aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorPo Lu2023-09-14 16:53:04 +0800
committerPo Lu2023-09-14 16:53:21 +0800
commit6ffb0a17199d70e5d4e5fc155897acf0ef2ccac6 (patch)
treec5f76e2dbe7fc3c0d1f448ff9f9f286956ce6fb9 /java
parentf13b08be11533c546fed257dcf8e3812a53b672a (diff)
downloademacs-6ffb0a17199d70e5d4e5fc155897acf0ef2ccac6.tar.gz
emacs-6ffb0a17199d70e5d4e5fc155897acf0ef2ccac6.zip
Avert a crash in the Android last resort font driver
* java/org/gnu/emacs/EmacsFontDriver.java (FONT_INVALID_CODE): New constant. (hasChar, encodeChar): Accept a jint character code rather than a jchar. * java/org/gnu/emacs/EmacsSdk23FontDriver.java (hasChar) (encodeChar): Return 0 or FONT_INVALID_CODE if the character is not representable in a Java char. * java/org/gnu/emacs/EmacsSdk7FontDriver.java (hasChar): Ditto. * src/androidfont.c (android_init_font_driver): Adjust signature to match.
Diffstat (limited to 'java')
-rw-r--r--java/org/gnu/emacs/EmacsFontDriver.java11
-rw-r--r--java/org/gnu/emacs/EmacsSdk23FontDriver.java10
-rw-r--r--java/org/gnu/emacs/EmacsSdk7FontDriver.java16
3 files changed, 29 insertions, 8 deletions
diff --git a/java/org/gnu/emacs/EmacsFontDriver.java b/java/org/gnu/emacs/EmacsFontDriver.java
index ff52899a897..798c3cfb032 100644
--- a/java/org/gnu/emacs/EmacsFontDriver.java
+++ b/java/org/gnu/emacs/EmacsFontDriver.java
@@ -63,6 +63,11 @@ public abstract class EmacsFontDriver
63 public static final int MONO = 100; 63 public static final int MONO = 100;
64 public static final int CHARCELL = 110; 64 public static final int CHARCELL = 110;
65 65
66 /* Special glyph codes. */
67 public static final int FONT_INVALID_CODE = 0xFFFFFFFF;
68
69
70
66 public static class FontSpec 71 public static class FontSpec
67 { 72 {
68 /* The fields below mean the same as they do in enum 73 /* The fields below mean the same as they do in enum
@@ -148,15 +153,17 @@ public abstract class EmacsFontDriver
148 } 153 }
149 }; 154 };
150 155
156
157
151 /* These mean the same as they do in struct font_driver. */ 158 /* These mean the same as they do in struct font_driver. */
152 public abstract FontEntity[] list (FontSpec fontSpec); 159 public abstract FontEntity[] list (FontSpec fontSpec);
153 public abstract FontEntity match (FontSpec fontSpec); 160 public abstract FontEntity match (FontSpec fontSpec);
154 public abstract String[] listFamilies (); 161 public abstract String[] listFamilies ();
155 public abstract FontObject openFont (FontEntity fontEntity, int pixelSize); 162 public abstract FontObject openFont (FontEntity fontEntity, int pixelSize);
156 public abstract int hasChar (FontSpec font, char charCode); 163 public abstract int hasChar (FontSpec font, int charCode);
157 public abstract void textExtents (FontObject font, int code[], 164 public abstract void textExtents (FontObject font, int code[],
158 FontMetrics fontMetrics); 165 FontMetrics fontMetrics);
159 public abstract int encodeChar (FontObject fontObject, char charCode); 166 public abstract int encodeChar (FontObject fontObject, int charCode);
160 public abstract int draw (FontObject fontObject, EmacsGC gc, 167 public abstract int draw (FontObject fontObject, EmacsGC gc,
161 EmacsDrawable drawable, int[] chars, 168 EmacsDrawable drawable, int[] chars,
162 int x, int y, int backgroundWidth, 169 int x, int y, int backgroundWidth,
diff --git a/java/org/gnu/emacs/EmacsSdk23FontDriver.java b/java/org/gnu/emacs/EmacsSdk23FontDriver.java
index aaba8dbd166..0752d8064ac 100644
--- a/java/org/gnu/emacs/EmacsSdk23FontDriver.java
+++ b/java/org/gnu/emacs/EmacsSdk23FontDriver.java
@@ -96,7 +96,7 @@ public final class EmacsSdk23FontDriver extends EmacsSdk7FontDriver
96 96
97 @Override 97 @Override
98 public int 98 public int
99 hasChar (FontSpec font, char charCode) 99 hasChar (FontSpec font, int charCode)
100 { 100 {
101 Sdk7FontObject fontObject; 101 Sdk7FontObject fontObject;
102 Paint paint; 102 Paint paint;
@@ -109,6 +109,12 @@ public final class EmacsSdk23FontDriver extends EmacsSdk7FontDriver
109 else 109 else
110 paint = ((Sdk7FontEntity) font).typeface.typefacePaint; 110 paint = ((Sdk7FontEntity) font).typeface.typefacePaint;
111 111
112 return paint.hasGlyph (String.valueOf (charCode)) ? 1 : 0; 112 /* If the character falls within the confines of the BMP, return
113 1. */
114 if (charCode < 65536)
115 return paint.hasGlyph (String.valueOf ((char) charCode)) ? 1 : 0;
116
117 /* Otherwise return 0. */
118 return 0;
113 } 119 }
114}; 120};
diff --git a/java/org/gnu/emacs/EmacsSdk7FontDriver.java b/java/org/gnu/emacs/EmacsSdk7FontDriver.java
index b8aecbe7c2d..21ae159d5bd 100644
--- a/java/org/gnu/emacs/EmacsSdk7FontDriver.java
+++ b/java/org/gnu/emacs/EmacsSdk7FontDriver.java
@@ -291,13 +291,18 @@ public class EmacsSdk7FontDriver extends EmacsFontDriver
291 291
292 @Override 292 @Override
293 public int 293 public int
294 hasChar (FontSpec font, char charCode) 294 hasChar (FontSpec font, int charCode)
295 { 295 {
296 float missingGlyphWidth, width; 296 float missingGlyphWidth, width;
297 Rect rect1, rect2; 297 Rect rect1, rect2;
298 Paint paint; 298 Paint paint;
299 Sdk7FontObject fontObject; 299 Sdk7FontObject fontObject;
300 300
301 /* Ignore characters outside the BMP. */
302
303 if (charCode > 65535)
304 return 0;
305
301 if (font instanceof Sdk7FontObject) 306 if (font instanceof Sdk7FontObject)
302 { 307 {
303 fontObject = (Sdk7FontObject) font; 308 fontObject = (Sdk7FontObject) font;
@@ -308,7 +313,7 @@ public class EmacsSdk7FontDriver extends EmacsFontDriver
308 313
309 paint.setTextSize (10); 314 paint.setTextSize (10);
310 315
311 if (Character.isWhitespace (charCode)) 316 if (Character.isWhitespace ((char) charCode))
312 return 1; 317 return 1;
313 318
314 missingGlyphWidth = paint.measureText (TOFU_STRING); 319 missingGlyphWidth = paint.measureText (TOFU_STRING);
@@ -325,7 +330,7 @@ public class EmacsSdk7FontDriver extends EmacsFontDriver
325 330
326 paint.getTextBounds (TOFU_STRING, 0, TOFU_STRING.length (), 331 paint.getTextBounds (TOFU_STRING, 0, TOFU_STRING.length (),
327 rect1); 332 rect1);
328 paint.getTextBounds ("" + charCode, 0, 1, rect2); 333 paint.getTextBounds ("" + (char) charCode, 0, 1, rect2);
329 return rect1.equals (rect2) ? 0 : 1; 334 return rect1.equals (rect2) ? 0 : 1;
330 } 335 }
331 336
@@ -410,8 +415,11 @@ public class EmacsSdk7FontDriver extends EmacsFontDriver
410 415
411 @Override 416 @Override
412 public int 417 public int
413 encodeChar (FontObject fontObject, char charCode) 418 encodeChar (FontObject fontObject, int charCode)
414 { 419 {
420 if (charCode > 65535)
421 return FONT_INVALID_CODE;
422
415 return charCode; 423 return charCode;
416 } 424 }
417 425