diff options
Diffstat (limited to 'testing/cairo')
-rw-r--r-- | testing/cairo/PKGBUILD | 47 | ||||
-rw-r--r-- | testing/cairo/cairo-1.10.0-buggy_gradients.patch | 13 | ||||
-rw-r--r-- | testing/cairo/cairo-1.12.2-reduce-broken-stopped-edge-continuation.patch | 275 | ||||
-rw-r--r-- | testing/cairo/git_fixes.patch | 1086 |
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 |