diff --git a/skiko/src/commonTest/kotlin/org/jetbrains/skia/PaintFilterCanvasTest.kt b/skiko/src/commonTest/kotlin/org/jetbrains/skia/PaintFilterCanvasTest.kt index 626df6e40f..582c4ba919 100644 --- a/skiko/src/commonTest/kotlin/org/jetbrains/skia/PaintFilterCanvasTest.kt +++ b/skiko/src/commonTest/kotlin/org/jetbrains/skia/PaintFilterCanvasTest.kt @@ -32,5 +32,7 @@ class PaintFilterCanvasTest { assertTrue(called) assertEquals(Color.RED, pixels.getColor(2, 2)) + + surface.close() } } \ No newline at end of file diff --git a/skiko/src/commonTest/kotlin/org/jetbrains/skia/PictureFilterCanvasTest.kt b/skiko/src/commonTest/kotlin/org/jetbrains/skia/PictureFilterCanvasTest.kt new file mode 100644 index 0000000000..61591212fa --- /dev/null +++ b/skiko/src/commonTest/kotlin/org/jetbrains/skia/PictureFilterCanvasTest.kt @@ -0,0 +1,45 @@ +package org.jetbrains.skia + +import kotlin.test.Test +import kotlin.test.assertEquals + +class PictureFilterCanvasTest { + @Test + fun canOverrideOnDrawPicture() { + val surface = Surface.makeRasterN32Premul(16, 16) + val bounds = Rect(0f, 0f, 16f, 16f) + var callCount = 0 + + // Prepare picture + val recorder = PictureRecorder() + val recordingCanvas = recorder.beginRecording(bounds) + val placeholder = Picture.makePlaceholder(bounds) + recordingCanvas.drawPicture(placeholder) + val picture = recorder.finishRecordingAsPicture() + + // Filtering + val filterCanvas = object : PictureFilterCanvas(surface.canvas) { + override fun onDrawPicture(picture: Picture, matrix: Matrix33?, paint: Paint?): Boolean { + callCount++ + drawRect( + Rect(0f, 0f, 8f, 8f), + Paint().apply { color = Color.RED } + ) + return true + } + } + filterCanvas.drawPicture(picture) + filterCanvas.close() + + // Render result + val pixels = Bitmap.makeFromImage(surface.makeImageSnapshot()) + + assertEquals(1, callCount) + assertEquals(Color.RED, pixels.getColor(2, 2)) + + placeholder.close() + picture.close() + recorder.close() + surface.close() + } +} \ No newline at end of file diff --git a/skiko/src/nativeJsMain/cpp/PictureFilterCanvas.cc b/skiko/src/nativeJsMain/cpp/PictureFilterCanvas.cc index 7b1fc7712c..4838e52db9 100644 --- a/skiko/src/nativeJsMain/cpp/PictureFilterCanvas.cc +++ b/skiko/src/nativeJsMain/cpp/PictureFilterCanvas.cc @@ -37,31 +37,31 @@ class SkikoPictureFilterCanvas : public SkNWayCanvas { } }; -SKIKO_EXPORT KNativePointer org_jetbrains_skia_SkikoPictureFilterCanvas__1nMake +SKIKO_EXPORT KNativePointer org_jetbrains_skia_PictureFilterCanvas__1nMake (SkCanvas* canvas) { SkikoPictureFilterCanvas* filterCanvas = new SkikoPictureFilterCanvas(canvas); return reinterpret_cast(filterCanvas); } -SKIKO_EXPORT void org_jetbrains_skia_SkikoPictureFilterCanvas__1nInit +SKIKO_EXPORT void org_jetbrains_skia_PictureFilterCanvas__1nInit (KNativePointer canvasPtr, KInteropPointer onDrawPicture) { SkikoPictureFilterCanvas* canvas = reinterpret_cast(canvasPtr); canvas->_onDrawPicture = KBooleanCallback(onDrawPicture); } -SKIKO_EXPORT KNativePointer org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_picture +SKIKO_EXPORT KNativePointer org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_picture (KNativePointer canvasPtr) { SkikoPictureFilterCanvas* canvas = reinterpret_cast(canvasPtr); return reinterpret_cast(const_cast(canvas->_onDrawPicture_picture)); } -SKIKO_EXPORT KNativePointer org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_matrix +SKIKO_EXPORT KNativePointer org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_matrix (KNativePointer canvasPtr) { SkikoPictureFilterCanvas* canvas = reinterpret_cast(canvasPtr); return reinterpret_cast(const_cast(canvas->_onDrawPicture_matrix)); } -SKIKO_EXPORT KNativePointer org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_paint +SKIKO_EXPORT KNativePointer org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_paint (KNativePointer canvasPtr) { SkikoPictureFilterCanvas* canvas = reinterpret_cast(canvasPtr); return reinterpret_cast(const_cast(canvas->_onDrawPicture_paint)); diff --git a/skiko/src/nativeJsMain/kotlin/org/jetbrains/skia/PictureFilterCanvas.nativeJs.kt b/skiko/src/nativeJsMain/kotlin/org/jetbrains/skia/PictureFilterCanvas.nativeJs.kt index 6d845b8bb0..67827540ae 100644 --- a/skiko/src/nativeJsMain/kotlin/org/jetbrains/skia/PictureFilterCanvas.nativeJs.kt +++ b/skiko/src/nativeJsMain/kotlin/org/jetbrains/skia/PictureFilterCanvas.nativeJs.kt @@ -21,14 +21,14 @@ internal actual fun PictureFilterCanvas.doInit(ptr: NativePointer) { @ModuleImport("./skiko.mjs", "org_jetbrains_skia_PictureFilterCanvas__1nInit") internal external fun PictureFilterCanvas_nInit(ptr: NativePointer, onFilter: InteropPointer) -@ExternalSymbolName("org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_picture") -@ModuleImport("./skiko.mjs", "org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_picture") +@ExternalSymbolName("org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_picture") +@ModuleImport("./skiko.mjs", "org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_picture") internal external fun PictureFilterCanvas_nGetOnDrawPicture_picture(ptr: NativePointer): NativePointer -@ExternalSymbolName("org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_matrix") -@ModuleImport("./skiko.mjs", "org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_matrix") +@ExternalSymbolName("org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_matrix") +@ModuleImport("./skiko.mjs", "org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_matrix") internal external fun PictureFilterCanvas_nGetOnDrawPicture_matrix(ptr: NativePointer): NativePointer -@ExternalSymbolName("org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_paint") -@ModuleImport("./skiko.mjs", "org_jetbrains_skia_SkikoPictureFilterCanvas__1nGetOnDrawPicture_paint") +@ExternalSymbolName("org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_paint") +@ModuleImport("./skiko.mjs", "org_jetbrains_skia_PictureFilterCanvas__1nGetOnDrawPicture_paint") internal external fun PictureFilterCanvas_nGetOnDrawPicture_paint(ptr: NativePointer): NativePointer