summaryrefslogtreecommitdiff
path: root/testing/cairo
diff options
context:
space:
mode:
Diffstat (limited to 'testing/cairo')
-rw-r--r--testing/cairo/PKGBUILD47
-rw-r--r--testing/cairo/cairo-1.10.0-buggy_gradients.patch13
-rw-r--r--testing/cairo/cairo-1.12.2-reduce-broken-stopped-edge-continuation.patch275
-rw-r--r--testing/cairo/git_fixes.patch1086
4 files changed, 0 insertions, 1421 deletions
diff --git a/testing/cairo/PKGBUILD b/testing/cairo/PKGBUILD
deleted file mode 100644
index 951f174dc..000000000
--- a/testing/cairo/PKGBUILD
+++ /dev/null
@@ -1,47 +0,0 @@
-# $Id: PKGBUILD 169506 2012-10-22 17:33:56Z andyrtr $
-# Maintainer: Jan de Groot <jgc@archlinux.org>
-# Contributor: Brice Carpentier <brice@daknet.org>
-
-pkgname=cairo
-pkgver=1.12.6
-pkgrel=1
-pkgdesc="Cairo vector graphics library"
-arch=(i686 x86_64)
-license=('LGPL' 'MPL')
-url="http://cairographics.org/"
-depends=('libpng' 'libxrender' 'libxext' 'fontconfig' 'pixman' 'glib2' 'sh')
-makedepends=('librsvg' 'poppler-glib' 'libspectre' 'gtk-doc') # 'libdrm')
-optdepends=('xcb-util: for XCB backend') # really needed?
-provides=('cairo-xcb')
-replaces=('cairo-xcb')
-options=('!libtool')
-source=(http://cairographics.org/releases/$pkgname-$pkgver.tar.xz
- cairo-1.10.0-buggy_gradients.patch)
-sha1sums=('a383c6cb4495e18848ea43e1031c294aa9417a43'
- '8b843a9934e5112b6188e5bcf4adfc1fdaf9fa04')
-
-build() {
- cd "$srcdir/$pkgname-$pkgver"
- patch -Np1 -i ${srcdir}/cairo-1.10.0-buggy_gradients.patch
-
-# autoreconf -vfi
- ./configure --prefix=/usr \
- --sysconfdir=/etc \
- --localstatedir=/var \
- --disable-static \
- --enable-tee \
- --disable-xlib-xcb \
- # --enable-test-surfaces \ takes ages
- #--enable-drm # breaks build
- make
-}
-
-#check() {
-# cd "$srcdir/$pkgname-$pkgver"
-# make -k check || /bin/true # 161 Passed, 328 Failed [8 crashed, 10 expected], 26 Skipped
-#}
-
-package() {
- cd "$srcdir/$pkgname-$pkgver"
- make DESTDIR="$pkgdir" install
-}
diff --git a/testing/cairo/cairo-1.10.0-buggy_gradients.patch b/testing/cairo/cairo-1.10.0-buggy_gradients.patch
deleted file mode 100644
index 368e356d3..000000000
--- a/testing/cairo/cairo-1.10.0-buggy_gradients.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/src/cairo-xlib-display.c.ubuntu 2010-08-04 11:57:49.000000000 +0200
-+++ b/src/cairo-xlib-display.c 2010-08-04 11:58:28.000000000 +0200
-@@ -353,11 +353,7 @@
- /* Prior to Render 0.10, there is no protocol support for gradients and
- * we call function stubs instead, which would silently consume the drawing.
- */
--#if RENDER_MAJOR == 0 && RENDER_MINOR < 10
- display->buggy_gradients = TRUE;
--#else
-- display->buggy_gradients = FALSE;
--#endif
- display->buggy_pad_reflect = FALSE;
- display->buggy_repeat = FALSE;
diff --git a/testing/cairo/cairo-1.12.2-reduce-broken-stopped-edge-continuation.patch b/testing/cairo/cairo-1.12.2-reduce-broken-stopped-edge-continuation.patch
deleted file mode 100644
index e3bb30580..000000000
--- a/testing/cairo/cairo-1.12.2-reduce-broken-stopped-edge-continuation.patch
+++ /dev/null
@@ -1,275 +0,0 @@
-From f228769dfe5a8b5d73c49a41e95e31ed73a77fb3 Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Fri, 08 Jun 2012 16:22:41 +0000
-Subject: polygon-reduce: Reduce broken stopped-edge continuation
-
-This is hopefully a lesser used path and the attempted optimisation to
-continue a stopped edge with a colinear stopped edge highly unlikely and
-lost in the noise of the general inefficiency of the routine. As it was
-broken, rather than attempt to rectify the "optimisation" remove it.
-
-Reported-by: Evangelos Foutras <evangelos@foutrelis.com>
-Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50852
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/src/cairo-polygon-reduce.c b/src/cairo-polygon-reduce.c
-index 8758070..ea457fe 100644
---- a/src/cairo-polygon-reduce.c
-+++ b/src/cairo-polygon-reduce.c
-@@ -42,6 +42,8 @@
- #include "cairo-freelist-private.h"
- #include "cairo-combsort-inline.h"
-
-+#define DEBUG_POLYGON 0
-+
- typedef cairo_point_t cairo_bo_point32_t;
-
- typedef struct _cairo_bo_intersect_ordinate {
-@@ -114,7 +116,6 @@ typedef struct _cairo_bo_event_queue {
-
- typedef struct _cairo_bo_sweep_line {
- cairo_bo_edge_t *head;
-- cairo_bo_edge_t *stopped;
- int32_t current_y;
- cairo_bo_edge_t *current_edge;
- } cairo_bo_sweep_line_t;
-@@ -476,8 +477,8 @@ edges_compare_x_for_y (const cairo_bo_edge_t *a,
- static inline int
- _line_equal (const cairo_line_t *a, const cairo_line_t *b)
- {
-- return a->p1.x == b->p1.x && a->p1.y == b->p1.y &&
-- a->p2.x == b->p2.x && a->p2.y == b->p2.y;
-+ return (a->p1.x == b->p1.x && a->p1.y == b->p1.y &&
-+ a->p2.x == b->p2.x && a->p2.y == b->p2.y);
- }
-
- static int
-@@ -1024,7 +1025,6 @@ static void
- _cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line)
- {
- sweep_line->head = NULL;
-- sweep_line->stopped = NULL;
- sweep_line->current_y = INT32_MIN;
- sweep_line->current_edge = NULL;
- }
-@@ -1139,6 +1139,8 @@ edges_colinear (const cairo_bo_edge_t *a, const cairo_bo_edge_t *b)
- */
- if (a->edge.line.p1.y == b->edge.line.p1.y) {
- return a->edge.line.p1.x == b->edge.line.p1.x;
-+ } else if (a->edge.line.p2.y == b->edge.line.p2.y) {
-+ return a->edge.line.p2.x == b->edge.line.p2.x;
- } else if (a->edge.line.p1.y < b->edge.line.p1.y) {
- return edge_compare_for_y_against_x (b,
- a->edge.line.p1.y,
-@@ -1205,82 +1207,48 @@ _active_edges_to_polygon (cairo_bo_edge_t *left,
- cairo_polygon_t *polygon)
- {
- cairo_bo_edge_t *right;
-+ unsigned int mask;
-
-- if (fill_rule == CAIRO_FILL_RULE_WINDING) {
-- while (left != NULL) {
-- int in_out = left->edge.dir;
--
-- right = left->next;
-- if (left->deferred.right == NULL) {
-- while (right != NULL && right->deferred.right == NULL)
-- right = right->next;
--
-- if (right != NULL && edges_colinear (left, right)) {
-- /* continuation on left */
-- left->deferred = right->deferred;
-- right->deferred.right = NULL;
-- }
-- }
--
-- right = left->next;
-- while (right != NULL) {
-- if (right->deferred.right != NULL)
-- _cairo_bo_edge_end (right, top, polygon);
--
-- in_out += right->edge.dir;
-- if (in_out == 0) {
-- cairo_bo_edge_t *next;
-- cairo_bool_t skip = FALSE;
--
-- /* skip co-linear edges */
-- next = right->next;
-- if (next != NULL)
-- skip = edges_colinear (right, next);
-+ if (fill_rule == CAIRO_FILL_RULE_WINDING)
-+ mask = ~0;
-+ else
-+ mask = 1;
-
-- if (! skip)
-- break;
-- }
-+ while (left != NULL) {
-+ int in_out = left->edge.dir;
-
-+ right = left->next;
-+ if (left->deferred.right == NULL) {
-+ while (right != NULL && right->deferred.right == NULL)
- right = right->next;
-- }
--
-- _cairo_bo_edge_start_or_continue (left, right, top, polygon);
-
-- left = right;
-- if (left != NULL)
-- left = left->next;
-+ if (right != NULL && edges_colinear (left, right)) {
-+ /* continuation on left */
-+ left->deferred = right->deferred;
-+ right->deferred.right = NULL;
-+ }
- }
-- } else {
-- while (left != NULL) {
-- int in_out = 0;
-
-- right = left->next;
-- while (right != NULL) {
-- if (right->deferred.right != NULL)
-- _cairo_bo_edge_end (right, top, polygon);
-+ right = left->next;
-+ while (right != NULL) {
-+ if (right->deferred.right != NULL)
-+ _cairo_bo_edge_end (right, top, polygon);
-
-- if ((in_out++ & 1) == 0) {
-- cairo_bo_edge_t *next;
-- cairo_bool_t skip = FALSE;
--
-- /* skip co-linear edges */
-- next = right->next;
-- if (next != NULL)
-- skip = edges_colinear (right, next);
--
-- if (! skip)
-- break;
-- }
--
-- right = right->next;
-+ in_out += right->edge.dir;
-+ if ((in_out & mask) == 0) {
-+ /* skip co-linear edges */
-+ if (right->next == NULL || !edges_colinear (right, right->next))
-+ break;
- }
-
-- _cairo_bo_edge_start_or_continue (left, right, top, polygon);
--
-- left = right;
-- if (left != NULL)
-- left = left->next;
-+ right = right->next;
- }
-+
-+ _cairo_bo_edge_start_or_continue (left, right, top, polygon);
-+
-+ left = right;
-+ if (left != NULL)
-+ left = left->next;
- }
- }
-
-@@ -1303,12 +1271,6 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
-
- while ((event = _cairo_bo_event_dequeue (&event_queue))) {
- if (event->point.y != sweep_line.current_y) {
-- for (e1 = sweep_line.stopped; e1; e1 = e1->next) {
-- if (e1->deferred.right != NULL)
-- _cairo_bo_edge_end (e1, e1->edge.bottom, polygon);
-- }
-- sweep_line.stopped = NULL;
--
- _active_edges_to_polygon (sweep_line.head,
- sweep_line.current_y,
- fill_rule, polygon);
-@@ -1328,23 +1290,6 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
- if (unlikely (status))
- goto unwind;
-
-- /* check to see if this is a continuation of a stopped edge */
-- /* XXX change to an infinitesimal lengthening rule */
-- for (left = sweep_line.stopped; left; left = left->next) {
-- if (e1->edge.top <= left->edge.bottom &&
-- edges_colinear (e1, left))
-- {
-- e1->deferred = left->deferred;
-- if (left->prev != NULL)
-- left->prev = left->next;
-- else
-- sweep_line.stopped = left->next;
-- if (left->next != NULL)
-- left->next->prev = left->prev;
-- break;
-- }
-- }
--
- left = e1->prev;
- right = e1->next;
-
-@@ -1371,14 +1316,8 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
-
- _cairo_bo_sweep_line_delete (&sweep_line, e1);
-
-- /* first, check to see if we have a continuation via a fresh edge */
-- if (e1->deferred.right != NULL) {
-- e1->next = sweep_line.stopped;
-- if (sweep_line.stopped != NULL)
-- sweep_line.stopped->prev = e1;
-- sweep_line.stopped = e1;
-- e1->prev = NULL;
-- }
-+ if (e1->deferred.right != NULL)
-+ _cairo_bo_edge_end (e1, e1->edge.bottom, polygon);
-
- if (left != NULL && right != NULL) {
- status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, right);
-@@ -1420,10 +1359,6 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
- }
- }
-
-- for (e1 = sweep_line.stopped; e1; e1 = e1->next) {
-- if (e1->deferred.right != NULL)
-- _cairo_bo_edge_end (e1, e1->edge.bottom, polygon);
-- }
- unwind:
- _cairo_bo_event_queue_fini (&event_queue);
-
-@@ -1447,6 +1382,12 @@ _cairo_polygon_reduce (cairo_polygon_t *polygon,
- if (unlikely (0 == num_events))
- return CAIRO_STATUS_SUCCESS;
-
-+ if (DEBUG_POLYGON) {
-+ FILE *file = fopen ("reduce_in.txt", "w");
-+ _cairo_debug_print_polygon (file, polygon);
-+ fclose (file);
-+ }
-+
- events = stack_events;
- event_ptrs = stack_event_ptrs;
- if (num_events > ARRAY_LENGTH (stack_events)) {
-@@ -1482,10 +1423,16 @@ _cairo_polygon_reduce (cairo_polygon_t *polygon,
- num_events,
- fill_rule,
- polygon);
-- polygon->num_limits = num_limits;
-+ polygon->num_limits = num_limits;
-
- if (events != stack_events)
- free (events);
-
-+ if (DEBUG_POLYGON) {
-+ FILE *file = fopen ("reduce_out.txt", "w");
-+ _cairo_debug_print_polygon (file, polygon);
-+ fclose (file);
-+ }
-+
- return status;
- }
---
-cgit v0.9.0.2-2-gbebe
diff --git a/testing/cairo/git_fixes.patch b/testing/cairo/git_fixes.patch
deleted file mode 100644
index 6ad8979eb..000000000
--- a/testing/cairo/git_fixes.patch
+++ /dev/null
@@ -1,1086 +0,0 @@
-From ede11b2954db19e3ca9d31cef7d04a7bf0e42ddc Mon Sep 17 00:00:00 2001
-From: Behdad Esfahbod <behdad@behdad.org>
-Date: Sun, 25 Mar 2012 18:37:14 +0000
-Subject: Fix math in comments
-
----
-diff --git a/src/cairo-arc.c b/src/cairo-arc.c
-index dc07fee..6977e88 100644
---- a/src/cairo-arc.c
-+++ b/src/cairo-arc.c
-@@ -139,7 +139,7 @@ _arc_segments_needed (double angle,
-
- From that paper, a very practical value of h is:
-
-- h = 4/3 * tan(angle/4)
-+ h = 4/3 * R * tan(angle/4)
-
- This value does not give the spline with minimal error, but it does
- provide a very good approximation, (6th-order convergence), and the
---
-cgit v0.9.0.2-2-gbebe
-From fba21ef2a4c4eb343668267fda713aedbb6af2a4 Mon Sep 17 00:00:00 2001
-From: Henry (Yu) Song <hsong@sisa.samsung.com>
-Date: Tue, 27 Mar 2012 21:25:37 +0000
-Subject: gl: use font's antialias option to check whether it needs mask
-
-There is need to loop over number of glyphs to check wether the glyph
-image is a ARGB32 as the font's antialias option can be used for checking.
-If antialias is SUBPIXEL or BEST, the glyph surface will be ARGB32,
-otherwise it will be A8 format. Therefore we will only be using
-component-alpha at SUBPIXEL (or better) font quality and only then need
-a mask for multiple pass glyph composition.
----
-diff --git a/src/cairo-gl-glyphs.c b/src/cairo-gl-glyphs.c
-index 832956f..9756ea4 100644
---- a/src/cairo-gl-glyphs.c
-+++ b/src/cairo-gl-glyphs.c
-@@ -427,23 +427,15 @@ _cairo_gl_composite_glyphs (void *_dst,
-
- TRACE ((stderr, "%s\n", __FUNCTION__));
-
-- /* If any of the glyphs are component alpha, we have to go through a mask,
-- * since only _cairo_gl_surface_composite() currently supports component
-- * alpha.
-+ /* If any of the glyphs require component alpha, we have to go through
-+ * a mask, since only _cairo_gl_surface_composite() currently supports
-+ * component alpha.
- */
-- if (!dst->base.is_clear && ! info->use_mask && op != CAIRO_OPERATOR_OVER) {
-- for (i = 0; i < info->num_glyphs; i++) {
-- cairo_scaled_glyph_t *scaled_glyph;
--
-- if (_cairo_scaled_glyph_lookup (info->font, info->glyphs[i].index,
-- CAIRO_SCALED_GLYPH_INFO_SURFACE,
-- &scaled_glyph) == CAIRO_INT_STATUS_SUCCESS &&
-- scaled_glyph->surface->format == CAIRO_FORMAT_ARGB32)
-- {
-- info->use_mask = TRUE;
-- break;
-- }
-- }
-+ if (!dst->base.is_clear && ! info->use_mask && op != CAIRO_OPERATOR_OVER &&
-+ (info->font->options.antialias == CAIRO_ANTIALIAS_SUBPIXEL ||
-+ info->font->options.antialias == CAIRO_ANTIALIAS_BEST))
-+ {
-+ info->use_mask = TRUE;
- }
-
- if (info->use_mask) {
---
-cgit v0.9.0.2-2-gbebe
-From d304f0e57be8036719c3709e2419487326369105 Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Wed, 28 Mar 2012 23:32:36 +0000
-Subject: composite-rectangles: Trim extents for SOURCE and CLEAR to the mask
-
-The SOURCE and CLEAR are the odd pair in Cairo's range of operators that
-are bound by the shape/mask, but are unbound by the source. This
-regularly leads to bugs as only track the bound/unbound rectangles and
-confuse the meaning when bound only by the mask.
-
-What is required is that the unbound extents in this case is only
-trimmed by the mask (the bounded extents are still the intersection of
-all).
-
-Fixes bug-source-cu
-
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/src/cairo-composite-rectangles.c b/src/cairo-composite-rectangles.c
-index 106571e..8c5cd5a 100644
---- a/src/cairo-composite-rectangles.c
-+++ b/src/cairo-composite-rectangles.c
-@@ -147,8 +147,12 @@ _cairo_composite_rectangles_intersect (cairo_composite_rectangles_t *extents,
- if (! ret && extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK)
- return CAIRO_INT_STATUS_NOTHING_TO_DO;
-
-- if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE))
-+ if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE)) {
- extents->unbounded = extents->bounded;
-+ } else if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) {
-+ if (!_cairo_rectangle_intersect (&extents->unbounded, &extents->mask))
-+ return CAIRO_INT_STATUS_NOTHING_TO_DO;
-+ }
-
- extents->clip = _cairo_clip_reduce_for_composite (clip, extents);
- if (_cairo_clip_is_all_clipped (extents->clip))
-@@ -199,8 +203,12 @@ _cairo_composite_rectangles_intersect_source_extents (cairo_composite_rectangles
- rect.height == extents->bounded.height)
- return CAIRO_INT_STATUS_SUCCESS;
-
-- if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE))
-+ if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE)) {
- extents->unbounded = extents->bounded;
-+ } else if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) {
-+ if (!_cairo_rectangle_intersect (&extents->unbounded, &extents->mask))
-+ return CAIRO_INT_STATUS_NOTHING_TO_DO;
-+ }
-
- clip = extents->clip;
- extents->clip = _cairo_clip_reduce_for_composite (clip, extents);
-@@ -253,8 +261,12 @@ _cairo_composite_rectangles_intersect_mask_extents (cairo_composite_rectangles_t
- mask.height == extents->bounded.height)
- return CAIRO_INT_STATUS_SUCCESS;
-
-- if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE))
-+ if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE)) {
- extents->unbounded = extents->bounded;
-+ } else if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) {
-+ if (!_cairo_rectangle_intersect (&extents->unbounded, &extents->mask))
-+ return CAIRO_INT_STATUS_NOTHING_TO_DO;
-+ }
-
- clip = extents->clip;
- extents->clip = _cairo_clip_reduce_for_composite (clip, extents);
---
-cgit v0.9.0.2-2-gbebe
-From af6e084dd78fcbb8ecce46c57f655f5e24343b8c Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Thu, 29 Mar 2012 13:48:24 +0000
-Subject: cairoint: Mark PDF surface as requiring the deflate stream output
-
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/src/cairoint.h b/src/cairoint.h
-index 9a8003e..9f20d51 100644
---- a/src/cairoint.h
-+++ b/src/cairoint.h
-@@ -73,7 +73,10 @@
- #include "cairo-compiler-private.h"
- #include "cairo-error-private.h"
-
--#if CAIRO_HAS_PS_SURFACE || CAIRO_HAS_SCRIPT_SURFACE || CAIRO_HAS_XML_SURFACE
-+#if CAIRO_HAS_PDF_SURFACE || \
-+ CAIRO_HAS_PS_SURFACE || \
-+ CAIRO_HAS_SCRIPT_SURFACE || \
-+ CAIRO_HAS_XML_SURFACE
- #define CAIRO_HAS_DEFLATE_STREAM 1
- #endif
-
-@@ -84,7 +87,9 @@
- #define CAIRO_HAS_FONT_SUBSET 1
- #endif
-
--#if CAIRO_HAS_PS_SURFACE || CAIRO_HAS_PDF_SURFACE || CAIRO_HAS_FONT_SUBSET
-+#if CAIRO_HAS_PS_SURFACE || \
-+ CAIRO_HAS_PDF_SURFACE || \
-+ CAIRO_HAS_FONT_SUBSET
- #define CAIRO_HAS_PDF_OPERATORS 1
- #endif
-
---
-cgit v0.9.0.2-2-gbebe
-From a965b0f95fdeb567f7ccb51f7c8c47735a61e2d9 Mon Sep 17 00:00:00 2001
-From: Henry (Yu) Song <hsong@sisa.samsung.com>
-Date: Thu, 29 Mar 2012 01:08:51 +0000
-Subject: gl: fix y-axis origin when map_to_image() for non texture GL surface
-
-We need to fix y-axis origin when map a GL surface to image surface for
-non-texture GL surface.
-
-Test cases: extended-blend-alpha-mask, extended-blend-mask.
-Although the image outputs is not right, but the image on the first grid
-(upper-left corner) is correct comparing to image output.
----
-diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c
-index 8bbf939..32ecf63 100644
---- a/src/cairo-gl-surface.c
-+++ b/src/cairo-gl-surface.c
-@@ -985,6 +985,7 @@ _cairo_gl_surface_map_to_image (void *abstract_surface,
- unsigned int cpp;
- cairo_bool_t invert;
- cairo_status_t status;
-+ int y;
-
- /* Want to use a switch statement here but the compiler gets whiny. */
- if (surface->base.content == CAIRO_CONTENT_COLOR_ALPHA) {
-@@ -1065,7 +1066,12 @@ _cairo_gl_surface_map_to_image (void *abstract_surface,
- glPixelStorei (GL_PACK_ROW_LENGTH, image->stride / cpp);
- if (invert)
- glPixelStorei (GL_PACK_INVERT_MESA, 1);
-- glReadPixels (extents->x, extents->y,
-+
-+ y = extents->y;
-+ if (! _cairo_gl_surface_is_texture (surface))
-+ y = surface->height - extents->y - extents->height;
-+
-+ glReadPixels (extents->x, y,
- extents->width, extents->height,
- format, type, image->data);
- if (invert)
---
-cgit v0.9.0.2-2-gbebe
-From c77112c5464d7ff21052527f82f4d729cc509291 Mon Sep 17 00:00:00 2001
-From: Uli Schlachter <psychon@znc.in>
-Date: Mon, 02 Apr 2012 18:43:00 +0000
-Subject: xcb: Fix SHM in _get_image()
-
-Commit 2283ab9 introduced a logic error. Instead of falling back to the non-SHM
-path when getting the image via SHM failed, we now did the fallback when getting
-the image via SHM worked (which means that the SHM operation was a waste of
-time).
-
-Signed-off-by: Uli Schlachter <psychon@znc.in>
----
-diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c
-index fff4f52..6bedbda 100644
---- a/src/cairo-xcb-surface.c
-+++ b/src/cairo-xcb-surface.c
-@@ -367,7 +367,7 @@ _get_image (cairo_xcb_surface_t *surface,
- if (use_shm) {
- image = _get_shm_image (surface, x, y, width, height);
- if (image) {
-- if (image->status) {
-+ if (image->status == CAIRO_STATUS_SUCCESS) {
- _cairo_xcb_connection_release (connection);
- return image;
- }
---
-cgit v0.9.0.2-2-gbebe
-From cc247c346b75353f16ab40ac74c54cdd9663d16b Mon Sep 17 00:00:00 2001
-From: Henry (Yu) Song <hsong@sisa.samsung.com>
-Date: Mon, 02 Apr 2012 21:29:47 +0000
-Subject: gl: Remove an unused variable
-
----
-diff --git a/src/cairo-gl-gradient.c b/src/cairo-gl-gradient.c
-index b364b92..ce7c0dd 100644
---- a/src/cairo-gl-gradient.c
-+++ b/src/cairo-gl-gradient.c
-@@ -207,7 +207,6 @@ _cairo_gl_gradient_create (cairo_gl_context_t *ctx,
- cairo_status_t status;
- int tex_width;
- void *data;
-- cairo_gl_dispatch_t *dispatch = &ctx->dispatch;
-
- if ((unsigned int) ctx->max_texture_size / 2 <= n_stops)
- return CAIRO_INT_STATUS_UNSUPPORTED;
---
-cgit v0.9.0.2-2-gbebe
-From 7a262fd398c8a1f3c9052e8d9ec459e27ff91b4d Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Wed, 04 Apr 2012 10:23:09 +0000
-Subject: fix bug in _cairo_image_analyze_color
-
----
-diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c
-index 8208a15..e860e1b 100644
---- a/src/cairo-image-surface.c
-+++ b/src/cairo-image-surface.c
-@@ -1130,9 +1130,12 @@ _cairo_image_analyze_color (cairo_image_surface_t *image)
- if (image->color != CAIRO_IMAGE_UNKNOWN_COLOR)
- return image->color;
-
-- if (image->format == CAIRO_FORMAT_A1 || image->format == CAIRO_FORMAT_A8)
-+ if (image->format == CAIRO_FORMAT_A1)
- return image->color = CAIRO_IMAGE_IS_MONOCHROME;
-
-+ if (image->format == CAIRO_FORMAT_A8)
-+ return image->color = CAIRO_IMAGE_IS_GRAYSCALE;
-+
- if (image->format == CAIRO_FORMAT_ARGB32) {
- image->color = CAIRO_IMAGE_IS_MONOCHROME;
- for (y = 0; y < image->height; y++) {
---
-cgit v0.9.0.2-2-gbebe
-From 70b2856ed3d31b41e69b3d82fb9c5c11c2b3d3d4 Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Thu, 05 Apr 2012 23:43:35 +0000
-Subject: type1-subset: use fallback font if glyph widths are calculated
-
-Bug 48349 has a pdf file with a Type 1 font where the glyph widths are
-of the form:
-
-34 9302 19 div hsbw
----
-diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
-index 607ac8e..ba1008a 100644
---- a/src/cairo-type1-subset.c
-+++ b/src/cairo-type1-subset.c
-@@ -751,6 +751,9 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
- command = *p++;
- switch (command) {
- case TYPE1_CHARSTRING_COMMAND_HSBW:
-+ if (! last_op_was_integer)
-+ return CAIRO_INT_STATUS_UNSUPPORTED;
-+
- font->glyphs[glyph].width = font->build_stack.stack[1]/font->base.units_per_em;
- font->build_stack.sp = 0;
- last_op_was_integer = FALSE;
-@@ -797,6 +800,9 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
- break;
-
- case TYPE1_CHARSTRING_COMMAND_SBW:
-+ if (! last_op_was_integer)
-+ return CAIRO_INT_STATUS_UNSUPPORTED;
-+
- font->glyphs[glyph].width = font->build_stack.stack[2]/font->base.units_per_em;
- font->build_stack.sp = 0;
- last_op_was_integer = FALSE;
---
-cgit v0.9.0.2-2-gbebe
-From a6d955fcc46ae2da8d6f3b2cadeae64c03066461 Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Thu, 05 Apr 2012 23:53:50 +0000
-Subject: fix indentation in cairo_type1_font_subset_parse_charstring
-
----
-diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
-index ba1008a..ddef8ae 100644
---- a/src/cairo-type1-subset.c
-+++ b/src/cairo-type1-subset.c
-@@ -1,3 +1,4 @@
-+/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
- /* cairo - a vector graphics library with display and print output
- *
- * Copyright © 2006 Red Hat, Inc
-@@ -750,86 +751,79 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
- if (*p < 32) {
- command = *p++;
- switch (command) {
-- case TYPE1_CHARSTRING_COMMAND_HSBW:
-- if (! last_op_was_integer)
-- return CAIRO_INT_STATUS_UNSUPPORTED;
-+ case TYPE1_CHARSTRING_COMMAND_HSBW:
-+ if (! last_op_was_integer)
-+ return CAIRO_INT_STATUS_UNSUPPORTED;
-+
-+ font->glyphs[glyph].width = font->build_stack.stack[1]/font->base.units_per_em;
-+ font->build_stack.sp = 0;
-+ last_op_was_integer = FALSE;
-+ break;
-+
-+ case TYPE1_CHARSTRING_COMMAND_CALLSUBR:
-+ if (font->subset_subrs &&
-+ last_op_was_integer &&
-+ font->build_stack.top_value >= 0 &&
-+ font->build_stack.top_value < font->num_subrs)
-+ {
-+ subr_num = font->build_stack.top_value;
-+ font->subrs[subr_num].used = TRUE;
-+ last_op_was_integer = FALSE;
-+ status = cairo_type1_font_subset_parse_charstring (font,
-+ glyph,
-+ font->subrs[subr_num].subr_string,
-+ font->subrs[subr_num].subr_length);
-+ } else {
-+ font->subset_subrs = FALSE;
-+ }
-+ break;
-+
-+ case TYPE1_CHARSTRING_COMMAND_ESCAPE:
-+ command = command << 8 | *p++;
-+ switch (command) {
-+ case TYPE1_CHARSTRING_COMMAND_SEAC:
-+ /* The seac command takes five integer arguments. The
-+ * last two are glyph indices into the PS standard
-+ * encoding give the names of the glyphs that this
-+ * glyph is composed from. All we need to do is to
-+ * make sure those glyphs are present in the subset
-+ * under their standard names. */
-+ status = use_standard_encoding_glyph (font, font->build_stack.stack[3]);
-+ if (unlikely (status))
-+ return status;
-+
-+ status = use_standard_encoding_glyph (font, font->build_stack.stack[4]);
-+ if (unlikely (status))
-+ return status;
-
-- font->glyphs[glyph].width = font->build_stack.stack[1]/font->base.units_per_em;
- font->build_stack.sp = 0;
- last_op_was_integer = FALSE;
- break;
-
-- case TYPE1_CHARSTRING_COMMAND_CALLSUBR:
-- if (font->subset_subrs &&
-- last_op_was_integer &&
-- font->build_stack.top_value >= 0 &&
-- font->build_stack.top_value < font->num_subrs)
-- {
-- subr_num = font->build_stack.top_value;
-- font->subrs[subr_num].used = TRUE;
-- last_op_was_integer = FALSE;
-- status = cairo_type1_font_subset_parse_charstring (font,
-- glyph,
-- font->subrs[subr_num].subr_string,
-- font->subrs[subr_num].subr_length);
-- } else {
-- font->subset_subrs = FALSE;
-- }
-+ case TYPE1_CHARSTRING_COMMAND_SBW:
-+ if (! last_op_was_integer)
-+ return CAIRO_INT_STATUS_UNSUPPORTED;
-+
-+ font->glyphs[glyph].width = font->build_stack.stack[2]/font->base.units_per_em;
-+ font->build_stack.sp = 0;
-+ last_op_was_integer = FALSE;
- break;
-
-- case TYPE1_CHARSTRING_COMMAND_ESCAPE:
-- command = command << 8 | *p++;
-- switch (command) {
-- case TYPE1_CHARSTRING_COMMAND_SEAC:
-- /* The seac command takes five integer arguments. The
-- * last two are glyph indices into the PS standard
-- * encoding give the names of the glyphs that this
-- * glyph is composed from. All we need to do is to
-- * make sure those glyphs are present in the subset
-- * under their standard names. */
-- status = use_standard_encoding_glyph (font, font->build_stack.stack[3]);
-- if (unlikely (status))
-- return status;
--
-- status = use_standard_encoding_glyph (font, font->build_stack.stack[4]);
-- if (unlikely (status))
-- return status;
--
-- font->build_stack.sp = 0;
-- last_op_was_integer = FALSE;
-- break;
--
-- case TYPE1_CHARSTRING_COMMAND_SBW:
-- if (! last_op_was_integer)
-- return CAIRO_INT_STATUS_UNSUPPORTED;
--
-- font->glyphs[glyph].width = font->build_stack.stack[2]/font->base.units_per_em;
-- font->build_stack.sp = 0;
-- last_op_was_integer = FALSE;
-- break;
--
-- case TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR:
-- for (i = 0; i < font->build_stack.sp; i++)
-- font->ps_stack.other_subr_args[i] = font->build_stack.stack[i];
-- font->ps_stack.num_other_subr_args = font->build_stack.sp;
-- font->ps_stack.cur_other_subr_arg = 0;
-- font->build_stack.sp = 0;
-- last_op_was_integer = FALSE;
-- break;
--
-- case TYPE1_CHARSTRING_COMMAND_POP:
-- if (font->ps_stack.num_other_subr_args > font->ps_stack.cur_other_subr_arg) {
-- font->build_stack.top_value = font->ps_stack.other_subr_args[font->ps_stack.cur_other_subr_arg++];
-- last_op_was_integer = TRUE;
-- } else {
-- font->subset_subrs = FALSE;
-- }
-- break;
--
-- default:
-- font->build_stack.sp = 0;
-- last_op_was_integer = FALSE;
-- break;
-+ case TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR:
-+ for (i = 0; i < font->build_stack.sp; i++)
-+ font->ps_stack.other_subr_args[i] = font->build_stack.stack[i];
-+ font->ps_stack.num_other_subr_args = font->build_stack.sp;
-+ font->ps_stack.cur_other_subr_arg = 0;
-+ font->build_stack.sp = 0;
-+ last_op_was_integer = FALSE;
-+ break;
-+
-+ case TYPE1_CHARSTRING_COMMAND_POP:
-+ if (font->ps_stack.num_other_subr_args > font->ps_stack.cur_other_subr_arg) {
-+ font->build_stack.top_value = font->ps_stack.other_subr_args[font->ps_stack.cur_other_subr_arg++];
-+ last_op_was_integer = TRUE;
-+ } else {
-+ font->subset_subrs = FALSE;
- }
- break;
-
-@@ -837,6 +831,13 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
- font->build_stack.sp = 0;
- last_op_was_integer = FALSE;
- break;
-+ }
-+ break;
-+
-+ default:
-+ font->build_stack.sp = 0;
-+ last_op_was_integer = FALSE;
-+ break;
- }
- } else {
- /* integer argument */
---
-cgit v0.9.0.2-2-gbebe
-From 8886220b5027296f5b3b95e9c2f93509108d3b9e Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Fri, 06 Apr 2012 00:13:53 +0000
-Subject: type1-subset: if font name is prefixed with a subset tag, strip it off
-
----
-diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
-index ddef8ae..e507abe 100644
---- a/src/cairo-type1-subset.c
-+++ b/src/cairo-type1-subset.c
-@@ -381,6 +381,7 @@ cairo_type1_font_subset_get_fontname (cairo_type1_font_subset_t *font)
- {
- const char *start, *end, *segment_end;
- char *s;
-+ int i;
-
- segment_end = font->header_segment + font->header_segment_size;
- start = find_token (font->header_segment, segment_end, "/FontName");
-@@ -406,6 +407,16 @@ cairo_type1_font_subset_get_fontname (cairo_type1_font_subset_t *font)
- return CAIRO_INT_STATUS_UNSUPPORTED;
- }
-
-+ /* If font name is prefixed with a subset tag, strip it off. */
-+ if (strlen(start) > 7 && start[6] == '+') {
-+ for (i = 0; i < 6; i++) {
-+ if (start[i] < 'A' || start[i] > 'Z')
-+ break;
-+ }
-+ if (i == 6)
-+ start += 7;
-+ }
-+
- font->base.base_font = strdup (start);
- free (s);
- if (unlikely (font->base.base_font == NULL))
---
-cgit v0.9.0.2-2-gbebe
-From 8657ca10e34b0034602680b4304d47ecf90ccbfd Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Fri, 06 Apr 2012 11:50:40 +0000
-Subject: fix _cairo_pattern_get_ink_extents to work with snapshot recording surfaces
-
-It had caused pdf bbox sizes to regress to page size bboxes.
----
-diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c
-index 27ba004..5b3e177 100644
---- a/src/cairo-pattern.c
-+++ b/src/cairo-pattern.c
-@@ -37,6 +37,7 @@
- #include "cairo-path-private.h"
- #include "cairo-pattern-private.h"
- #include "cairo-recording-surface-private.h"
-+#include "cairo-surface-snapshot-private.h"
-
- #include <float.h>
-
-@@ -3666,6 +3667,9 @@ _cairo_pattern_get_ink_extents (const cairo_pattern_t *pattern,
- (const cairo_surface_pattern_t *) pattern;
- cairo_surface_t *surface = surface_pattern->surface;
-
-+ if (_cairo_surface_is_snapshot (surface))
-+ surface = _cairo_surface_snapshot_get_target (surface);
-+
- if (_cairo_surface_is_recording (surface)) {
- cairo_matrix_t imatrix;
- cairo_box_t box;
---
-cgit v0.9.0.2-2-gbebe
-From 6f28f0b33cb12f3b2dd48c87da0018bd00c17107 Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Sun, 08 Apr 2012 10:28:59 +0000
-Subject: stroke: Fix misuse of half_line_x for vertical caps on dashes
-
-A typo using half_line_x instead of half_line_y when emitting dashed
-segments of the rectilinear stroke.
-
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/src/cairo-path-stroke-boxes.c b/src/cairo-path-stroke-boxes.c
-index 3e8c5a4..cc9dd19 100644
---- a/src/cairo-path-stroke-boxes.c
-+++ b/src/cairo-path-stroke-boxes.c
-@@ -342,15 +342,15 @@ _cairo_rectilinear_stroker_emit_segments_dashed (cairo_rectilinear_stroker_t *st
- box.p1.x = box.p2.x - half_line_x;
- }
- if (out_slope.dy >= 0)
-- box.p1.y -= half_line_x;
-+ box.p1.y -= half_line_y;
- if (out_slope.dy <= 0)
-- box.p2.y += half_line_x;
-+ box.p2.y += half_line_y;
- } else {
- if (box.p1.y <= box.p2.y) {
- box.p1.y = box.p2.y;
-- box.p2.y += half_line_x;
-+ box.p2.y += half_line_y;
- } else {
-- box.p1.y = box.p2.y - half_line_x;
-+ box.p1.y = box.p2.y - half_line_y;
- }
- if (out_slope.dx >= 0)
- box.p1.x -= half_line_x;
---
-cgit v0.9.0.2-2-gbebe
-From 113ec6bf0c8ed1ff12293d1ed2a2de9bd5b9904b Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Sun, 08 Apr 2012 16:58:13 +0000
-Subject: traps: Clip the trapezoid extents against the clip extents
-
-Just in case the clip polygon turns out to be much larger than the
-operation extents (silly us for not reducing it correctly) and lead to
-catastrophe, such as:
-
-Program received signal SIGSEGV, Segmentation fault.
-pixman_fill_sse2 (bits=<optimized out>, stride=4, bpp=8, x=0, y=0,
-width=3, height=-34811, data=0) at pixman-sse2.c:3369
-3369 *(uint16_t *)d = data;
-
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c
-index 284a0be..c49e208 100644
---- a/src/cairo-traps-compositor.c
-+++ b/src/cairo-traps-compositor.c
-@@ -218,8 +218,13 @@ combine_clip_as_traps (const cairo_traps_compositor_t *compositor,
- _cairo_traps_fini (&traps);
- cairo_surface_destroy (src);
-
-- if (status == CAIRO_INT_STATUS_SUCCESS &&
-- (fixup.width < extents->width || fixup.height < extents->height)) {
-+ if (unlikely (status))
-+ return status;
-+
-+ if (! _cairo_rectangle_intersect (&fixup, extents))
-+ return CAIRO_STATUS_SUCCESS;
-+
-+ if (fixup.width < extents->width || fixup.height < extents->height) {
- cairo_boxes_t clear;
-
- _cairo_boxes_init (&clear);
---
-cgit v0.9.0.2-2-gbebe
-From de61681574eb7d6e0e497ea7f25797e3d9b20ac4 Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Mon, 09 Apr 2012 11:47:34 +0000
-Subject: build: Disable -Wset-but-unused-variable
-
-This is too noisy in the current build, and masking more important
-warnings.
-
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/build/configure.ac.warnings b/build/configure.ac.warnings
-index 3eb0104..f1b17f4 100644
---- a/build/configure.ac.warnings
-+++ b/build/configure.ac.warnings
-@@ -21,6 +21,9 @@ MAYBE_WARN="-Wall -Wextra \
- -Wno-missing-field-initializers -Wno-unused-parameter \
- -Wno-attributes -Wno-long-long -Winline"
-
-+# -Wunused-but-set-variable is too noisy at present
-+NO_WARN="-Wno-unused-but-set-variable"
-+
- dnl Sun Studio 12 likes to rag at us for abusing enums like
- dnl having cairo_status_t variables hold cairo_int_status_t
- dnl values. It's bad, we know. Now please be quiet.
-@@ -34,6 +37,8 @@ MAYBE_WARN="$MAYBE_WARN -fno-strict-aliasing -fno-common -flto"
- dnl Also to turn various gcc/glibc-specific preprocessor checks
- MAYBE_WARN="$MAYBE_WARN -Wp,-D_FORTIFY_SOURCE=2"
-
-+MAYBE_WARN="$MAYBE_WARN $NO_WARN"
-+
- # invalidate cached value if MAYBE_WARN has changed
- if test "x$cairo_cv_warn_maybe" != "x$MAYBE_WARN"; then
- unset cairo_cv_warn_cflags
---
-cgit v0.9.0.2-2-gbebe
-From 7cb5053c0694992320b5f7ea3b91ea497431813b Mon Sep 17 00:00:00 2001
-From: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Mon, 09 Apr 2012 11:49:20 +0000
-Subject: analysis: Apply the integer translation to the bbox as well
-
-The bbox is used to compute the ink extents (and so the pattern extents
-of a recording surface) and if given an integer translation we failed to
-transform the bbox into the target space.
-
-Fixes mask (pdf).
-
-Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
----
-diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c
-index b8abe02..8878f62 100644
---- a/src/cairo-analysis-surface.c
-+++ b/src/cairo-analysis-surface.c
-@@ -220,6 +220,14 @@ _add_operation (cairo_analysis_surface_t *surface,
- if (_cairo_matrix_is_integer_translation (&surface->ctm, &tx, &ty)) {
- rect->x += tx;
- rect->y += ty;
-+
-+ tx = _cairo_fixed_from_int (tx);
-+ bbox.p1.x += tx;
-+ bbox.p2.x += tx;
-+
-+ ty = _cairo_fixed_from_int (ty);
-+ bbox.p1.y += ty;
-+ bbox.p2.y += ty;
- } else {
- _cairo_matrix_transform_bounding_box_fixed (&surface->ctm,
- &bbox, NULL);
---
-cgit v0.9.0.2-2-gbebe
-From 038e4991912656a3239ca82d60056ca129016ba6 Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Mon, 09 Apr 2012 08:31:44 +0000
-Subject: pdf: avoid unnecessary use of patterns in mask groups
-
----
-diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
-index 4930e72..78537ce 100644
---- a/src/cairo-pdf-surface.c
-+++ b/src/cairo-pdf-surface.c
-@@ -5703,56 +5703,68 @@ _cairo_pdf_surface_write_mask_group (cairo_pdf_surface_t *surface,
- if (unlikely (status))
- return status;
-
-- pattern_res.id = 0;
-- gstate_res.id = 0;
-- status = _cairo_pdf_surface_add_pdf_pattern (surface, group->mask, NULL,
-- &pattern_res, &gstate_res);
-- if (unlikely (status))
-- return status;
--
-- if (gstate_res.id != 0) {
-- smask_group = _cairo_pdf_surface_create_smask_group (surface, &group->extents);
-- if (unlikely (smask_group == NULL))
-- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
--
-- smask_group->width = group->width;
-- smask_group->height = group->height;
-- smask_group->operation = PDF_PAINT;
-- smask_group->source = cairo_pattern_reference (group->mask);
-- smask_group->source_res = pattern_res;
-- status = _cairo_pdf_surface_add_smask_group (surface, smask_group);
-- if (unlikely (status)) {
-- _cairo_pdf_smask_group_destroy (smask_group);
-- return status;
-- }
--
-- status = _cairo_pdf_surface_add_smask (surface, gstate_res);
-- if (unlikely (status))
-- return status;
--
-- status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res);
-+ if (_can_paint_pattern (group->mask)) {
-+ _cairo_output_stream_printf (surface->output, "q\n");
-+ status = _cairo_pdf_surface_paint_pattern (surface,
-+ group->mask,
-+ &group->extents,
-+ FALSE);
- if (unlikely (status))
- return status;
-
-- _cairo_output_stream_printf (surface->output,
-- "q /s%d gs /x%d Do Q\n",
-- gstate_res.id,
-- smask_group->group_res.id);
-+ _cairo_output_stream_printf (surface->output, "Q\n");
- } else {
-- status = _cairo_pdf_surface_select_pattern (surface, group->mask, pattern_res, FALSE);
-+ pattern_res.id = 0;
-+ gstate_res.id = 0;
-+ status = _cairo_pdf_surface_add_pdf_pattern (surface, group->mask, NULL,
-+ &pattern_res, &gstate_res);
- if (unlikely (status))
- return status;
-
-- _cairo_output_stream_printf (surface->output,
-- "%f %f %f %f re f\n",
-- bbox.p1.x,
-- bbox.p1.y,
-- bbox.p2.x - bbox.p1.x,
-- bbox.p2.y - bbox.p1.y);
-+ if (gstate_res.id != 0) {
-+ smask_group = _cairo_pdf_surface_create_smask_group (surface, &group->extents);
-+ if (unlikely (smask_group == NULL))
-+ return _cairo_error (CAIRO_STATUS_NO_MEMORY);
-
-- status = _cairo_pdf_surface_unselect_pattern (surface);
-- if (unlikely (status))
-- return status;
-+ smask_group->width = group->width;
-+ smask_group->height = group->height;
-+ smask_group->operation = PDF_PAINT;
-+ smask_group->source = cairo_pattern_reference (group->mask);
-+ smask_group->source_res = pattern_res;
-+ status = _cairo_pdf_surface_add_smask_group (surface, smask_group);
-+ if (unlikely (status)) {
-+ _cairo_pdf_smask_group_destroy (smask_group);
-+ return status;
-+ }
-+
-+ status = _cairo_pdf_surface_add_smask (surface, gstate_res);
-+ if (unlikely (status))
-+ return status;
-+
-+ status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res);
-+ if (unlikely (status))
-+ return status;
-+
-+ _cairo_output_stream_printf (surface->output,
-+ "q /s%d gs /x%d Do Q\n",
-+ gstate_res.id,
-+ smask_group->group_res.id);
-+ } else {
-+ status = _cairo_pdf_surface_select_pattern (surface, group->mask, pattern_res, FALSE);
-+ if (unlikely (status))
-+ return status;
-+
-+ _cairo_output_stream_printf (surface->output,
-+ "%f %f %f %f re f\n",
-+ bbox.p1.x,
-+ bbox.p1.y,
-+ bbox.p2.x - bbox.p1.x,
-+ bbox.p2.y - bbox.p1.y);
-+
-+ status = _cairo_pdf_surface_unselect_pattern (surface);
-+ if (unlikely (status))
-+ return status;
-+ }
- }
-
- status = _cairo_pdf_surface_close_group (surface, &mask_group);
-@@ -5764,54 +5776,66 @@ _cairo_pdf_surface_write_mask_group (cairo_pdf_surface_t *surface,
- if (unlikely (status))
- return status;
-
-- pattern_res.id = 0;
-- gstate_res.id = 0;
-- status = _cairo_pdf_surface_add_pdf_pattern (surface, group->source, NULL,
-- &pattern_res, &gstate_res);
-- if (unlikely (status))
-- return status;
--
-- if (gstate_res.id != 0) {
-- smask_group = _cairo_pdf_surface_create_smask_group (surface, &group->extents);
-- if (unlikely (smask_group == NULL))
-- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
--
-- smask_group->operation = PDF_PAINT;
-- smask_group->source = cairo_pattern_reference (group->source);
-- smask_group->source_res = pattern_res;
-- status = _cairo_pdf_surface_add_smask_group (surface, smask_group);
-- if (unlikely (status)) {
-- _cairo_pdf_smask_group_destroy (smask_group);
-- return status;
-- }
--
-- status = _cairo_pdf_surface_add_smask (surface, gstate_res);
-- if (unlikely (status))
-- return status;
--
-- status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res);
-+ if (_can_paint_pattern (group->source)) {
-+ _cairo_output_stream_printf (surface->output, "q\n");
-+ status = _cairo_pdf_surface_paint_pattern (surface,
-+ group->source,
-+ &group->extents,
-+ FALSE);
- if (unlikely (status))
- return status;
-
-- _cairo_output_stream_printf (surface->output,
-- "q /s%d gs /x%d Do Q\n",
-- gstate_res.id,
-- smask_group->group_res.id);
-+ _cairo_output_stream_printf (surface->output, "Q\n");
- } else {
-- status = _cairo_pdf_surface_select_pattern (surface, group->source, pattern_res, FALSE);
-+ pattern_res.id = 0;
-+ gstate_res.id = 0;
-+ status = _cairo_pdf_surface_add_pdf_pattern (surface, group->source, NULL,
-+ &pattern_res, &gstate_res);
- if (unlikely (status))
- return status;
-
-- _cairo_output_stream_printf (surface->output,
-- "%f %f %f %f re f\n",
-- bbox.p1.x,
-- bbox.p1.y,
-- bbox.p2.x - bbox.p1.x,
-- bbox.p2.y - bbox.p1.y);
-+ if (gstate_res.id != 0) {
-+ smask_group = _cairo_pdf_surface_create_smask_group (surface, &group->extents);
-+ if (unlikely (smask_group == NULL))
-+ return _cairo_error (CAIRO_STATUS_NO_MEMORY);
-
-- status = _cairo_pdf_surface_unselect_pattern (surface);
-- if (unlikely (status))
-- return status;
-+ smask_group->operation = PDF_PAINT;
-+ smask_group->source = cairo_pattern_reference (group->source);
-+ smask_group->source_res = pattern_res;
-+ status = _cairo_pdf_surface_add_smask_group (surface, smask_group);
-+ if (unlikely (status)) {
-+ _cairo_pdf_smask_group_destroy (smask_group);
-+ return status;
-+ }
-+
-+ status = _cairo_pdf_surface_add_smask (surface, gstate_res);
-+ if (unlikely (status))
-+ return status;
-+
-+ status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res);
-+ if (unlikely (status))
-+ return status;
-+
-+ _cairo_output_stream_printf (surface->output,
-+ "q /s%d gs /x%d Do Q\n",
-+ gstate_res.id,
-+ smask_group->group_res.id);
-+ } else {
-+ status = _cairo_pdf_surface_select_pattern (surface, group->source, pattern_res, FALSE);
-+ if (unlikely (status))
-+ return status;
-+
-+ _cairo_output_stream_printf (surface->output,
-+ "%f %f %f %f re f\n",
-+ bbox.p1.x,
-+ bbox.p1.y,
-+ bbox.p2.x - bbox.p1.x,
-+ bbox.p2.y - bbox.p1.y);
-+
-+ status = _cairo_pdf_surface_unselect_pattern (surface);
-+ if (unlikely (status))
-+ return status;
-+ }
- }
-
- status = _cairo_pdf_surface_close_group (surface, NULL);
---
-cgit v0.9.0.2-2-gbebe
-From 9fcbe25c2dcf831783bb0fd20af9754c0b5c409b Mon Sep 17 00:00:00 2001
-From: Maarten Bosmans <mkbosmans@gmail.com>
-Date: Mon, 09 Apr 2012 19:33:50 +0000
-Subject: Protect code using dlfcn.h with CAIRO_HAS_DLSYM
-
----
-diff --git a/configure.ac b/configure.ac
-index cedfebe..5d2e6ec 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -52,6 +52,7 @@ AM_CONDITIONAL(CAIRO_HAS_DL, test "x$have_dl" = "xyes")
- if test "x$have_dlsym" = "xyes"; then
- AC_DEFINE([CAIRO_HAS_DLSYM], 1, [Define to 1 if dlsym is available])
- fi
-+AM_CONDITIONAL(CAIRO_HAS_DLSYM, test "x$have_dlsym" = "xyes")
-
- dnl ===========================================================================
-
-diff --git a/util/Makefile.am b/util/Makefile.am
-index f202f35..82d0a80 100644
---- a/util/Makefile.am
-+++ b/util/Makefile.am
-@@ -12,20 +12,24 @@ endif
-
- if CAIRO_HAS_TRACE
- SUBDIRS += cairo-trace
-+if CAIRO_HAS_DLSYM
- if CAIRO_HAS_SCRIPT_SURFACE
- if CAIRO_HAS_TEE_SURFACE
- SUBDIRS += cairo-fdr
- endif
- endif
- endif
-+endif
-
- if BUILD_SPHINX
-+if CAIRO_HAS_DLSYM
- if CAIRO_HAS_SCRIPT_SURFACE
- if CAIRO_HAS_TEE_SURFACE
- SUBDIRS += cairo-sphinx
- endif
- endif
- endif
-+endif
-
- AM_CPPFLAGS = -I$(top_srcdir)/src \
- -I$(top_builddir)/src \
---
-cgit v0.9.0.2-2-gbebe
-From c7b86ab97be1d3d3ccf43b652832f148a2fcf290 Mon Sep 17 00:00:00 2001
-From: Adrian Johnson <ajohnson@redneon.com>
-Date: Tue, 10 Apr 2012 13:04:05 +0000
-Subject: any2ppm: fix missing enumeration warning
-
----
-diff --git a/test/any2ppm.c b/test/any2ppm.c
-index 6b61c47..2403347 100644
---- a/test/any2ppm.c
-+++ b/test/any2ppm.c
-@@ -193,6 +193,7 @@ write_ppm (cairo_surface_t *surface, int fd)
- break;
- case CAIRO_FORMAT_A1:
- case CAIRO_FORMAT_RGB16_565:
-+ case CAIRO_FORMAT_RGB30:
- case CAIRO_FORMAT_INVALID:
- default:
- return "unhandled image format";
---
-cgit v0.9.0.2-2-gbebe
-From 09de481ce5f6ed1c38c0d5bf3af7c60642c4c947 Mon Sep 17 00:00:00 2001
-From: Gilles Espinasse <g.esp@free.fr>
-Date: Sat, 07 Apr 2012 21:09:51 +0000
-Subject: Cosmetic configure fix
-
-'how to allow undefined symbols in shared libraries' test should use CAIRO_CC_TRY_FLAG_SILENT or configure display is a bit out of order like this
-
-checking how to allow undefined symbols in shared libraries used by test suite... checking whether gcc supports -Wl,--allow-shlib-undefined... yes
--Wl,--allow-shlib-undefined
-
-Signed-off-by: Gilles Espinasse <g.esp@free.fr>
-Signed-off-by: Uli Schlachter <psychon@znc.in>
----
-diff --git a/build/configure.ac.warnings b/build/configure.ac.warnings
-index f1b17f4..3b2c6f3 100644
---- a/build/configure.ac.warnings
-+++ b/build/configure.ac.warnings
-@@ -89,7 +89,7 @@ AC_DEFINE_UNQUOTED([WARN_UNUSED_RESULT], [$cairo_cv_warn_unused_result],
-
- dnl check linker flags
- AC_CACHE_CHECK([how to allow undefined symbols in shared libraries used by test suite], cairo_cv_test_undefined_ldflags,
-- [CAIRO_CC_TRY_FLAG([-Wl,--allow-shlib-undefined], [],
-+ [CAIRO_CC_TRY_FLAG_SILENT([-Wl,--allow-shlib-undefined], [],
- [cairo_cv_test_undefined_ldflags="-Wl,--allow-shlib-undefined]")])
- CAIRO_TEST_UNDEFINED_LDFLAGS="$cairo_cv_test_undefined_ldflags"
- AC_SUBST(CAIRO_TEST_UNDEFINED_LDFLAGS)
---
-cgit v0.9.0.2-2-gbebe
-From 07fc63676dfdaa57ed919ad7be8f59c97c615473 Mon Sep 17 00:00:00 2001
-From: Uli Schlachter <psychon@znc.in>
-Date: Wed, 11 Apr 2012 19:37:55 +0000
-Subject: xlib: Disable fallback compositor with xlib-xcb
-
-When xlib-xcb is enabled, this is just dead code which is never used. Thus, this
-shouldn't hurt. However, this does include cairo-xlib-private.h. Shouldn't be a
-problem? Well, that header contains static inline functions which some compiler
-on Solaris will emit even when they are unused.
-
-This brings us to the real problem: That static inline function refers to a
-function which isn't compiled with xlib-xcb and thus linking fails with
-undefined symbols.
-
-This can be reproduced with GCC by adding a call to
-_cairo_xlib_screen_put_gc(NULL, NULL, 0, 0); to
-_cairo_xlib_fallback_compositor_get.
-
-Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48489
-Signed-off-by: Uli Schlachter <psychon@znc.in>
----
-diff --git a/src/cairo-xlib-fallback-compositor.c b/src/cairo-xlib-fallback-compositor.c
-index 5391926..7d45cd1 100644
---- a/src/cairo-xlib-fallback-compositor.c
-+++ b/src/cairo-xlib-fallback-compositor.c
-@@ -42,6 +42,8 @@
-
- #include "cairoint.h"
-
-+#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS
-+
- #include "cairo-xlib-private.h"
-
- #include "cairo-compositor-private.h"
-@@ -52,3 +54,5 @@ _cairo_xlib_fallback_compositor_get (void)
- /* XXX Do something interesting here to mitigate fallbacks ala xcb */
- return &_cairo_fallback_compositor;
- }
-+
-+#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */
---
-cgit v0.9.0.2-2-gbebe