63 { 64 65 float fadv = 0.0f; 66 if ((glyph & 0xfffe) == 0xfffe) { 67 return 0; // JDK uses this glyph code. 68 } 69 70 JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data; 71 JNIEnv* env = jdkFontInfo->env; 72 jobject fontStrike = jdkFontInfo->fontStrike; 73 jobject pt = env->CallObjectMethod(fontStrike, 74 sunFontIDs.getGlyphMetricsMID, glyph); 75 76 if (pt == NULL) { 77 return 0; 78 } 79 fadv = env->GetFloatField(pt, sunFontIDs.xFID); 80 fadv *= jdkFontInfo->devScale; 81 env->DeleteLocalRef(pt); 82 83 return FloatToFixed(fadv); 84 } 85 86 static hb_position_t 87 hb_jdk_get_glyph_v_advance (hb_font_t *font HB_UNUSED, 88 void *font_data, 89 hb_codepoint_t glyph, 90 void *user_data HB_UNUSED) 91 { 92 93 float fadv = 0.0f; 94 if ((glyph & 0xfffe) == 0xfffe) { 95 return 0; // JDK uses this glyph code. 96 } 97 98 JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data; 99 JNIEnv* env = jdkFontInfo->env; 100 jobject fontStrike = jdkFontInfo->fontStrike; 101 jobject pt = env->CallObjectMethod(fontStrike, 102 sunFontIDs.getGlyphMetricsMID, glyph); 103 104 if (pt == NULL) { 105 return 0; 106 } 107 fadv = env->GetFloatField(pt, sunFontIDs.yFID); 108 env->DeleteLocalRef(pt); 109 110 return FloatToFixed(fadv); 111 112 } 113 114 static hb_bool_t 115 hb_jdk_get_glyph_h_origin (hb_font_t *font HB_UNUSED, 116 void *font_data HB_UNUSED, 117 hb_codepoint_t glyph HB_UNUSED, 118 hb_position_t *x HB_UNUSED, 119 hb_position_t *y HB_UNUSED, 120 void *user_data HB_UNUSED) 121 { 122 /* We always work in the horizontal coordinates. */ 123 return true; 124 } 125 126 static hb_bool_t 127 hb_jdk_get_glyph_v_origin (hb_font_t *font HB_UNUSED, 128 void *font_data, 129 hb_codepoint_t glyph, 130 hb_position_t *x, 184 hb_position_t *x, 185 hb_position_t *y, 186 void *user_data HB_UNUSED) 187 { 188 if ((glyph & 0xfffe) == 0xfffe) { 189 *x = 0; *y = 0; 190 return true; 191 } 192 193 JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data; 194 JNIEnv* env = jdkFontInfo->env; 195 jobject fontStrike = jdkFontInfo->fontStrike; 196 jobject pt = env->CallObjectMethod(fontStrike, 197 sunFontIDs.getGlyphPointMID, 198 glyph, point_index); 199 200 if (pt == NULL) { 201 *x = 0; *y = 0; 202 return true; 203 } 204 *x = FloatToFixed(env->GetFloatField(pt, sunFontIDs.xFID)); 205 *y = FloatToFixed(env->GetFloatField(pt, sunFontIDs.yFID)); 206 env->DeleteLocalRef(pt); 207 208 return true; 209 } 210 211 static hb_bool_t 212 hb_jdk_get_glyph_name (hb_font_t *font HB_UNUSED, 213 void *font_data, 214 hb_codepoint_t glyph, 215 char *name, unsigned int size, 216 void *user_data HB_UNUSED) 217 { 218 return false; 219 } 220 221 static hb_bool_t 222 hb_jdk_get_glyph_from_name (hb_font_t *font HB_UNUSED, 223 void *font_data, 224 const char *name, int len, 225 hb_codepoint_t *glyph, 304 305 hb_face_t *face = 306 hb_face_create_for_tables(reference_table, jdkFontInfo, destroy); 307 308 return face; 309 } 310 311 static hb_font_t* _hb_jdk_font_create(JDKFontInfo *jdkFontInfo, 312 hb_destroy_func_t destroy) { 313 314 hb_font_t *font; 315 hb_face_t *face; 316 317 face = hb_jdk_face_create(jdkFontInfo, destroy); 318 font = hb_font_create(face); 319 hb_face_destroy (face); 320 hb_font_set_funcs (font, 321 _hb_jdk_get_font_funcs (), 322 jdkFontInfo, (hb_destroy_func_t) _do_nothing); 323 hb_font_set_scale (font, 324 FloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale), 325 FloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale)); 326 return font; 327 } 328 329 #ifdef MACOSX 330 static hb_font_t* _hb_jdk_ct_font_create(JDKFontInfo *jdkFontInfo) { 331 332 hb_font_t *font = NULL; 333 hb_face_t *face = NULL; 334 if (jdkFontInfo->nativeFont == 0) { 335 return NULL; 336 } 337 face = hb_coretext_face_create((CGFontRef)(jdkFontInfo->nativeFont)); 338 font = hb_font_create(face); 339 hb_face_destroy(face); 340 341 hb_font_set_scale(font, 342 FloatToFixed(jdkFontInfo->ptSize), 343 FloatToFixed(jdkFontInfo->ptSize)); 344 return font; 345 } 346 #endif 347 348 hb_font_t* hb_jdk_font_create(JDKFontInfo *jdkFontInfo, 349 hb_destroy_func_t destroy) { 350 351 hb_font_t* font = NULL; 352 353 #ifdef MACOSX 354 if (jdkFontInfo->aat) { 355 font = _hb_jdk_ct_font_create(jdkFontInfo); 356 } 357 #endif 358 if (font == NULL) { 359 font = _hb_jdk_font_create(jdkFontInfo, destroy); 360 } 361 return font; 362 } | 63 { 64 65 float fadv = 0.0f; 66 if ((glyph & 0xfffe) == 0xfffe) { 67 return 0; // JDK uses this glyph code. 68 } 69 70 JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data; 71 JNIEnv* env = jdkFontInfo->env; 72 jobject fontStrike = jdkFontInfo->fontStrike; 73 jobject pt = env->CallObjectMethod(fontStrike, 74 sunFontIDs.getGlyphMetricsMID, glyph); 75 76 if (pt == NULL) { 77 return 0; 78 } 79 fadv = env->GetFloatField(pt, sunFontIDs.xFID); 80 fadv *= jdkFontInfo->devScale; 81 env->DeleteLocalRef(pt); 82 83 return HBFloatToFixed(fadv); 84 } 85 86 static hb_position_t 87 hb_jdk_get_glyph_v_advance (hb_font_t *font HB_UNUSED, 88 void *font_data, 89 hb_codepoint_t glyph, 90 void *user_data HB_UNUSED) 91 { 92 93 float fadv = 0.0f; 94 if ((glyph & 0xfffe) == 0xfffe) { 95 return 0; // JDK uses this glyph code. 96 } 97 98 JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data; 99 JNIEnv* env = jdkFontInfo->env; 100 jobject fontStrike = jdkFontInfo->fontStrike; 101 jobject pt = env->CallObjectMethod(fontStrike, 102 sunFontIDs.getGlyphMetricsMID, glyph); 103 104 if (pt == NULL) { 105 return 0; 106 } 107 fadv = env->GetFloatField(pt, sunFontIDs.yFID); 108 env->DeleteLocalRef(pt); 109 110 return HBFloatToFixed(fadv); 111 112 } 113 114 static hb_bool_t 115 hb_jdk_get_glyph_h_origin (hb_font_t *font HB_UNUSED, 116 void *font_data HB_UNUSED, 117 hb_codepoint_t glyph HB_UNUSED, 118 hb_position_t *x HB_UNUSED, 119 hb_position_t *y HB_UNUSED, 120 void *user_data HB_UNUSED) 121 { 122 /* We always work in the horizontal coordinates. */ 123 return true; 124 } 125 126 static hb_bool_t 127 hb_jdk_get_glyph_v_origin (hb_font_t *font HB_UNUSED, 128 void *font_data, 129 hb_codepoint_t glyph, 130 hb_position_t *x, 184 hb_position_t *x, 185 hb_position_t *y, 186 void *user_data HB_UNUSED) 187 { 188 if ((glyph & 0xfffe) == 0xfffe) { 189 *x = 0; *y = 0; 190 return true; 191 } 192 193 JDKFontInfo *jdkFontInfo = (JDKFontInfo*)font_data; 194 JNIEnv* env = jdkFontInfo->env; 195 jobject fontStrike = jdkFontInfo->fontStrike; 196 jobject pt = env->CallObjectMethod(fontStrike, 197 sunFontIDs.getGlyphPointMID, 198 glyph, point_index); 199 200 if (pt == NULL) { 201 *x = 0; *y = 0; 202 return true; 203 } 204 *x = HBFloatToFixed(env->GetFloatField(pt, sunFontIDs.xFID)); 205 *y = HBFloatToFixed(env->GetFloatField(pt, sunFontIDs.yFID)); 206 env->DeleteLocalRef(pt); 207 208 return true; 209 } 210 211 static hb_bool_t 212 hb_jdk_get_glyph_name (hb_font_t *font HB_UNUSED, 213 void *font_data, 214 hb_codepoint_t glyph, 215 char *name, unsigned int size, 216 void *user_data HB_UNUSED) 217 { 218 return false; 219 } 220 221 static hb_bool_t 222 hb_jdk_get_glyph_from_name (hb_font_t *font HB_UNUSED, 223 void *font_data, 224 const char *name, int len, 225 hb_codepoint_t *glyph, 304 305 hb_face_t *face = 306 hb_face_create_for_tables(reference_table, jdkFontInfo, destroy); 307 308 return face; 309 } 310 311 static hb_font_t* _hb_jdk_font_create(JDKFontInfo *jdkFontInfo, 312 hb_destroy_func_t destroy) { 313 314 hb_font_t *font; 315 hb_face_t *face; 316 317 face = hb_jdk_face_create(jdkFontInfo, destroy); 318 font = hb_font_create(face); 319 hb_face_destroy (face); 320 hb_font_set_funcs (font, 321 _hb_jdk_get_font_funcs (), 322 jdkFontInfo, (hb_destroy_func_t) _do_nothing); 323 hb_font_set_scale (font, 324 HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale), 325 HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale)); 326 return font; 327 } 328 329 #ifdef MACOSX 330 static hb_font_t* _hb_jdk_ct_font_create(JDKFontInfo *jdkFontInfo) { 331 332 hb_font_t *font = NULL; 333 hb_face_t *face = NULL; 334 if (jdkFontInfo->nativeFont == 0) { 335 return NULL; 336 } 337 face = hb_coretext_face_create((CGFontRef)(jdkFontInfo->nativeFont)); 338 font = hb_font_create(face); 339 hb_face_destroy(face); 340 341 hb_font_set_scale(font, 342 HBFloatToFixed(jdkFontInfo->ptSize), 343 HBFloatToFixed(jdkFontInfo->ptSize)); 344 return font; 345 } 346 #endif 347 348 hb_font_t* hb_jdk_font_create(JDKFontInfo *jdkFontInfo, 349 hb_destroy_func_t destroy) { 350 351 hb_font_t* font = NULL; 352 353 #ifdef MACOSX 354 if (jdkFontInfo->aat) { 355 font = _hb_jdk_ct_font_create(jdkFontInfo); 356 } 357 #endif 358 if (font == NULL) { 359 font = _hb_jdk_font_create(jdkFontInfo, destroy); 360 } 361 return font; 362 } |