aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>2016-02-16 17:03:11 +0300
committerDmitry Batrak <Dmitry.Batrak@jetbrains.com>2016-02-17 15:55:07 +0300
commit8c2c287f878c57f7968c4ecab3780a1f4193be81 (patch)
tree5adf56dc52890f7e9b7d9b1292ae0f91e236734a
parent249edc960e48751f44d575f3fb4898190149024c (diff)
downloadjdk8u_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-vers2
-rw-r--r--make/mapfiles/libfontmanager/mapfile-vers.openjdk2
-rw-r--r--src/macosx/classes/sun/font/CFont.java1
-rw-r--r--src/share/classes/sun/font/Font2D.java20
-rw-r--r--src/share/classes/sun/font/SunLayoutEngine.java24
-rw-r--r--src/share/native/sun/font/HBShaper.c18
-rw-r--r--src/share/native/sun/font/hb-jdk-font.cpp102
-rw-r--r--src/share/native/sun/font/hb-jdk.h5
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);