--- old/src/java.desktop/share/classes/sun/font/CharToGlyphMapper.java 2018-04-25 08:07:31.000000000 -0700 +++ new/src/java.desktop/share/classes/sun/font/CharToGlyphMapper.java 2018-04-25 08:07:31.000000000 -0700 @@ -88,4 +88,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 >= 0xE0100 && charCode <= 0xE01FF) || + (charCode >= 0xFE00 && charCode <= 0xFE0F) || + (charCode >= 0x180B && charCode <= 0x180D)); + } + + public static boolean isVariationSelector(char charCode) { + return ((charCode >= 0xFE00 && charCode <= 0xFE0F) || + (charCode >= 0x180B && charCode <= 0x180D)); + } + + public static boolean isVariationSelector(char charCode1, char charCode2) { + return (charCode1 == 0xDB40 && + charCode2 >= 0xDD00 && charCode2 <= 0xDDEF); + // 0xE0100 - 0xE01FF + } + }