summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/04-subpixel-aa-api.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/cairo/04-subpixel-aa-api.patch')
-rw-r--r--gfx/cairo/04-subpixel-aa-api.patch234
1 files changed, 234 insertions, 0 deletions
diff --git a/gfx/cairo/04-subpixel-aa-api.patch b/gfx/cairo/04-subpixel-aa-api.patch
new file mode 100644
index 0000000000..c4763638eb
--- /dev/null
+++ b/gfx/cairo/04-subpixel-aa-api.patch
@@ -0,0 +1,234 @@
+diff --git a/gfx/cairo/cairo/src/cairo-compositor-private.h b/gfx/cairo/cairo/src/cairo-compositor-private.h
+--- a/gfx/cairo/cairo/src/cairo-compositor-private.h
++++ b/gfx/cairo/cairo/src/cairo-compositor-private.h
+@@ -85,7 +85,8 @@ struct cairo_compositor {
+ cairo_scaled_font_t *scaled_font,
+ cairo_glyph_t *glyphs,
+ int num_glyphs,
+- cairo_bool_t overlap);
++ cairo_bool_t overlap,
++ cairo_bool_t permit_subpixel_antialiasing);
+ };
+
+ struct cairo_mask_compositor {
+diff --git a/gfx/cairo/cairo/src/cairo-compositor.c b/gfx/cairo/cairo/src/cairo-compositor.c
+--- a/gfx/cairo/cairo/src/cairo-compositor.c
++++ b/gfx/cairo/cairo/src/cairo-compositor.c
+@@ -248,7 +248,8 @@ cairo_int_status_t
+ compositor = compositor->delegate;
+
+ status = compositor->glyphs (compositor, &extents,
+- scaled_font, glyphs, num_glyphs, overlap);
++ scaled_font, glyphs, num_glyphs, overlap,
++ surface->permit_subpixel_antialiasing);
+
+ compositor = compositor->delegate;
+ } while (status == CAIRO_INT_STATUS_UNSUPPORTED);
+diff --git a/gfx/cairo/cairo/src/cairo-no-compositor.c b/gfx/cairo/cairo/src/cairo-no-compositor.c
+--- a/gfx/cairo/cairo/src/cairo-no-compositor.c
++++ b/gfx/cairo/cairo/src/cairo-no-compositor.c
+@@ -91,7 +91,8 @@ static cairo_int_status_t
+ cairo_scaled_font_t *scaled_font,
+ cairo_glyph_t *glyphs,
+ int num_glyphs,
+- cairo_bool_t overlap)
++ cairo_bool_t overlap,
++ cairo_bool_t permit_subpixel_antialiasing)
+ {
+ ASSERT_NOT_REACHED;
+ return CAIRO_INT_STATUS_NOTHING_TO_DO;
+diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c
+--- a/gfx/cairo/cairo/src/cairo-quartz-surface.c
++++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c
+@@ -1947,7 +1947,8 @@ static cairo_int_status_t
+ cairo_scaled_font_t *scaled_font,
+ cairo_glyph_t *glyphs,
+ int num_glyphs,
+- cairo_bool_t overlap)
++ cairo_bool_t overlap,
++ cairo_bool_t permit_subpixel_antialiasing)
+ {
+ CGAffineTransform textTransform, invTextTransform;
+ CGGlyph glyphs_static[CAIRO_STACK_ARRAY_LENGTH (CGSize)];
+@@ -1963,6 +1964,7 @@ static cairo_int_status_t
+ CGFontRef cgfref = NULL;
+
+ cairo_bool_t didForceFontSmoothing = FALSE;
++ cairo_antialias_t effective_antialiasing;
+
+ if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ)
+ return CAIRO_INT_STATUS_UNSUPPORTED;
+@@ -1983,7 +1985,12 @@ static cairo_int_status_t
+ CGContextSetFont (state.cgMaskContext, cgfref);
+ CGContextSetFontSize (state.cgMaskContext, 1.0);
+
+- switch (scaled_font->options.antialias) {
++ effective_antialiasing = scaled_font->options.antialias;
++ if (effective_antialiasing == CAIRO_ANTIALIAS_SUBPIXEL &&
++ !permit_subpixel_antialiasing) {
++ effective_antialiasing = CAIRO_ANTIALIAS_GRAY;
++ }
++ switch (effective_antialiasing) {
+ case CAIRO_ANTIALIAS_SUBPIXEL:
+ case CAIRO_ANTIALIAS_BEST:
+ CGContextSetShouldAntialias (state.cgMaskContext, TRUE);
+diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h
+--- a/gfx/cairo/cairo/src/cairo-surface-private.h
++++ b/gfx/cairo/cairo/src/cairo-surface-private.h
+@@ -71,6 +71,7 @@ struct _cairo_surface {
+ unsigned has_font_options : 1;
+ unsigned owns_device : 1;
+ unsigned is_vector : 1;
++ unsigned permit_subpixel_antialiasing : 1;
+
+ cairo_user_data_array_t user_data;
+ cairo_user_data_array_t mime_data;
+diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c
+--- a/gfx/cairo/cairo/src/cairo-surface.c
++++ b/gfx/cairo/cairo/src/cairo-surface.c
+@@ -115,6 +115,7 @@ const cairo_surface_t name = { \
+ FALSE, /* has_font_options */ \
+ FALSE, /* owns_device */ \
+ FALSE, /* is_vector */ \
++ FALSE, /* permit_subpixel_antialiasing */ \
+ { 0, 0, 0, NULL, }, /* user_data */ \
+ { 0, 0, 0, NULL, }, /* mime_data */ \
+ { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform */ \
+@@ -421,6 +422,7 @@ void
+ surface->serial = 0;
+ surface->damage = NULL;
+ surface->owns_device = (device != NULL);
++ surface->permit_subpixel_antialiasing = TRUE;
+
+ _cairo_user_data_array_init (&surface->user_data);
+ _cairo_user_data_array_init (&surface->mime_data);
+@@ -452,6 +454,8 @@ static void
+ _cairo_surface_set_font_options (surface, &options);
+ }
+
++ surface->permit_subpixel_antialiasing = other->permit_subpixel_antialiasing;
++
+ cairo_surface_set_fallback_resolution (surface,
+ other->x_fallback_resolution,
+ other->y_fallback_resolution);
+@@ -1619,6 +1623,51 @@ cairo_surface_get_font_options (cairo_su
+ }
+ slim_hidden_def (cairo_surface_get_font_options);
+
++/**
++ * cairo_surface_set_subpixel_antialiasing:
++ * @surface: a #cairo_surface_t
++ *
++ * Sets whether the surface permits subpixel antialiasing. By default,
++ * surfaces permit subpixel antialiasing.
++ *
++ * Enabling subpixel antialiasing for CONTENT_COLOR_ALPHA surfaces generally
++ * requires that the pixels in the areas under a subpixel antialiasing
++ * operation already be opaque.
++ **/
++void
++cairo_surface_set_subpixel_antialiasing (cairo_surface_t *surface,
++ cairo_subpixel_antialiasing_t enabled)
++{
++ if (surface->status)
++ return;
++
++ if (surface->finished) {
++ _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED);
++ return;
++ }
++
++ surface->permit_subpixel_antialiasing =
++ enabled == CAIRO_SUBPIXEL_ANTIALIASING_ENABLED;
++}
++
++/**
++ * cairo_surface_get_subpixel_antialiasing:
++ * @surface: a #cairo_surface_t
++ *
++ * Gets whether the surface supports subpixel antialiasing. By default,
++ * CAIRO_CONTENT_COLOR surfaces support subpixel antialiasing but other
++ * surfaces do not.
++ **/
++cairo_subpixel_antialiasing_t
++cairo_surface_get_subpixel_antialiasing (cairo_surface_t *surface)
++{
++ if (surface->status)
++ return CAIRO_SUBPIXEL_ANTIALIASING_DISABLED;
++
++ return surface->permit_subpixel_antialiasing ?
++ CAIRO_SUBPIXEL_ANTIALIASING_ENABLED : CAIRO_SUBPIXEL_ANTIALIASING_DISABLED;
++}
++
+ cairo_status_t
+ _cairo_surface_flush (cairo_surface_t *surface, unsigned flags)
+ {
+diff --git a/gfx/cairo/cairo/src/cairo-xcb-private.h b/gfx/cairo/cairo/src/cairo-xcb-private.h
+--- a/gfx/cairo/cairo/src/cairo-xcb-private.h
++++ b/gfx/cairo/cairo/src/cairo-xcb-private.h
+@@ -453,7 +453,8 @@ cairo_private cairo_int_status_t
+ cairo_scaled_font_t *scaled_font,
+ cairo_glyph_t *glyphs,
+ int num_glyphs,
+- cairo_bool_t overlap);
++ cairo_bool_t overlap,
++ cairo_bool_t permit_subpixel_antialiasing);
+ cairo_private void
+ _cairo_xcb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font);
+
+diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface-render.c b/gfx/cairo/cairo/src/cairo-xcb-surface-render.c
+--- a/gfx/cairo/cairo/src/cairo-xcb-surface-render.c
++++ b/gfx/cairo/cairo/src/cairo-xcb-surface-render.c
+@@ -4816,7 +4816,8 @@ cairo_int_status_t
+ cairo_scaled_font_t *scaled_font,
+ cairo_glyph_t *glyphs,
+ int num_glyphs,
+- cairo_bool_t overlap)
++ cairo_bool_t overlap,
++ cairo_bool_t permit_subpixel_antialiasing)
+ {
+ cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface;
+ cairo_operator_t op = composite->op;
+diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface.c b/gfx/cairo/cairo/src/cairo-xcb-surface.c
+--- a/gfx/cairo/cairo/src/cairo-xcb-surface.c
++++ b/gfx/cairo/cairo/src/cairo-xcb-surface.c
+@@ -912,7 +912,8 @@ static cairo_int_status_t
+ cairo_scaled_font_t *scaled_font,
+ cairo_glyph_t *glyphs,
+ int num_glyphs,
+- cairo_bool_t overlap)
++ cairo_bool_t overlap,
++ cairo_bool_t permit_subpixel_antialiasing)
+ {
+ cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface;
+ cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents);
+diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h
+--- a/gfx/cairo/cairo/src/cairo.h
++++ b/gfx/cairo/cairo/src/cairo.h
+@@ -2573,6 +2573,26 @@ cairo_surface_show_page (cairo_surface_t
+ cairo_public cairo_bool_t
+ cairo_surface_has_show_text_glyphs (cairo_surface_t *surface);
+
++/**
++ * _cairo_subpixel_antialiasing_t:
++ * @CAIRO_SUBPIXEL_ANTIALIASING_ENABLED: subpixel antialiasing is enabled
++ * for this surface.
++ * @CAIRO_SUBPIXEL_ANTIALIASING_DISABLED: subpixel antialiasing is disabled
++ * for this surface.
++ */
++typedef enum _cairo_subpixel_antialiasing_t {
++ CAIRO_SUBPIXEL_ANTIALIASING_ENABLED,
++ CAIRO_SUBPIXEL_ANTIALIASING_DISABLED
++} cairo_subpixel_antialiasing_t;
++
++cairo_public void
++cairo_surface_set_subpixel_antialiasing (cairo_surface_t *surface,
++ cairo_subpixel_antialiasing_t enabled);
++
++cairo_public cairo_subpixel_antialiasing_t
++cairo_surface_get_subpixel_antialiasing (cairo_surface_t *surface);
++
++
+ /* Image-surface functions */
+
+ cairo_public cairo_surface_t *