[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#699466: marked as done (unblock: cairo/1.12.2-3)



Your message dated Sun, 17 Feb 2013 22:39:10 +0000
with message-id <1361140750.20472.121.camel@jacala.jungle.funky-badger.org>
and subject line Re: Bug#691710: Post-RC1 unblock-udeb d-i ACK
has caused the Debian Bug report #699466,
regarding unblock: cairo/1.12.2-3
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
699466: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=699466
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package cairo

It fixes several important bugs which could lead to crashes (in evince)
or broken print output. We have a large number of duplicates, so it
seems worthwile getting those fixes into wheezy.

Changelog:

cairo (1.12.2-3) unstable; urgency=low

cairo (1.12.2-3) unstable; urgency=low

  * Team upload.

  [ intrigeri ]
  * Fix several printing related problems:
    - Evince crash when printing certain PDF files (Closes: #672336)
    - Evince producing broken print output (Closes: #679105)
    Patches cherry-picked from upstream:
    - 07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch
    - 08_cff_convert_._to_locale_specific_decimal_point_befor.patch
    - 09_cff_use_correct_size_for_buffer.patch
    - 10_cff_subsetting_widths_can_be_floating_point.patch

  [ Michael Biebl ]
  * Fix segmentation fault when rendering SVGs at certain sizes.
    (Closes: #697482)
    Patch cherry-picked from upstream:
    - 11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch

 -- Michael Biebl <biebl@debian.org>  Thu, 31 Jan 2013 16:22:34 +0100

cairo (1.12.2-2.1) unstable; urgency=low

  * Non-maintainer upload.
  * (Closes: #690799)  evince crashes with a certain PDF file

 -- Neil Williams <codehelp@debian.org>  Sat, 26 Jan 2013 23:22:12 +0000


Full debdiff (including the NMU) is attached.

Cheers,
Michael

unblock cairo/1.12.2-3

-- System Information:
Debian Release: 7.0
  APT prefers unstable
  APT policy: (500, 'unstable'), (200, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.2.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=de_DE.utf8, LC_CTYPE=de_DE.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff -Nru cairo-1.12.2/debian/changelog cairo-1.12.2/debian/changelog
--- cairo-1.12.2/debian/changelog	2012-05-17 13:23:08.000000000 +0200
+++ cairo-1.12.2/debian/changelog	2013-01-31 16:22:46.000000000 +0100
@@ -1,3 +1,32 @@
+cairo (1.12.2-3) unstable; urgency=low
+
+  * Team upload.
+
+  [ intrigeri ]
+  * Fix several printing related problems:
+    - Evince crash when printing certain PDF files (Closes: #672336)
+    - Evince producing broken print output (Closes: #679105)
+    Patches cherry-picked from upstream:
+    - 07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch
+    - 08_cff_convert_._to_locale_specific_decimal_point_befor.patch
+    - 09_cff_use_correct_size_for_buffer.patch
+    - 10_cff_subsetting_widths_can_be_floating_point.patch
+
+  [ Michael Biebl ]
+  * Fix segmentation fault when rendering SVGs at certain sizes.
+    (Closes: #697482)
+    Patch cherry-picked from upstream:
+    - 11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch
+
+ -- Michael Biebl <biebl@debian.org>  Thu, 31 Jan 2013 16:22:34 +0100
+
+cairo (1.12.2-2.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * (Closes: #690799)  evince crashes with a certain PDF file
+
+ -- Neil Williams <codehelp@debian.org>  Sat, 26 Jan 2013 23:22:12 +0000
+
 cairo (1.12.2-2) unstable; urgency=low
 
   * debian/libcairo2-udeb.install:
diff -Nru cairo-1.12.2/debian/patches/07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch cairo-1.12.2/debian/patches/07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch
--- cairo-1.12.2/debian/patches/07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch	1970-01-01 01:00:00.000000000 +0100
+++ cairo-1.12.2/debian/patches/07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch	2013-01-31 16:22:46.000000000 +0100
@@ -0,0 +1,37 @@
+From: Adrian Johnson <ajohnson@redneon.com>
+Date: Thu, 7 Jun 2012 19:18:52 +0930
+Subject: cff-subsetting: Ignore charset for non cid fonts
+
+Fixes crash in https://bugzilla.gnome.org/show_bug.cgi?id=677422
+---
+ src/cairo-cff-subset.c |   16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/src/cairo-cff-subset.c b/src/cairo-cff-subset.c
+index db6fdf7..6f0cd66 100644
+--- a/src/cairo-cff-subset.c
++++ b/src/cairo-cff-subset.c
+@@ -1178,14 +1178,16 @@ cairo_cff_font_read_top_dict (cairo_cff_font_t *font)
+         goto fail;
+     font->num_glyphs = _cairo_array_num_elements (&font->charstrings_index);
+ 
+-    operand = cff_dict_get_operands (font->top_dict, CHARSET_OP, &size);
+-    if (font->is_cid && !operand)
+-	return CAIRO_INT_STATUS_UNSUPPORTED;
++    if (font->is_cid) {
++	 operand = cff_dict_get_operands (font->top_dict, CHARSET_OP, &size);
++	 if (!operand)
++	      return CAIRO_INT_STATUS_UNSUPPORTED;
+ 
+-    decode_integer (operand, &offset);
+-    font->charset = font->data + offset;
+-    if (font->charset >= font->data_end)
+-	return CAIRO_INT_STATUS_UNSUPPORTED;
++	 decode_integer (operand, &offset);
++	 font->charset = font->data + offset;
++	 if (font->charset >= font->data_end)
++	      return CAIRO_INT_STATUS_UNSUPPORTED;
++    }
+ 
+     if (!font->is_opentype)
+         cairo_cff_font_read_font_metrics (font, font->top_dict);
diff -Nru cairo-1.12.2/debian/patches/08_cff_convert_._to_locale_specific_decimal_point_befor.patch cairo-1.12.2/debian/patches/08_cff_convert_._to_locale_specific_decimal_point_befor.patch
--- cairo-1.12.2/debian/patches/08_cff_convert_._to_locale_specific_decimal_point_befor.patch	1970-01-01 01:00:00.000000000 +0100
+++ cairo-1.12.2/debian/patches/08_cff_convert_._to_locale_specific_decimal_point_befor.patch	2013-01-31 16:22:46.000000000 +0100
@@ -0,0 +1,68 @@
+From: Adrian Johnson <ajohnson@redneon.com>
+Date: Wed, 4 Jul 2012 19:54:18 +0930
+Subject: cff: convert '.' to locale specific decimal point before using
+ sscanf
+
+to fix bug when decoding cff real numbers.
+
+Bug 51443
+---
+ src/cairo-cff-subset.c |   26 +++++++++++++++++++++++++-
+ 1 file changed, 25 insertions(+), 1 deletion(-)
+
+diff --git a/src/cairo-cff-subset.c b/src/cairo-cff-subset.c
+index 6f0cd66..aeaf5b1 100644
+--- a/src/cairo-cff-subset.c
++++ b/src/cairo-cff-subset.c
+@@ -51,6 +51,7 @@
+ #include "cairo-scaled-font-subsets-private.h"
+ #include "cairo-truetype-subset-private.h"
+ #include <string.h>
++#include <locale.h>
+ 
+ /* CFF Dict Operators. If the high byte is 0 the command is encoded
+  * with a single byte. */
+@@ -293,11 +294,23 @@ decode_nibble (int n, char *buf)
+ static unsigned char *
+ decode_real (unsigned char *p, double *real)
+ {
++    struct lconv *locale_data;
++    const char *decimal_point;
++    int decimal_point_len;
+     int n;
+     char buffer[100];
++    char buffer2[200];
++    char *q;
+     char *buf = buffer;
+     char *buf_end = buffer + sizeof (buf);
+ 
++    locale_data = localeconv ();
++    decimal_point = locale_data->decimal_point;
++    decimal_point_len = strlen (decimal_point);
++
++    assert (decimal_point_len != 0);
++    assert (sizeof(buffer) + decimal_point_len < sizeof(buffer2));
++
+     p++;
+     while (buf + 2 < buf_end) {
+ 	n = *p >> 4;
+@@ -312,7 +325,18 @@ decode_real (unsigned char *p, double *real)
+     };
+     *buf = 0;
+ 
+-    if (sscanf(buffer, "%lf", real) != 1)
++    buf = buffer;
++    if (strchr (buffer, '.')) {
++	 q = strchr (buffer, '.');
++	 strncpy (buffer2, buffer, q - buffer);
++	 buf = buffer2 + (q - buffer);
++	 strncpy (buf, decimal_point, decimal_point_len);
++	 buf += decimal_point_len;
++	 strcpy (buf, q + 1);
++	 buf = buffer2;
++    }
++
++    if (sscanf(buf, "%lf", real) != 1)
+         *real = 0.0;
+ 
+     return p;
diff -Nru cairo-1.12.2/debian/patches/09_cff_use_correct_size_for_buffer.patch cairo-1.12.2/debian/patches/09_cff_use_correct_size_for_buffer.patch
--- cairo-1.12.2/debian/patches/09_cff_use_correct_size_for_buffer.patch	1970-01-01 01:00:00.000000000 +0100
+++ cairo-1.12.2/debian/patches/09_cff_use_correct_size_for_buffer.patch	2013-01-31 16:22:46.000000000 +0100
@@ -0,0 +1,22 @@
+From: Adrian Johnson <ajohnson@redneon.com>
+Date: Thu, 5 Jul 2012 21:59:33 +0930
+Subject: cff: use correct size for buffer
+
+Bug 51443
+---
+ src/cairo-cff-subset.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/cairo-cff-subset.c b/src/cairo-cff-subset.c
+index aeaf5b1..b3b6026 100644
+--- a/src/cairo-cff-subset.c
++++ b/src/cairo-cff-subset.c
+@@ -302,7 +302,7 @@ decode_real (unsigned char *p, double *real)
+     char buffer2[200];
+     char *q;
+     char *buf = buffer;
+-    char *buf_end = buffer + sizeof (buf);
++    char *buf_end = buffer + sizeof (buffer);
+ 
+     locale_data = localeconv ();
+     decimal_point = locale_data->decimal_point;
diff -Nru cairo-1.12.2/debian/patches/10_cff_subsetting_widths_can_be_floating_point.patch cairo-1.12.2/debian/patches/10_cff_subsetting_widths_can_be_floating_point.patch
--- cairo-1.12.2/debian/patches/10_cff_subsetting_widths_can_be_floating_point.patch	1970-01-01 01:00:00.000000000 +0100
+++ cairo-1.12.2/debian/patches/10_cff_subsetting_widths_can_be_floating_point.patch	2013-01-31 16:22:46.000000000 +0100
@@ -0,0 +1,78 @@
+From: Adrian Johnson <ajohnson@redneon.com>
+Date: Tue, 31 Jul 2012 22:52:09 +0930
+Subject: cff subsetting: widths can be floating point
+
+Bug 52972
+---
+ src/cairo-cff-subset.c |   22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+Index: cairo-1.12.2/src/cairo-cff-subset.c
+===================================================================
+--- cairo-1.12.2.orig/src/cairo-cff-subset.c	2013-01-26 15:16:34.393671169 +0100
++++ cairo-1.12.2/src/cairo-cff-subset.c	2013-01-26 15:16:34.385671057 +0100
+@@ -1,3 +1,4 @@
++/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
+ /* cairo - a vector graphics library with display and print output
+  *
+  * Copyright © 2006 Adrian Johnson
+@@ -152,8 +153,8 @@
+     int  		 units_per_em;
+     int 		 global_sub_bias;
+     int			 local_sub_bias;
+-    int                  default_width;
+-    int                  nominal_width;
++    double               default_width;
++    double               nominal_width;
+ 
+     /* CID Font Data */
+     int                 *fdselect;
+@@ -162,8 +163,8 @@
+     cairo_hash_table_t **fd_private_dict;
+     cairo_array_t       *fd_local_sub_index;
+     int			*fd_local_sub_bias;
+-    int                 *fd_default_width;
+-    int                 *fd_nominal_width;
++    double              *fd_default_width;
++    double              *fd_nominal_width;
+ 
+     /* Subsetted Font Data */
+     char                *subset_font_name;
+@@ -910,8 +911,8 @@
+                                   cairo_array_t      *local_sub_index,
+                                   int                *local_sub_bias,
+                                   cairo_bool_t      **local_subs_used,
+-                                  int                *default_width,
+-                                  int                *nominal_width,
++                                  double             *default_width,
++                                  double             *nominal_width,
+                                   unsigned char      *ptr,
+                                   int                 size)
+ {
+@@ -946,12 +947,12 @@
+     *default_width = 0;
+     operand = cff_dict_get_operands (private_dict, DEFAULTWIDTH_OP, &i);
+     if (operand)
+-        decode_integer (operand, default_width);
++        decode_number (operand, default_width);
+ 
+     *nominal_width = 0;
+     operand = cff_dict_get_operands (private_dict, NOMINALWIDTH_OP, &i);
+     if (operand)
+-        decode_integer (operand, nominal_width);
++	 decode_number (operand, nominal_width);
+ 
+     num_subs = _cairo_array_num_elements (local_sub_index);
+     *local_subs_used = calloc (num_subs, sizeof (cairo_bool_t));
+@@ -1468,9 +1469,8 @@
+         *integer = -(p[0] - 251) * 256 - p[1] - 108;
+         p += 2;
+     } else { /* *p == 255 */
+-    /* This actually a 16.16 fixed-point number however we are not interested in
+-     * the value of fixed-point numbers. */
+-        *integer = (p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4];
++	 /* 16.16 fixed-point number. The fraction is ignored. */
++	 *integer = (int16_t)((p[1] << 8) | p[2]);
+         p += 5;
+     }
+     return p;
diff -Nru cairo-1.12.2/debian/patches/11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch cairo-1.12.2/debian/patches/11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch
--- cairo-1.12.2/debian/patches/11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch	1970-01-01 01:00:00.000000000 +0100
+++ cairo-1.12.2/debian/patches/11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch	2013-01-31 16:22:46.000000000 +0100
@@ -0,0 +1,275 @@
+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 -Nru cairo-1.12.2/debian/patches/intersect-dereference.diff cairo-1.12.2/debian/patches/intersect-dereference.diff
--- cairo-1.12.2/debian/patches/intersect-dereference.diff	1970-01-01 01:00:00.000000000 +0100
+++ cairo-1.12.2/debian/patches/intersect-dereference.diff	2013-01-31 16:22:46.000000000 +0100
@@ -0,0 +1,13 @@
+Index: cairo-1.12.2/src/cairo-polygon-intersect.c
+===================================================================
+--- cairo-1.12.2.orig/src/cairo-polygon-intersect.c	2012-04-19 13:17:58.000000000 +0100
++++ cairo-1.12.2/src/cairo-polygon-intersect.c	2013-01-26 23:08:54.000000000 +0000
+@@ -1231,6 +1231,8 @@
+ 	    } while (1);
+ 
+ 	    right = left->next;
++	    if (!right)
++		    return;
+ 	    do {
+ 		if unlikely ((right->deferred.other))
+ 		    edges_end (right, top, polygon);
diff -Nru cairo-1.12.2/debian/patches/series cairo-1.12.2/debian/patches/series
--- cairo-1.12.2/debian/patches/series	2012-04-30 14:25:25.000000000 +0200
+++ cairo-1.12.2/debian/patches/series	2013-01-31 16:22:46.000000000 +0100
@@ -3,3 +3,9 @@
 03_export-symbols.patch
 05-flto.patch
 06_hurd-map-noreserve.patch
+07_cff-subsetting-Ignore-charset-for-non-cid-fonts.patch
+08_cff_convert_._to_locale_specific_decimal_point_befor.patch
+09_cff_use_correct_size_for_buffer.patch
+10_cff_subsetting_widths_can_be_floating_point.patch
+11_polygon-reduce_reduce_broken_stopped-edge_continuation.patch
+intersect-dereference.diff

--- End Message ---
--- Begin Message ---
On Sun, 2013-02-17 at 23:23 +0100, Cyril Brulebois wrote:
> and thanks for your patience. Release managers, here's your d-i ACK
> for all those requests:
[...]
>  eglibc/2.13-38
>  cairo/1.12.2-3

unblock-udeb hints added; thanks.

Regards,

Adam

--- End Message ---

Reply to: