Skip to content

Commit dae836d

Browse files
committed
Implement experimental bitmap-blur procedure in (lispkit draw).
1 parent 97f09be commit dae836d

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

Sources/LispKit/Primitives/DrawingLibrary.swift

+22
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ public final class DrawingLibrary: NativeLibrary {
158158
self.define(Procedure("bitmap-exif-data", bitmapExifData))
159159
self.define(Procedure("set-bitmap-exif-data!", setBitmapExifData))
160160
self.define(Procedure("make-bitmap", makeBitmap))
161+
self.define(Procedure("bitmap-blur", bitmapBlur))
161162
self.define(Procedure("save-bitmap", saveBitmap))
162163
self.define(Procedure("bitmap->bytevector", bitmapToBytevector))
163164

@@ -945,6 +946,27 @@ public final class DrawingLibrary: NativeLibrary {
945946
return .object(NativeImage(nsimage))
946947
}
947948

949+
private lazy var coreImageContext = CIContext()
950+
951+
private func bitmapBlur(bitmap: Expr, radius: Expr) throws -> Expr {
952+
let nsImage = try self.image(from: bitmap)
953+
guard let cgImage = nsImage.cgImage(forProposedRect: nil, context: nil, hints: nil) else {
954+
return .false
955+
}
956+
let image = CIImage(cgImage: cgImage)
957+
let radius = CGFloat(try radius.asDouble(coerce: true))
958+
let blurredImage = image.clampedToExtent()
959+
.applyingFilter(
960+
"CIGaussianBlur",
961+
parameters: [ kCIInputRadiusKey: radius ])
962+
.cropped(to: image.extent)
963+
guard let res = self.coreImageContext.createCGImage(blurredImage,
964+
from: blurredImage.extent) else {
965+
return .false
966+
}
967+
return .object(NativeImage(NSImage(cgImage: res, size: blurredImage.extent.size)))
968+
}
969+
948970
private func saveBitmap(filename: Expr, bitmap: Expr, format: Expr) throws -> Expr {
949971
guard case .symbol(let sym) = format else {
950972
throw RuntimeError.eval(.invalidImageFileType, format)

Sources/LispKit/Primitives/DrawingLibrary_iOS.swift

+21
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ public final class DrawingLibrary: NativeLibrary {
154154
self.define(Procedure("bitmap-exif-data", bitmapExifData))
155155
// self.define(Procedure("set-bitmap-exif-data!", setBitmapExifData))
156156
self.define(Procedure("make-bitmap", makeBitmap))
157+
self.define(Procedure("bitmap-blur", bitmapBlur))
157158
self.define(Procedure("save-bitmap", saveBitmap))
158159
self.define(Procedure("bitmap->bytevector", bitmapToBytevector))
159160

@@ -917,6 +918,26 @@ public final class DrawingLibrary: NativeLibrary {
917918
return .object(NativeImage(uiImage))
918919
}
919920

921+
private lazy var coreImageContext = CIContext()
922+
923+
private func bitmapBlur(bitmap: Expr, radius: Expr) throws -> Expr {
924+
let orig = try self.image(from: bitmap)
925+
guard let image = CIImage(image: orig) else {
926+
return .false
927+
}
928+
let radius = CGFloat(try radius.asDouble(coerce: true))
929+
let blurredImage = image.clampedToExtent()
930+
.applyingFilter(
931+
"CIGaussianBlur",
932+
parameters: [ kCIInputRadiusKey: radius ])
933+
.cropped(to: image.extent)
934+
guard let res = self.coreImageContext.createCGImage(blurredImage,
935+
from: blurredImage.extent) else {
936+
return .false
937+
}
938+
return .object(NativeImage(UIImage(cgImage: res, scale: orig.scale, orientation: .up)))
939+
}
940+
920941
private func saveBitmap(filename: Expr, bitmap: Expr, format: Expr) throws -> Expr {
921942
guard case .symbol(let sym) = format else {
922943
throw RuntimeError.eval(.invalidImageFileType, format)

0 commit comments

Comments
 (0)