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
make android.text.Layout.draw() compatible custom Canvas classes
TextAndroidCanvas is a proxy canvas class which prevents us from accessing the GtkSnapshot of the real canvas. To solve this problem, we call Canvas.drawText() for each line.
This commit is contained in:
@@ -143,6 +143,14 @@ JNIEXPORT jint JNICALL Java_android_text_Layout_native_1get_1ellipsis_1count
|
||||
JNIEXPORT void JNICALL Java_android_text_Layout_native_1draw
|
||||
(JNIEnv *, jobject, jlong, jlong, jlong);
|
||||
|
||||
/*
|
||||
* Class: android_text_Layout
|
||||
* Method: native_draw_custom_canvas
|
||||
* Signature: (JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_android_text_Layout_native_1draw_1custom_1canvas
|
||||
(JNIEnv *, jobject, jlong, jobject, jobject);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -104,7 +104,7 @@ JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawText(JNIEnv *
|
||||
(*env)->ReleaseStringUTFChars(env, text, str);
|
||||
PangoRectangle rect;
|
||||
pango_layout_get_pixel_extents(layout, NULL, &rect);
|
||||
y -= rect.height;
|
||||
y -= (float)pango_layout_get_baseline(layout) / PANGO_SCALE;
|
||||
if (paint->alignment == PANGO_ALIGN_CENTER)
|
||||
x -= rect.width / 2.f;
|
||||
else if (paint->alignment == PANGO_ALIGN_RIGHT)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <pango/pango.h>
|
||||
|
||||
#include "../defines.h"
|
||||
#include "../util.h"
|
||||
#include "../graphics/AndroidPaint.h"
|
||||
#include "../generated_headers/android_text_Layout.h"
|
||||
|
||||
@@ -149,3 +150,22 @@ JNIEXPORT void JNICALL Java_android_text_Layout_native_1draw(JNIEnv *env, jobjec
|
||||
|
||||
gtk_snapshot_append_layout(snapshot, pango_layout, &android_paint->color);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_android_text_Layout_native_1draw_1custom_1canvas(JNIEnv *env, jobject object, jlong layout, jobject canvas, jobject paint)
|
||||
{
|
||||
PangoLayout *pango_layout = PANGO_LAYOUT(_PTR(layout));
|
||||
|
||||
const gchar *text = pango_layout_get_text(pango_layout);
|
||||
PangoLayoutIter *pango_iter = pango_layout_get_iter(pango_layout);
|
||||
do {
|
||||
PangoLayoutLine *pango_line = pango_layout_iter_get_line_readonly(pango_iter);
|
||||
|
||||
jstring text_jstr = (*env)->NewStringUTF(env, text + pango_line->start_index);
|
||||
jint end = (*env)->GetStringLength(env, text_jstr);
|
||||
if (pango_line->length < end)
|
||||
end = pango_line->length;
|
||||
jfloat y = (float)pango_layout_iter_get_baseline(pango_iter) / PANGO_SCALE;
|
||||
(*env)->CallVoidMethod(env, canvas, handle_cache.canvas.drawText, text_jstr, (jint)0, end, (jfloat)0, y, paint);
|
||||
(*env)->DeleteLocalRef(env, text_jstr);
|
||||
} while (pango_layout_iter_next_line(pango_iter));
|
||||
}
|
||||
|
||||
@@ -175,6 +175,9 @@ void set_up_handle_cache(JNIEnv *env)
|
||||
handle_cache.webview.class = _REF((*env)->FindClass(env, "android/webkit/WebView"));
|
||||
handle_cache.webview.internalGetAssetManager = _METHOD(handle_cache.webview.class, "internalGetAssetManager", "()Landroid/content/res/AssetManager;");
|
||||
handle_cache.webview.internalLoadChanged = _METHOD(handle_cache.webview.class, "internalLoadChanged", "(ILjava/lang/String;)V");
|
||||
|
||||
handle_cache.canvas.class = _REF((*env)->FindClass(env, "android/graphics/Canvas"));
|
||||
handle_cache.canvas.drawText = _METHOD(handle_cache.canvas.class, "drawText", "(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V");
|
||||
}
|
||||
|
||||
void extract_from_apk(const char *path, const char *target) {
|
||||
|
||||
@@ -128,6 +128,10 @@ struct handle_cache {
|
||||
jmethodID onCreate;
|
||||
jmethodID start;
|
||||
} instrumentation;
|
||||
struct {
|
||||
jclass class;
|
||||
jmethodID drawText;
|
||||
} canvas;
|
||||
};
|
||||
|
||||
extern struct handle_cache handle_cache;
|
||||
|
||||
Reference in New Issue
Block a user