@@ -144,6 +144,12 @@ public LayoutEngine getEngine(LayoutEngineKey key) {
144144 private SoftReference <ConcurrentHashMap <LayoutEngineKey , LayoutEngine >> cacheref =
145145 new SoftReference <>(null );
146146
147+ private boolean isAAT (Font2D font ) {
148+ // CoreText layout code ignores fractional metrics font attribute
149+ // also, using CoreText layout in Harfbuzz code leads to wrong advances for emoji glyphs
150+ return false ;
151+ }
152+
147153 private SunLayoutEngine (LayoutEngineKey key ) {
148154 this .key = key ;
149155 }
@@ -153,8 +159,15 @@ public void layout(FontStrikeDesc desc, float[] mat, float ptSize, int gmask,
153159 Point2D .Float pt , GVData data ) {
154160 Font2D font = key .font ();
155161 FontStrike strike = font .getStrike (desc );
156- shape (font , strike , ptSize , mat ,
157- font .getHarfbuzzFacePtr (), font .getPlatformNativeFontPtr (), font .isAAT (),
162+ long layoutTables = font .getLayoutTableCache ();
163+ long pNativeFont = font .getPlatformNativeFontPtr (); // used on OSX
164+ // pScaler probably not needed long term.
165+ long pScaler = 0L ;
166+ if (font instanceof FileFont ) {
167+ pScaler = ((FileFont )font ).getScaler ().nativeScaler ;
168+ }
169+ shape (font , strike , ptSize , mat , pScaler , pNativeFont ,
170+ layoutTables , isAAT (font ),
158171 tr .text , data , key .script (),
159172 tr .start , tr .limit , baseIndex , pt ,
160173 typo_flags , gmask );
@@ -163,7 +176,7 @@ public void layout(FontStrikeDesc desc, float[] mat, float ptSize, int gmask,
163176 /* Native method to invoke harfbuzz layout engine */
164177 private static native boolean
165178 shape (Font2D font , FontStrike strike , float ptSize , float [] mat ,
166- long pscaler , long pNativeFont , boolean aat ,
179+ long pscaler , long pNativeFont , long layoutTables , boolean aat ,
167180 char [] chars , GVData data ,
168181 int script , int offset , int limit ,
169182 int baseIndex , Point2D .Float pt , int typo_flags , int slot );
0 commit comments