1 /* 2 * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 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 63 public boolean canDisplay(int cp) { 64 int glyph = charToGlyph(cp); 65 return glyph != missingGlyph; 66 } 67 68 public int charToGlyph(char unicode) { 69 char[] chars = new char[1]; 70 int[] glyphs = new int[1]; 71 chars[0] = unicode; 72 charsToGlyphs(1, chars, glyphs); 73 return glyphs[0]; 74 } 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 protected boolean hasVariationSelectorGlyph(int charCode, 96 int variationSelector) { 97 return false; 98 } 99 100 public static boolean isBaseChar(int charCode) { 101 int type = Character.getType(charCode); 102 if (type == Character.UNASSIGNED || 103 type == Character.CONTROL || 104 type == Character.FORMAT || 105 type == Character.NON_SPACING_MARK) { 106 return false; 107 } 108 return java.text.Normalizer.isNormalized( 109 java.nio.CharBuffer.wrap(Character.toChars(charCode)), 110 java.text.Normalizer.Form.NFD); 111 } 112 113 public static boolean isVariationSelector(int charCode) { 114 return ((charCode >= VSS_START && charCode <= VSS_END) || 115 (charCode >= VS_START && charCode <= VS_END)); 116 } 117 118 public static boolean isVariationSelector(char charCode) { 119 return (charCode >= VS_START && charCode <= VS_END); 120 } 121 122 public static boolean isVariationSelector(char charCode1, 123 char charCode2) { 124 return (charCode1 == 0xDB40 && 125 (charCode2 >= 0xDD00 && charCode2 <= 0xDDEF)); 126 // VSS_START - VSS_END 127 } 128 129 }