diff options
author | Dmitry Batrak <Dmitry.Batrak@jetbrains.com> | 2016-02-16 17:03:11 +0300 |
---|---|---|
committer | Dmitry Batrak <Dmitry.Batrak@jetbrains.com> | 2016-02-17 15:55:07 +0300 |
commit | 8c2c287f878c57f7968c4ecab3780a1f4193be81 (patch) | |
tree | 5adf56dc52890f7e9b7d9b1292ae0f91e236734a | |
parent | 249edc960e48751f44d575f3fb4898190149024c (diff) | |
download | jdk8u_jdk-jetbrains-master-mirror-osx.tar.gz |
optimize usage of Harfbuzz - create hb_face_t instance only once for each Font2D instancejetbrains-master-mirror-osx
-rw-r--r-- | make/mapfiles/libfontmanager/mapfile-vers | 2 | ||||
-rw-r--r-- | make/mapfiles/libfontmanager/mapfile-vers.openjdk | 2 | ||||
-rw-r--r-- | src/macosx/classes/sun/font/CFont.java | 1 | ||||
-rw-r--r-- | src/share/classes/sun/font/Font2D.java | 20 | ||||
-rw-r--r-- | src/share/classes/sun/font/SunLayoutEngine.java | 24 | ||||
-rw-r--r-- | src/share/native/sun/font/HBShaper.c | 18 | ||||
-rw-r--r-- | src/share/native/sun/font/hb-jdk-font.cpp | 102 | ||||
-rw-r--r-- | src/share/native/sun/font/hb-jdk.h | 5 |
8 files changed, 94 insertions, 80 deletions
diff --git a/make/mapfiles/libfontmanager/mapfile-vers b/make/mapfiles/libfontmanager/mapfile-vers index f2acff6aa6..3c6716fb52 100644 --- a/make/mapfiles/libfontmanager/mapfile-vers +++ b/make/mapfiles/libfontmanager/mapfile-vers @@ -31,6 +31,8 @@ SUNWprivate_1.1 { newLayoutTableCache; freeLayoutTableCache; isNullScalerContext; + Java_sun_font_Font2D_createHarfbuzzFace; + Java_sun_font_Font2D_disposeHarfbuzzFace; Java_sun_font_NullFontScaler_getNullScalerContext; Java_sun_font_NullFontScaler_getGlyphImage; Java_sun_font_SunFontManager_initIDs; diff --git a/make/mapfiles/libfontmanager/mapfile-vers.openjdk b/make/mapfiles/libfontmanager/mapfile-vers.openjdk index 21ecea9911..058c9c587a 100644 --- a/make/mapfiles/libfontmanager/mapfile-vers.openjdk +++ b/make/mapfiles/libfontmanager/mapfile-vers.openjdk @@ -33,6 +33,8 @@ SUNWprivate_1.1 { newLayoutTableCache; freeLayoutTableCache; isNullScalerContext; + Java_sun_font_Font2D_createHarfbuzzFace; + Java_sun_font_Font2D_disposeHarfbuzzFace; Java_sun_font_NullFontScaler_getNullScalerContext; Java_sun_font_NullFontScaler_getGlyphImage; Java_sun_font_SunFontManager_initIDs; diff --git a/src/macosx/classes/sun/font/CFont.java b/src/macosx/classes/sun/font/CFont.java index c88e53c066..f548a9e6e8 100644 --- a/src/macosx/classes/sun/font/CFont.java +++ b/src/macosx/classes/sun/font/CFont.java @@ -184,6 +184,7 @@ public final class CFont extends PhysicalFont { } protected synchronized void finalize() { + super.finalize(); if (nativeFontPtr != 0) { disposeNativeFont(nativeFontPtr); } diff --git a/src/share/classes/sun/font/Font2D.java b/src/share/classes/sun/font/Font2D.java index f1c836145c..5254bf2e7c 100644 --- a/src/share/classes/sun/font/Font2D.java +++ b/src/share/classes/sun/font/Font2D.java @@ -74,6 +74,8 @@ public abstract class Font2D { protected int style = Font.PLAIN; protected FontFamily family; protected int fontRank = DEFAULT_RANK; + + private long harfbuzzFaceNativePtr; /* * A mapper can be independent of the strike. @@ -470,6 +472,24 @@ public abstract class Font2D { protected long getPlatformNativeFontPtr() { return 0L; } + + synchronized long getHarfbuzzFacePtr() { + if (harfbuzzFaceNativePtr == 0) { + harfbuzzFaceNativePtr = createHarfbuzzFace(); + } + return harfbuzzFaceNativePtr; + } + + @Override + protected synchronized void finalize() { + if (harfbuzzFaceNativePtr != 0) { + disposeHarfbuzzFace(harfbuzzFaceNativePtr); + harfbuzzFaceNativePtr = 0; + } + } + + private native long createHarfbuzzFace(); + private native void disposeHarfbuzzFace(long harfbuzzFaceNativePtr); /* for layout code */ protected long getUnitsPerEm() { diff --git a/src/share/classes/sun/font/SunLayoutEngine.java b/src/share/classes/sun/font/SunLayoutEngine.java index dc36711375..a6548a0ca2 100644 --- a/src/share/classes/sun/font/SunLayoutEngine.java +++ b/src/share/classes/sun/font/SunLayoutEngine.java @@ -160,19 +160,6 @@ public final class SunLayoutEngine implements LayoutEngine, LayoutEngineFactory this.key = key; } - private boolean isAAT(Font2D font) { - if (font instanceof TrueTypeFont) { - TrueTypeFont ttf = (TrueTypeFont)font; - return ttf.getDirectoryEntry(TrueTypeFont.morxTag) != null || - ttf.getDirectoryEntry(TrueTypeFont.mortTag) != null; - } else if (font instanceof PhysicalFont) { - PhysicalFont pf = (PhysicalFont)font; - return pf.getTableBytes(TrueTypeFont.morxTag) != null || - pf.getTableBytes(TrueTypeFont.mortTag) != null; - } - return false; - } - public void layout(FontStrikeDesc desc, float[] mat, float ptSize, int gmask, int baseIndex, TextRecord tr, int typo_flags, Point2D.Float pt, GVData data) { @@ -188,13 +175,8 @@ public final class SunLayoutEngine implements LayoutEngine, LayoutEngineFactory key.script(), key.lang(), typo_flags, pt, data, font.getUnitsPerEm(), layoutTables); } else { - 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, isAAT(font), + long pFace = font.getHarfbuzzFacePtr(); + shape(font, strike, ptSize, mat, pFace, tr.text, data, key.script(), tr.start, tr.limit, baseIndex, pt, typo_flags, gmask); @@ -212,7 +194,7 @@ public final class SunLayoutEngine implements LayoutEngine, LayoutEngineFactory /* Native method to invoke harfbuzz layout engine */ private static native boolean shape(Font2D font, FontStrike strike, float ptSize, float[] mat, - long pscaler, long pNativeFont, boolean aat, + long pFace, char[] chars, GVData data, int script, int offset, int limit, int baseIndex, Point2D.Float pt, int typo_flags, int slot); diff --git a/src/share/native/sun/font/HBShaper.c b/src/share/native/sun/font/HBShaper.c index 422575cb16..61552a9466 100644 --- a/src/share/native/sun/font/HBShaper.c +++ b/src/share/native/sun/font/HBShaper.c @@ -195,10 +195,7 @@ JDKFontInfo* jobject font2D, jobject fontStrike, jfloat ptSize, - jlong pScaler, - jlong pNativeFont, - jfloatArray matrix, - jboolean aat) { + jfloatArray matrix) { JDKFontInfo *fi = (JDKFontInfo*)malloc(sizeof(JDKFontInfo)); @@ -208,8 +205,6 @@ JDKFontInfo* fi->env = env; // this is valid only for the life of this JNI call. fi->font2D = font2D; fi->fontStrike = fontStrike; - fi->nativeFont = pNativeFont; - fi->aat = aat; (*env)->GetFloatArrayRegion(env, matrix, 0, 4, fi->matrix); fi->ptSize = ptSize; fi->xPtSize = euclidianDistance(fi->matrix[0], fi->matrix[1]); @@ -227,9 +222,7 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape jobject fontStrike, jfloat ptSize, jfloatArray matrix, - jlong pScaler, - jlong pNativeFont, - jboolean aat, + jlong pFace, jcharArray text, jobject gvdata, jint script, @@ -241,6 +234,7 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape jint slot) { hb_buffer_t *buffer; + hb_face_t* hbface; hb_font_t* hbfont; jchar *chars; jsize len; @@ -255,8 +249,7 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape unsigned int buflen; JDKFontInfo *jdkFontInfo = - createJDKFontInfo(env, font2D, fontStrike, ptSize, - pScaler, pNativeFont, matrix, aat); + createJDKFontInfo(env, font2D, fontStrike, ptSize, matrix); if (!jdkFontInfo) { return JNI_FALSE; } @@ -264,7 +257,8 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape jdkFontInfo->font2D = font2D; jdkFontInfo->fontStrike = fontStrike; - hbfont = hb_jdk_font_create(jdkFontInfo, NULL); + hbface = (hb_face_t*) jlong_to_ptr(pFace); + hbfont = hb_jdk_font_create(hbface, jdkFontInfo, NULL); buffer = hb_buffer_create(); hb_buffer_set_script(buffer, getHBScriptCode(script)); diff --git a/src/share/native/sun/font/hb-jdk-font.cpp b/src/share/native/sun/font/hb-jdk-font.cpp index 194731f4e7..a685306095 100644 --- a/src/share/native/sun/font/hb-jdk-font.cpp +++ b/src/share/native/sun/font/hb-jdk-font.cpp @@ -23,6 +23,8 @@ * questions. */ +#include "jlong.h" +#include "sun_font_Font2D.h" #include "hb.h" #include "hb-jdk.h" #ifdef MACOSX @@ -273,15 +275,37 @@ _hb_jdk_get_font_funcs (void) static void _do_nothing(void) { } +struct Font2DPtr { + JavaVM* vmPtr; + jweak font2DRef; +}; + +static void cleanupFontInfo(void* data) { + Font2DPtr* fontInfo; + JNIEnv* env; + + fontInfo = (Font2DPtr*) data; + fontInfo->vmPtr->GetEnv((void**)&env, JNI_VERSION_1_1); + env->DeleteWeakGlobalRef(fontInfo->font2DRef); + free((void*)data); +} + static hb_blob_t * reference_table(hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { - JDKFontInfo *jdkFontInfo = (JDKFontInfo*)user_data; - JNIEnv* env = jdkFontInfo->env; - jobject font2D = jdkFontInfo->font2D; + Font2DPtr *fontInfo; + JNIEnv* env; + jobject font2D; jsize length; jbyte* buffer; + fontInfo = (Font2DPtr*)user_data; + fontInfo->vmPtr->GetEnv((void**)&env, JNI_VERSION_1_1); + if (env == NULL) { + return NULL; + } + font2D = fontInfo->font2DRef; + // HB_TAG_NONE is 0 and is used to get the whole font file. // It is not expected not be needed for JDK. if (tag == 0) { @@ -301,25 +325,41 @@ reference_table(hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { buffer, free); } -hb_face_t* -hb_jdk_face_create(JDKFontInfo *jdkFontInfo, - hb_destroy_func_t destroy) { - - hb_face_t *face = - hb_face_create_for_tables(reference_table, jdkFontInfo, destroy); +/* + * Class: sun_font_Font2D + * Method: createHarfbuzzFace + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_sun_font_Font2D_createHarfbuzzFace(JNIEnv *env, jobject font2D) { + Font2DPtr *fi = (Font2DPtr*)malloc(sizeof(Font2DPtr)); + if (!fi) { + return 0; + } + JavaVM* vmPtr; + env->GetJavaVM(&vmPtr); + fi->vmPtr = vmPtr; + fi->font2DRef = env->NewWeakGlobalRef(font2D); + hb_face_t *face = hb_face_create_for_tables(reference_table, fi, cleanupFontInfo); + return ptr_to_jlong(face); +} - return face; +/* + * Class: sun_font_Font2D + * Method: disposeHarfbuzzFace + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_sun_font_Font2D_disposeHarfbuzzFace(JNIEnv *env, jobject font2D, jlong ptr) { + hb_face_t* face = (hb_face_t*) jlong_to_ptr(ptr); + hb_face_destroy(face); } -static hb_font_t* _hb_jdk_font_create(JDKFontInfo *jdkFontInfo, +static hb_font_t* _hb_jdk_font_create(hb_face_t* face, + JDKFontInfo *jdkFontInfo, hb_destroy_func_t destroy) { hb_font_t *font; - hb_face_t *face; - face = hb_jdk_face_create(jdkFontInfo, destroy); font = hb_font_create(face); - hb_face_destroy (face); hb_font_set_funcs (font, _hb_jdk_get_font_funcs (), jdkFontInfo, (hb_destroy_func_t) _do_nothing); @@ -329,37 +369,11 @@ static hb_font_t* _hb_jdk_font_create(JDKFontInfo *jdkFontInfo, return font; } -#ifdef MACOSX -static hb_font_t* _hb_jdk_ct_font_create(JDKFontInfo *jdkFontInfo) { - - hb_font_t *font = NULL; - hb_face_t *face = NULL; - if (jdkFontInfo->nativeFont == 0) { - return NULL; - } - face = hb_coretext_face_create((CGFontRef)(jdkFontInfo->nativeFont)); - font = hb_font_create(face); - hb_face_destroy(face); - - hb_font_set_scale(font, - FloatToF26Dot6(jdkFontInfo->ptSize), - FloatToF26Dot6(jdkFontInfo->ptSize)); - return font; -} -#endif - -hb_font_t* hb_jdk_font_create(JDKFontInfo *jdkFontInfo, +hb_font_t* hb_jdk_font_create(hb_face_t* hbface, + JDKFontInfo *jdkFontInfo, hb_destroy_func_t destroy) { hb_font_t* font = NULL; - -#ifdef MACOSX - if (jdkFontInfo->aat) { - font = _hb_jdk_ct_font_create(jdkFontInfo); - } -#endif - if (font == NULL) { - font = _hb_jdk_font_create(jdkFontInfo, destroy); - } - return font; + font = _hb_jdk_font_create(hbface, jdkFontInfo, destroy); + return font; } diff --git a/src/share/native/sun/font/hb-jdk.h b/src/share/native/sun/font/hb-jdk.h index c17ea12ebb..68f88a0ec4 100644 --- a/src/share/native/sun/font/hb-jdk.h +++ b/src/share/native/sun/font/hb-jdk.h @@ -38,12 +38,10 @@ typedef struct JDKFontInfo_Struct { JNIEnv* env; jobject font2D; jobject fontStrike; - long nativeFont; float matrix[4]; float ptSize; float xPtSize; float yPtSize; - jboolean aat; } JDKFontInfo; @@ -58,7 +56,8 @@ hb_face_t * hb_jdk_face_create(JDKFontInfo* jdkFontInfo, hb_destroy_func_t destroy); hb_font_t * -hb_jdk_font_create(JDKFontInfo* jdkFontInfo, +hb_jdk_font_create(hb_face_t* hbface, + JDKFontInfo* jdkFontInfo, hb_destroy_func_t destroy); |