summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/ft-no-subpixel-if-surface-disables.patch
blob: a53e5de2bd989fa520bcf01ac36796e03f71f38f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# HG changeset patch
# Parent 31c7eac3de3de324cb5c93bd19c4e16a693f1101
# User Karl Tomlinson <karlt+@karlt.net>
b=929451 don't use subpixel aa for ft fonts on surfaces that don't support it r?roc

Also:
* Prefer subpixel order provided by the surface over that from the font face.
* Allow font face options to turn off subpixel aa.

diff --git a/gfx/cairo/cairo/src/cairo-ft-font.c b/gfx/cairo/cairo/src/cairo-ft-font.c
--- a/gfx/cairo/cairo/src/cairo-ft-font.c
+++ b/gfx/cairo/cairo/src/cairo-ft-font.c
@@ -1759,23 +1759,26 @@ static void
 
     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;
+    } else if (options->base.antialias != CAIRO_ANTIALIAS_GRAY) {
+	/* The surface supports subpixel aa, so let the font face options
+	 * choose whether to use subpixel aa.  If the surface has
+	 * CAIRO_ANTIALIAS_GRAY (e.g. PS, PDF, SVG, translucent part of a
+	 * CONTENT_COLOR_ALPHA surface), then don't accept subpixel aa. */
+	if (other->base.antialias != CAIRO_ANTIALIAS_DEFAULT)
+	    options->base.antialias = other->base.antialias;
+	/* If the surface knows the subpixel order then use that. */
+	if (options->base.subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT)
+	    options->base.subpixel_order = other->base.subpixel_order;
     }
 
     if (options->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;