summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/native-clipping.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/cairo/native-clipping.patch')
-rw-r--r--gfx/cairo/native-clipping.patch189
1 files changed, 189 insertions, 0 deletions
diff --git a/gfx/cairo/native-clipping.patch b/gfx/cairo/native-clipping.patch
new file mode 100644
index 0000000000..171998fe7c
--- /dev/null
+++ b/gfx/cairo/native-clipping.patch
@@ -0,0 +1,189 @@
+commit 857df0583365228150b3319475efc43b22077d06
+Author: Jeff Muizelaar <jmuizelaar@mozilla.com>
+Date: Tue Apr 20 15:43:54 2010 -0400
+
+ native clipping
+
+diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
+index df063bf..819e53e 100644
+--- a/src/cairo-quartz-surface.c
++++ b/src/cairo-quartz-surface.c
+@@ -39,6 +39,8 @@
+
+ #include "cairo-quartz-private.h"
+ #include "cairo-surface-clipper-private.h"
++#include "cairo-gstate-private.h"
++#include "cairo-private.h"
+
+ #include <dlfcn.h>
+
+@@ -3095,6 +3097,61 @@ cairo_quartz_surface_get_cg_context (cairo_surface_t *surface)
+ return quartz->cgContext;
+ }
+
++CGContextRef
++cairo_quartz_get_cg_context_with_clip (cairo_t *cr)
++{
++
++ cairo_surface_t *surface = cr->gstate->target;
++ cairo_clip_t *clip = &cr->gstate->clip;
++ cairo_status_t status;
++
++ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface;
++
++ if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ)
++ return NULL;
++
++ if (!clip->path) {
++ if (clip->all_clipped) {
++ /* Save the state before we set an empty clip rect so that
++ * our previous clip will be restored */
++ CGContextSaveGState (quartz->cgContext);
++
++ /* _cairo_surface_clipper_set_clip doesn't deal with
++ * clip->all_clipped because drawing is normally discarded earlier */
++ CGRect empty = {{0,0}, {0,0}};
++ CGContextClipToRect (quartz->cgContext, empty);
++
++ return quartz->cgContext;
++ }
++
++ /* an empty clip is represented by NULL */
++ clip = NULL;
++ }
++
++ status = _cairo_surface_clipper_set_clip (&quartz->clipper, clip);
++
++ /* Save the state after we set the clip so that it persists
++ * after we restore */
++ CGContextSaveGState (quartz->cgContext);
++
++ if (unlikely (status))
++ return NULL;
++
++ return quartz->cgContext;
++}
++
++void
++cairo_quartz_finish_cg_context_with_clip (cairo_t *cr)
++{
++ cairo_surface_t *surface = cr->gstate->target;
++
++ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface;
++
++ if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ)
++ return;
++
++ CGContextRestoreGState (quartz->cgContext);
++}
+
+ /* Debug stuff */
+
+diff --git a/src/cairo-quartz.h b/src/cairo-quartz.h
+index e8b71ba..aa1cdd2 100644
+--- a/src/cairo-quartz.h
++++ b/src/cairo-quartz.h
+@@ -57,6 +57,12 @@ cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext,
+ cairo_public CGContextRef
+ cairo_quartz_surface_get_cg_context (cairo_surface_t *surface);
+
++cairo_public CGContextRef
++cairo_quartz_get_cg_context_with_clip (cairo_t *cr);
++
++cairo_public void
++cairo_quartz_finish_cg_context_with_clip (cairo_t *cr);
++
+ #if CAIRO_HAS_QUARTZ_FONT
+
+ /*
+diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c
+index d4575a3..c10e134 100644
+--- a/src/cairo-win32-surface.c
++++ b/src/cairo-win32-surface.c
+@@ -52,7 +52,9 @@
+ #include "cairo-win32-private.h"
+ #include "cairo-scaled-font-subsets-private.h"
+ #include "cairo-surface-fallback-private.h"
+-
++#include "cairo-surface-clipper-private.h"
++#include "cairo-gstate-private.h"
++#include "cairo-private.h"
+ #include <wchar.h>
+ #include <windows.h>
+
+@@ -1914,6 +1916,61 @@ cairo_win32_surface_get_dc (cairo_surface_t *surface)
+ return NULL;
+ }
+
++
++HDC
++cairo_win32_get_dc_with_clip (cairo_t *cr)
++{
++ cairo_surface_t *surface = cr->gstate->target;
++ cairo_clip_t clip;
++ _cairo_clip_init_copy(&clip, &cr->gstate->clip);
++
++ if (_cairo_surface_is_win32 (surface)){
++ cairo_win32_surface_t *winsurf = (cairo_win32_surface_t *) surface;
++ cairo_region_t *clip_region = NULL;
++ cairo_status_t status;
++
++ if (clip.path) {
++ status = _cairo_clip_get_region (&clip, &clip_region);
++ assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO);
++ if (status) {
++ _cairo_clip_fini(&clip);
++ return NULL;
++ }
++ }
++ _cairo_win32_surface_set_clip_region (winsurf, clip_region);
++
++ _cairo_clip_fini(&clip);
++ return winsurf->dc;
++ }
++
++ if (_cairo_surface_is_paginated (surface)) {
++ cairo_surface_t *target;
++
++ target = _cairo_paginated_surface_get_target (surface);
++
++#ifndef CAIRO_OMIT_WIN32_PRINTING
++ if (_cairo_surface_is_win32_printing (target)) {
++ cairo_status_t status;
++ cairo_win32_surface_t *winsurf = (cairo_win32_surface_t *) target;
++
++ status = _cairo_surface_clipper_set_clip (&winsurf->clipper, &clip);
++
++ _cairo_clip_fini(&clip);
++
++ if (status)
++ return NULL;
++
++ return winsurf->dc;
++ }
++#endif
++ }
++
++ _cairo_clip_fini(&clip);
++ return NULL;
++}
++
++
++
+ /**
+ * cairo_win32_surface_get_image
+ * @surface: a #cairo_surface_t
+diff --git a/src/cairo-win32.h b/src/cairo-win32.h
+index 7d04d2a..c304f92 100644
+--- a/src/cairo-win32.h
++++ b/src/cairo-win32.h
+@@ -65,6 +65,9 @@ cairo_win32_surface_create_with_dib (cairo_format_t format,
+ cairo_public HDC
+ cairo_win32_surface_get_dc (cairo_surface_t *surface);
+
++cairo_public HDC
++cairo_win32_get_dc_with_clip (cairo_t *cr);
++
+ cairo_public cairo_surface_t *
+ cairo_win32_surface_get_image (cairo_surface_t *surface);
+