CoreText: stricter handling of FontSymbolic traits
authorKristian Rietveld <kris@lanedo.com>
Mon, 14 Nov 2011 09:48:53 +0000 (10:48 +0100)
committerKristian Rietveld <kris@lanedo.com>
Mon, 14 Nov 2011 09:54:05 +0000 (10:54 +0100)
It turns out that getting this value as "Int" is incorrect and resulted
in font traits not being returned in some cases.  Without traits, an
italic trait is not set, which caused synthetic oblique fonts to be
created when not necessary.

Also use CTFontSymbolicTraits type in the PangoCoreTextFace structure
and do a stricter bit mask check for certainty.

pango/pangocoretext-fontmap.c

index 542665e..9f67acb 100644 (file)
@@ -78,7 +78,7 @@ struct _PangoCoreTextFace
   char *style_name;
 
   PangoWeight weight;
-  int traits;
+  CTFontSymbolicTraits traits;
   guint synthetic_italic : 1;
 };
 
@@ -195,7 +195,7 @@ pango_core_text_face_is_oblique (PangoCoreTextFace *face)
 static inline PangoCoreTextFace *
 pango_core_text_face_from_ct_font_descriptor (CTFontDescriptorRef desc)
 {
-  int font_traits;
+  SInt64 font_traits;
   char *buffer;
   CFStringRef str;
   CFNumberRef number;
@@ -250,8 +250,14 @@ pango_core_text_face_from_ct_font_descriptor (CTFontDescriptorRef desc)
   else
     face->weight = PANGO_WEIGHT_NORMAL;
 
+  /* This is interesting, the value stored is a CTFontSymbolicTraits which
+   * is defined as uint32_t.  CFNumber does not have an obvious type which
+   * deals with unsigned values.  Upon inspection with CFNumberGetType,
+   * it turns out this value is stored as SInt64, so we use that to
+   * obtain the value from the CFNumber.
+   */
   number = (CFNumberRef)CFDictionaryGetValue (dict, kCTFontSymbolicTrait);
-  if (CFNumberGetValue (number, kCFNumberIntType, &font_traits))
+  if (CFNumberGetValue (number, kCFNumberSInt64Type, &font_traits))
     {
       face->traits = font_traits;
     }
@@ -327,8 +333,8 @@ pango_core_text_family_list_faces (PangoFontFamily  *family,
 
           faces = g_list_prepend (faces, face);
 
-          if (face->traits & kCTFontItalicTrait
-              || pango_core_text_face_is_oblique (face))
+          if ((face->traits & kCTFontItalicTrait) == kCTFontItalicTrait ||
+              pango_core_text_face_is_oblique (face))
             g_hash_table_insert (italic_faces,
                                 GINT_TO_POINTER ((gint)face->weight),
                                  face);