< prev index next >
src/java.desktop/share/classes/sun/font/SunLayoutEngine.java
Print this page
*** 29,42 ****
*/
package sun.font;
import sun.font.GlyphLayout.*;
import java.awt.geom.Point2D;
import java.lang.ref.SoftReference;
import java.util.concurrent.ConcurrentHashMap;
- import java.util.Locale;
import java.util.WeakHashMap;
/*
* different ways to do this
* 1) each physical font2d keeps a hashtable mapping scripts to layout
--- 29,44 ----
*/
package sun.font;
import sun.font.GlyphLayout.*;
+ import sun.java2d.Disposer;
+ import sun.java2d.DisposerRecord;
+
import java.awt.geom.Point2D;
import java.lang.ref.SoftReference;
import java.util.concurrent.ConcurrentHashMap;
import java.util.WeakHashMap;
/*
* different ways to do this
* 1) each physical font2d keeps a hashtable mapping scripts to layout
*** 148,159 ****
private SunLayoutEngine(LayoutEngineKey key) {
this.key = key;
}
static WeakHashMap<Font2D, Boolean> aatInfo = new WeakHashMap<>();
! private boolean isAAT(Font2D font) {
Boolean aatObj;
synchronized (aatInfo) {
aatObj = aatInfo.get(font);
}
if (aatObj != null) {
--- 150,163 ----
private SunLayoutEngine(LayoutEngineKey key) {
this.key = key;
}
static WeakHashMap<Font2D, Boolean> aatInfo = new WeakHashMap<>();
+ private static final WeakHashMap<Font2D, FaceRef> facePtr =
+ new WeakHashMap<>();
! private static boolean isAAT(Font2D font) {
Boolean aatObj;
synchronized (aatInfo) {
aatObj = aatInfo.get(font);
}
if (aatObj != null) {
*** 173,204 ****
aatInfo.put(font, Boolean.valueOf(aat));
}
return aat;
}
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();
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,
! layoutTables, isAAT(font),
tr.text, data, key.script(),
tr.start, tr.limit, baseIndex, pt,
typo_flags, gmask);
}
/* Native method to invoke harfbuzz layout engine */
private static native boolean
shape(Font2D font, FontStrike strike, float ptSize, float[] mat,
! long pscaler, long pNativeFont, long layoutTables, boolean aat,
char[] chars, GVData data,
int script, int offset, int limit,
int baseIndex, Point2D.Float pt, int typo_flags, int slot);
}
--- 177,252 ----
aatInfo.put(font, Boolean.valueOf(aat));
}
return aat;
}
+ private long getFacePtr(Font2D font2D) {
+ FaceRef ref;
+ synchronized (facePtr) {
+ ref = facePtr.computeIfAbsent(font2D, FaceRef::new);
+ }
+ return ref.getNativePtr();
+ }
+
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 pNativeFont = font.getPlatformNativeFontPtr(); // used on OSX
// pScaler probably not needed long term.
long pScaler = 0L;
if (font instanceof FileFont) {
pScaler = ((FileFont)font).getScaler().nativeScaler;
}
+ long pFace = getFacePtr(font);
+ if (pFace != 0) {
shape(font, strike, ptSize, mat, pScaler, pNativeFont,
! pFace, isAAT(font),
tr.text, data, key.script(),
tr.start, tr.limit, baseIndex, pt,
typo_flags, gmask);
}
+ }
/* Native method to invoke harfbuzz layout engine */
private static native boolean
shape(Font2D font, FontStrike strike, float ptSize, float[] mat,
! long pscaler, long pNativeFont, long pFace, boolean aat,
char[] chars, GVData data,
int script, int offset, int limit,
int baseIndex, Point2D.Float pt, int typo_flags, int slot);
+
+ private static native long createFace(Font2D font,
+ boolean aat,
+ long platformNativeFontPtr,
+ long layoutTables);
+
+ private static native void disposeFace(long facePtr);
+
+ private static class FaceRef implements DisposerRecord {
+ private Font2D font;
+ private Long facePtr;
+
+ private FaceRef(Font2D font) {
+ this.font = font;
+ }
+
+ private synchronized long getNativePtr() {
+ if (facePtr == null) {
+ facePtr = createFace(font, isAAT(font),
+ font.getPlatformNativeFontPtr(),
+ font.getLayoutTableCache());
+ if (facePtr != 0) {
+ Disposer.addObjectRecord(font, this);
+ }
+ font = null;
+ }
+ return facePtr;
+ }
+
+ @Override
+ public void dispose() {
+ disposeFace(facePtr);
+ }
+ }
}
< prev index next >