From 899805f23fa0267121d825189cfd756ee2129546 Mon Sep 17 00:00:00 2001 From: Mis012 Date: Sat, 15 Feb 2025 21:36:03 +0100 Subject: [PATCH] Canvas: add drawLines --- .../generated_headers/android_graphics_GskCanvas.h | 8 ++++++++ .../graphics/android_graphics_GskCanvas.c | 9 +++++++++ src/api-impl/android/graphics/Canvas.java | 9 +++++++++ src/api-impl/android/graphics/GskCanvas.java | 13 +++++++++++++ 4 files changed, 39 insertions(+) diff --git a/src/api-impl-jni/generated_headers/android_graphics_GskCanvas.h b/src/api-impl-jni/generated_headers/android_graphics_GskCanvas.h index f87f215a..5ea64c10 100644 --- a/src/api-impl-jni/generated_headers/android_graphics_GskCanvas.h +++ b/src/api-impl-jni/generated_headers/android_graphics_GskCanvas.h @@ -73,6 +73,14 @@ JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1restore JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawLine (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat, jlong); +/* + * Class: android_graphics_GskCanvas + * Method: native_drawLines + * Signature: (J[FIIJ)V + */ +JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawLines + (JNIEnv *, jobject, jlong, jfloatArray, jint, jint, jlong); + /* * Class: android_graphics_GskCanvas * Method: native_drawText diff --git a/src/api-impl-jni/graphics/android_graphics_GskCanvas.c b/src/api-impl-jni/graphics/android_graphics_GskCanvas.c index 4f3abdb8..c7eee145 100644 --- a/src/api-impl-jni/graphics/android_graphics_GskCanvas.c +++ b/src/api-impl-jni/graphics/android_graphics_GskCanvas.c @@ -82,6 +82,15 @@ JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawLine(JNIEnv * gtk_snapshot_restore(snapshot); } +JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawLines(JNIEnv *env, jclass this_class, jlong snapshot_ptr, jfloatArray points_arr, jint offset, jint count, jlong paint_ptr) +{ + jfloat *points = (*env)->GetFloatArrayElements(env, points_arr, NULL); + for(int i = offset; i < count; i++) + Java_android_graphics_GskCanvas_native_1drawLine(env, this_class, snapshot_ptr, points[i + 0], points[i + 1], points[i + 2], points[i + 3], paint_ptr); + (*env)->ReleaseFloatArrayElements(env, points_arr, points, 0); +} + + extern GtkWidget *window; JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawText(JNIEnv *env, jclass this_class, jlong snapshot_ptr, jstring text, jfloat x, jfloat y, jlong paint_ptr) diff --git a/src/api-impl/android/graphics/Canvas.java b/src/api-impl/android/graphics/Canvas.java index 039172f8..5cd17577 100644 --- a/src/api-impl/android/graphics/Canvas.java +++ b/src/api-impl/android/graphics/Canvas.java @@ -378,6 +378,15 @@ public class Canvas { gsk_canvas.drawLine(startX, startY, stopX, stopY, paint); } + public void drawLines(float[] points, Paint paint) { + drawLines(points, 0, points.length, paint); + } + + public void drawLines(float[] points, int offset, int count, Paint paint) { + gsk_canvas.snapshot = bitmap.getSnapshot(); + gsk_canvas.drawLines(points, offset, count, paint); + } + public void setBitmap(Bitmap bitmap) { if (bitmap != null && !bitmap.isMutable()) { throw new IllegalStateException("Bitmap must be mutable"); diff --git a/src/api-impl/android/graphics/GskCanvas.java b/src/api-impl/android/graphics/GskCanvas.java index 749e71d0..7b356403 100644 --- a/src/api-impl/android/graphics/GskCanvas.java +++ b/src/api-impl/android/graphics/GskCanvas.java @@ -78,6 +78,18 @@ public class GskCanvas extends Canvas { native_drawLine(snapshot, startX, startY, stopX, stopY, paint != null ? paint.paint : default_paint.paint); } + @Override + public void drawLines(float[] points, Paint paint) { + drawLines(points, 0, points.length, paint); + } + + @Override + public void drawLines(float[] points, int offset, int count, Paint paint) { + if (offset + count < 0 /* overflow */ || offset + count > points.length) + throw new IndexOutOfBoundsException(); + native_drawLines(snapshot, points, offset, count, paint != null ? paint.paint : default_paint.paint); + } + @Override public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) { Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); @@ -122,6 +134,7 @@ public class GskCanvas extends Canvas { protected native void native_save(long snapshot); protected native void native_restore(long snapshot); protected native void native_drawLine(long snapshot, float startX, float startY, float stopX, float stopY, long paint); + protected native void native_drawLines(long snapshot, float[] points, int offset, int count, long paint); protected native void native_drawText(long snapshot, String text, float x, float y, long paint); protected native void native_drawRoundRect(long snapshot, float left, float top, float right, float bottom, float rx, float ry, long paint); protected native void native_scale(long snapshot, float sx, float sy);