diff options
author | John Ralls <jralls@ceridwen.us> | 2011-05-01 12:12:21 -0700 |
---|---|---|
committer | John Ralls <jralls@ceridwen.us> | 2011-05-01 12:12:21 -0700 |
commit | 9003800c297781223828c5d5e537aa34391c17ca (patch) | |
tree | 42dfa4cecdfd2861d6993c5001725e7793d8473b /pango/pangocoretext-fontmap.c | |
parent | 0cc03a0a8e91627267236ff94cc424203c39b03a (diff) | |
download | pango-9003800c297781223828c5d5e537aa34391c17ca.tar.gz |
Bug 648044; Change PangoCoreTextFace::weight to type PangoWeight and perform the conversion from the CFNumber with a mapping table in pango_core_test_face_from_ct_font_descriptor()
This assigns PangoWeights which better align with the CoreText weights and better ensures that unique values are used for hash keys used for determining which faces need synthetic italic faces created.
Diffstat (limited to 'pango/pangocoretext-fontmap.c')
-rw-r--r-- | pango/pangocoretext-fontmap.c | 96 |
1 files changed, 44 insertions, 52 deletions
diff --git a/pango/pangocoretext-fontmap.c b/pango/pangocoretext-fontmap.c index 2d2563f9..815c35a2 100644 --- a/pango/pangocoretext-fontmap.c +++ b/pango/pangocoretext-fontmap.c @@ -77,7 +77,7 @@ struct _PangoCoreTextFace char *postscript_name; char *style_name; - float weight; + PangoWeight weight; int traits; guint synthetic_italic : 1; }; @@ -92,6 +92,28 @@ typedef struct _PangoCoreTextFaceClass PangoCoreTextFaceClass; static GType pango_core_text_family_get_type (void); static GType pango_core_text_face_get_type (void); +typedef struct +{ + float bound; + PangoWeight weight; +} PangoCTWeight; + +static const float ct_weight_min = -1.00f; +static const float ct_weight_max = 1.00f; + +static const PangoCTWeight ct_weight_limits[] = { + { -0.70, PANGO_WEIGHT_THIN}, + { -0.50, PANGO_WEIGHT_ULTRALIGHT }, + { -0.35, PANGO_WEIGHT_LIGHT }, + { -0.10, PANGO_WEIGHT_BOOK }, + { 0.10, PANGO_WEIGHT_NORMAL }, + { 0.24, PANGO_WEIGHT_MEDIUM }, + { 0.36, PANGO_WEIGHT_SEMIBOLD }, + { 0.50, PANGO_WEIGHT_BOLD }, + { 0.75, PANGO_WEIGHT_ULTRABOLD }, + { 1.00, PANGO_WEIGHT_HEAVY } +}; + static const char * get_real_family (const char *family_name) { @@ -209,13 +231,26 @@ pango_core_text_face_from_ct_font_descriptor (CTFontDescriptorRef desc) number = (CFNumberRef)CFDictionaryGetValue (dict, kCTFontWeightTrait); if (CFNumberGetValue (number, kCFNumberCGFloatType, &value)) - /* Map value from range [-1.0, 1.0] to range [1, 14] */ - face->weight = (value + 1.0f) * 6.5f + 1; + { + if (value < ct_weight_min || value > ct_weight_max) + { + face->weight = PANGO_WEIGHT_NORMAL; /* This is really an error */ + } + else + { + guint i; + for (i = 0; i < G_N_ELEMENTS(ct_weight_limits); i++) + if (value < ct_weight_limits[i].bound) + { + face->weight = ct_weight_limits[i].weight; + break; + } + } + } else face->weight = PANGO_WEIGHT_NORMAL; - number = (CFNumberRef)CFDictionaryGetValue (dict, - kCTFontSymbolicTrait); + number = (CFNumberRef)CFDictionaryGetValue (dict, kCTFontSymbolicTrait); if (CFNumberGetValue (number, kCFNumberIntType, &font_traits)) { face->traits = font_traits; @@ -294,7 +329,8 @@ pango_core_text_family_list_faces (PangoFontFamily *family, if (face->traits & kCTFontItalicTrait || pango_core_text_face_is_oblique (face)) - g_hash_table_insert (italic_faces, GINT_TO_POINTER (face->weight), + g_hash_table_insert (italic_faces, + GINT_TO_POINTER ((gint)face->weight), face); } @@ -310,7 +346,7 @@ pango_core_text_family_list_faces (PangoFontFamily *family, PangoCoreTextFace *face = l->data; if (!g_hash_table_lookup (italic_faces, - GINT_TO_POINTER (face->weight))) + GINT_TO_POINTER ((gint)face->weight))) { PangoCoreTextFace *italic_face; @@ -419,57 +455,13 @@ pango_core_text_face_describe (PangoFontFace *face) { PangoCoreTextFace *ctface = PANGO_CORE_TEXT_FACE (face); PangoFontDescription *description; - PangoWeight pango_weight; PangoStyle pango_style; PangoVariant pango_variant; - int weight; description = pango_font_description_new (); pango_font_description_set_family (description, ctface->family->family_name); - weight = ctface->weight; - - switch (weight) - { - case 1: - case 2: - pango_weight = PANGO_WEIGHT_ULTRALIGHT; - break; - - case 3: - case 4: - pango_weight = PANGO_WEIGHT_LIGHT; - break; - - case 5: - case 6: - pango_weight = PANGO_WEIGHT_NORMAL; - break; - - case 7: - case 8: - pango_weight = PANGO_WEIGHT_SEMIBOLD; - break; - - case 9: - case 10: - pango_weight = PANGO_WEIGHT_BOLD; - break; - - case 11: - case 12: - pango_weight = PANGO_WEIGHT_ULTRABOLD; - break; - - case 13: - case 14: - pango_weight = PANGO_WEIGHT_HEAVY; - break; - - default: - g_assert_not_reached (); - }; if (ctface->traits & kCTFontItalicTrait) pango_style = PANGO_STYLE_ITALIC; @@ -486,7 +478,7 @@ pango_core_text_face_describe (PangoFontFace *face) #endif pango_variant = PANGO_VARIANT_NORMAL; - pango_font_description_set_weight (description, pango_weight); + pango_font_description_set_weight (description, ctface->weight); pango_font_description_set_style (description, pango_style); pango_font_description_set_variant (description, pango_variant); |