< prev index next >

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

Print this page

        

@@ -23,10 +23,13 @@
  * questions.
  */
 
 package sun.font;
 
+import sun.java2d.Disposer;
+import sun.java2d.DisposerRecord;
+
 import java.awt.Font;
 import java.awt.font.FontRenderContext;
 import java.awt.geom.AffineTransform;
 import java.lang.ref.Reference;
 import java.lang.ref.SoftReference;

@@ -73,10 +76,12 @@
     protected String fullName;             /* Full font name (english)   */
     protected int style = Font.PLAIN;
     protected FontFamily family;
     protected int fontRank = DEFAULT_RANK;
 
+    private HarfbuzzFaceRef harfbuzzFaceRef;
+
     /*
      * A mapper can be independent of the strike.
      * Perhaps the reference to the mapper ought to be held on the
      * scaler, as it may be implemented via scaler functionality anyway
      * and so the mapper would be useless if its native portion was

@@ -476,10 +481,27 @@
      */
     protected long getPlatformNativeFontPtr() {
         return 0L;
     }
 
+    protected boolean isAAT() {
+        return false;
+    }
+
+    synchronized long getHarfbuzzFacePtr() {
+        if (harfbuzzFaceRef == null) {
+            long harfbuzzFaceNativePtr = createHarfbuzzFace(isAAT(), getPlatformNativeFontPtr());
+            if (harfbuzzFaceNativePtr == 0) return 0;
+            harfbuzzFaceRef = new HarfbuzzFaceRef(harfbuzzFaceNativePtr);
+            Disposer.addObjectRecord(this, harfbuzzFaceRef);
+        }
+        return harfbuzzFaceRef.harfbuzzFaceNativePtr;
+    }
+
+    private native long createHarfbuzzFace(boolean aat, long platformNativeFontPtr);
+    private static native void disposeHarfbuzzFace(long harfbuzzFaceNativePtr);
+
     /* for layout code */
     protected long getUnitsPerEm() {
         return 2048;
     }
 

@@ -557,6 +579,18 @@
              */
             return metrics.ascentX/-metrics.ascentY;
         }
     }
 
+    private static class HarfbuzzFaceRef implements DisposerRecord {
+        private final long harfbuzzFaceNativePtr;
+
+        private HarfbuzzFaceRef(long harfbuzzFaceNativePtr) {
+            this.harfbuzzFaceNativePtr = harfbuzzFaceNativePtr;
+        }
+
+        @Override
+        public void dispose() {
+            disposeHarfbuzzFace(harfbuzzFaceNativePtr);
+        }
+    }
 }
< prev index next >