summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Crozat <fcrozat@mandriva.com>2006-02-23 17:09:47 -0800
committerCarl Worth <cworth@cworth.org>2006-02-23 17:09:47 -0800
commitd8d8694ac424f1c9b1ef57a5a08c6f4ad1a208ce (patch)
tree931797095b42d75ac49df61cb55f0513fe24dbbc
parent65c32ae36fe90d69131435a25e6b15a05339df47 (diff)
downloadcairo-d8d8694ac424f1c9b1ef57a5a08c6f4ad1a208ce.tar.gz
Fix usage of freetype to match Xft and follow David Turner's recommendations.
Change a little the logic in hinting to follow the same logic as Xft and doesn't try to mix FT_LOAD_TARGET which should not be mixed (based on David Turner comments)
-rw-r--r--src/cairo-ft-font.c103
1 files changed, 51 insertions, 52 deletions
diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c
index 7ef6a8202..bc56dca03 100644
--- a/src/cairo-ft-font.c
+++ b/src/cairo-ft-font.c
@@ -1343,8 +1343,7 @@ _get_pattern_load_flags (FcPattern *pattern)
#ifdef FC_HINT_STYLE
int hintstyle;
#endif
- int load_flags = 0;
- int target_flags = 0;
+ int load_flags = FT_LOAD_DEFAULT;
/* disable antialiasing if requested */
if (FcPatternGetBool (pattern,
@@ -1369,48 +1368,46 @@ _get_pattern_load_flags (FcPattern *pattern)
load_flags |= FT_LOAD_NO_HINTING;
if (antialias) {
- switch (hintstyle) {
- case FC_HINT_SLIGHT:
- case FC_HINT_MEDIUM:
- target_flags = FT_LOAD_TARGET_LIGHT;
- break;
- default:
- target_flags = FT_LOAD_TARGET_NORMAL;
- break;
- }
+ if (FcPatternGetInteger (pattern,
+ FC_RGBA, 0, &rgba) != FcResultMatch)
+ rgba = FC_RGBA_UNKNOWN;
+
+ switch (rgba) {
+ case FC_RGBA_UNKNOWN:
+ case FC_RGBA_NONE:
+ switch (hintstyle) {
+ case FC_HINT_NONE:
+ break;
+ case FC_HINT_SLIGHT:
+ case FC_HINT_MEDIUM:
+ load_flags |= FT_LOAD_TARGET_LIGHT;
+ break;
+ default:
+ load_flags |= FT_LOAD_TARGET_NORMAL;
+ break;
+ }
+ break;
+ case FC_RGBA_BGR:
+ load_flags |= PRIVATE_FLAG_BGR;
+ case FC_RGBA_RGB:
+ load_flags |= FT_LOAD_TARGET_LCD;
+ break;
+ case FC_RGBA_VBGR:
+ load_flags |= PRIVATE_FLAG_BGR;
+ case FC_RGBA_VRGB:
+ load_flags |= FT_LOAD_TARGET_LCD_V;
+ break;
+ }
} else {
#ifdef FT_LOAD_TARGET_MONO
- target_flags = FT_LOAD_TARGET_MONO;
+ load_flags |= FT_LOAD_TARGET_MONO;
#endif
}
#else /* !FC_HINT_STYLE */
if (!hinting)
- target_flags = FT_LOAD_NO_HINTING;
+ load_flags |= FT_LOAD_NO_HINTING;
#endif /* FC_FHINT_STYLE */
- if (FcPatternGetInteger (pattern,
- FC_RGBA, 0, &rgba) != FcResultMatch)
- rgba = FC_RGBA_UNKNOWN;
-
- switch (rgba) {
- case FC_RGBA_UNKNOWN:
- case FC_RGBA_NONE:
- default:
- break;
- case FC_RGBA_BGR:
- target_flags |= PRIVATE_FLAG_BGR;
- case FC_RGBA_RGB:
- target_flags |= FT_LOAD_TARGET_LCD;
- break;
- case FC_RGBA_VBGR:
- target_flags |= PRIVATE_FLAG_BGR;
- case FC_RGBA_VRGB:
- target_flags |= FT_LOAD_TARGET_LCD_V;
- break;
- }
-
- load_flags |= target_flags;
-
/* force autohinting if requested */
if (FcPatternGetBool (pattern,
FC_AUTOHINT, 0, &autohint) != FcResultMatch)
@@ -1445,7 +1442,7 @@ _get_pattern_load_flags (FcPattern *pattern)
static int
_get_options_load_flags (const cairo_font_options_t *options)
{
- int load_flags = 0;
+ int load_flags = FT_LOAD_DEFAULT;
/* disable antialiasing if requested */
switch (options->antialias) {
@@ -1456,6 +1453,7 @@ _get_options_load_flags (const cairo_font_options_t *options)
load_flags |= FT_LOAD_MONOCHROME;
break;
case CAIRO_ANTIALIAS_SUBPIXEL:
+ load_flags |= FT_LOAD_NO_BITMAP;
switch (options->subpixel_order) {
case CAIRO_SUBPIXEL_ORDER_BGR:
load_flags |= PRIVATE_FLAG_BGR;
@@ -1469,28 +1467,29 @@ _get_options_load_flags (const cairo_font_options_t *options)
load_flags |= FT_LOAD_TARGET_LCD_V;
break;
}
+ break;
+
/* fall through ... */
case CAIRO_ANTIALIAS_DEFAULT:
case CAIRO_ANTIALIAS_GRAY:
load_flags |= FT_LOAD_NO_BITMAP;
+ /* disable hinting if requested */
+ switch (options->hint_style) {
+ case CAIRO_HINT_STYLE_NONE:
+ load_flags |= FT_LOAD_NO_HINTING;
+ break;
+ case CAIRO_HINT_STYLE_SLIGHT:
+ case CAIRO_HINT_STYLE_MEDIUM:
+ load_flags |= FT_LOAD_TARGET_LIGHT;
+ break;
+ case CAIRO_HINT_STYLE_FULL:
+ default:
+ load_flags |= FT_LOAD_TARGET_NORMAL;
+ break;
+ }
break;
}
- /* disable hinting if requested */
- switch (options->hint_style) {
- case CAIRO_HINT_STYLE_NONE:
- load_flags |= FT_LOAD_NO_HINTING;
- break;
- case CAIRO_HINT_STYLE_SLIGHT:
- case CAIRO_HINT_STYLE_MEDIUM:
- load_flags |= FT_LOAD_TARGET_LIGHT;
- break;
- case CAIRO_HINT_STYLE_FULL:
- default:
- load_flags |= FT_LOAD_TARGET_NORMAL;
- break;
- }
-
return load_flags;
}