--- old/src/java.desktop/share/classes/sun/font/CharToGlyphMapper.java 2018-05-31 15:12:51.000000000 -0700 +++ new/src/java.desktop/share/classes/sun/font/CharToGlyphMapper.java 2018-05-31 15:12:51.000000000 -0700 @@ -36,6 +36,10 @@ public static final int HI_SURROGATE_END = 0xDBFF; public static final int LO_SURROGATE_START = 0xDC00; public static final int LO_SURROGATE_END = 0xDFFF; + public static final int VS_START = 0xFE00; + public static final int VS_END = 0xFE0F; + public static final int VSS_START = 0xE0100; + public static final int VSS_END = 0xE01FF; public static final int UNINITIALIZED_GLYPH = -1; public static final int INVISIBLE_GLYPH_ID = 0xffff; @@ -88,4 +92,38 @@ public abstract void charsToGlyphs(int count, int[] unicodes, int[] glyphs); + protected boolean hasVariationSelectorGlyph(int charCode, + int variationSelector) { + return false; + } + + public static boolean isBaseChar(int charCode) { + int type = Character.getType(charCode); + if (type == Character.UNASSIGNED || + type == Character.CONTROL || + type == Character.FORMAT || + type == Character.NON_SPACING_MARK) { + return false; + } + return java.text.Normalizer.isNormalized( + java.nio.CharBuffer.wrap(Character.toChars(charCode)), + java.text.Normalizer.Form.NFD); + } + + public static boolean isVariationSelector(int charCode) { + return ((charCode >= VSS_START && charCode <= VSS_END) || + (charCode >= VS_START && charCode <= VS_END)); + } + + public static boolean isVariationSelector(char charCode) { + return (charCode >= VS_START && charCode <= VS_END); + } + + public static boolean isVariationSelector(char charCode1, + char charCode2) { + return (charCode1 == 0xDB40 && + (charCode2 >= 0xDD00 && charCode2 <= 0xDDEF)); + // VSS_START - VSS_END + } + }