< prev index next >
src/java.desktop/share/classes/sun/font/TrueTypeGlyphMapper.java
Print this page
*** 85,95 ****
Integer.toHexString((int)glyphCode) +
" for char " + Integer.toHexString(charCode));
}
return (char)missingGlyph;
}
! } catch(Exception e) {
handleBadCMAP();
return (char) missingGlyph;
}
}
--- 85,120 ----
Integer.toHexString((int)glyphCode) +
" for char " + Integer.toHexString(charCode));
}
return (char)missingGlyph;
}
! } catch (Exception e) {
! handleBadCMAP();
! return (char) missingGlyph;
! }
! }
!
! private char getGlyphFromCMAPVS(int charCode, int variationSelector) {
! if (variationSelector == 0) {
! return getGlyphFromCMAP(charCode);
! }
! try {
! char glyphCode = cmap.getGlyph(charCode, variationSelector, true);
! if (glyphCode < numGlyphs ||
! glyphCode >= FileFontStrike.INVISIBLE_GLYPHS) {
! return glyphCode;
! } else {
! if (FontUtilities.isLogging()) {
! FontUtilities.getLogger().warning
! (font + " out of range glyph id=" +
! Integer.toHexString((int)glyphCode) +
! " for char " + Integer.toHexString(charCode) +
! " for vs " + Integer.toHexString(variationSelector));
! }
! return (char)missingGlyph;
! }
! } catch (Exception e) {
handleBadCMAP();
return (char) missingGlyph;
}
}
*** 135,145 ****
}
return glyph;
}
public void charsToGlyphs(int count, int[] unicodes, int[] glyphs) {
! for (int i=0;i<count;i++) {
if (needsJAremapping) {
glyphs[i] = getGlyphFromCMAP(remapJAIntChar(unicodes[i]));
} else {
glyphs[i] = getGlyphFromCMAP(unicodes[i]);
}
--- 160,201 ----
}
return glyph;
}
public void charsToGlyphs(int count, int[] unicodes, int[] glyphs) {
! for (int i = 0; i < count; i++) {
! if (isVariationSelector(unicodes[i])) {
! charsToGlyphsVS(count, unicodes, glyphs);
! return;
! }
! if (needsJAremapping) {
! glyphs[i] = getGlyphFromCMAP(remapJAIntChar(unicodes[i]));
! } else {
! glyphs[i] = getGlyphFromCMAP(unicodes[i]);
! }
! if (font.checkUseNatives() &&
! glyphs[i] < font.glyphToCharMap.length) {
! font.glyphToCharMap[glyphs[i]] = (char)unicodes[i];
! }
! }
! }
!
! private void charsToGlyphsVS(int count, int[] unicodes, int[] glyphs) {
! for (int i = 0; i < count; i++) {
! if (i < count - 1 &&
! isVariationSelector(unicodes[i + 1]) &&
! isVSBaseChar(unicodes[i])) {
! if (needsJAremapping) {
! glyphs[i] = getGlyphFromCMAPVS(remapJAIntChar(unicodes[i]),
! unicodes[i + 1]);
! } else {
! glyphs[i] = getGlyphFromCMAPVS(unicodes[i],
! unicodes[i + 1]);
! }
! i++;
! glyphs[i] = INVISIBLE_GLYPH_ID;
! } else {
if (needsJAremapping) {
glyphs[i] = getGlyphFromCMAP(remapJAIntChar(unicodes[i]));
} else {
glyphs[i] = getGlyphFromCMAP(unicodes[i]);
}
*** 147,160 ****
glyphs[i] < font.glyphToCharMap.length) {
font.glyphToCharMap[glyphs[i]] = (char)unicodes[i];
}
}
}
public void charsToGlyphs(int count, char[] unicodes, int[] glyphs) {
! for (int i=0; i<count; i++) {
int code;
if (needsJAremapping) {
code = remapJAChar(unicodes[i]);
} else {
code = unicodes[i]; // char is unsigned.
--- 203,217 ----
glyphs[i] < font.glyphToCharMap.length) {
font.glyphToCharMap[glyphs[i]] = (char)unicodes[i];
}
}
}
+ }
public void charsToGlyphs(int count, char[] unicodes, int[] glyphs) {
! for (int i = 0; i < count; i++) {
int code;
if (needsJAremapping) {
code = remapJAChar(unicodes[i]);
} else {
code = unicodes[i]; // char is unsigned.
*** 167,188 ****
--- 224,310 ----
if (low >= LO_SURROGATE_START &&
low <= LO_SURROGATE_END) {
code = (code - HI_SURROGATE_START) *
0x400 + low - LO_SURROGATE_START + 0x10000;
+ if (isVariationSelector(code)) {
+ charsToGlyphsVS(count, unicodes, glyphs);
+ return;
+ }
glyphs[i] = getGlyphFromCMAP(code);
i += 1; // Empty glyph slot after surrogate
glyphs[i] = INVISIBLE_GLYPH_ID;
continue;
}
+ } else if (isVariationSelectorBMP(unicodes[i])) {
+ charsToGlyphsVS(count, unicodes, glyphs);
+ return;
+ }
+ glyphs[i] = getGlyphFromCMAP(code);
+
+ if (font.checkUseNatives() &&
+ glyphs[i] < font.glyphToCharMap.length) {
+ font.glyphToCharMap[glyphs[i]] = (char)code;
+ }
+
+ }
+ }
+
+ private void charsToGlyphsVS(int count, char[] unicodes, int[] glyphs) {
+ for (int i = 0; i < count; i++) {
+ int code;
+ int variationSelector = 0;
+ int step = 1;
+ if (needsJAremapping) {
+ code = remapJAChar(unicodes[i]);
+ } else {
+ code = unicodes[i]; // char is unsigned.
+ }
+
+ if (code >= HI_SURROGATE_START &&
+ code <= HI_SURROGATE_END && i < count - 1) {
+ char low = unicodes[i + 1];
+
+ if (low >= LO_SURROGATE_START &&
+ low <= LO_SURROGATE_END) {
+ code = (code - HI_SURROGATE_START) *
+ 0x400 + low - LO_SURROGATE_START + 0x10000;
+
+ glyphs[i + 1] = INVISIBLE_GLYPH_ID;
+ step = 2;
+ }
+ }
+ if (i < count - step &&
+ isVariationSelectorBMP(unicodes[i + step]) &&
+ isVSBaseChar(code)) {
+ variationSelector = unicodes[i + step];
+ glyphs[i] = getGlyphFromCMAPVS(code, variationSelector);
+ glyphs[i+step] = INVISIBLE_GLYPH_ID;
+ i += 1;
+ } else if (i < count - step -1 &&
+ isVariationSelectorExt(unicodes[i + step],
+ unicodes[i + step + 1]) &&
+ isVSBaseChar(code)) {
+ variationSelector = (unicodes[i + step] - HI_SURROGATE_START)
+ * 0x400 + unicodes[i + step + 1]
+ - LO_SURROGATE_START + 0x10000;
+ glyphs[i] = getGlyphFromCMAPVS(code, variationSelector);
+ glyphs[i + step] = INVISIBLE_GLYPH_ID;
+ glyphs[i + step + 1] = INVISIBLE_GLYPH_ID;
+ i += 2;
}
+ if (variationSelector == 0) {
glyphs[i] = getGlyphFromCMAP(code);
if (font.checkUseNatives() &&
glyphs[i] < font.glyphToCharMap.length) {
font.glyphToCharMap[glyphs[i]] = (char)code;
}
+ }
+ if (code >= 0x10000) {
+ i++;
+ }
}
}
/* This variant checks if shaping is needed and immediately
*** 190,201 ****
* to check the return type because it needs to know how to handle
* the character data for display.
*/
public boolean charsToGlyphsNS(int count, char[] unicodes, int[] glyphs) {
! for (int i=0; i<count; i++) {
int code;
if (needsJAremapping) {
code = remapJAChar(unicodes[i]);
} else {
code = unicodes[i]; // char is unsigned.
}
--- 312,371 ----
* to check the return type because it needs to know how to handle
* the character data for display.
*/
public boolean charsToGlyphsNS(int count, char[] unicodes, int[] glyphs) {
! for (int i = 0; i < count; i++) {
! int code;
! if (needsJAremapping) {
! code = remapJAChar(unicodes[i]);
! } else {
! code = unicodes[i]; // char is unsigned.
! }
!
! if (code >= HI_SURROGATE_START &&
! code <= HI_SURROGATE_END && i < count - 1) {
! char low = unicodes[i + 1];
!
! if (low >= LO_SURROGATE_START &&
! low <= LO_SURROGATE_END) {
! code = (code - HI_SURROGATE_START) *
! 0x400 + low - LO_SURROGATE_START + 0x10000;
! glyphs[i + 1] = INVISIBLE_GLYPH_ID;
! }
! }
! if (isVariationSelector(code)) {
! return charsToGlyphsNSVS(count, unicodes, glyphs);
! }
!
! glyphs[i] = getGlyphFromCMAP(code);
! if (font.checkUseNatives() &&
! glyphs[i] < font.glyphToCharMap.length) {
! font.glyphToCharMap[glyphs[i]] = (char)code;
! }
!
! if (code < FontUtilities.MIN_LAYOUT_CHARCODE) {
! continue;
! }
! else if (FontUtilities.isComplexCharCode(code)) {
! return true;
! }
! else if (code >= 0x10000) {
! i += 1; // Empty glyph slot after surrogate
! continue;
! }
! }
!
! return false;
! }
!
! private boolean charsToGlyphsNSVS(int count, char[] unicodes,
! int[] glyphs) {
! for (int i = 0; i < count; i++) {
int code;
+ int step = 1;
+ int variationSelector = 0;
if (needsJAremapping) {
code = remapJAChar(unicodes[i]);
} else {
code = unicodes[i]; // char is unsigned.
}
*** 207,224 ****
--- 377,416 ----
if (low >= LO_SURROGATE_START &&
low <= LO_SURROGATE_END) {
code = (code - HI_SURROGATE_START) *
0x400 + low - LO_SURROGATE_START + 0x10000;
glyphs[i + 1] = INVISIBLE_GLYPH_ID;
+ step = 2;
}
}
+ if (i < count - step &&
+ isVariationSelectorBMP(unicodes[i + step]) &&
+ isVSBaseChar(code)) {
+ variationSelector = unicodes[i + step];
+ glyphs[i] = getGlyphFromCMAPVS(code, variationSelector);
+ glyphs[i+step] = INVISIBLE_GLYPH_ID;
+ i += 1;
+ } else if (i < count - step - 1 &&
+ isVariationSelectorExt(unicodes[i + step],
+ unicodes[i + step + 1]) &&
+ isVSBaseChar(code)) {
+ variationSelector = (unicodes[i + step] - HI_SURROGATE_START)
+ * 0x400 + unicodes[i + step + 1]
+ - LO_SURROGATE_START + 0x10000;
+ glyphs[i] = getGlyphFromCMAPVS(code, variationSelector);
+ glyphs[i + step] = INVISIBLE_GLYPH_ID;
+ glyphs[i + step + 1] = INVISIBLE_GLYPH_ID;
+ i += 2;
+ }
+ if (variationSelector == 0) {
glyphs[i] = getGlyphFromCMAP(code);
if (font.checkUseNatives() &&
glyphs[i] < font.glyphToCharMap.length) {
font.glyphToCharMap[glyphs[i]] = (char)code;
}
+ }
if (code < FontUtilities.MIN_LAYOUT_CHARCODE) {
continue;
}
else if (FontUtilities.isComplexCharCode(code)) {
*** 240,245 ****
--- 432,441 ----
return
cmap instanceof CMap.CMapFormat8 ||
cmap instanceof CMap.CMapFormat10 ||
cmap instanceof CMap.CMapFormat12;
}
+
+ int getGlyphOfVS(int charCode, int variationSelector) {
+ return cmap.getGlyph(charCode, variationSelector, false);
+ }
}
< prev index next >