< prev index next >

src/java.desktop/share/classes/sun/font/SunLayoutEngine.java

Print this page

        

@@ -101,13 +101,24 @@
  * 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,23 +159,59 @@
 
     private SunLayoutEngine(LayoutEngineKey key) {
         this.key = key;
     }
 
-    public void layout(FontStrikeDesc desc, float[] mat, int gmask,
+    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, float ptSize, 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, ptSize, 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 ptSize, 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 >