Skip to content

Commit

Permalink
Fix PictureFilterCanvas native bindings and add tests (#1011)
Browse files Browse the repository at this point in the history
  • Loading branch information
MatkovIvan authored Jan 14, 2025
1 parent c22b0fc commit 0e03962
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,7 @@ class PaintFilterCanvasTest {

assertTrue(called)
assertEquals(Color.RED, pixels.getColor(2, 2))

surface.close()
}
}
Original file line number Diff line number Diff line change
@@ -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()
}
}
10 changes: 5 additions & 5 deletions skiko/src/nativeJsMain/cpp/PictureFilterCanvas.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<KNativePointer>(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<SkikoPictureFilterCanvas*>(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<SkikoPictureFilterCanvas*>(canvasPtr);
return reinterpret_cast<KNativePointer>(const_cast<SkPicture *>(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<SkikoPictureFilterCanvas*>(canvasPtr);
return reinterpret_cast<KNativePointer>(const_cast<SkMatrix *>(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<SkikoPictureFilterCanvas*>(canvasPtr);
return reinterpret_cast<KNativePointer>(const_cast<SkPaint *>(canvas->_onDrawPicture_paint));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 0e03962

Please sign in to comment.