< prev index next >

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

Print this page

        

*** 23,50 **** --- 23,76 ---- * 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,70 **** --- 87,120 ---- 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 >