[arch-commits] Commit in cairo/trunk (PKGBUILD git_fixes.diff)

andyrtr at archlinux.org andyrtr at archlinux.org
Wed Oct 31 07:41:50 UTC 2012


    Date: Wednesday, October 31, 2012 @ 03:41:50
  Author: andyrtr
Revision: 170044

upgpkg: cairo 1.12.6-2

update to latest git commits - should solve FS#32272; drop buggy gradient patch that should be obsolete with latest Xorg

Added:
  cairo/trunk/git_fixes.diff
Modified:
  cairo/trunk/PKGBUILD

----------------+
 PKGBUILD       |   15 
 git_fixes.diff |  934 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 945 insertions(+), 4 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-10-31 07:26:06 UTC (rev 170043)
+++ PKGBUILD	2012-10-31 07:41:50 UTC (rev 170044)
@@ -4,7 +4,7 @@
 
 pkgname=cairo
 pkgver=1.12.6
-pkgrel=1
+pkgrel=2
 pkgdesc="Cairo vector graphics library"
 arch=(i686 x86_64)
 license=('LGPL' 'MPL')
@@ -16,14 +16,21 @@
 replaces=('cairo-xcb')
 options=('!libtool')
 source=(http://cairographics.org/releases/$pkgname-$pkgver.tar.xz
-        cairo-1.10.0-buggy_gradients.patch)
+        cairo-1.10.0-buggy_gradients.patch
+        git_fixes.diff)
 sha1sums=('a383c6cb4495e18848ea43e1031c294aa9417a43'
-          '8b843a9934e5112b6188e5bcf4adfc1fdaf9fa04')
+          '8b843a9934e5112b6188e5bcf4adfc1fdaf9fa04'
+          '31b3179cda0afa2e2f037d6850fd8607383cb95a')
 
 build() {
   cd "$srcdir/$pkgname-$pkgver"
-  patch -Np1 -i ${srcdir}/cairo-1.10.0-buggy_gradients.patch
+#  patch -Np1 -i ${srcdir}/cairo-1.10.0-buggy_gradients.patch
 
+  # status: http://cgit.freedesktop.org/cairo/commit/?id=66625cb46c985321c46b79d2163a4d676d6700ba
+  # 2012-10-30 12:40:41 (GMT)
+  # xlib: Apply the image offsets to the destination rather the source
+  patch -Np1 -i ${srcdir}/git_fixes.diff
+
 #  autoreconf -vfi
   ./configure --prefix=/usr \
 	--sysconfdir=/etc \

Added: git_fixes.diff
===================================================================
--- git_fixes.diff	                        (rev 0)
+++ git_fixes.diff	2012-10-31 07:41:50 UTC (rev 170044)
@@ -0,0 +1,934 @@
+From e43f53bf7f3d371116f31f22ab9754b08b5abe7f Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Mon, 22 Oct 2012 12:47:11 +0000
+Subject: version: Post release bump to 1.12.7
+
+---
+diff --git a/cairo-version.h b/cairo-version.h
+index dc89a19..c685909 100644
+--- a/cairo-version.h
++++ b/cairo-version.h
+@@ -3,6 +3,6 @@
+ 
+ #define CAIRO_VERSION_MAJOR 1
+ #define CAIRO_VERSION_MINOR 12
+-#define CAIRO_VERSION_MICRO 6
++#define CAIRO_VERSION_MICRO 7
+ 
+ #endif
+--
+cgit v0.9.0.2-2-gbebe
+From 00feb8ce530a472abbde445b52d9ae8c99ec97f0 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Fri, 26 Oct 2012 09:51:31 +0000
+Subject: xlib/shm: Sanity check that the server handles XSendEvent with ShmCompletion
+
+Uli Schlachter suggested it would be wiser to complement our blacklist
+of known broken X/libXext with an explicit roundtrip to check for a
+BadValue error return when we try to use XSendEvent.
+
+Suggested-by: Uli Schlachter <psychon at znc.in>
+Reported-by: Martin Husemann <martin at duskware.de>
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+---
+diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c
+index ec0d334..17594b1 100644
+--- a/src/cairo-xlib-surface-shm.c
++++ b/src/cairo-xlib-surface-shm.c
+@@ -1128,8 +1128,60 @@ _cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface)
+     (((major) * 10000000) + ((minor) * 100000) + ((patch) * 1000) + snap)
+ 
+ static cairo_bool_t
+-xorg_has_buggy_send_shm_completion_event(Display *dpy)
++has_broken_send_shm_event (cairo_xlib_display_t *display,
++			   cairo_xlib_shm_display_t *shm)
+ {
++    Display *dpy = display->display;
++    int (*old_handler) (Display *display, XErrorEvent *event);
++    XShmCompletionEvent ev;
++    XShmSegmentInfo info;
++
++    info.shmid = shmget (IPC_PRIVATE, 0x1000, IPC_CREAT | 0600);
++    if (info.shmid == -1)
++	return TRUE;
++
++    info.readOnly = FALSE;
++    info.shmaddr = shmat (info.shmid, NULL, 0);
++    if (info.shmaddr == (char *) -1) {
++	shmctl (info.shmid, IPC_RMID, NULL);
++	return TRUE;
++    }
++
++    ev.type = shm->event;
++    ev.drawable = shm->window;
++    ev.major_code = shm->opcode;
++    ev.minor_code = X_ShmPutImage;
++
++    ev.shmseg = info.shmid;
++    ev.offset = 0;
++
++    assert (CAIRO_MUTEX_IS_LOCKED (_cairo_xlib_display_mutex));
++    _x_error_occurred = FALSE;
++
++    XLockDisplay (dpy);
++    XSync (dpy, False);
++    old_handler = XSetErrorHandler (_check_error_handler);
++
++    XShmAttach (dpy, &info);
++    XSendEvent (dpy, ev.drawable, False, 0, (XEvent *)&ev);
++    XShmDetach (dpy, &info);
++
++    XSync (dpy, False);
++    XSetErrorHandler (old_handler);
++    XUnlockDisplay (dpy);
++
++    shmctl (info.shmid, IPC_RMID, NULL);
++    shmdt (info.shmaddr);
++
++    return _x_error_occurred;
++}
++
++static cairo_bool_t
++xorg_has_buggy_send_shm_completion_event(cairo_xlib_display_t *display,
++					 cairo_xlib_shm_display_t *shm)
++{
++    Display *dpy = display->display;
++
+     /* As libXext sets the SEND_EVENT bit in the ShmCompletionEvent,
+      * the Xserver may crash if it does not take care when processing
+      * the event type. For instance versions of Xorg prior to 1.11.1
+@@ -1141,8 +1193,12 @@ xorg_has_buggy_send_shm_completion_event(Display *dpy)
+      *
+      * Remove the SendEvent bit (0x80) before doing range checks on event type.
+      */
+-    return (strstr (ServerVendor (dpy), "X.Org") != NULL &&
+-	    VendorRelease (dpy) < XORG_VERSION_ENCODE(1,11,0,1));
++    if (strstr (ServerVendor (dpy), "X.Org") != NULL &&
++	VendorRelease (dpy) < XORG_VERSION_ENCODE(1,11,0,1))
++	return TRUE;
++
++    /* For everyone else check that no error is generated */
++    return has_broken_send_shm_event (display, shm);
+ }
+ 
+ void
+@@ -1162,6 +1218,15 @@ _cairo_xlib_display_init_shm (cairo_xlib_display_t *display)
+     if (unlikely (shm == NULL))
+ 	return;
+ 
++    codes = XInitExtension (display->display, SHMNAME);
++    if (codes == NULL) {
++	free (shm);
++	return;
++    }
++
++    shm->opcode = codes ->major_opcode;
++    shm->event = codes->first_event;
++
+     if (unlikely (_pqueue_init (&shm->info))) {
+ 	free (shm);
+ 	return;
+@@ -1177,16 +1242,12 @@ _cairo_xlib_display_init_shm (cairo_xlib_display_t *display)
+ 				 DefaultVisual (display->display, scr),
+ 				 CWOverrideRedirect, &attr);
+ 
+-    if (xorg_has_buggy_send_shm_completion_event(display->display))
++    if (xorg_has_buggy_send_shm_completion_event(display, shm))
+ 	has_pixmap = 0;
+ 
+     shm->has_pixmaps = has_pixmap ? MIN_PIXMAP_SIZE : 0;
+     cairo_list_init (&shm->pool);
+ 
+-    codes = XInitExtension (display->display, SHMNAME);
+-    shm->opcode = codes ->major_opcode;
+-    shm->event = codes->first_event;
+-
+     cairo_list_init (&shm->surfaces);
+ 
+     display->shm = shm;
+--
+cgit v0.9.0.2-2-gbebe
+From fdd2082f923012a1354be7086d03f78fb166695b Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Fri, 26 Oct 2012 09:51:31 +0000
+Subject: xlib: Check for both X.org and Xorg ServerVendors
+
+Martin Husemann reported that on his NetBSD machine the vendor was being
+reported as "The Xorg Foundation", a non-conformist separatist split of
+the Peoples' Liberation Army^W^W^W "The X.Org Foundation". Simply check
+for both during initialisation.
+
+Reported-by: Martin Husemann <martin at duskware.de>
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+---
+diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c
+index 67c0673..04c89b2 100644
+--- a/src/cairo-xlib-display.c
++++ b/src/cairo-xlib-display.c
+@@ -315,7 +315,7 @@ _cairo_xlib_device_create (Display *dpy)
+      *    safest to just blacklist all old-versioning-scheme X servers,
+      *    (just using VendorRelease < 70000000), as buggy_repeat=TRUE.
+      */
+-    if (strstr (ServerVendor (dpy), "X.Org") != NULL) {
++    if (_cairo_xlib_vendor_is_xorg (dpy)) {
+ 	if (VendorRelease (dpy) >= 60700000) {
+ 	    if (VendorRelease (dpy) < 70000000)
+ 		display->buggy_repeat = TRUE;
+diff --git a/src/cairo-xlib-private.h b/src/cairo-xlib-private.h
+index d2bd588..c328302 100644
+--- a/src/cairo-xlib-private.h
++++ b/src/cairo-xlib-private.h
+@@ -216,6 +216,13 @@ struct _cairo_xlib_proxy {
+     cairo_surface_t *owner;
+ };
+ 
++inline static cairo_bool_t
++_cairo_xlib_vendor_is_xorg (Display *dpy)
++{
++    const char *const vendor = ServerVendor (dpy);
++    return strstr (vendor, "X.Org") || strstr (vendor, "Xorg");
++}
++
+ cairo_private cairo_status_t
+ _cairo_xlib_surface_get_gc (cairo_xlib_display_t *display,
+                             cairo_xlib_surface_t *surface,
+diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c
+index 17594b1..89f51a9 100644
+--- a/src/cairo-xlib-surface-shm.c
++++ b/src/cairo-xlib-surface-shm.c
+@@ -1193,7 +1193,7 @@ xorg_has_buggy_send_shm_completion_event(cairo_xlib_display_t *display,
+      *
+      * Remove the SendEvent bit (0x80) before doing range checks on event type.
+      */
+-    if (strstr (ServerVendor (dpy), "X.Org") != NULL &&
++    if (_cairo_xlib_vendor_is_xorg (dpy) &&
+ 	VendorRelease (dpy) < XORG_VERSION_ENCODE(1,11,0,1))
+ 	return TRUE;
+ 
+--
+cgit v0.9.0.2-2-gbebe
+From d57e652f08f5ff7c334d01bc071962e6a131928f Mon Sep 17 00:00:00 2001
+From: Adrian Johnson <ajohnson at redneon.com>
+Date: Fri, 26 Oct 2012 12:30:01 +0000
+Subject: type1-subset: parse all operators
+
+The PDF at bug 56265 contained a Type 1 font that used the "div"
+operator to compute the glyph width. As the "div" operator was
+not handled by the charstring parser this resulted in an incorrect
+glyph width in the PDF output.
+
+Fix this by upgrading the charstring parsing to handle all Type 1
+operators.
+---
+diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
+index 1bdb12b..c7f613a 100644
+--- a/src/cairo-type1-subset.c
++++ b/src/cairo-type1-subset.c
+@@ -137,13 +137,10 @@ typedef struct _cairo_type1_font_subset {
+     int hex_column;
+ 
+     struct {
+-	int stack[TYPE1_STACKSIZE], sp, top_value;
++	double stack[TYPE1_STACKSIZE];
++	int sp;
+     } build_stack;
+ 
+-    struct {
+-	int other_subr_args[TYPE1_STACKSIZE], num_other_subr_args, cur_other_subr_arg;
+-    } ps_stack;
+-
+ 
+ } cairo_type1_font_subset_t;
+ 
+@@ -742,15 +739,33 @@ use_standard_encoding_glyph (cairo_type1_font_subset_t *font, int index)
+     return CAIRO_INT_STATUS_UNSUPPORTED;
+ }
+ 
+-#define TYPE1_CHARSTRING_COMMAND_ESCAPE		0x0c
+-#define TYPE1_CHARSTRING_COMMAND_SEAC		0x0c06
+-#define TYPE1_CHARSTRING_COMMAND_SBW		0x0c07
+-#define TYPE1_CHARSTRING_COMMAND_HSBW		0x0d
+-#define TYPE1_CHARSTRING_COMMAND_CALLSUBR	0x0a
+-#define TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR  0x0c10
+-#define TYPE1_CHARSTRING_COMMAND_POP	        0x0c11
+-
+ 
++#define TYPE1_CHARSTRING_COMMAND_HSTEM		 0x01
++#define TYPE1_CHARSTRING_COMMAND_VSTEM		 0x03
++#define TYPE1_CHARSTRING_COMMAND_VMOVETO	 0x04
++#define TYPE1_CHARSTRING_COMMAND_RLINETO	 0x05
++#define TYPE1_CHARSTRING_COMMAND_HLINETO	 0x06
++#define TYPE1_CHARSTRING_COMMAND_VLINETO	 0x07
++#define TYPE1_CHARSTRING_COMMAND_RRCURVETO	 0x08
++#define TYPE1_CHARSTRING_COMMAND_CLOSEPATH	 0x09
++#define TYPE1_CHARSTRING_COMMAND_CALLSUBR	 0x0a
++#define TYPE1_CHARSTRING_COMMAND_RETURN		 0x0b
++#define TYPE1_CHARSTRING_COMMAND_ESCAPE		 0x0c
++#define TYPE1_CHARSTRING_COMMAND_HSBW		 0x0d
++#define TYPE1_CHARSTRING_COMMAND_ENDCHAR	 0x0e
++#define TYPE1_CHARSTRING_COMMAND_RMOVETO	 0x15
++#define TYPE1_CHARSTRING_COMMAND_HMOVETO	 0x16
++#define TYPE1_CHARSTRING_COMMAND_VHCURVETO	 0x1e
++#define TYPE1_CHARSTRING_COMMAND_HVCURVETO	 0x1f
++#define TYPE1_CHARSTRING_COMMAND_DOTSECTION	 0x0c00
++#define TYPE1_CHARSTRING_COMMAND_VSTEM3		 0x0c01
++#define TYPE1_CHARSTRING_COMMAND_HSTEM3		 0x0c02
++#define TYPE1_CHARSTRING_COMMAND_SEAC		 0x0c06
++#define TYPE1_CHARSTRING_COMMAND_SBW		 0x0c07
++#define TYPE1_CHARSTRING_COMMAND_DIV		 0x0c0c
++#define TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR   0x0c10
++#define TYPE1_CHARSTRING_COMMAND_POP	         0x0c11
++#define TYPE1_CHARSTRING_COMMAND_SETCURRENTPOINT 0x0c21
+ 
+ /* Get glyph width and look for seac operatorParse charstring */
+ static cairo_status_t
+@@ -765,7 +780,6 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+     const unsigned char *p;
+     cairo_bool_t last_op_was_integer;
+     int command;
+-    int subr_num, i;
+ 
+     charstring = malloc (encrypted_charstring_length);
+     if (unlikely (charstring == NULL))
+@@ -785,37 +799,60 @@ 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;
+-
+-		font->glyphs[glyph].width = font->build_stack.stack[1]/font->base.units_per_em;
++	    case TYPE1_CHARSTRING_COMMAND_HSTEM:
++	    case TYPE1_CHARSTRING_COMMAND_VSTEM:
++	    case TYPE1_CHARSTRING_COMMAND_VMOVETO:
++	    case TYPE1_CHARSTRING_COMMAND_RLINETO:
++	    case TYPE1_CHARSTRING_COMMAND_HLINETO:
++	    case TYPE1_CHARSTRING_COMMAND_VLINETO:
++	    case TYPE1_CHARSTRING_COMMAND_RRCURVETO:
++	    case TYPE1_CHARSTRING_COMMAND_CLOSEPATH:
++	    case TYPE1_CHARSTRING_COMMAND_RMOVETO:
++	    case TYPE1_CHARSTRING_COMMAND_HMOVETO:
++	    case TYPE1_CHARSTRING_COMMAND_VHCURVETO:
++	    case TYPE1_CHARSTRING_COMMAND_HVCURVETO:
++	    case TYPE1_CHARSTRING_COMMAND_RETURN:
++	    case TYPE1_CHARSTRING_COMMAND_ENDCHAR:
++	    default:
+ 		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->build_stack.sp--;
+-		    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;
++		if (font->subset_subrs && font->build_stack.sp > 0) {
++		    int subr_num = font->build_stack.stack[--font->build_stack.sp];
++		    if (subr_num >= 0 && subr_num < font->num_subrs) {
++			font->subrs[subr_num].used = TRUE;
++			status = cairo_type1_font_subset_parse_charstring (
++			                                   font,
++							   glyph,
++							   font->subrs[subr_num].subr_string,
++							   font->subrs[subr_num].subr_length);
++			break;
++		    }
+ 		}
++		font->subset_subrs = FALSE;
++		break;
++
++	    case TYPE1_CHARSTRING_COMMAND_HSBW:
++		if (font->build_stack.sp < 2)
++		    return CAIRO_INT_STATUS_UNSUPPORTED;
++
++		font->glyphs[glyph].width = font->build_stack.stack[1]/font->base.units_per_em;
++		font->build_stack.sp = 0;
+ 		break;
+ 
+ 	    case TYPE1_CHARSTRING_COMMAND_ESCAPE:
+ 		command = command << 8 | *p++;
+ 		switch (command) {
++		case TYPE1_CHARSTRING_COMMAND_DOTSECTION:
++		case TYPE1_CHARSTRING_COMMAND_VSTEM3:
++		case TYPE1_CHARSTRING_COMMAND_HSTEM3:
++		case TYPE1_CHARSTRING_COMMAND_SETCURRENTPOINT:
++		case TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR:
++		default:
++		    font->build_stack.sp = 0;
++		    break;
++
+ 		case TYPE1_CHARSTRING_COMMAND_SEAC:
+ 		    /* The seac command takes five integer arguments.  The
+ 		     * last two are glyph indices into the PS standard
+@@ -823,6 +860,9 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 		     * glyph is composed from.  All we need to do is to
+ 		     * make sure those glyphs are present in the subset
+ 		     * under their standard names. */
++		    if (font->build_stack.sp < 5)
++			return CAIRO_INT_STATUS_UNSUPPORTED;
++
+ 		    status = use_standard_encoding_glyph (font, font->build_stack.stack[3]);
+ 		    if (unlikely (status))
+ 			return status;
+@@ -832,55 +872,49 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 			return status;
+ 
+ 		    font->build_stack.sp = 0;
+-		    last_op_was_integer = FALSE;
+ 		    break;
+ 
+ 		case TYPE1_CHARSTRING_COMMAND_SBW:
+-		    if (! last_op_was_integer)
++		    if (font->build_stack.sp < 4)
+ 			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;
++		case TYPE1_CHARSTRING_COMMAND_DIV:
++		    if (font->build_stack.sp < 2) {
++			return CAIRO_INT_STATUS_UNSUPPORTED;
+ 		    } else {
+-			font->subset_subrs = FALSE;
++			double num1 = font->build_stack.stack[font->build_stack.sp - 2];
++			double num2 = font->build_stack.stack[font->build_stack.sp - 1];
++			font->build_stack.sp--;
++			if (num2 == 0.0)
++			    return CAIRO_INT_STATUS_UNSUPPORTED;
++
++			font->build_stack.stack[font->build_stack.sp - 1] = num1/num2;
+ 		    }
+ 		    break;
+ 
+-		default:
+-		    font->build_stack.sp = 0;
+-		    last_op_was_integer = FALSE;
++		case TYPE1_CHARSTRING_COMMAND_POP:
++		    if (font->build_stack.sp < TYPE1_STACKSIZE) {
++			/* use negative number to prevent it being used as a subr_num */
++			font->build_stack.stack[font->build_stack.sp++] = -1.0;
++		    }
+ 		    break;
+ 		}
+ 		break;
+-
+-	    default:
+-		font->build_stack.sp = 0;
+-		last_op_was_integer = FALSE;
+-		break;
+ 	    }
+-        } else {
++	} else {
+             /* integer argument */
+-	    p = cairo_type1_font_subset_decode_integer (p, &font->build_stack.top_value);
+-	    last_op_was_integer = TRUE;
+-	    if (font->build_stack.sp < TYPE1_STACKSIZE)
+-		font->build_stack.stack[font->build_stack.sp++] = font->build_stack.top_value;
+-        }
++	    if (font->build_stack.sp < TYPE1_STACKSIZE) {
++		int val;
++		p = cairo_type1_font_subset_decode_integer (p, &val);
++		font->build_stack.stack[font->build_stack.sp++] = val;
++	    } else {
++		return CAIRO_INT_STATUS_UNSUPPORTED;
++	    }
++	}
+     }
+ 
+     free (charstring);
+@@ -1321,7 +1355,6 @@ skip_subrs:
+     for (j = 0; j < font->num_glyphs; j++) {
+ 	glyph = font->subset_index_to_glyphs[j];
+ 	font->build_stack.sp = 0;
+-	font->ps_stack.num_other_subr_args = 0;
+ 	status = cairo_type1_font_subset_parse_charstring (font,
+ 							   glyph,
+ 							   font->glyphs[glyph].encrypted_charstring,
+--
+cgit v0.9.0.2-2-gbebe
+From f18199fcfb3b052c198041fc05156ae3d9e6aee7 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Sun, 28 Oct 2012 10:04:12 +0000
+Subject: xlib/shm: Check for XShm headers
+
+Not all version of libXext ship the same set of headers, so play safe
+and check during configure that we have the headers we depend upon in
+the code.
+
+Reported-by: Sebastian Haas <sehaas at gmail.com>
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+---
+diff --git a/configure.ac b/configure.ac
+index 7adbeb1..021ec8e 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -105,6 +105,10 @@ CAIRO_ENABLE_SURFACE_BACKEND(xlib, Xlib, auto, [
+ 		  AC_MSG_RESULT(no),
+ 		  AC_MSG_RESULT(assuming no))
+       fi
++
++      AC_CHECK_HEADERS([X11/extensions/XShm.h X11/extensions/shmproto.h], [], [],
++		       [#include <X11/Xlibint.h>
++			#include <X11/Xproto.h>])
+ ])
+ 
+ CAIRO_ENABLE_SURFACE_BACKEND(xlib_xrender, Xlib Xrender, auto, [
+diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c
+index 89f51a9..a3d4385 100644
+--- a/src/cairo-xlib-surface-shm.c
++++ b/src/cairo-xlib-surface-shm.c
+@@ -41,12 +41,105 @@
+ 
+ #include "cairo-xlib-private.h"
+ #include "cairo-xlib-surface-private.h"
+-#include "cairo-image-surface-private.h"
+-#include "cairo-mempool-private.h"
++
++#if !HAVE_X11_EXTENSIONS_XSHM_H || !HAVE_X11_EXTENSIONS_SHMPROTO_H
++void _cairo_xlib_display_init_shm (cairo_xlib_display_t *display) {}
++
++cairo_surface_t *
++_cairo_xlib_surface_get_shm (cairo_xlib_surface_t *surface,
++			     cairo_bool_t overwrite)
++{
++    return NULL;
++}
++
++cairo_int_status_t
++_cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface)
++{
++    ASSERT_NOT_REACHED;
++    return CAIRO_INT_STATUS_SUCCESS;
++}
++
++cairo_surface_t *
++_cairo_xlib_surface_create_shm (cairo_xlib_surface_t *other,
++				pixman_format_code_t format,
++				int width, int height)
++{
++    return NULL;
++}
++
++cairo_surface_t *
++_cairo_xlib_surface_create_shm__image (cairo_xlib_surface_t *surface,
++				       pixman_format_code_t format,
++				       int width, int height)
++{
++    return NULL;
++}
++
++cairo_surface_t *
++_cairo_xlib_surface_create_similar_shm (void *other,
++					cairo_format_t format,
++					int width, int height)
++{
++    return cairo_image_surface_create (format, width, height);
++}
++
++void
++_cairo_xlib_shm_surface_mark_active (cairo_surface_t *_shm)
++{
++    ASSERT_NOT_REACHED;
++}
++
++void
++_cairo_xlib_shm_surface_get_ximage (cairo_surface_t *surface,
++				    XImage *ximage)
++{
++    ASSERT_NOT_REACHED;
++}
++
++void *
++_cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface)
++{
++    ASSERT_NOT_REACHED;
++    return NULL;
++}
++
++Pixmap
++_cairo_xlib_shm_surface_get_pixmap (cairo_surface_t *surface)
++{
++    ASSERT_NOT_REACHED;
++    return 0;
++}
++
++XRenderPictFormat *
++_cairo_xlib_shm_surface_get_xrender_format (cairo_surface_t *surface)
++{
++    ASSERT_NOT_REACHED;
++    return NULL;
++}
++
++cairo_bool_t
++_cairo_xlib_shm_surface_is_active (cairo_surface_t *surface)
++{
++    ASSERT_NOT_REACHED;
++    return FALSE;
++}
++
++cairo_bool_t
++_cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface)
++{
++    ASSERT_NOT_REACHED;
++    return TRUE;
++}
++
++void _cairo_xlib_display_fini_shm (cairo_xlib_display_t *display) {}
++
++#else
+ 
+ #include "cairo-damage-private.h"
+ #include "cairo-default-context-private.h"
++#include "cairo-image-surface-private.h"
+ #include "cairo-list-inline.h"
++#include "cairo-mempool-private.h"
+ 
+ #include <X11/Xlibint.h>
+ #include <X11/Xproto.h>
+@@ -1281,5 +1374,5 @@ _cairo_xlib_display_fini_shm (cairo_xlib_display_t *display)
+     free (shm);
+     display->shm = NULL;
+ }
+-
++#endif
+ #endif
+--
+cgit v0.9.0.2-2-gbebe
+From 0e2458697848cf8c89c9d57fa9b64f0ea7bd0877 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Sun, 28 Oct 2012 10:08:39 +0000
+Subject: xlib/shm: Use shmstr.h instead of shmproto.h if available
+
+Before it was known as shmproto.h, the wire protocol definition was to
+be found in shmstr.h, so if we don't have the current version of libXext
+try to use the older includes.
+
+Reported-by: Sebastian Haas <sehaas at gmail.com>
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+---
+diff --git a/configure.ac b/configure.ac
+index 021ec8e..f523284 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -106,7 +106,7 @@ CAIRO_ENABLE_SURFACE_BACKEND(xlib, Xlib, auto, [
+ 		  AC_MSG_RESULT(assuming no))
+       fi
+ 
+-      AC_CHECK_HEADERS([X11/extensions/XShm.h X11/extensions/shmproto.h], [], [],
++      AC_CHECK_HEADERS([X11/extensions/XShm.h X11/extensions/shmproto.h X11/extensions/shmstr.h], [], [],
+ 		       [#include <X11/Xlibint.h>
+ 			#include <X11/Xproto.h>])
+ ])
+diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c
+index a3d4385..44e6284 100644
+--- a/src/cairo-xlib-surface-shm.c
++++ b/src/cairo-xlib-surface-shm.c
+@@ -42,7 +42,7 @@
+ #include "cairo-xlib-private.h"
+ #include "cairo-xlib-surface-private.h"
+ 
+-#if !HAVE_X11_EXTENSIONS_XSHM_H || !HAVE_X11_EXTENSIONS_SHMPROTO_H
++#if !HAVE_X11_EXTENSIONS_XSHM_H || !(HAVE_X11_EXTENSIONS_SHMPROTO_H || HAVE_X11_EXTENSIONS_SHMSTR_H)
+ void _cairo_xlib_display_init_shm (cairo_xlib_display_t *display) {}
+ 
+ cairo_surface_t *
+@@ -144,7 +144,11 @@ void _cairo_xlib_display_fini_shm (cairo_xlib_display_t *display) {}
+ #include <X11/Xlibint.h>
+ #include <X11/Xproto.h>
+ #include <X11/extensions/XShm.h>
++#if HAVE_X11_EXTENSIONS_SHMPROTO_H
+ #include <X11/extensions/shmproto.h>
++#elif HAVE_X11_EXTENSIONS_SHMSTR_H
++#include <X11/extensions/shmstr.h>
++#endif
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ 
+--
+cgit v0.9.0.2-2-gbebe
+From 5a6e1d680a5bf1c4091e74f999abd611abd92334 Mon Sep 17 00:00:00 2001
+From: Adrian Johnson <ajohnson at redneon.com>
+Date: Sun, 28 Oct 2012 10:28:52 +0000
+Subject: type1-subset: restore correct callothersub behavior
+
+that was removed in d57e652f. Without this subsetting of subroutines
+won't work for some fonts.
+---
+diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
+index c7f613a..786055a 100644
+--- a/src/cairo-type1-subset.c
++++ b/src/cairo-type1-subset.c
+@@ -141,6 +141,11 @@ typedef struct _cairo_type1_font_subset {
+ 	int sp;
+     } build_stack;
+ 
++    struct {
++	int stack[TYPE1_STACKSIZE];
++	int sp;
++    } ps_stack;
++
+ 
+ } cairo_type1_font_subset_t;
+ 
+@@ -767,7 +772,9 @@ use_standard_encoding_glyph (cairo_type1_font_subset_t *font, int index)
+ #define TYPE1_CHARSTRING_COMMAND_POP	         0x0c11
+ #define TYPE1_CHARSTRING_COMMAND_SETCURRENTPOINT 0x0c21
+ 
+-/* Get glyph width and look for seac operatorParse charstring */
++/* Parse the charstring, including recursing into subroutines. Find
++ * the glyph width, subroutines called, and glyphs required by the
++ * SEAC operator. */
+ static cairo_status_t
+ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 					  int                        glyph,
+@@ -814,6 +821,7 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 	    case TYPE1_CHARSTRING_COMMAND_RETURN:
+ 	    case TYPE1_CHARSTRING_COMMAND_ENDCHAR:
+ 	    default:
++		/* stack clearing operator */
+ 		font->build_stack.sp = 0;
+ 		break;
+ 
+@@ -848,8 +856,8 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 		case TYPE1_CHARSTRING_COMMAND_VSTEM3:
+ 		case TYPE1_CHARSTRING_COMMAND_HSTEM3:
+ 		case TYPE1_CHARSTRING_COMMAND_SETCURRENTPOINT:
+-		case TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR:
+ 		default:
++		    /* stack clearing operator */
+ 		    font->build_stack.sp = 0;
+ 		    break;
+ 
+@@ -896,11 +904,25 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 		    }
+ 		    break;
+ 
++		case TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR:
++		    if (font->build_stack.sp < 1)
++			return CAIRO_INT_STATUS_UNSUPPORTED;
++
++		    font->build_stack.sp--;
++		    font->ps_stack.sp = 0;
++		    while (font->build_stack.sp)
++			font->ps_stack.stack[font->ps_stack.sp++] = font->build_stack.stack[--font->build_stack.sp];
++
++                    break;
++
+ 		case TYPE1_CHARSTRING_COMMAND_POP:
+-		    if (font->build_stack.sp < TYPE1_STACKSIZE) {
+-			/* use negative number to prevent it being used as a subr_num */
+-			font->build_stack.stack[font->build_stack.sp++] = -1.0;
+-		    }
++		    if (font->ps_stack.sp < 1)
++			return CAIRO_INT_STATUS_UNSUPPORTED;
++
++		    /* T1 spec states that if the interpreter does not
++		     * support executing the callothersub, the results
++		     * must be taken from the callothersub arguments. */
++		    font->build_stack.stack[font->build_stack.sp++] = font->ps_stack.stack[--font->ps_stack.sp];
+ 		    break;
+ 		}
+ 		break;
+@@ -1355,6 +1377,7 @@ skip_subrs:
+     for (j = 0; j < font->num_glyphs; j++) {
+ 	glyph = font->subset_index_to_glyphs[j];
+ 	font->build_stack.sp = 0;
++	font->ps_stack.sp = 0;
+ 	status = cairo_type1_font_subset_parse_charstring (font,
+ 							   glyph,
+ 							   font->glyphs[glyph].encrypted_charstring,
+--
+cgit v0.9.0.2-2-gbebe
+From 0c800dc3f64ee030df1cd0a6a1dcd6df71502dea Mon Sep 17 00:00:00 2001
+From: Adrian Johnson <ajohnson at redneon.com>
+Date: Tue, 30 Oct 2012 08:53:30 +0000
+Subject: type1-subset: ensure subroutine numnber is an integer
+
+---
+diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
+index 786055a..dff4a95 100644
+--- a/src/cairo-type1-subset.c
++++ b/src/cairo-type1-subset.c
+@@ -827,15 +827,18 @@ cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font,
+ 
+ 	    case TYPE1_CHARSTRING_COMMAND_CALLSUBR:
+ 		if (font->subset_subrs && font->build_stack.sp > 0) {
+-		    int subr_num = font->build_stack.stack[--font->build_stack.sp];
+-		    if (subr_num >= 0 && subr_num < font->num_subrs) {
+-			font->subrs[subr_num].used = TRUE;
+-			status = cairo_type1_font_subset_parse_charstring (
+-			                                   font,
+-							   glyph,
+-							   font->subrs[subr_num].subr_string,
+-							   font->subrs[subr_num].subr_length);
+-			break;
++		    double int_val;
++		    if (modf(font->build_stack.stack[--font->build_stack.sp], &int_val) == 0.0) {
++			int subr_num = int_val;
++			if (subr_num >= 0 && subr_num < font->num_subrs) {
++			    font->subrs[subr_num].used = TRUE;
++			    status = cairo_type1_font_subset_parse_charstring (
++				font,
++				glyph,
++				font->subrs[subr_num].subr_string,
++				font->subrs[subr_num].subr_length);
++			    break;
++			}
+ 		    }
+ 		}
+ 		font->subset_subrs = FALSE;
+--
+cgit v0.9.0.2-2-gbebe
+From 65176b7380f0d633da514be1febe16f17b99d876 Mon Sep 17 00:00:00 2001
+From: Kevin Tardif <kiyoka at gmail.com>
+Date: Tue, 30 Oct 2012 04:27:27 +0000
+Subject: type1-subset, cff-subset: Plugged 2 memory leaks
+
+- _cairo_type1_font_subset_fini doesn't free font->cleartext
+- _cairo_cff_font_create can exit without freeing font->font_name and/or
+  font->data; _cairo_cff_font_load_opentype_cff is called to allocate
+  font_name, then _cairo_cff_font_load_cff is called to allocate
+  font->data, then _cairo_cff_font_load_cff's return status is checked
+  and if it failed, it jumps to fail1. This can cause font_name to leak
+  since the fail1 target only frees the font variable. In addition,
+  _cairo_cff_font_load_cff can fail -after- allocating data, and then
+  data won't be freed either.
+
+Bug 56566
+---
+diff --git a/src/cairo-cff-subset.c b/src/cairo-cff-subset.c
+index e3040fc..bd8d5b5 100644
+--- a/src/cairo-cff-subset.c
++++ b/src/cairo-cff-subset.c
+@@ -2787,7 +2787,7 @@ _cairo_cff_font_create (cairo_scaled_font_subset_t  *scaled_font_subset,
+     if (backend->is_synthetic && backend->is_synthetic (scaled_font_subset->scaled_font))
+ 	return CAIRO_INT_STATUS_UNSUPPORTED;
+ 
+-    font = malloc (sizeof (cairo_cff_font_t));
++    font = calloc (1, sizeof (cairo_cff_font_t));
+     if (unlikely (font == NULL))
+         return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ 
+@@ -2862,11 +2862,11 @@ fail4:
+ fail3:
+     free (font->subset_font_name);
+ fail2:
+-    free (font->data);
+-    free (font->font_name);
+     free (font->ps_name);
+     _cairo_array_fini (&font->output);
+ fail1:
++    free (font->data);
++    free (font->font_name);
+     free (font);
+ 
+     return status;
+diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
+index dff4a95..2ec56f1 100644
+--- a/src/cairo-type1-subset.c
++++ b/src/cairo-type1-subset.c
+@@ -1670,6 +1670,8 @@ _cairo_type1_font_subset_fini (cairo_type1_font_subset_t *font)
+ 
+     free (font->subset_index_to_glyphs);
+ 
++    free (font->cleartext);
++
+     return status;
+ }
+ 
+--
+cgit v0.9.0.2-2-gbebe
+From 66625cb46c985321c46b79d2163a4d676d6700ba Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris at chris-wilson.co.uk>
+Date: Tue, 30 Oct 2012 12:40:41 +0000
+Subject: xlib: Apply the image offsets to the destination rather the source
+
+So that we can specify the entire source surface as the region to copy
+and not introduce clipping errors.
+
+Fixes regression from
+commit c068691ff57c2f6cd750a54db17393c0e132cb00
+Author: Chris Wilson <chris at chris-wilson.co.uk>
+Date:   Fri Aug 17 21:33:54 2012 +0100
+
+    xlib/shm: Use an impromptu upload ShmSegment
+
+Reported-by: John Lindgren <john.lindgren at aol.com>
+Reported-by: Kalev Lember <kalevlember at gmail.com>
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56547
+Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
+---
+diff --git a/src/cairo-xlib-render-compositor.c b/src/cairo-xlib-render-compositor.c
+index e325382..74c43e9 100644
+--- a/src/cairo-xlib-render-compositor.c
++++ b/src/cairo-xlib-render-compositor.c
+@@ -179,22 +179,19 @@ copy_image_boxes (void *_dst,
+ 		int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x);
+ 		int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y);
+ 
+-		rects[j].x = x1;
+-		rects[j].y = y1;
+-		rects[j].width  = x2 - x1;
+-		rects[j].height = y2 - y1;
+-		j++;
++		if (x2 > x1 && y2 > y1) {
++		    rects[j].x = x1;
++		    rects[j].y = y1;
++		    rects[j].width  = x2 - x1;
++		    rects[j].height = y2 - y1;
++		    j++;
++		}
+ 	    }
+ 	}
+-	assert (j == boxes->num_boxes);
+ 
+ 	XSetClipRectangles (dst->dpy, gc, 0, 0, rects, j, Unsorted);
+-
+ 	XCopyArea (dst->dpy, src, dst->drawable, gc,
+-		   dx, dy,
+-		   image->width,  image->height,
+-		   0,      0);
+-
++		   0, 0, image->width, image->height, -dx, -dy);
+ 	XSetClipMask (dst->dpy, gc, None);
+ 
+ 	if (rects != stack_rects)
+@@ -337,7 +334,8 @@ draw_image_boxes (void *_dst,
+ 
+ 	    if (_cairo_xlib_shm_surface_get_pixmap (&image->base)) {
+ 		status = copy_image_boxes (dst, image, boxes, dx, dy);
+-		goto out;
++		if (status != CAIRO_INT_STATUS_UNSUPPORTED)
++		    goto out;
+ 	    }
+ 	}
+     }
+--
+cgit v0.9.0.2-2-gbebe




More information about the arch-commits mailing list