You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
GskCanavas: draw default content when custom View calls super.onDraw()
This commit is contained in:
@@ -31,6 +31,14 @@ JNIEXPORT jlong JNICALL Java_android_graphics_drawable_Drawable_native_1construc
|
|||||||
JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate
|
JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate
|
||||||
(JNIEnv *, jobject, jlong);
|
(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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -199,6 +199,14 @@ extern "C" {
|
|||||||
#define android_view_View_TEXT_DIRECTION_LTR 3L
|
#define android_view_View_TEXT_DIRECTION_LTR 3L
|
||||||
#undef android_view_View_TEXT_DIRECTION_RTL
|
#undef android_view_View_TEXT_DIRECTION_RTL
|
||||||
#define android_view_View_TEXT_DIRECTION_RTL 4L
|
#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
|
* Class: android_view_View
|
||||||
* Method: setOnTouchListener
|
* Method: setOnTouchListener
|
||||||
|
|||||||
@@ -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) {
|
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)));
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -583,3 +583,9 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1queueAllocate(JNIEnv *env,
|
|||||||
{
|
{
|
||||||
gtk_widget_queue_allocate(GTK_WIDGET(_PTR(widget_ptr)));
|
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)));
|
||||||
|
}
|
||||||
|
|||||||
@@ -94,23 +94,30 @@ void wrapper_widget_allocate(GtkWidget *widget, int width, int height, int basel
|
|||||||
gtk_widget_size_allocate(wrapper->background, &allocation, baseline);
|
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)
|
static void wrapper_widget_snapshot(GtkWidget *widget, GdkSnapshot *snapshot)
|
||||||
{
|
{
|
||||||
WrapperWidget *wrapper = WRAPPER_WIDGET(widget);
|
WrapperWidget *wrapper = WRAPPER_WIDGET(widget);
|
||||||
if (wrapper->real_height > 0 && wrapper->real_width > 0) {
|
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));
|
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) {
|
if (wrapper->draw_method) {
|
||||||
JNIEnv *env = get_jni_env();
|
JNIEnv *env = get_jni_env();
|
||||||
_SET_LONG_FIELD(wrapper->canvas, "snapshot", _INTPTR(snapshot));
|
_SET_LONG_FIELD(wrapper->canvas, "snapshot", _INTPTR(snapshot));
|
||||||
(*env)->CallVoidMethod(env, wrapper->jobj, wrapper->draw_method, wrapper->canvas);
|
(*env)->CallVoidMethod(env, wrapper->jobj, wrapper->draw_method, wrapper->canvas);
|
||||||
if ((*env)->ExceptionCheck(env))
|
if ((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
|
} else {
|
||||||
|
wrapper_widget_draw_children(wrapper, snapshot);
|
||||||
}
|
}
|
||||||
if (wrapper->real_height > 0 && wrapper->real_width > 0) {
|
if (wrapper->real_height > 0 && wrapper->real_width > 0) {
|
||||||
gtk_snapshot_pop(snapshot);
|
gtk_snapshot_pop(snapshot);
|
||||||
|
|||||||
@@ -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_queue_draw(WrapperWidget *wrapper);
|
||||||
void wrapper_widget_set_layout_params(WrapperWidget *wrapper, int width, int height);
|
void wrapper_widget_set_layout_params(WrapperWidget *wrapper, int width, int height);
|
||||||
void wrapper_widget_set_background(WrapperWidget *wrapper, GdkPaintable *paintable);
|
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);
|
void _setOnTouchListener(JNIEnv *env, jobject this, GtkWidget *widget, jobject on_touch_listener);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ package android.graphics;
|
|||||||
* - implements Canvas for onscreen rendering inside GTKs snapshot function
|
* - implements Canvas for onscreen rendering inside GTKs snapshot function
|
||||||
*/
|
*/
|
||||||
public class GskCanvas extends Canvas {
|
public class GskCanvas extends Canvas {
|
||||||
private long snapshot;
|
public long snapshot;
|
||||||
private int save_count = 0;
|
private int save_count = 0;
|
||||||
|
|
||||||
public GskCanvas(long snapshot) {
|
public GskCanvas(long snapshot) {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import android.content.res.Resources.Theme;
|
|||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.ColorFilter;
|
import android.graphics.ColorFilter;
|
||||||
|
import android.graphics.GskCanvas;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.PorterDuffColorFilter;
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
@@ -74,7 +75,10 @@ public class Drawable {
|
|||||||
return mBounds;
|
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) {
|
public boolean setState(int[] stateSet) {
|
||||||
if (!Arrays.equals(this.mStateSet, 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 static native long native_paintable_from_path(String path);
|
||||||
protected native long native_constructor();
|
protected native long native_constructor();
|
||||||
protected native void native_invalidate(long paintable);
|
protected native void native_invalidate(long paintable);
|
||||||
|
protected native void native_draw(long paintable, long snapshot, int width, int height);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.content.res.ColorStateList;
|
|||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.GskCanvas;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
@@ -899,7 +900,11 @@ public class View implements Drawable.Callback {
|
|||||||
return null;
|
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) {
|
public void draw(Canvas canvas) {
|
||||||
onDraw(canvas);
|
onDraw(canvas);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user