--- old/src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc 2018-05-31 15:13:01.000000000 -0700 +++ new/src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc 2018-05-31 15:13:00.000000000 -0700 @@ -48,10 +48,58 @@ 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; }