< prev index next >

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

Print this page




  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 }
< prev index next >