19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.font; 27 28 /* 29 * NB the versions that take a char as an int are used by the opentype 30 * layout engine. If that remains in native these methods may not be 31 * needed in the Java class. 32 */ 33 public abstract class CharToGlyphMapper { 34 35 public static final int HI_SURROGATE_START = 0xD800; 36 public static final int HI_SURROGATE_END = 0xDBFF; 37 public static final int LO_SURROGATE_START = 0xDC00; 38 public static final int LO_SURROGATE_END = 0xDFFF; 39 40 public static final int UNINITIALIZED_GLYPH = -1; 41 public static final int INVISIBLE_GLYPH_ID = 0xffff; 42 public static final int INVISIBLE_GLYPHS = 0xfffe; // and above 43 44 protected int missingGlyph = CharToGlyphMapper.UNINITIALIZED_GLYPH; 45 46 public int getMissingGlyphCode() { 47 return missingGlyph; 48 } 49 50 /* Default implementations of these methods may be overridden by 51 * subclasses which have special requirements or optimisations 52 */ 53 54 public boolean canDisplay(char ch) { 55 int glyph = charToGlyph(ch); 56 return glyph != missingGlyph; 57 } 58 71 72 public int charToGlyph(int unicode) { 73 int[] chars = new int[1]; 74 int [] glyphs = new int[1]; 75 chars[0] = unicode; 76 charsToGlyphs(1, chars, glyphs); 77 return glyphs[0]; 78 } 79 80 public abstract int getNumGlyphs(); 81 82 public abstract void charsToGlyphs(int count, 83 char[] unicodes, int[] glyphs); 84 85 public abstract boolean charsToGlyphsNS(int count, 86 char[] unicodes, int[] glyphs); 87 88 public abstract void charsToGlyphs(int count, 89 int[] unicodes, int[] glyphs); 90 91 } | 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.font; 27 28 /* 29 * NB the versions that take a char as an int are used by the opentype 30 * layout engine. If that remains in native these methods may not be 31 * needed in the Java class. 32 */ 33 public abstract class CharToGlyphMapper { 34 35 public static final int HI_SURROGATE_START = 0xD800; 36 public static final int HI_SURROGATE_END = 0xDBFF; 37 public static final int LO_SURROGATE_START = 0xDC00; 38 public static final int LO_SURROGATE_END = 0xDFFF; 39 public static final int VS_START = 0xFE00; 40 public static final int VS_END = 0xFE0F; 41 public static final int VSS_START = 0xE0100; 42 public static final int VSS_END = 0xE01FF; 43 44 public static final int UNINITIALIZED_GLYPH = -1; 45 public static final int INVISIBLE_GLYPH_ID = 0xffff; 46 public static final int INVISIBLE_GLYPHS = 0xfffe; // and above 47 48 protected int missingGlyph = CharToGlyphMapper.UNINITIALIZED_GLYPH; 49 50 public int getMissingGlyphCode() { 51 return missingGlyph; 52 } 53 54 /* Default implementations of these methods may be overridden by 55 * subclasses which have special requirements or optimisations 56 */ 57 58 public boolean canDisplay(char ch) { 59 int glyph = charToGlyph(ch); 60 return glyph != missingGlyph; 61 } 62 75 76 public int charToGlyph(int unicode) { 77 int[] chars = new int[1]; 78 int [] glyphs = new int[1]; 79 chars[0] = unicode; 80 charsToGlyphs(1, chars, glyphs); 81 return glyphs[0]; 82 } 83 84 public abstract int getNumGlyphs(); 85 86 public abstract void charsToGlyphs(int count, 87 char[] unicodes, int[] glyphs); 88 89 public abstract boolean charsToGlyphsNS(int count, 90 char[] unicodes, int[] glyphs); 91 92 public abstract void charsToGlyphs(int count, 93 int[] unicodes, int[] glyphs); 94 95 // Based on Unicode 10.0.0 chapter 23.4 96 public static boolean isVSBaseChar(int charCode) { 97 int type = Character.getType(charCode); 98 if (type == Character.UNASSIGNED || 99 type == Character.CONTROL || 100 type == Character.FORMAT || 101 type == Character.NON_SPACING_MARK) { 102 return false; 103 } 104 return java.text.Normalizer.isNormalized( 105 java.nio.CharBuffer.wrap(Character.toChars(charCode)), 106 java.text.Normalizer.Form.NFD); 107 } 108 109 public static boolean isVariationSelector(int charCode) { 110 return ((charCode >= VSS_START && charCode <= VSS_END) || 111 (charCode >= VS_START && charCode <= VS_END)); 112 } 113 114 public static boolean isVariationSelectorBMP(char charCode) { 115 return (charCode >= VS_START && charCode <= VS_END); 116 } 117 118 public static boolean isVariationSelectorExt(char charCode1, 119 char charCode2) { 120 return (charCode1 == 0xDB40 && 121 (charCode2 >= 0xDD00 && charCode2 <= 0xDDEF)); 122 // VSS_START - VSS_END 123 } 124 125 } |