< prev index next >
src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc
Print this page
@@ -46,14 +46,62 @@
{
JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data;
JNIEnv* env = jdkFontInfo->env;
jobject font2D = jdkFontInfo->font2D;
- hb_codepoint_t u = (variation_selector==0) ? unicode : variation_selector;
+ if (variation_selector == 0) {
+ *glyph = (hb_codepoint_t)env->CallIntMethod(
+ font2D, sunFontIDs.f2dCharToGlyphMID, unicode);
+ if (env->ExceptionOccurred())
+ {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ } else {
+ jintArray unicodes = NULL;
+ jintArray results = NULL;
+ jint* tmp = NULL;
- *glyph = (hb_codepoint_t)
- env->CallIntMethod(font2D, sunFontIDs.f2dCharToGlyphMID, u);
+ *glyph = 0;
+ unicodes = env->NewIntArray(2);
+ if (unicodes == NULL) {
+ goto cleanup;
+ }
+ results = env->NewIntArray(2);
+ if (results == NULL) {
+ goto cleanup;
+ }
+
+ tmp = new jint[2];
+ if (tmp == NULL) {
+ goto cleanup;
+ }
+ tmp[0] = unicode;
+ tmp[1] = variation_selector;
+
+ env->SetIntArrayRegion(unicodes, 0, 2, tmp);
+ env->CallVoidMethod(font2D, sunFontIDs.f2dCharsToGlyphsMID, 2,
+ unicodes, results);
+ if (env->ExceptionOccurred())
+ {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ goto cleanup;
+ }
+ env->GetIntArrayRegion(results, 0, 2, tmp);
+ *glyph = tmp[0];
+cleanup:
+ if (unicodes != NULL) {
+ env->DeleteLocalRef(unicodes);
+ }
+ if (results != NULL) {
+ env->DeleteLocalRef(results);
+ }
+ if (tmp != NULL) {
+ delete [] tmp;
+ }
+ }
if ((int)*glyph < 0) {
*glyph = 0;
}
return (*glyph != 0);
}
< prev index next >