< prev index next >
src/java.desktop/share/classes/sun/font/SunLayoutEngine.java
Print this page
*** 101,113 ****
--- 101,124 ----
* script/font combinations will be small, so a flat hashtable should
* suffice.
* */
public final class SunLayoutEngine implements LayoutEngine, LayoutEngineFactory {
private static native void initGVIDs();
+ private static final boolean useICU;
static {
FontManagerNativeLibrary.load();
initGVIDs();
+ String le = java.security.AccessController.doPrivileged(
+ new sun.security.action.
+ GetPropertyAction("sun.font.layoutengine", ""));
+ useICU = le.equals("icu");
+ String verbose = java.security.AccessController.doPrivileged(
+ new sun.security.action.
+ GetPropertyAction("sun.font.layoutengine.verbose", ""));
+ if ("true".equalsIgnoreCase(verbose)) {
+ System.out.println("Using " + (useICU ? "icu." : "harfbuzz."));
+ }
}
private LayoutEngineKey key;
private static LayoutEngineFactory instance;
*** 148,170 ****
--- 159,217 ----
private SunLayoutEngine(LayoutEngineKey key) {
this.key = key;
}
+ private boolean isAAT(Font2D font) {
+ if (font instanceof TrueTypeFont) {
+ TrueTypeFont ttf = (TrueTypeFont)font;
+ return ttf.getDirectoryEntry(TrueTypeFont.morxTag) != null ||
+ ttf.getDirectoryEntry(TrueTypeFont.mortTag) != null;
+ } else if (font instanceof PhysicalFont) {
+ PhysicalFont pf = (PhysicalFont)font;
+ return pf.getTableBytes(TrueTypeFont.morxTag) != null ||
+ pf.getTableBytes(TrueTypeFont.mortTag) != null;
+ }
+ return false;
+ }
+
public void layout(FontStrikeDesc desc, float[] mat, int gmask,
int baseIndex, TextRecord tr, int typo_flags,
Point2D.Float pt, GVData data) {
Font2D font = key.font();
FontStrike strike = font.getStrike(desc);
long layoutTables = font.getLayoutTableCache();
+ if (useICU) {
nativeLayout(font, strike, mat, gmask, baseIndex,
tr.text, tr.start, tr.limit, tr.min, tr.max,
key.script(), key.lang(), typo_flags, pt, data,
font.getUnitsPerEm(), layoutTables);
+ } else {
+ long pNativeFont = font.getPlatformNativeFontPtr(); // used on OSX
+ // pScaler probably not needed long term.
+ long pScaler = 0L;
+ if (font instanceof FileFont) {
+ pScaler = ((FileFont)font).getScaler().nativeScaler;
+ }
+ shape(font, strike, mat, pScaler, pNativeFont, isAAT(font),
+ tr.text, data, key.script(),
+ tr.start, tr.limit, baseIndex, pt,
+ typo_flags, gmask);
+ }
}
+ /* Native method to invoke ICU layout engine */
private static native void
nativeLayout(Font2D font, FontStrike strike, float[] mat, int gmask,
int baseIndex, char[] chars, int offset, int limit,
int min, int max, int script, int lang, int typo_flags,
Point2D.Float pt, GVData data, long upem, long layoutTables);
+
+
+ /* Native method to invoke harfbuzz layout engine */
+ private static native boolean
+ shape(Font2D font, FontStrike strike, float[] mat,
+ long pscaler, long pNativeFont, boolean aat,
+ char[] chars, GVData data,
+ int script, int offset, int limit,
+ int baseIndex, Point2D.Float pt, int typo_flags, int slot);
}
< prev index next >