Skip to content

Commit 8429292

Browse files
committed
Bug fixes for libraries (lispkit pdf), (lispkit image), and (lispkit vision). Fix legacy PDF example code.
1 parent 535c0da commit 8429292

File tree

14 files changed

+244
-111
lines changed

14 files changed

+244
-111
lines changed

LispKit.xcodeproj/project.pbxproj

+14-6
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
CC0E57C6268FAAE800693DD2 /* 223.sld in Copy pre-installed SRFI libraries */ = {isa = PBXBuildFile; fileRef = CC0E57C2268FAA4200693DD2 /* 223.sld */; };
7474
CC0E57C7268FAAFB00693DD2 /* SRFI-223.scm in Copy tests */ = {isa = PBXBuildFile; fileRef = CC0E57C3268FAA7800693DD2 /* SRFI-223.scm */; };
7575
CC0EBFF91ED37FB7004510B2 /* Math.scm in Copy examples */ = {isa = PBXBuildFile; fileRef = CC0EBFF81ED37A76004510B2 /* Math.scm */; };
76-
CC10404D1F53789D0045144A /* pdf.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC10404C1F5378660045144A /* pdf.sld */; };
76+
CC10404D1F53789D0045144A /* legacy.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC10404C1F5378660045144A /* legacy.sld */; };
7777
CC131C4C1CDE0C3D006C030C /* SyntaxRules.scm in Resources */ = {isa = PBXBuildFile; fileRef = CC131C4B1CDE0C3D006C030C /* SyntaxRules.scm */; };
7878
CC131C4E1CDE0DCA006C030C /* RegressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC131C4D1CDE0DCA006C030C /* RegressionTests.swift */; };
7979
CC131C501CDE0E01006C030C /* LispKitTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC131C4F1CDE0E01006C030C /* LispKitTestCase.swift */; };
@@ -872,7 +872,7 @@
872872
CCC48D9E25E9806600D082AD /* prettify.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC750BD91F5B772200CD82A2 /* prettify.sld */; };
873873
CCC48D9F25E9806600D082AD /* csv.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CCBD755D21E224A7008CD7C8 /* csv.sld */; };
874874
CCC48DA025E9806600D082AD /* deprecated.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC3A02591F97F3E1009B959C /* deprecated.sld */; };
875-
CCC48DA125E9806600D082AD /* pdf.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC10404C1F5378660045144A /* pdf.sld */; };
875+
CCC48DA125E9806600D082AD /* legacy.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC10404C1F5378660045144A /* legacy.sld */; };
876876
CCC48DA225E9806600D082AD /* clos.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC703A1A218D09B600E71EA9 /* clos.sld */; };
877877
CCC48DA325E9806600D082AD /* prolog.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CCD3E15325C5EB83007FCE8A /* prolog.sld */; };
878878
CCC48DA425E9806600D082AD /* logic.sld in Copy pre-installed LispKit libraries */ = {isa = PBXBuildFile; fileRef = CC436C3F1FFBD5090095559E /* logic.sld */; };
@@ -1785,7 +1785,7 @@
17851785
CCE7CA461F8EC07000FD7ECA /* iterate.sld in Copy pre-installed LispKit libraries */,
17861786
CC2345411F655BD800C38817 /* datatype.sld in Copy pre-installed LispKit libraries */,
17871787
CC750BDA1F5B776700CD82A2 /* prettify.sld in Copy pre-installed LispKit libraries */,
1788-
CC10404D1F53789D0045144A /* pdf.sld in Copy pre-installed LispKit libraries */,
1788+
CC10404D1F53789D0045144A /* legacy.sld in Copy pre-installed LispKit libraries */,
17891789
CC72862D1F52B32C00EEBC58 /* heap.sld in Copy pre-installed LispKit libraries */,
17901790
CC5848031E56920600BE6497 /* set.sld in Copy pre-installed LispKit libraries */,
17911791
);
@@ -2457,7 +2457,7 @@
24572457
CCC48D9E25E9806600D082AD /* prettify.sld in Copy pre-installed LispKit libraries */,
24582458
CCC48D9F25E9806600D082AD /* csv.sld in Copy pre-installed LispKit libraries */,
24592459
CCC48DA025E9806600D082AD /* deprecated.sld in Copy pre-installed LispKit libraries */,
2460-
CCC48DA125E9806600D082AD /* pdf.sld in Copy pre-installed LispKit libraries */,
2460+
CCC48DA125E9806600D082AD /* legacy.sld in Copy pre-installed LispKit libraries */,
24612461
CCC48DA225E9806600D082AD /* clos.sld in Copy pre-installed LispKit libraries */,
24622462
CCC48DA325E9806600D082AD /* prolog.sld in Copy pre-installed LispKit libraries */,
24632463
CCC48DA425E9806600D082AD /* logic.sld in Copy pre-installed LispKit libraries */,
@@ -3158,7 +3158,7 @@
31583158
CC0E57C2268FAA4200693DD2 /* 223.sld */ = {isa = PBXFileReference; lastKnownFileType = text; path = 223.sld; sourceTree = "<group>"; };
31593159
CC0E57C3268FAA7800693DD2 /* SRFI-223.scm */ = {isa = PBXFileReference; lastKnownFileType = text; path = "SRFI-223.scm"; sourceTree = "<group>"; };
31603160
CC0EBFF81ED37A76004510B2 /* Math.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Math.scm; sourceTree = "<group>"; };
3161-
CC10404C1F5378660045144A /* pdf.sld */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pdf.sld; sourceTree = "<group>"; };
3161+
CC10404C1F5378660045144A /* legacy.sld */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = legacy.sld; sourceTree = "<group>"; };
31623162
CC131C4B1CDE0C3D006C030C /* SyntaxRules.scm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SyntaxRules.scm; sourceTree = "<group>"; };
31633163
CC131C4D1CDE0DCA006C030C /* RegressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegressionTests.swift; sourceTree = "<group>"; };
31643164
CC131C4F1CDE0E01006C030C /* LispKitTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = LispKitTestCase.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
@@ -4231,7 +4231,6 @@
42314231
CC750BD91F5B772200CD82A2 /* prettify.sld */,
42324232
CC8BBA2926BF38F200552B8F /* text-table.sld */,
42334233
CCBD755D21E224A7008CD7C8 /* csv.sld */,
4234-
CC10404C1F5378660045144A /* pdf.sld */,
42354234
CC703A1A218D09B600E71EA9 /* clos.sld */,
42364235
CCD3E15325C5EB83007FCE8A /* prolog.sld */,
42374236
CC436C3F1FFBD5090095559E /* logic.sld */,
@@ -4245,6 +4244,7 @@
42454244
CC703A1B218D09D100E71EA9 /* clos */,
42464245
CC26AD3E21470AC90090D9EE /* draw */,
42474246
CC421D392D478698006AED19 /* image */,
4247+
CCFFD5892D4D9AB60092150E /* pdf */,
42484248
CC240E8A24FB144500FF6D0F /* sxml */,
42494249
);
42504250
path = lispkit;
@@ -5103,6 +5103,14 @@
51035103
path = Examples;
51045104
sourceTree = "<group>";
51055105
};
5106+
CCFFD5892D4D9AB60092150E /* pdf */ = {
5107+
isa = PBXGroup;
5108+
children = (
5109+
CC10404C1F5378660045144A /* legacy.sld */,
5110+
);
5111+
path = pdf;
5112+
sourceTree = "<group>";
5113+
};
51065114
/* End PBXGroup section */
51075115

51085116
/* Begin PBXHeadersBuildPhase section */

LispKit.xcodeproj/xcshareddata/xcschemes/LispKitRepl.xcscheme

+5
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@
8181
value = "xcode"
8282
isEnabled = "YES">
8383
</EnvironmentVariable>
84+
<EnvironmentVariable
85+
key = "CG_PDF_VERBOSE"
86+
value = "true"
87+
isEnabled = "YES">
88+
</EnvironmentVariable>
8489
</EnvironmentVariables>
8590
</LaunchAction>
8691
<ProfileAction

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ _LispKit_ provides support for the following core features, many of which are ba
101101
[`(lispkit draw turtle)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Draw-Turtle),
102102
[`(lispkit draw barcode)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Draw-Barcode),
103103
[`(lispkit draw chart bar)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Draw-Chart-Bar),
104+
[`(lispkit image)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Image),
105+
[`(lispkit image process)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Image-Process),
106+
[`(lispkit vision)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Vision),
104107
[`(lispkit styled-text)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Styled-Text),
105108
[`(lispkit datatype)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Datatype),
106109
[`(lispkit object)`](https://github.com/objecthub/swift-lispkit/wiki/LispKit-Object),

Sources/LispKit/Graphics/Drawing.swift

+3
Original file line numberDiff line numberDiff line change
@@ -413,9 +413,12 @@ public enum DrawingInstruction: CustomStringConvertible {
413413
case .boundingBox(let box):
414414
textRect = box
415415
}
416+
let context = context.cgContext
417+
context.saveGState()
416418
str.draw(with: textRect,
417419
options: [.usesLineFragmentOrigin, .usesFontLeading],
418420
attributes: attributes)
421+
context.restoreGState()
419422
case .attributedText(let attribStr, let location):
420423
let textRect: NSRect
421424
switch location {

Sources/LispKit/Graphics/Drawing_iOS.swift

+4
Original file line numberDiff line numberDiff line change
@@ -451,16 +451,20 @@ public enum DrawingInstruction: CustomStringConvertible, @unchecked Sendable {
451451
textRect = box
452452
}
453453
if let current = UIGraphicsGetCurrentContext(), current == context {
454+
context.saveGState()
454455
str.draw(with: textRect,
455456
options: [.usesLineFragmentOrigin, .usesFontLeading],
456457
attributes: attributes,
457458
context: nil)
459+
context.restoreGState()
458460
} else {
459461
UIGraphicsPushContext(context)
462+
context.saveGState()
460463
str.draw(with: textRect,
461464
options: [.usesLineFragmentOrigin, .usesFontLeading],
462465
attributes: attributes,
463466
context: nil)
467+
context.restoreGState()
464468
UIGraphicsPopContext()
465469
}
466470
case .attributedText(let attribStr, let location):

Sources/LispKit/Primitives/ImageLibrary.swift

+41-22
Original file line numberDiff line numberDiff line change
@@ -991,31 +991,50 @@ public final class ImageLibrary: NativeLibrary {
991991
private func applyImageFilter(expr: Expr, args: Arguments) throws -> Expr {
992992
var image = try self.abstractImage(from: expr).ciImage
993993
for a in args {
994+
if case .null = a {
995+
continue
996+
}
994997
var list = a
995-
if case .pair(.symbol(_), _) = a {
996-
list = .pair(a, .null)
998+
switch a {
999+
case .pair(.symbol(_), _):
1000+
list = .pair(a, .null)
1001+
case .object(_):
1002+
list = .pair(a, .null)
1003+
default:
1004+
break
9971005
}
9981006
while case .pair(let arg, let rest) = list {
999-
guard case .pair(let ident, let params) = arg else {
1000-
throw RuntimeError.type(arg, expected: [.pairType])
1001-
}
1002-
let name: String
1003-
if case .symbol(let sym) = ident {
1004-
guard let mappedName = self.filterName[sym] else {
1005-
return .false
1006-
}
1007-
name = mappedName
1008-
} else {
1009-
name = try ident.asString()
1010-
}
1011-
guard let filter = CIFilter(name: name,
1012-
parameters: try self.parameters(from: params, input: image)) else {
1013-
return .false
1014-
}
1015-
if let outputImage = filter.outputImage {
1016-
image = outputImage
1017-
} else {
1018-
return .false
1007+
switch arg {
1008+
case .object(_):
1009+
let ciFilter = try self.imageFilter(from: arg).ciFilter
1010+
ciFilter.setValue(image, forKey: kCIInputImageKey)
1011+
if let outputImage = ciFilter.outputImage {
1012+
image = outputImage
1013+
} else {
1014+
return .false
1015+
}
1016+
case .pair(let ident, let params):
1017+
let name: String
1018+
if case .symbol(let sym) = ident {
1019+
guard let mappedName = self.filterName[sym] else {
1020+
return .false
1021+
}
1022+
name = mappedName
1023+
} else {
1024+
name = try ident.asString()
1025+
}
1026+
guard let filter = CIFilter(name: name,
1027+
parameters: try self.parameters(from: params, input: image)) else {
1028+
return .false
1029+
}
1030+
if let outputImage = filter.outputImage {
1031+
image = outputImage
1032+
} else {
1033+
return .false
1034+
}
1035+
default:
1036+
Swift.print("falling through: \(arg)")
1037+
throw RuntimeError.type(arg, expected: [.pairType])
10191038
}
10201039
list = rest
10211040
}

0 commit comments

Comments
 (0)