< prev index next >

modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTFontFile.java

Print this page

        

@@ -23,28 +23,54 @@
  * questions.
  */
 
 package com.sun.javafx.font.coretext;
 
+import com.sun.javafx.font.Disposer;
+import com.sun.javafx.font.DisposerRecord;
 import com.sun.javafx.font.FontStrikeDesc;
 import com.sun.javafx.font.PrismFontFile;
 import com.sun.javafx.font.PrismFontStrike;
 import com.sun.javafx.geom.Path2D;
 import com.sun.javafx.geom.transform.BaseTransform;
 
 class CTFontFile extends PrismFontFile {
 
+    private final long cgFontRef;
     /* Transform used for outline and bounds */
     private final static CGAffineTransform tx = new CGAffineTransform();
     static {
         tx.a = 1;   /* scale x */
         tx.d = -1;  /* scale y */
     }
 
+    private static class SelfDisposerRecord implements DisposerRecord {
+        private long cgFontRef;
+
+        SelfDisposerRecord(long cgFontRef) {
+            this.cgFontRef = cgFontRef;
+        }
+
+        @Override
+        public synchronized void dispose() {
+            if (cgFontRef != 0) {
+                OS.CFRelease(cgFontRef);
+                cgFontRef = 0;
+            }
+        }
+    }
+
     CTFontFile(String name, String filename, int fIndex, boolean register,
                boolean embedded, boolean copy, boolean tracked) throws Exception {
         super(name, filename, fIndex, register, embedded, copy, tracked);
+
+        if (embedded) {
+            cgFontRef = createCGFontForEmbeddedFont();
+            Disposer.addRecord(this, new SelfDisposerRecord(cgFontRef));
+        } else {
+            cgFontRef = 0;
+        }
     }
 
     public static boolean registerFont(String fontfile) {
         if (fontfile == null) return false;
         long alloc = OS.kCFAllocatorDefault();

@@ -61,10 +87,34 @@
             OS.CFRelease(fileRef);
         }
         return result;
     }
 
+    private long createCGFontForEmbeddedFont() {
+        long cgFontRef = 0;
+        final long fileNameRef = OS.CFStringCreate(getFileName());
+        if (fileNameRef != 0) {
+            final long url = OS.CFURLCreateWithFileSystemPath(
+                    OS.kCFAllocatorDefault(), fileNameRef,
+                    OS.kCFURLPOSIXPathStyle, false);
+            if (url != 0) {
+                final long dataProvider = OS.CGDataProviderCreateWithURL(url);
+                if (dataProvider != 0) {
+                    cgFontRef = OS.CGFontCreateWithDataProvider(dataProvider);
+                    OS.CFRelease(dataProvider);
+                }
+                OS.CFRelease(url);
+            }
+            OS.CFRelease(fileNameRef);
+        }
+        return cgFontRef;
+    }
+
+    long getCGFontRef() {
+        return cgFontRef;
+    }
+
     CGRect getBBox(int gc, float size) {
         CTFontStrike strike = (CTFontStrike)getStrike(size, BaseTransform.IDENTITY_TRANSFORM);
         long fontRef = strike.getFontRef();
         if (fontRef == 0) return null;
         long pathRef = OS.CTFontCreatePathForGlyph(fontRef, (short)gc, tx);
< prev index next >