04-subpixel-aa-api.patch (9951B)
1 # HG changeset patch 2 # User Jonathan Kew <jkew@mozilla.com> 3 # Date 1713886888 -3600 4 # Tue Apr 23 16:41:28 2024 +0100 5 # Node ID 5795122842a66df4f6217e4b5e9aac0e20b4389e 6 # Parent a0271c8e8524b6a3a11f76fe5854b402c71926a3 7 Apply cairo/04-subpixel-aa-api.patch (with modification in cairo-quartz-surface.c) 8 9 diff --git a/gfx/cairo/cairo/src/cairo-compositor-private.h b/gfx/cairo/cairo/src/cairo-compositor-private.h 10 --- a/gfx/cairo/cairo/src/cairo-compositor-private.h 11 +++ b/gfx/cairo/cairo/src/cairo-compositor-private.h 12 @@ -85,7 +85,8 @@ struct cairo_compositor { 13 cairo_scaled_font_t *scaled_font, 14 cairo_glyph_t *glyphs, 15 int num_glyphs, 16 - cairo_bool_t overlap); 17 + cairo_bool_t overlap, 18 + cairo_bool_t permit_subpixel_antialiasing); 19 }; 20 21 struct cairo_mask_compositor { 22 diff --git a/gfx/cairo/cairo/src/cairo-compositor.c b/gfx/cairo/cairo/src/cairo-compositor.c 23 --- a/gfx/cairo/cairo/src/cairo-compositor.c 24 +++ b/gfx/cairo/cairo/src/cairo-compositor.c 25 @@ -290,7 +290,8 @@ cairo_int_status_t 26 compositor = compositor->delegate; 27 28 status = compositor->glyphs (compositor, &extents, 29 - scaled_font, glyphs, num_glyphs, overlap); 30 + scaled_font, glyphs, num_glyphs, overlap, 31 + surface->permit_subpixel_antialiasing); 32 33 compositor = compositor->delegate; 34 } while (status == CAIRO_INT_STATUS_UNSUPPORTED); 35 diff --git a/gfx/cairo/cairo/src/cairo-no-compositor.c b/gfx/cairo/cairo/src/cairo-no-compositor.c 36 --- a/gfx/cairo/cairo/src/cairo-no-compositor.c 37 +++ b/gfx/cairo/cairo/src/cairo-no-compositor.c 38 @@ -91,7 +91,8 @@ static cairo_int_status_t 39 cairo_scaled_font_t *scaled_font, 40 cairo_glyph_t *glyphs, 41 int num_glyphs, 42 - cairo_bool_t overlap) 43 + cairo_bool_t overlap, 44 + cairo_bool_t permit_subpixel_antialiasing) 45 { 46 ASSERT_NOT_REACHED; 47 return CAIRO_INT_STATUS_NOTHING_TO_DO; 48 diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c 49 --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c 50 +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c 51 @@ -1871,7 +1871,8 @@ static cairo_int_status_t 52 cairo_scaled_font_t *scaled_font, 53 cairo_glyph_t *glyphs, 54 int num_glyphs, 55 - cairo_bool_t overlap) 56 + cairo_bool_t overlap, 57 + cairo_bool_t permit_subpixel_antialiasing) 58 { 59 CGAffineTransform textTransform, invTextTransform; 60 CGGlyph glyphs_static[CAIRO_STACK_ARRAY_LENGTH (CGPoint)]; 61 @@ -1885,6 +1886,7 @@ static cairo_int_status_t 62 CTFontRef ctFont = NULL; 63 64 cairo_bool_t didForceFontSmoothing = FALSE; 65 + cairo_antialias_t effective_antialiasing; 66 67 if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ) 68 return CAIRO_INT_STATUS_UNSUPPORTED; 69 @@ -1904,6 +1906,14 @@ static cairo_int_status_t 70 ctFont = _cairo_quartz_scaled_font_get_ct_font (scaled_font); 71 _cairo_quartz_set_antialiasing (state.cgMaskContext, scaled_font->options.antialias); 72 73 + effective_antialiasing = scaled_font->options.antialias; 74 + if (effective_antialiasing == CAIRO_ANTIALIAS_SUBPIXEL && 75 + !permit_subpixel_antialiasing) { 76 + effective_antialiasing = CAIRO_ANTIALIAS_GRAY; 77 + } 78 + 79 + _cairo_quartz_set_antialiasing (state.cgMaskContext, effective_antialiasing); 80 + 81 if (num_glyphs > ARRAY_LENGTH (glyphs_static)) { 82 cg_glyphs = (CGGlyph*) _cairo_malloc_ab (num_glyphs, sizeof (CGGlyph) + sizeof (CGPoint)); 83 if (unlikely (cg_glyphs == NULL)) { 84 diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h 85 --- a/gfx/cairo/cairo/src/cairo-surface-private.h 86 +++ b/gfx/cairo/cairo/src/cairo-surface-private.h 87 @@ -71,6 +71,7 @@ struct _cairo_surface { 88 unsigned has_font_options : 1; 89 unsigned owns_device : 1; 90 unsigned is_vector : 1; 91 + unsigned permit_subpixel_antialiasing : 1; 92 93 cairo_user_data_array_t user_data; 94 cairo_user_data_array_t mime_data; 95 diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c 96 --- a/gfx/cairo/cairo/src/cairo-surface.c 97 +++ b/gfx/cairo/cairo/src/cairo-surface.c 98 @@ -114,6 +114,7 @@ const cairo_surface_t name = { \ 99 FALSE, /* has_font_options */ \ 100 FALSE, /* owns_device */ \ 101 FALSE, /* is_vector */ \ 102 + FALSE, /* permit_subpixel_antialiasing */ \ 103 { 0, 0, 0, NULL, }, /* user_data */ \ 104 { 0, 0, 0, NULL, }, /* mime_data */ \ 105 { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform */ \ 106 @@ -426,6 +427,7 @@ void 107 surface->serial = 0; 108 surface->damage = NULL; 109 surface->owns_device = (device != NULL); 110 + surface->permit_subpixel_antialiasing = TRUE; 111 112 _cairo_user_data_array_init (&surface->user_data); 113 _cairo_user_data_array_init (&surface->mime_data); 114 @@ -461,6 +463,8 @@ static void 115 _cairo_font_options_fini (&options); 116 } 117 118 + surface->permit_subpixel_antialiasing = other->permit_subpixel_antialiasing; 119 + 120 cairo_surface_set_fallback_resolution (surface, 121 other->x_fallback_resolution, 122 other->y_fallback_resolution); 123 @@ -1626,6 +1630,51 @@ cairo_surface_get_font_options (cairo_su 124 _cairo_font_options_init_copy (options, &surface->font_options); 125 } 126 127 +/** 128 + * cairo_surface_set_subpixel_antialiasing: 129 + * @surface: a #cairo_surface_t 130 + * 131 + * Sets whether the surface permits subpixel antialiasing. By default, 132 + * surfaces permit subpixel antialiasing. 133 + * 134 + * Enabling subpixel antialiasing for CONTENT_COLOR_ALPHA surfaces generally 135 + * requires that the pixels in the areas under a subpixel antialiasing 136 + * operation already be opaque. 137 + **/ 138 +void 139 +cairo_surface_set_subpixel_antialiasing (cairo_surface_t *surface, 140 + cairo_subpixel_antialiasing_t enabled) 141 +{ 142 + if (surface->status) 143 + return; 144 + 145 + if (surface->finished) { 146 + _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); 147 + return; 148 + } 149 + 150 + surface->permit_subpixel_antialiasing = 151 + enabled == CAIRO_SUBPIXEL_ANTIALIASING_ENABLED; 152 +} 153 + 154 +/** 155 + * cairo_surface_get_subpixel_antialiasing: 156 + * @surface: a #cairo_surface_t 157 + * 158 + * Gets whether the surface supports subpixel antialiasing. By default, 159 + * CAIRO_CONTENT_COLOR surfaces support subpixel antialiasing but other 160 + * surfaces do not. 161 + **/ 162 +cairo_subpixel_antialiasing_t 163 +cairo_surface_get_subpixel_antialiasing (cairo_surface_t *surface) 164 +{ 165 + if (surface->status) 166 + return CAIRO_SUBPIXEL_ANTIALIASING_DISABLED; 167 + 168 + return surface->permit_subpixel_antialiasing ? 169 + CAIRO_SUBPIXEL_ANTIALIASING_ENABLED : CAIRO_SUBPIXEL_ANTIALIASING_DISABLED; 170 +} 171 + 172 cairo_status_t 173 _cairo_surface_flush (cairo_surface_t *surface, unsigned flags) 174 { 175 diff --git a/gfx/cairo/cairo/src/cairo-xcb-private.h b/gfx/cairo/cairo/src/cairo-xcb-private.h 176 --- a/gfx/cairo/cairo/src/cairo-xcb-private.h 177 +++ b/gfx/cairo/cairo/src/cairo-xcb-private.h 178 @@ -443,7 +443,8 @@ cairo_private cairo_int_status_t 179 cairo_scaled_font_t *scaled_font, 180 cairo_glyph_t *glyphs, 181 int num_glyphs, 182 - cairo_bool_t overlap); 183 + cairo_bool_t overlap, 184 + cairo_bool_t permit_subpixel_antialiasing); 185 cairo_private void 186 _cairo_xcb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font); 187 188 diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface-render.c b/gfx/cairo/cairo/src/cairo-xcb-surface-render.c 189 --- a/gfx/cairo/cairo/src/cairo-xcb-surface-render.c 190 +++ b/gfx/cairo/cairo/src/cairo-xcb-surface-render.c 191 @@ -4814,7 +4814,8 @@ cairo_int_status_t 192 cairo_scaled_font_t *scaled_font, 193 cairo_glyph_t *glyphs, 194 int num_glyphs, 195 - cairo_bool_t overlap) 196 + cairo_bool_t overlap, 197 + cairo_bool_t permit_subpixel_antialiasing) 198 { 199 cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; 200 cairo_operator_t op = composite->op; 201 diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface.c b/gfx/cairo/cairo/src/cairo-xcb-surface.c 202 --- a/gfx/cairo/cairo/src/cairo-xcb-surface.c 203 +++ b/gfx/cairo/cairo/src/cairo-xcb-surface.c 204 @@ -906,7 +906,8 @@ static cairo_int_status_t 205 cairo_scaled_font_t *scaled_font, 206 cairo_glyph_t *glyphs, 207 int num_glyphs, 208 - cairo_bool_t overlap) 209 + cairo_bool_t overlap, 210 + cairo_bool_t permit_subpixel_antialiasing) 211 { 212 cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; 213 cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); 214 diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h 215 --- a/gfx/cairo/cairo/src/cairo.h 216 +++ b/gfx/cairo/cairo/src/cairo.h 217 @@ -2737,6 +2737,26 @@ cairo_surface_show_page (cairo_surface_t 218 cairo_public cairo_bool_t 219 cairo_surface_has_show_text_glyphs (cairo_surface_t *surface); 220 221 +/** 222 + * _cairo_subpixel_antialiasing_t: 223 + * @CAIRO_SUBPIXEL_ANTIALIASING_ENABLED: subpixel antialiasing is enabled 224 + * for this surface. 225 + * @CAIRO_SUBPIXEL_ANTIALIASING_DISABLED: subpixel antialiasing is disabled 226 + * for this surface. 227 + */ 228 +typedef enum _cairo_subpixel_antialiasing_t { 229 + CAIRO_SUBPIXEL_ANTIALIASING_ENABLED, 230 + CAIRO_SUBPIXEL_ANTIALIASING_DISABLED 231 +} cairo_subpixel_antialiasing_t; 232 + 233 +cairo_public void 234 +cairo_surface_set_subpixel_antialiasing (cairo_surface_t *surface, 235 + cairo_subpixel_antialiasing_t enabled); 236 + 237 +cairo_public cairo_subpixel_antialiasing_t 238 +cairo_surface_get_subpixel_antialiasing (cairo_surface_t *surface); 239 + 240 + 241 /* Image-surface functions */ 242 243 cairo_public cairo_surface_t *