--- old/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java 2015-11-17 15:39:40.000000000 -0800 +++ new/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java 2015-11-17 15:39:40.000000000 -0800 @@ -103,9 +103,20 @@ * */ 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; @@ -150,21 +161,57 @@ 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); }