mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 21:31:04 +00:00
64df3d06dc
When we did the major cairo update in bug 739096, most of our old patch files were superseded and no longer relevant, but I failed to clean them up at the time. So here, we remove all the old patch files, and create new ones just for the fixes we've applied on top of the new code from upstream. I've omitted patch files for fixes that I am aware have already landed upstream, as those will automatically be included in any future update we take. (It's possible more of the new patch files will also be obsolete by the time we try pulling a new version, but at least they should provide a starting point.) Differential Revision: https://phabricator.services.mozilla.com/D164680
235 lines
9.3 KiB
Diff
235 lines
9.3 KiB
Diff
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 *
|