diff options
Diffstat (limited to 'pango/pangocairo-atsuifont.c')
-rw-r--r-- | pango/pangocairo-atsuifont.c | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/pango/pangocairo-atsuifont.c b/pango/pangocairo-atsuifont.c index 5d087af9..d185fa6f 100644 --- a/pango/pangocairo-atsuifont.c +++ b/pango/pangocairo-atsuifont.c @@ -22,6 +22,8 @@ #include <config.h> +#import <Cocoa/Cocoa.h> + #include "pangoatsui-private.h" #include "pangocairo.h" #include "pangocairo-private.h" @@ -269,6 +271,7 @@ _pango_cairo_atsui_font_new (PangoCairoATSUIFontMap *cafontmap, const PangoFontDescription *desc) { const char *postscript_name; + gboolean synthesize_italic = FALSE; PangoCairoATSUIFont *cafont; PangoATSUIFont *afont; CFStringRef cfstr; @@ -277,14 +280,46 @@ _pango_cairo_atsui_font_new (PangoCairoATSUIFontMap *cafontmap, ATSUFontID font_id; postscript_name = _pango_atsui_face_get_postscript_name (face); + cfstr = CFStringCreateWithCString (NULL, postscript_name, kCFStringEncodingUTF8); - font_ref = ATSFontFindFromPostScriptName (cfstr, kATSOptionFlagsDefault); - font_id = FMGetFontFromATSFontRef (font_ref); - CFRelease (cfstr); + /* We synthesize italic in two cases. The first is when + * NSFontManager has handed out a face that it claims has italic but + * it doesn't. The other is when an italic face is requested that + * doesn't have a real version. + */ + if (font_ref == kATSFontRefUnspecified && + pango_font_description_get_style (desc) != PANGO_STYLE_NORMAL) + { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSString *nsname; + NSFont *nsfont, *converted_font; + gdouble size; + + size = (double) pango_font_description_get_size (desc) / PANGO_SCALE; + + nsname = [NSString stringWithUTF8String:postscript_name]; + nsfont = [NSFont fontWithName:nsname size:size]; + + converted_font = [[NSFontManager sharedFontManager] convertFont:nsfont + toHaveTrait:NSUnitalicFontMask]; + font_ref = ATSFontFindFromPostScriptName ((CFStringRef) [converted_font fontName], + kATSOptionFlagsDefault); + + [pool release]; + + synthesize_italic = TRUE; + } + else if (_pango_atsui_face_get_synthetic_italic (face)) + synthesize_italic = TRUE; + + if (font_ref == kATSFontRefUnspecified) + return NULL; + + font_id = FMGetFontFromATSFontRef (font_ref); if (!font_id) return NULL; @@ -314,6 +349,20 @@ _pango_cairo_atsui_font_new (PangoCairoATSUIFontMap *cafontmap, else cairo_matrix_init_identity (&cafont->ctm); + if (synthesize_italic) + { + cairo_matrix_t shear, result; + + /* Apply a shear matrix, matching what Cocoa does. */ + cairo_matrix_init (&shear, + 1, 0, + 0.25, 1, + 0, 0); + + cairo_matrix_multiply (&result, &shear, &cafont->font_matrix); + cafont->font_matrix = result; + } + cafont->options = cairo_font_options_copy (_pango_cairo_context_get_merged_font_options (context)); return afont; |