I have used this patch with your source package
Could you try the modified package
http://olivn.trollprod.org/cairo-1.10.2-7.299.src.rpm
--- cairo-1.10.2.orig/src/cairo-ft-font.c 2011-01-30 11:05:56.709210029 +0000
+++ cairo-1.10.2/src/cairo-ft-font.c 2011-01-30 11:42:31.169860095 +0000
@@ -1578,6 +1578,7 @@
#ifdef FC_HINT_STYLE
int hintstyle;
#endif
+ int lcd_filter;
_cairo_font_options_init_default (&ft_options.base);
ft_options.load_flags = FT_LOAD_DEFAULT;
@@ -1587,81 +1588,125 @@
#define FC_EMBEDDED_BITMAP "embeddedbitmap"
#endif
+#ifndef FcUndefined
+#define FcUndefined -1
+#endif
/* Check whether to force use of embedded bitmaps */
if (FcPatternGetBool (pattern,
FC_EMBEDDED_BITMAP, 0, &bitmap) != FcResultMatch)
- bitmap = FcFalse;
+ bitmap = FcUndefined;
- /* disable antialiasing if requested */
- if (FcPatternGetBool (pattern,
- FC_ANTIALIAS, 0, &antialias) != FcResultMatch)
- antialias = FcTrue;
-
- if (antialias) {
- cairo_subpixel_order_t subpixel_order;
- int lcd_filter;
-
- /* disable hinting if requested */
- if (FcPatternGetBool (pattern,
- FC_HINTING, 0, &hinting) != FcResultMatch)
- hinting = FcTrue;
-
- if (FcPatternGetInteger (pattern,
- FC_RGBA, 0, &rgba) != FcResultMatch)
- rgba = FC_RGBA_UNKNOWN;
+ if (FcPatternGetInteger (pattern,
+ FC_RGBA, 0, &rgba) != FcResultMatch)
+ rgba = FC_RGBA_UNKNOWN;
+
+ /* Checking if antialias property was delivered from FontConfig */
+ if (FcPatternGetBool (pattern, FC_ANTIALIAS, 0, &antialias) != FcResultMatch)
+ antialias = FcUndefined;
+
+ /*
+ * There are several cases of FontConfig setting we have to deal with
+ * a) antialias == true, rgba == rgb/bgr/vrgb/vbgr
+ * b) antialias == true, rgba == none
+ * c) antialias == true, rgba undefined
+ * d) antialias == false
+ * e) antialias == undefined, rgba == rgb/bgr/vrgb/vbgr
+ * f) antialias == undefined, rgba == none
+ * g) antialias == undefined, rgba undefined
+ *
+ * They are processed in following manner:
+ * a-c) antialias is defined and is true
+ * In such case we have to decide what type of antialias to select: GRAY or SUBPIXEL.
+ * This is done based on the subpixel_order property.
+ * - CAIRO_ANTIALIAS_GRAY when rgba is FC_RGBA_NONE
+ * - CAIRO_ANTIALIAS_SUBPIXEL otherwise (if the rgba is rgb/bgr/vrgb/vbgr
+ * or subpixel wasn't defined in FC at all)
+ *
+ * d) antialias property is defined and is false
+ * In such case we set the CAIRO_ANTIALIAS_NONE
+ *
+ * e-g) antialias property is not defined
+ * - the subpixel_order was specified in FC - very unlikely scenario,
+ * but in such case we are assuming antialiasing should be switched on.
+ * Type of antialias is set it to CAIRO_ANTIALIAS_GRAY or CAIRO_ANTIALIAS_SUBPIXEL
+ * based on the rgba type.
+ * - the subpixel_order was not specified as well - we are setting CAIRO_ANTIALIAS_DEFAULT
+ */
+ if ( (antialias == FcTrue) ||
+ ( (antialias == FcUndefined) && (rgba != FC_RGBA_UNKNOWN) ) ) {
+ if (rgba == FC_RGBA_NONE) {
+ ft_options.base.antialias = CAIRO_ANTIALIAS_GRAY;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+ } else {
+ ft_options.base.antialias = CAIRO_ANTIALIAS_SUBPIXEL;
+ /* ft_options.base.subpixel_order will be set later */
+ }
+ } else if (antialias == FcFalse) {
+ ft_options.base.antialias = CAIRO_ANTIALIAS_NONE;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+ } /* Antialias property not defined in Fontconfig and rgba is not set.
+ * Not doing anything - staying with CAIRO_ANTIALIAS_DEFAULT */
+ if ( ft_options.base.antialias == CAIRO_ANTIALIAS_SUBPIXEL ) {
switch (rgba) {
case FC_RGBA_RGB:
- subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB;
break;
case FC_RGBA_BGR:
- subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR;
break;
case FC_RGBA_VRGB:
- subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB;
break;
case FC_RGBA_VBGR:
- subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR;
break;
case FC_RGBA_UNKNOWN:
case FC_RGBA_NONE:
default:
- subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+ ft_options.base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
break;
}
+ }
- if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) {
- ft_options.base.subpixel_order = subpixel_order;
- ft_options.base.antialias = CAIRO_ANTIALIAS_SUBPIXEL;
- }
-
- if (FcPatternGetInteger (pattern,
- FC_LCD_FILTER, 0, &lcd_filter) == FcResultMatch)
- {
- switch (lcd_filter) {
- case FC_LCD_NONE:
- ft_options.base.lcd_filter = CAIRO_LCD_FILTER_NONE;
- break;
- case FC_LCD_DEFAULT:
- ft_options.base.lcd_filter = CAIRO_LCD_FILTER_FIR5;
- break;
- case FC_LCD_LIGHT:
- ft_options.base.lcd_filter = CAIRO_LCD_FILTER_FIR3;
- break;
- case FC_LCD_LEGACY:
- ft_options.base.lcd_filter = CAIRO_LCD_FILTER_INTRA_PIXEL;
- break;
- }
+ if (FcPatternGetInteger (pattern, FC_LCD_FILTER, 0, &lcd_filter) == FcResultMatch) {
+ switch (lcd_filter) {
+ case FC_LCD_NONE:
+ ft_options.base.lcd_filter = CAIRO_LCD_FILTER_NONE;
+ break;
+ case FC_LCD_DEFAULT:
+ ft_options.base.lcd_filter = CAIRO_LCD_FILTER_FIR5;
+ break;
+ case FC_LCD_LIGHT:
+ ft_options.base.lcd_filter = CAIRO_LCD_FILTER_FIR3;
+ break;
+ case FC_LCD_LEGACY:
+ ft_options.base.lcd_filter = CAIRO_LCD_FILTER_INTRA_PIXEL;
+ break;
}
-
-#ifdef FC_HINT_STYLE
- if (FcPatternGetInteger (pattern,
- FC_HINT_STYLE, 0, &hintstyle) != FcResultMatch)
- hintstyle = FC_HINT_FULL;
-
- if (!hinting)
- hintstyle = FC_HINT_NONE;
-
+ } /* No LCD_FILTER property in FontConfig - staying with default CAIRO_LCD_FILTER_DEFAULT. */
+
+ /*
+ * Processing hinting information
+ * Hinting should be processed also when no antialias information delivered from FontConfig
+ */
+ if (FcPatternGetBool (pattern, FC_HINTING, 0, &hinting) != FcResultMatch)
+ hinting = FcUndefined;
+
+ /*
+ * If hininng is forced off, setting CAIRO_HINT_STYLE_NONE
+ * If hinting is not forced off, processing hintstyle and setting appropiate style
+ * If hinting is not forced off nor hintstyle defined,
+ * staing with the default CAIRO_HINT_STYLE_DEFAUT
+ * defined by _cairo_font_options_init_default
+ */
+ if (hinting == FcFalse)
+ ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE;
+
+#ifdef FC_HINT_STYLE
+ if ( (hinting != FcFalse) &&
+ (FcPatternGetInteger (pattern,
+ FC_HINT_STYLE, 0, &hintstyle) == FcResultMatch) ) {
switch (hintstyle) {
case FC_HINT_NONE:
ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE;
@@ -1677,46 +1722,39 @@
ft_options.base.hint_style = CAIRO_HINT_STYLE_FULL;
break;
}
-#else /* !FC_HINT_STYLE */
- if (!hinting) {
- ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE;
- }
+ }
#endif /* FC_HINT_STYLE */
- /* Force embedded bitmaps off if no hinting requested */
- if (ft_options.base.hint_style == CAIRO_HINT_STYLE_NONE)
- bitmap = FcFalse;
-
- if (!bitmap)
- ft_options.load_flags |= FT_LOAD_NO_BITMAP;
+ /* Force embedded bitmaps off if no hinting requested */
+ if (ft_options.base.hint_style == CAIRO_HINT_STYLE_NONE)
+ bitmap = FcFalse;
- } else {
- ft_options.base.antialias = CAIRO_ANTIALIAS_NONE;
- }
+ if (bitmap == FcFalse)
+ ft_options.load_flags |= FT_LOAD_NO_BITMAP;
/* force autohinting if requested */
if (FcPatternGetBool (pattern,
FC_AUTOHINT, 0, &autohint) != FcResultMatch)
- autohint = FcFalse;
+ autohint = FcUndefined;
- if (autohint)
+ if (autohint == FcTrue)
ft_options.load_flags |= FT_LOAD_FORCE_AUTOHINT;
if (FcPatternGetBool (pattern,
FC_VERTICAL_LAYOUT, 0, &vertical_layout) != FcResultMatch)
- vertical_layout = FcFalse;
+ vertical_layout = FcUndefined;
- if (vertical_layout)
+ if (vertical_layout == FcTrue)
ft_options.load_flags |= FT_LOAD_VERTICAL_LAYOUT;
#ifndef FC_EMBOLDEN
#define FC_EMBOLDEN "embolden"
#endif
- if (FcPatternGetBool (pattern,
+ if (FcPatternGetBool (pattern,
FC_EMBOLDEN, 0, &embolden) != FcResultMatch)
- embolden = FcFalse;
-
- if (embolden)
+ embolden = FcUndefined;
+
+ if (embolden == FcTrue)
ft_options.extra_flags |= CAIRO_FT_OPTIONS_EMBOLDEN;
*ret = ft_options;
@@ -1736,31 +1774,38 @@
if (load_flags & FT_LOAD_NO_HINTING)
other->base.hint_style = CAIRO_HINT_STYLE_NONE;
- if (other->base.antialias == CAIRO_ANTIALIAS_NONE ||
- options->base.antialias == CAIRO_ANTIALIAS_NONE) {
- options->base.antialias = CAIRO_ANTIALIAS_NONE;
- options->base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
- }
-
- if (other->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL &&
- (options->base.antialias == CAIRO_ANTIALIAS_DEFAULT ||
- options->base.antialias == CAIRO_ANTIALIAS_GRAY)) {
- options->base.antialias = CAIRO_ANTIALIAS_SUBPIXEL;
- options->base.subpixel_order = other->base.subpixel_order;
+ /* If others structure defines settings for antialiasing, we are processing them */
+ if (other->base.antialias != CAIRO_ANTIALIAS_DEFAULT) {
+ if ( other->base.antialias == CAIRO_ANTIALIAS_NONE ) {
+ /* Force antialias off */
+ options->base.antialias = CAIRO_ANTIALIAS_NONE;
+ options->base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+ } else {
+ /* Force antialias on */
+
+ /* If antialias==CAIRO_ANTIALIAS_SUBPIXEL is set,
+ * but the subpixel_order is set to CAIRO_SUBPIXEL_ORDER_DEFAULT,
+ * we have to determine what type of antialiasing will be used based
+ * on current subpixel order */
+ if ( (other->base.subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT) &&
+ (other->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL) ) {
+ if (options->base.subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT)
+ options->base.antialias = CAIRO_ANTIALIAS_GRAY;
+ else
+ options->base.antialias = CAIRO_ANTIALIAS_SUBPIXEL;
+ } else {
+ options->base.subpixel_order = other->base.subpixel_order;
+ options->base.antialias = other->base.antialias;
+ }
+ }
}
-
- if (options->base.hint_style == CAIRO_HINT_STYLE_DEFAULT)
+
+ if (other->base.hint_style != CAIRO_HINT_STYLE_DEFAULT)
options->base.hint_style = other->base.hint_style;
- if (other->base.hint_style == CAIRO_HINT_STYLE_NONE)
- options->base.hint_style = CAIRO_HINT_STYLE_NONE;
-
- if (options->base.lcd_filter == CAIRO_LCD_FILTER_DEFAULT)
+ if (other->base.lcd_filter != CAIRO_LCD_FILTER_DEFAULT)
options->base.lcd_filter = other->base.lcd_filter;
- if (other->base.lcd_filter == CAIRO_LCD_FILTER_NONE)
- options->base.lcd_filter = CAIRO_LCD_FILTER_NONE;
-
if (options->base.antialias == CAIRO_ANTIALIAS_NONE) {
if (options->base.hint_style == CAIRO_HINT_STYLE_NONE)
load_flags |= FT_LOAD_NO_HINTING;