Import a bunch of more up to date local cairo patches, notably fixes to win32 clipping.

This commit is contained in:
vladimir%pobox.com 2006-01-18 22:15:25 +00:00
Родитель b72c2bda46
Коммит fb2d6d0f0c
11 изменённых файлов: 209 добавлений и 313 удалений

Просмотреть файл

@ -23,10 +23,25 @@ if cairo is enabled. Please upgrade to VC7.1/8.
mozilla-misc.patch
- Misc compilation fixes for pixman (submitted upstream)
- temporary moz_cairo_set_target API (not for upstream)
- mac compilation fix for cairo-atsui-font.c for 10.2 SDK (maybe should
be upstream?)
- cairo-features.h.in - add cairo-platform.h include and hard-code the
cairo version (not for upstream)
- #if 0'ing out DllMain in win32-surface.c -- not needed, since
we don't use cairo multithreaded, and DllMain interferes
with libxul's DllMain. (not for usptream)
- #if 0'ing out bits to get rid of multithreaded stuff in cairoint.h
(not for upstream)
cairo-debug-helpers.patch
- some stuff for cairo-debug.[ch]
cairo-win32-clip.patch
- Make mark_dirty() reset a surface's clip, so that we can call it
when we RestoreDC() after native win32 drawing (submitted upstream)
- Rework win32 surface clip and extents handling for correctness
(submitted upstream)
device-offset-scale.path
- Move device offset/scale handling into surface layer; large rework
of device offset/scale. (submitted upstream)

Просмотреть файл

@ -1,209 +0,0 @@
Index: src/cairo-debug.c
===================================================================
RCS file: /cvs/cairo/cairo/src/cairo-debug.c,v
retrieving revision 1.2
diff -u -8 -p -r1.2 cairo-debug.c
--- src/cairo-debug.c 31 Aug 2005 22:08:02 -0000 1.2
+++ src/cairo-debug.c 10 Jan 2006 21:15:50 -0000
@@ -65,8 +65,158 @@ cairo_debug_reset_static_data (void)
_cairo_font_reset_static_data ();
#if CAIRO_HAS_FT_FONT
_cairo_ft_font_reset_static_data ();
#endif
}
+/*
+ * path dumper
+ */
+
+typedef struct _cairo_debug_path_dump_closure {
+ unsigned int op_count;
+ FILE *fp;
+} cairo_debug_path_dump_closure_t;
+
+static cairo_status_t
+_cairo_debug_path_move_to (void *closure,
+ cairo_point_t *point)
+{
+ cairo_debug_path_dump_closure_t *fdc =
+ (cairo_debug_path_dump_closure_t*) closure;
+ fprintf (fdc->fp, "%d: moveto (%f, %f)\n",
+ fdc->op_count++,
+ _cairo_fixed_to_double(point->x),
+ _cairo_fixed_to_double(point->y));
+ return CAIRO_STATUS_SUCCESS;
+}
+
+static cairo_status_t
+_cairo_debug_path_line_to (void *closure,
+ cairo_point_t *point)
+{
+ cairo_debug_path_dump_closure_t *fdc =
+ (cairo_debug_path_dump_closure_t*) closure;
+ fprintf (fdc->fp, "%d: lineto (%f, %f)\n",
+ fdc->op_count++,
+ _cairo_fixed_to_double(point->x),
+ _cairo_fixed_to_double(point->y));
+ return CAIRO_STATUS_SUCCESS;
+}
+
+static cairo_status_t
+_cairo_debug_path_curve_to (void *closure,
+ cairo_point_t *p0,
+ cairo_point_t *p1,
+ cairo_point_t *p2)
+{
+ cairo_debug_path_dump_closure_t *fdc =
+ (cairo_debug_path_dump_closure_t*) closure;
+ fprintf (fdc->fp, "%d: curveto (%f, %f) (%f, %f) (%f, %f)\n",
+ fdc->op_count++,
+ _cairo_fixed_to_double(p0->x),
+ _cairo_fixed_to_double(p0->y),
+ _cairo_fixed_to_double(p1->x),
+ _cairo_fixed_to_double(p1->y),
+ _cairo_fixed_to_double(p2->x),
+ _cairo_fixed_to_double(p2->y));
+ return CAIRO_STATUS_SUCCESS;
+}
+
+static cairo_status_t
+_cairo_debug_path_close_path (void *closure)
+{
+ cairo_debug_path_dump_closure_t *fdc =
+ (cairo_debug_path_dump_closure_t*) closure;
+ fprintf (fdc->fp, "%d: close\n",
+ fdc->op_count++);
+ return CAIRO_STATUS_SUCCESS;
+}
+
+/**
+ * cairo_debug_dump_path
+ * @path: a #cairo_path_fixed_t
+ * @fp: the file pointer where to dump the given path
+ *
+ * Dumps @path in human-readable form to @fp.
+ */
+void
+cairo_debug_dump_path (cairo_path_fixed_t *path,
+ FILE *fp)
+{
+ cairo_debug_path_dump_closure_t fdc;
+ fdc.fp = fp;
+ fdc.op_count = 0;
+
+ fprintf (fp, "=== path %p ===\n", path);
+ _cairo_path_fixed_interpret (path,
+ CAIRO_DIRECTION_FORWARD,
+ _cairo_debug_path_move_to,
+ _cairo_debug_path_line_to,
+ _cairo_debug_path_curve_to,
+ _cairo_debug_path_close_path,
+ &fdc);
+ fprintf (fp, "======================\n");
+}
+
+/*
+ * traps dumping
+ */
+
+/**
+ * cairo_debug_dump_traps
+ * @traps: a #cairo_traps_t
+ * @fp: the file pointer where to dump the traps
+ *
+ * Dumps @traps in human-readable form to @fp.
+ */
+void
+cairo_debug_dump_traps (cairo_traps_t *traps,
+ FILE *fp)
+{
+ fprintf (fp, "=== traps %p ===\n", traps);
+ fprintf (fp, "extents: (%f, %f) (%f, %f)\n",
+ _cairo_fixed_to_double (traps->extents.p1.x),
+ _cairo_fixed_to_double (traps->extents.p1.y),
+ _cairo_fixed_to_double (traps->extents.p2.x),
+ _cairo_fixed_to_double (traps->extents.p2.y));
+
+ cairo_debug_dump_trapezoid_array (traps->traps,
+ traps->num_traps,
+ fp);
+
+ fprintf (fp, "=======================\n");
+}
+
+/**
+ * cairo_debug_dump_trapezoid_array
+ * @traps: a #cairo_trapezoid_t pointer
+ * @num_traps: the number of trapezoids in @traps
+ * @fp: the file pointer where to dump the traps
+ *
+ * Dumps num_traps in the @traps array in human-readable form to @fp.
+ */
+void
+cairo_debug_dump_trapezoid_array (cairo_trapezoid_t *traps,
+ int num_traps,
+ FILE *fp)
+{
+ int i;
+
+ for (i = 0; i < num_traps; i++) {
+ fprintf (fp, "% 3d: t: %f b: %f l: (%f,%f)->(%f,%f) r: (%f,%f)->(%f,%f)\n",
+ i,
+ _cairo_fixed_to_double (traps[i].top),
+ _cairo_fixed_to_double (traps[i].bottom),
+ _cairo_fixed_to_double (traps[i].left.p1.x),
+ _cairo_fixed_to_double (traps[i].left.p1.y),
+ _cairo_fixed_to_double (traps[i].left.p2.x),
+ _cairo_fixed_to_double (traps[i].left.p2.y),
+ _cairo_fixed_to_double (traps[i].right.p1.x),
+ _cairo_fixed_to_double (traps[i].right.p1.y),
+ _cairo_fixed_to_double (traps[i].right.p2.x),
+ _cairo_fixed_to_double (traps[i].right.p2.y));
+ }
+}
+
Index: src/cairo-debug.h
===================================================================
RCS file: /cvs/cairo/cairo/src/cairo-debug.h,v
retrieving revision 1.1
diff -u -8 -p -r1.1 cairo-debug.h
--- src/cairo-debug.h 1 Aug 2005 20:33:47 -0000 1.1
+++ src/cairo-debug.h 10 Jan 2006 21:15:50 -0000
@@ -32,17 +32,35 @@
* Contributor(s):
* Carl D. Worth <cworth@cworth.org>
*/
#ifndef CAIRO_DEBUG_H
#define CAIRO_DEBUG_H
#include <cairo-features.h>
+#include <stdio.h>
CAIRO_BEGIN_DECLS
+struct _cairo_path_fixed;
+struct _cairo_traps;
+struct _cairo_trapezoid;
+
void
cairo_debug_reset_static_data (void);
+void
+cairo_debug_dump_path (struct _cairo_path_fixed *path,
+ FILE *fp);
+
+void
+cairo_debug_dump_traps (struct _cairo_traps *traps,
+ FILE *fp);
+
+void
+cairo_debug_dump_trapezoid_array (struct _cairo_trapezoid *traps,
+ int num_traps,
+ FILE *fp);
+
CAIRO_END_DECLS
#endif /* CAIRO_H */

Просмотреть файл

Просмотреть файл

@ -35,6 +35,8 @@
#include "cairoint.h"
#include "cairo-clip-private.h"
/**
* cairo_debug_reset_static_data:
*
@ -70,6 +72,45 @@ cairo_debug_reset_static_data (void)
#endif
}
/*
* clip dumper
*/
void
cairo_debug_dump_clip (struct _cairo_clip *clip,
FILE *fp)
{
fprintf (fp, "clip %p: %s ", (clip->mode == CAIRO_CLIP_MODE_PATH ? "PATH" :
clip->mode == CAIRO_CLIP_MODE_REGION ? "REGION" :
clip->mode == CAIRO_CLIP_MODE_MASK ? "MASK" :
"INVALID?!"));
if (clip->mode == CAIRO_CLIP_MODE_PATH) {
fprintf (fp, "\n=== clip path ===\n");
} else if (clip->mode == CAIRO_CLIP_MODE_REGION) {
if (!clip->region) {
fprintf (fp, "region = NULL");
} else if (pixman_region_num_rects (clip->region) == 1) {
pixman_box16_t *rects = pixman_region_rects (clip->region);
fprintf (fp, "region [%d %d %d %d]",
rects[0].x1, rects[0].y1,
rects[0].x2, rects[0].y2);
} else {
pixman_box16_t *rects = pixman_region_rects (clip->region);
int i, nr = pixman_region_num_rects(clip->region);
fprintf (fp, "region (%d rects)\n", nr);
for (i = 0; i < nr; i++) {
fprintf (fp, "rect %d: [%d %d %d %d]", i,
rects[nr].x1, rects[nr].y1,
rects[nr].x2, rects[nr].y2);
}
}
} else if (clip->mode == CAIRO_CLIP_MODE_MASK) {
fprintf (fp, "mask, surface: %p rect: [%d %d %d %d]", clip->surface,
clip->surface_rect.x, clip->surface_rect.y, clip->surface_rect.width, clip->surface_rect.height);
}
fprintf (fp, "\n");
}
/*
* path dumper
*/

Просмотреть файл

@ -44,10 +44,14 @@ CAIRO_BEGIN_DECLS
struct _cairo_path_fixed;
struct _cairo_traps;
struct _cairo_trapezoid;
struct _cairo_clip;
void
cairo_debug_reset_static_data (void);
void
cairo_debug_dump_clip (struct _cairo_clip *clip,
FILE *fp);
void
cairo_debug_dump_path (struct _cairo_path_fixed *path,
FILE *fp);

Просмотреть файл

@ -518,6 +518,10 @@ cairo_surface_mark_dirty (cairo_surface_t *surface)
* Like cairo_surface_mark_dirty(), but drawing has been done only to
* the specified rectangle, so that cairo can retain cached contents
* for other parts of the surface.
*
* Any cached clip set on the surface will be reset by this function,
* to make sure that future cairo calls have the clip set that they
* expect.
*/
void
cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface,
@ -536,6 +540,12 @@ cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface,
return;
}
/* Always reset the clip here, to avoid having a SaveDC/RestoreDC around
* cairo calls that update the surface clip resulting in a desync between
* the cairo clip and the backend clip.
*/
surface->current_clip_serial = -1;
if (surface->backend->mark_dirty_rectangle) {
cairo_status_t status;
@ -1542,6 +1552,12 @@ _cairo_surface_set_clip (cairo_surface_t *surface, cairo_clip_t *clip)
if (!surface)
return CAIRO_STATUS_NULL_POINTER;
if (surface->status)
return surface->status;
if (surface->finished)
return CAIRO_STATUS_SURFACE_FINISHED;
if (clip) {
serial = clip->serial;
if (serial == 0)
@ -1549,7 +1565,7 @@ _cairo_surface_set_clip (cairo_surface_t *surface, cairo_clip_t *clip)
}
surface->clip = clip;
if (serial == _cairo_surface_get_current_clip_serial (surface))
return CAIRO_STATUS_SUCCESS;

Просмотреть файл

@ -62,9 +62,9 @@ typedef struct _cairo_win32_surface {
cairo_rectangle_t clip_rect;
int set_clip;
HRGN saved_clip;
cairo_rectangle_t extents;
} cairo_win32_surface_t;
cairo_status_t

Просмотреть файл

@ -274,9 +274,14 @@ _cairo_win32_surface_create_for_dc (HDC original_dc,
surface->clip_rect.width = width;
surface->clip_rect.height = height;
surface->set_clip = 0;
surface->saved_clip = NULL;
surface->saved_clip = CreateRectRgn (0, 0, 0, 0);
if (GetClipRgn (surface->dc, surface->saved_clip) == 0) {
DeleteObject(surface->saved_clip);
surface->saved_clip = NULL;
}
surface->extents = surface->clip_rect;
_cairo_surface_init (&surface->base, &cairo_win32_surface_backend);
return (cairo_surface_t *)surface;
@ -340,9 +345,8 @@ _cairo_win32_surface_finish (void *abstract_surface)
if (surface->image)
cairo_surface_destroy (surface->image);
if (surface->saved_clip) {
if (surface->saved_clip)
DeleteObject (surface->saved_clip);
}
/* If we created the Bitmap and DC, destroy them */
if (surface->bitmap) {
@ -403,7 +407,7 @@ _cairo_win32_surface_acquire_source_image (void *abstract_sur
cairo_win32_surface_t *surface = abstract_surface;
cairo_win32_surface_t *local = NULL;
cairo_status_t status;
if (surface->image) {
*image_out = (cairo_image_surface_t *)surface->image;
*image_extra = NULL;
@ -446,7 +450,7 @@ _cairo_win32_surface_acquire_dest_image (void *abstract_surfa
cairo_status_t status;
RECT clip_box;
int x1, y1, x2, y2;
if (surface->image) {
image_rect->x = 0;
image_rect->y = 0;
@ -461,12 +465,12 @@ _cairo_win32_surface_acquire_dest_image (void *abstract_surfa
if (GetClipBox (surface->dc, &clip_box) == ERROR)
return _cairo_win32_print_gdi_error ("_cairo_win3_surface_acquire_dest_image");
x1 = clip_box.left;
x2 = clip_box.right;
y1 = clip_box.top;
y2 = clip_box.bottom;
if (interest_rect->x > x1)
x1 = interest_rect->x;
if (interest_rect->y > y1)
@ -855,19 +859,9 @@ _cairo_win32_surface_set_clip_region (void *abstract_surface,
if (region == NULL) {
/* Clear any clip set by cairo, return to the original */
if (surface->set_clip) {
if (SelectClipRgn (surface->dc, surface->saved_clip) == ERROR)
return _cairo_win32_print_gdi_error ("_cairo_win32_surface_set_clip_region");
if (SelectClipRgn (surface->dc, surface->saved_clip) == ERROR)
return _cairo_win32_print_gdi_error ("_cairo_win32_surface_set_clip_region (reset)");
if (surface->saved_clip) {
DeleteObject (surface->saved_clip);
surface->saved_clip = NULL;
}
surface->set_clip = 0;
}
return CAIRO_STATUS_SUCCESS;
} else {
@ -910,36 +904,16 @@ _cairo_win32_surface_set_clip_region (void *abstract_surface,
if (!gdi_region)
return CAIRO_STATUS_NO_MEMORY;
if (surface->set_clip) {
/* Combine the new region with the original clip */
/* Combine the new region with the original clip */
if (surface->saved_clip) {
if (CombineRgn (gdi_region, gdi_region, surface->saved_clip, RGN_AND) == ERROR)
goto FAIL;
}
if (SelectClipRgn (surface->dc, gdi_region) == ERROR)
if (surface->saved_clip) {
if (CombineRgn (gdi_region, gdi_region, surface->saved_clip, RGN_AND) == ERROR)
goto FAIL;
} else {
/* Save the the current region */
surface->saved_clip = CreateRectRgn (0, 0, 0, 0);
if (!surface->saved_clip) {
goto FAIL; }
/* This function has no error return! */
if (GetClipRgn (surface->dc, surface->saved_clip) == 0) { /* No clip */
DeleteObject (surface->saved_clip);
surface->saved_clip = NULL;
}
if (ExtSelectClipRgn (surface->dc, gdi_region, RGN_AND) == ERROR)
goto FAIL;
surface->set_clip = 1;
}
if (SelectClipRgn (surface->dc, gdi_region) == ERROR)
goto FAIL;
DeleteObject (gdi_region);
return CAIRO_STATUS_SUCCESS;
@ -955,15 +929,8 @@ _cairo_win32_surface_get_extents (void *abstract_surface,
cairo_rectangle_t *rectangle)
{
cairo_win32_surface_t *surface = abstract_surface;
RECT clip_box;
if (GetClipBox (surface->dc, &clip_box) == ERROR)
return _cairo_win32_print_gdi_error ("_cairo_win3_surface_acquire_dest_image");
rectangle->x = clip_box.left;
rectangle->y = clip_box.top;
rectangle->width = clip_box.right - clip_box.left;
rectangle->height = clip_box.bottom - clip_box.top;
*rectangle = surface->extents;
return CAIRO_STATUS_SUCCESS;
}
@ -1007,8 +974,19 @@ cairo_win32_surface_create (HDC hdc)
surface->clip_rect.width = rect.right - rect.left;
surface->clip_rect.height = rect.bottom - rect.top;
surface->set_clip = 0;
surface->saved_clip = NULL;
if (surface->clip_rect.width == 0 ||
surface->clip_rect.height == 0)
{
surface->saved_clip = NULL;
} else {
surface->saved_clip = CreateRectRgn (0, 0, 0, 0);
if (GetClipRgn (hdc, surface->saved_clip) == 0) {
DeleteObject(surface->saved_clip);
surface->saved_clip = NULL;
}
}
surface->extents = surface->clip_rect;
_cairo_surface_init (&surface->base, &cairo_win32_surface_backend);

Просмотреть файл

@ -2,7 +2,7 @@ Index: src/cairo-gstate.c
===================================================================
--- src/cairo-gstate.c.orig
+++ src/cairo-gstate.c
@@ -501,37 +501,10 @@ _cairo_gstate_get_miter_limit (cairo_gst
@@ -508,37 +508,10 @@ _cairo_gstate_get_miter_limit (cairo_gst
return gstate->stroke_style.miter_limit;
}
@ -40,7 +40,7 @@ Index: src/cairo-gstate.c
}
cairo_status_t
@@ -617,9 +590,6 @@ _cairo_gstate_set_matrix (cairo_gstate_t
@@ -624,9 +597,6 @@ _cairo_gstate_set_matrix (cairo_gstate_t
if (status)
return status;
@ -50,7 +50,7 @@ Index: src/cairo-gstate.c
return CAIRO_STATUS_SUCCESS;
}
@@ -631,9 +601,6 @@ _cairo_gstate_identity_matrix (cairo_gst
@@ -638,9 +608,6 @@ _cairo_gstate_identity_matrix (cairo_gst
cairo_matrix_init_identity (&gstate->ctm);
cairo_matrix_init_identity (&gstate->ctm_inverse);
@ -60,7 +60,7 @@ Index: src/cairo-gstate.c
return CAIRO_STATUS_SUCCESS;
}
@@ -675,15 +642,11 @@ void
@@ -682,15 +649,11 @@ void
_cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y)
{
cairo_matrix_transform_point (&gstate->ctm, x, y);
@ -76,7 +76,7 @@ Index: src/cairo-gstate.c
cairo_matrix_transform_point (&gstate->ctm_inverse, x, y);
}
@@ -704,16 +667,8 @@ _cairo_gstate_copy_transformed_pattern (
@@ -711,16 +674,8 @@ _cairo_gstate_copy_transformed_pattern (
cairo_pattern_t *original,
cairo_matrix_t *ctm_inverse)
{
@ -237,7 +237,7 @@ Index: src/cairo-surface.c
/**
* _cairo_surface_set_error:
* @surface: a surface
@@ -523,7 +539,10 @@ cairo_surface_mark_dirty_rectangle (cair
@@ -533,7 +549,10 @@ cairo_surface_mark_dirty_rectangle (cair
if (surface->backend->mark_dirty_rectangle) {
cairo_status_t status;
@ -249,7 +249,7 @@ Index: src/cairo-surface.c
if (status)
_cairo_surface_set_error (surface, status);
@@ -618,6 +637,7 @@ _cairo_surface_release_source_image (cai
@@ -628,6 +647,7 @@ _cairo_surface_release_source_image (cai
* @surface: a #cairo_surface_t
* @interest_rect: area of @surface for which fallback drawing is being done.
* A value of %NULL indicates that the entire surface is desired.
@ -257,7 +257,7 @@ Index: src/cairo-surface.c
* @image_out: location to store a pointer to an image surface that includes at least
* the intersection of @interest_rect with the visible area of @surface.
* This surface could be @surface itself, a surface held internal to @surface,
@@ -650,10 +670,26 @@ _cairo_surface_acquire_dest_image (cairo
@@ -660,10 +680,26 @@ _cairo_surface_acquire_dest_image (cairo
cairo_rectangle_t *image_rect,
void **image_extra)
{
@ -286,7 +286,7 @@ Index: src/cairo-surface.c
}
/**
@@ -675,10 +711,22 @@ _cairo_surface_release_dest_image (cairo
@@ -685,10 +721,22 @@ _cairo_surface_release_dest_image (cairo
cairo_rectangle_t *image_rect,
void *image_extra)
{
@ -310,7 +310,7 @@ Index: src/cairo-surface.c
image, image_rect, image_extra);
}
@@ -714,6 +762,13 @@ _cairo_surface_clone_similar (cairo_surf
@@ -724,6 +772,13 @@ _cairo_surface_clone_similar (cairo_surf
return CAIRO_INT_STATUS_UNSUPPORTED;
status = surface->backend->clone_similar (surface, src, clone_out);
@ -324,7 +324,7 @@ Index: src/cairo-surface.c
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
@@ -722,6 +777,12 @@ _cairo_surface_clone_similar (cairo_surf
@@ -732,6 +787,12 @@ _cairo_surface_clone_similar (cairo_surf
return status;
status = surface->backend->clone_similar (surface, &image->base, clone_out);
@ -337,7 +337,7 @@ Index: src/cairo-surface.c
/* If the above failed point, we could implement a full fallback
* using acquire_dest_image, but that's going to be very
@@ -798,7 +859,8 @@ _cairo_surface_composite (cairo_operator
@@ -808,7 +869,8 @@ _cairo_surface_composite (cairo_operator
src, mask, dst,
src_x, src_y,
mask_x, mask_y,
@ -347,7 +347,7 @@ Index: src/cairo-surface.c
width, height);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
@@ -927,6 +989,8 @@ _cairo_surface_fill_rectangles (cairo_su
@@ -937,6 +999,8 @@ _cairo_surface_fill_rectangles (cairo_su
int num_rects)
{
cairo_int_status_t status;
@ -356,7 +356,7 @@ Index: src/cairo-surface.c
assert (! surface->is_snapshot);
@@ -940,8 +1004,26 @@ _cairo_surface_fill_rectangles (cairo_su
@@ -950,8 +1014,26 @@ _cairo_surface_fill_rectangles (cairo_su
return CAIRO_STATUS_SUCCESS;
if (surface->backend->fill_rectangles) {
@ -385,7 +385,7 @@ Index: src/cairo-surface.c
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
@@ -1002,10 +1084,31 @@ _cairo_surface_stroke (cairo_surface_t
@@ -1012,10 +1094,31 @@ _cairo_surface_stroke (cairo_surface_t
if (surface->backend->stroke) {
cairo_status_t status;
@ -418,7 +418,7 @@ Index: src/cairo-surface.c
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
@@ -1026,13 +1129,33 @@ _cairo_surface_fill (cairo_surface_t *su
@@ -1036,13 +1139,33 @@ _cairo_surface_fill (cairo_surface_t *su
cairo_antialias_t antialias)
{
cairo_status_t status;
@ -453,7 +453,7 @@ Index: src/cairo-surface.c
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
@@ -1057,6 +1180,7 @@ _cairo_surface_composite_trapezoids (cai
@@ -1067,6 +1190,7 @@ _cairo_surface_composite_trapezoids (cai
int num_traps)
{
cairo_int_status_t status;
@ -461,7 +461,7 @@ Index: src/cairo-surface.c
assert (! dst->is_snapshot);
@@ -1072,13 +1196,36 @@ _cairo_surface_composite_trapezoids (cai
@@ -1082,13 +1206,36 @@ _cairo_surface_composite_trapezoids (cai
return CAIRO_STATUS_SURFACE_FINISHED;
if (dst->backend->composite_trapezoids) {
@ -500,7 +500,7 @@ Index: src/cairo-surface.c
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
@@ -1225,6 +1372,9 @@ _cairo_surface_set_clip_region (cairo_su
@@ -1235,6 +1382,9 @@ _cairo_surface_set_clip_region (cairo_su
pixman_region16_t *region,
unsigned int serial)
{
@ -510,7 +510,7 @@ Index: src/cairo-surface.c
if (surface->status)
return surface->status;
@@ -1232,10 +1382,48 @@ _cairo_surface_set_clip_region (cairo_su
@@ -1242,10 +1392,50 @@ _cairo_surface_set_clip_region (cairo_su
return CAIRO_STATUS_SURFACE_FINISHED;
assert (surface->backend->set_clip_region != NULL);
@ -532,12 +532,14 @@ Index: src/cairo-surface.c
+ pixman_box16_t *rects = pixman_region_rects (region);
+ for (i = 0; i < nr; i++) {
+ pixman_box16_t tmpb;
+ pixman_region16_t *tmpr;
+
+ tmpb.x1 = BACKEND_X(surface, rects[i].x1);
+ tmpb.y1 = BACKEND_Y(surface, rects[i].y1);
+ tmpb.x2 = BACKEND_X(surface, rects[i].x2);
+ tmpb.y2 = BACKEND_Y(surface, rects[i].y2);
+
+ pixman_region16_t *tmpr = pixman_region_create_simple (&tmpb);
+ tmpr = pixman_region_create_simple (&tmpb);
+
+ pixman_region_append (dev_region, tmpr);
+ pixman_region_destroy (tmpr);
@ -561,7 +563,7 @@ Index: src/cairo-surface.c
}
cairo_int_status_t
@@ -1245,6 +1433,10 @@ _cairo_surface_intersect_clip_path (cair
@@ -1255,6 +1445,10 @@ _cairo_surface_intersect_clip_path (cair
double tolerance,
cairo_antialias_t antialias)
{
@ -572,7 +574,7 @@ Index: src/cairo-surface.c
if (surface->status)
return surface->status;
@@ -1253,11 +1445,30 @@ _cairo_surface_intersect_clip_path (cair
@@ -1263,11 +1457,30 @@ _cairo_surface_intersect_clip_path (cair
assert (surface->backend->intersect_clip_path != NULL);
@ -608,7 +610,7 @@ Index: src/cairo-surface.c
}
static cairo_status_t
@@ -1273,11 +1484,11 @@ _cairo_surface_set_clip_path_recursive (
@@ -1283,11 +1496,11 @@ _cairo_surface_set_clip_path_recursive (
if (status)
return status;
@ -625,7 +627,7 @@ Index: src/cairo-surface.c
}
/**
@@ -1374,13 +1585,20 @@ cairo_status_t
@@ -1390,13 +1603,20 @@ cairo_status_t
_cairo_surface_get_extents (cairo_surface_t *surface,
cairo_rectangle_t *rectangle)
{
@ -647,7 +649,7 @@ Index: src/cairo-surface.c
}
cairo_status_t
@@ -1392,13 +1610,34 @@ _cairo_surface_show_glyphs (cairo_surfac
@@ -1408,13 +1628,34 @@ _cairo_surface_show_glyphs (cairo_surfac
cairo_scaled_font_t *scaled_font)
{
cairo_status_t status;
@ -684,7 +686,7 @@ Index: src/cairo-surface.c
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
}
@@ -1428,6 +1667,7 @@ _cairo_surface_old_show_glyphs (cairo_sc
@@ -1444,6 +1685,7 @@ _cairo_surface_old_show_glyphs (cairo_sc
int num_glyphs)
{
cairo_status_t status;
@ -692,7 +694,7 @@ Index: src/cairo-surface.c
assert (! dst->is_snapshot);
@@ -1437,14 +1677,35 @@ _cairo_surface_old_show_glyphs (cairo_sc
@@ -1453,14 +1695,35 @@ _cairo_surface_old_show_glyphs (cairo_sc
if (dst->finished)
return CAIRO_STATUS_SURFACE_FINISHED;
@ -731,7 +733,7 @@ Index: src/cairo-surface.c
status = CAIRO_INT_STATUS_UNSUPPORTED;
return status;
@@ -1554,7 +1815,15 @@ _cairo_surface_composite_fixup_unbounded
@@ -1570,7 +1833,15 @@ _cairo_surface_composite_fixup_unbounded
cairo_rectangle_t *mask_rectangle = NULL;
assert (! dst->is_snapshot);
@ -748,7 +750,7 @@ Index: src/cairo-surface.c
/* The RENDER/libpixman operators are clipped to the bounds of the untransformed,
* non-repeating sources and masks. Other sources and masks can be ignored.
*/
@@ -1629,6 +1898,10 @@ _cairo_surface_composite_shape_fixup_unb
@@ -1645,6 +1916,10 @@ _cairo_surface_composite_shape_fixup_unb
cairo_rectangle_t *mask_rectangle = NULL;
assert (! dst->is_snapshot);
@ -827,7 +829,7 @@ Index: src/cairoint.h
===================================================================
--- src/cairoint.h.orig
+++ src/cairoint.h
@@ -1460,6 +1460,13 @@ _cairo_path_fixed_bounds (cairo_path_fix
@@ -1466,6 +1466,13 @@ _cairo_path_fixed_bounds (cairo_path_fix
double *x1, double *y1,
double *x2, double *y2);
@ -841,7 +843,7 @@ Index: src/cairoint.h
/* cairo_path_fill.c */
cairo_private cairo_status_t
_cairo_path_fixed_fill_to_traps (cairo_path_fixed_t *path,
@@ -1978,6 +1985,13 @@ cairo_private cairo_status_t
@@ -1984,6 +1991,13 @@ cairo_private cairo_status_t
_cairo_traps_extract_region (cairo_traps_t *tr,
pixman_region16_t **region);

Просмотреть файл

@ -167,13 +167,14 @@ Index: pixman/src/fbcompose.c
===================================================================
--- pixman/src/fbcompose.c.orig
+++ pixman/src/fbcompose.c
@@ -33,8 +33,15 @@
@@ -33,8 +33,16 @@
#include "pixregionint.h"
+#ifdef _MSC_VER
+#define _USE_MATH_DEFINES
+#endif
+
#include <math.h>
+#ifndef M_PI
@ -204,3 +205,53 @@ Index: src/cairo-atsui-font.c
typedef struct _cairo_atsui_font_face cairo_atsui_font_face_t;
typedef struct _cairo_atsui_font cairo_atsui_font_t;
Index: src/cairo-features.h.in
===================================================================
--- src/cairo-features.h.in.orig
+++ src/cairo-features.h.in
@@ -37,6 +37,8 @@
#ifndef CAIRO_FEATURES_H
#define CAIRO_FEATURES_H
+#include "cairo-platform.h"
+
#ifdef __cplusplus
# define CAIRO_BEGIN_DECLS extern "C" {
# define CAIRO_END_DECLS }
@@ -49,11 +51,11 @@
# define cairo_public
#endif
-#define CAIRO_VERSION_MAJOR @CAIRO_VERSION_MAJOR@
-#define CAIRO_VERSION_MINOR @CAIRO_VERSION_MINOR@
-#define CAIRO_VERSION_MICRO @CAIRO_VERSION_MICRO@
+#define CAIRO_VERSION_MAJOR 1
+#define CAIRO_VERSION_MINOR 1
+#define CAIRO_VERSION_MICRO 1
-#define CAIRO_VERSION_STRING "@CAIRO_VERSION_MAJOR@.@CAIRO_VERSION_MINOR@.@CAIRO_VERSION_MICRO@"
+#define CAIRO_VERSION_STRING "1.1.1"
@PS_SURFACE_FEATURE@
Index: src/cairo-win32-surface.c
===================================================================
--- src/cairo-win32-surface.c.orig
+++ src/cairo-win32-surface.c
@@ -1062,6 +1062,9 @@ CRITICAL_SECTION cairo_toy_font_face_has
CRITICAL_SECTION cairo_scaled_font_map_mutex;
CRITICAL_SECTION cairo_ft_unscaled_font_map_mutex;
+#if 0
+// Mozilla doesn't use the mutexes, and this definition of DllMain
+// conflicts with libxul.
BOOL WINAPI
DllMain (HINSTANCE hinstDLL,
DWORD fdwReason,
@@ -1083,4 +1086,6 @@ DllMain (HINSTANCE hinstDLL,
}
return TRUE;
}
+#endif // 0
+
#endif

Просмотреть файл

@ -151,25 +151,23 @@ Index: src/cairo-gstate.c
- 0, 0,
- _cairo_surface_get_width (gstate->target),
- _cairo_surface_get_height (gstate->target));
-
+ /* If this gstate is already redirected, this is an error; we need a
+ * new gstate to be able to redirect */
+ assert (gstate->parent_target == NULL);
- _cairo_surface_fini (&mask);
-
- pix = _cairo_surface_get_drawable (gstate->target);
- XFreePixmap (gstate->dpy, pix);
-
- cairo_surface_destroy (gstate->target);
- gstate->target = gstate->parent_surface;
- gstate->parent_surface = NULL;
+ /* If this gstate is already redirected, this is an error; we need a
+ * new gstate to be able to redirect */
+ assert (gstate->parent_target == NULL);
+
+ /* Set up our new parent_target based on our current target;
+ * gstate->parent_target will take the ref that is held by gstate->target
+ */
+ cairo_surface_destroy (gstate->parent_target);
+ gstate->parent_target = gstate->target;
+
- cairo_surface_destroy (gstate->target);
- gstate->target = gstate->parent_surface;
- gstate->parent_surface = NULL;
+ /* Now set up our new target; we overwrite gstate->target directly,
+ * since its ref is now owned by gstate->parent_target */
+ gstate->target = cairo_surface_reference (child);
@ -449,7 +447,7 @@ Index: src/cairoint.h
===================================================================
--- src/cairoint.h.orig
+++ src/cairoint.h
@@ -1073,9 +1073,24 @@ _cairo_gstate_clone (cairo_gstate_t *gst
@@ -1077,9 +1077,24 @@ _cairo_gstate_clone (cairo_gstate_t *gst
cairo_private void
_moz_cairo_gstate_set_target (cairo_gstate_t *gstate, cairo_surface_t *target);
@ -474,7 +472,7 @@ Index: src/cairoint.h
cairo_private cairo_status_t
_cairo_gstate_set_source (cairo_gstate_t *gstate, cairo_pattern_t *source);
@@ -2173,6 +2188,9 @@ slim_hidden_proto(cairo_restore)
@@ -2177,6 +2192,9 @@ slim_hidden_proto(cairo_restore)
slim_hidden_proto(cairo_save)
slim_hidden_proto(cairo_stroke_preserve)
slim_hidden_proto(cairo_surface_destroy)