Speedup text rendering on Android slightly, eliminate possible assert

This commit is contained in:
Henrik Rydgård
2026-01-01 23:03:58 +01:00
parent 02d621c0f6
commit cadbe3a2e0
2 changed files with 9 additions and 9 deletions
+8 -3
View File
@@ -25,7 +25,7 @@ TextDrawerAndroid::TextDrawerAndroid(Draw::DrawContext *draw) : TextDrawer(draw)
method_allocFont = env->GetStaticMethodID(cls_textRenderer, "allocFont", "(Ljava/lang/String;)I");
method_freeAllFonts = env->GetStaticMethodID(cls_textRenderer, "freeAllFonts", "()V");
method_measureText = env->GetStaticMethodID(cls_textRenderer, "measureText", "(Ljava/lang/String;ID)I");
method_renderText = env->GetStaticMethodID(cls_textRenderer, "renderText", "(Ljava/lang/String;ID)[I");
method_renderText = env->GetStaticMethodID(cls_textRenderer, "renderText", "(Ljava/lang/String;IDII)[I");
} else {
ERROR_LOG(Log::G3D, "Failed to find class: '%s'", textRendererClassName);
}
@@ -126,7 +126,7 @@ bool TextDrawerAndroid::DrawStringBitmap(std::vector<uint8_t> &bitmapData, TextS
// WARN_LOG(Log::G3D, "Text: '%.*s' (%02x)", (int)str.length(), str.data(), str[0]);
// TODO: Handle bold/italic
jintArray imageData = (jintArray)env->CallStaticObjectMethod(cls_textRenderer, method_renderText, jstr, iter->second.font, iter->second.size);
jintArray imageData = (jintArray)env->CallStaticObjectMethod(cls_textRenderer, method_renderText, jstr, iter->second.font, iter->second.size, imageWidth, imageHeight);
env->DeleteLocalRef(jstr);
entry.texture = nullptr;
@@ -137,7 +137,12 @@ bool TextDrawerAndroid::DrawStringBitmap(std::vector<uint8_t> &bitmapData, TextS
entry.lastUsedFrame = frameCount_;
jint *jimage = env->GetIntArrayElements(imageData, nullptr);
_assert_(env->GetArrayLength(imageData) == imageWidth * imageHeight);
if (env->GetArrayLength(imageData) != imageWidth * imageHeight) {
ERROR_LOG(Log::G3D, "TextRenderer returned bad image size");
env->ReleaseIntArrayElements(imageData, jimage, JNI_ABORT);
env->DeleteLocalRef(imageData);
return false;
}
if (texFormat == Draw::DataFormat::B4G4R4A4_UNORM_PACK16 || texFormat == Draw::DataFormat::R4G4B4A4_UNORM_PACK16) {
bitmapData.resize(entry.bmWidth * entry.bmHeight * sizeof(uint16_t));
uint16_t *bitmapData16 = (uint16_t *)&bitmapData[0];
@@ -109,14 +109,9 @@ public class TextRenderer {
Point s = measure(string, font, textSize);
return (s.x << 16) | s.y;
}
public static int[] renderText(String string, int font, double textSize) {
public static int[] renderText(String string, int font, double textSize, int w, int h) {
textPaint.setTypeface(fontMap.get(font));
textPaint.setTextSize((float) textSize);
Point s = measure(string, font, textSize);
int w = s.x;
int h = s.y;
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);