diff options
| author | Po Lu | 2023-09-14 16:53:04 +0800 |
|---|---|---|
| committer | Po Lu | 2023-09-14 16:53:21 +0800 |
| commit | 6ffb0a17199d70e5d4e5fc155897acf0ef2ccac6 (patch) | |
| tree | c5f76e2dbe7fc3c0d1f448ff9f9f286956ce6fb9 /java | |
| parent | f13b08be11533c546fed257dcf8e3812a53b672a (diff) | |
| download | emacs-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.java | 11 | ||||
| -rw-r--r-- | java/org/gnu/emacs/EmacsSdk23FontDriver.java | 10 | ||||
| -rw-r--r-- | java/org/gnu/emacs/EmacsSdk7FontDriver.java | 16 |
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 | ||