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