< 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 >