< prev index next >

src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc

Print this page

        

*** 21,30 **** --- 21,32 ---- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ + #include "jlong.h" + #include "sun_font_Font2D.h" #include "hb.h" #include "hb-jdk.h" #ifdef MACOSX #include "hb-coretext.h" #endif
*** 271,289 **** } static void _do_nothing(void) { } 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; jsize length; jbyte* buffer; // 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) { return NULL; } --- 273,313 ---- } 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) { ! 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) { return NULL; }
*** 299,365 **** return hb_blob_create((const char *)buffer, length, HB_MEMORY_MODE_WRITABLE, 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); ! return face; } ! static hb_font_t* _hb_jdk_font_create(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); hb_font_set_scale (font, HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale), HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale)); 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, HBFloatToFixed(jdkFontInfo->ptSize), HBFloatToFixed(jdkFontInfo->ptSize)); return font; } #endif ! hb_font_t* hb_jdk_font_create(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; } --- 323,405 ---- return hb_blob_create((const char *)buffer, length, HB_MEMORY_MODE_WRITABLE, buffer, free); } ! /* ! * Class: sun_font_Font2D ! * Method: createHarfbuzzFace ! * Signature: (ZJ)J ! */ ! JNIEXPORT jlong JNICALL Java_sun_font_Font2D_createHarfbuzzFace(JNIEnv *env, jobject font2D, jboolean aat, jlong platformFontPtr) { ! #ifdef MACOSX ! if (aat && platformFontPtr) { ! hb_face_t *face = hb_coretext_face_create((CGFontRef)platformFontPtr); ! return ptr_to_jlong(face); ! } ! #endif ! 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); ! } ! /* ! * Class: sun_font_Font2D ! * Method: disposeHarfbuzzFace ! * Signature: (J)V ! */ ! JNIEXPORT void JNICALL Java_sun_font_Font2D_disposeHarfbuzzFace(JNIEnv *env, jclass cls, 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(hb_face_t* face, ! JDKFontInfo *jdkFontInfo, hb_destroy_func_t destroy) { hb_font_t *font; font = hb_font_create(face); hb_font_set_funcs (font, _hb_jdk_get_font_funcs (), jdkFontInfo, (hb_destroy_func_t) _do_nothing); hb_font_set_scale (font, HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale), HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale)); return font; } #ifdef MACOSX ! static hb_font_t* _hb_jdk_ct_font_create(hb_face_t* face, JDKFontInfo *jdkFontInfo) { hb_font_t *font = NULL; font = hb_font_create(face); hb_font_set_scale(font, HBFloatToFixed(jdkFontInfo->ptSize), HBFloatToFixed(jdkFontInfo->ptSize)); return font; } #endif ! 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 && jdkFontInfo->nativeFont) { ! font = _hb_jdk_ct_font_create(hbface, jdkFontInfo); } #endif if (font == NULL) { ! font = _hb_jdk_font_create(hbface, jdkFontInfo, destroy); } return font; }
< prev index next >