diff --git a/src/api-impl-jni/generated_headers/android_graphics_drawable_Drawable.h b/src/api-impl-jni/generated_headers/android_graphics_drawable_Drawable.h index 34f2113a..ce832f2b 100644 --- a/src/api-impl-jni/generated_headers/android_graphics_drawable_Drawable.h +++ b/src/api-impl-jni/generated_headers/android_graphics_drawable_Drawable.h @@ -31,6 +31,14 @@ JNIEXPORT jlong JNICALL Java_android_graphics_drawable_Drawable_native_1construc JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate (JNIEnv *, jobject, jlong); +/* + * Class: android_graphics_drawable_Drawable + * Method: native_draw + * Signature: (JJII)V + */ +JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1draw + (JNIEnv *, jobject, jlong, jlong, jint, jint); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/generated_headers/android_view_View.h b/src/api-impl-jni/generated_headers/android_view_View.h index cc396a79..7b58275a 100644 --- a/src/api-impl-jni/generated_headers/android_view_View.h +++ b/src/api-impl-jni/generated_headers/android_view_View.h @@ -199,6 +199,14 @@ extern "C" { #define android_view_View_TEXT_DIRECTION_LTR 3L #undef android_view_View_TEXT_DIRECTION_RTL #define android_view_View_TEXT_DIRECTION_RTL 4L +/* + * Class: android_view_View + * Method: native_onDraw + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_android_view_View_native_1onDraw + (JNIEnv *, jobject, jlong, jlong); + /* * Class: android_view_View * Method: setOnTouchListener diff --git a/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c b/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c index eed99e0b..3cf4c314 100644 --- a/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c +++ b/src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c @@ -89,3 +89,9 @@ JNIEXPORT jlong JNICALL Java_android_graphics_drawable_Drawable_native_1construc JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate(JNIEnv *env, jobject this, jlong paintable_ptr) { gdk_paintable_invalidate_contents(GDK_PAINTABLE(_PTR(paintable_ptr))); } + +JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1draw(JNIEnv *env, jobject this, jlong paintable_ptr, jlong snapshot_ptr, jint width, jint height) { + GdkSnapshot *snapshot = (GdkSnapshot *)_PTR(snapshot_ptr); + GdkPaintable *paintable = GDK_PAINTABLE(_PTR(paintable_ptr)); + gdk_paintable_snapshot(paintable, snapshot, width, height); +} diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index f9be17d6..12163e06 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -583,3 +583,9 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1queueAllocate(JNIEnv *env, { gtk_widget_queue_allocate(GTK_WIDGET(_PTR(widget_ptr))); } + +JNIEXPORT void JNICALL Java_android_view_View_native_1onDraw(JNIEnv *env, jobject this, jlong widget_ptr, jlong snapshot_ptr) +{ + WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(_PTR(widget_ptr)))); + wrapper_widget_draw_children(wrapper, GDK_SNAPSHOT(_PTR(snapshot_ptr))); +} diff --git a/src/api-impl-jni/widgets/WrapperWidget.c b/src/api-impl-jni/widgets/WrapperWidget.c index 0a61ce7d..85eb8ad1 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.c +++ b/src/api-impl-jni/widgets/WrapperWidget.c @@ -94,23 +94,30 @@ void wrapper_widget_allocate(GtkWidget *widget, int width, int height, int basel gtk_widget_size_allocate(wrapper->background, &allocation, baseline); } +void wrapper_widget_draw_children(WrapperWidget *wrapper, GdkSnapshot *snapshot) +{ + GtkWidget *widget = &wrapper->parent_instance; + GtkWidget *child = gtk_widget_get_first_child(widget); + while (child) { + gtk_widget_snapshot_child(widget, child, snapshot); + child = gtk_widget_get_next_sibling(child); + } +} + static void wrapper_widget_snapshot(GtkWidget *widget, GdkSnapshot *snapshot) { WrapperWidget *wrapper = WRAPPER_WIDGET(widget); if (wrapper->real_height > 0 && wrapper->real_width > 0) { gtk_snapshot_push_clip(snapshot, &GRAPHENE_RECT_INIT(0, 0, wrapper->real_width, wrapper->real_height)); } - GtkWidget *child = gtk_widget_get_first_child(widget); - while (child) { - gtk_widget_snapshot_child(widget, child, snapshot); - child = gtk_widget_get_next_sibling(child); - } if (wrapper->draw_method) { JNIEnv *env = get_jni_env(); _SET_LONG_FIELD(wrapper->canvas, "snapshot", _INTPTR(snapshot)); (*env)->CallVoidMethod(env, wrapper->jobj, wrapper->draw_method, wrapper->canvas); if ((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); + } else { + wrapper_widget_draw_children(wrapper, snapshot); } if (wrapper->real_height > 0 && wrapper->real_width > 0) { gtk_snapshot_pop(snapshot); diff --git a/src/api-impl-jni/widgets/WrapperWidget.h b/src/api-impl-jni/widgets/WrapperWidget.h index 2a9d72d1..49fa06ea 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.h +++ b/src/api-impl-jni/widgets/WrapperWidget.h @@ -35,6 +35,7 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job void wrapper_widget_queue_draw(WrapperWidget *wrapper); void wrapper_widget_set_layout_params(WrapperWidget *wrapper, int width, int height); void wrapper_widget_set_background(WrapperWidget *wrapper, GdkPaintable *paintable); +void wrapper_widget_draw_children(WrapperWidget *wrapper, GdkSnapshot *snapshot); void _setOnTouchListener(JNIEnv *env, jobject this, GtkWidget *widget, jobject on_touch_listener); diff --git a/src/api-impl/android/graphics/GskCanvas.java b/src/api-impl/android/graphics/GskCanvas.java index 58f55fc1..d06128c6 100644 --- a/src/api-impl/android/graphics/GskCanvas.java +++ b/src/api-impl/android/graphics/GskCanvas.java @@ -5,7 +5,7 @@ package android.graphics; * - implements Canvas for onscreen rendering inside GTKs snapshot function */ public class GskCanvas extends Canvas { - private long snapshot; + public long snapshot; private int save_count = 0; public GskCanvas(long snapshot) { diff --git a/src/api-impl/android/graphics/drawable/Drawable.java b/src/api-impl/android/graphics/drawable/Drawable.java index a1a268e3..16d8c03c 100644 --- a/src/api-impl/android/graphics/drawable/Drawable.java +++ b/src/api-impl/android/graphics/drawable/Drawable.java @@ -17,6 +17,7 @@ import android.content.res.Resources.Theme; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; +import android.graphics.GskCanvas; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; @@ -74,7 +75,10 @@ public class Drawable { return mBounds; } - public void draw(Canvas canvas) {} + public void draw(Canvas canvas) { + if (canvas instanceof GskCanvas) + native_draw(paintable, ((GskCanvas)canvas).snapshot, mBounds.width(), mBounds.height()); + } public boolean setState(int[] stateSet) { if (!Arrays.equals(this.mStateSet, stateSet)) { @@ -261,4 +265,5 @@ public class Drawable { protected static native long native_paintable_from_path(String path); protected native long native_constructor(); protected native void native_invalidate(long paintable); + protected native void native_draw(long paintable, long snapshot, int width, int height); } diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 9c0e47cc..a085b68f 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -7,6 +7,7 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.graphics.GskCanvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; @@ -899,7 +900,11 @@ public class View implements Drawable.Callback { return null; } - public void onDraw(Canvas canvas) {} + protected native void native_onDraw(long widget, long snapshot); + public void onDraw(Canvas canvas) { + if (canvas instanceof GskCanvas) + native_onDraw(widget, ((GskCanvas)canvas).snapshot); + } public void draw(Canvas canvas) { onDraw(canvas); }