1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/cairo/native-clipping.patch Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,189 @@ 1.4 +commit 857df0583365228150b3319475efc43b22077d06 1.5 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> 1.6 +Date: Tue Apr 20 15:43:54 2010 -0400 1.7 + 1.8 + native clipping 1.9 + 1.10 +diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c 1.11 +index df063bf..819e53e 100644 1.12 +--- a/src/cairo-quartz-surface.c 1.13 ++++ b/src/cairo-quartz-surface.c 1.14 +@@ -39,6 +39,8 @@ 1.15 + 1.16 + #include "cairo-quartz-private.h" 1.17 + #include "cairo-surface-clipper-private.h" 1.18 ++#include "cairo-gstate-private.h" 1.19 ++#include "cairo-private.h" 1.20 + 1.21 + #include <dlfcn.h> 1.22 + 1.23 +@@ -3095,6 +3097,61 @@ cairo_quartz_surface_get_cg_context (cairo_surface_t *surface) 1.24 + return quartz->cgContext; 1.25 + } 1.26 + 1.27 ++CGContextRef 1.28 ++cairo_quartz_get_cg_context_with_clip (cairo_t *cr) 1.29 ++{ 1.30 ++ 1.31 ++ cairo_surface_t *surface = cr->gstate->target; 1.32 ++ cairo_clip_t *clip = &cr->gstate->clip; 1.33 ++ cairo_status_t status; 1.34 ++ 1.35 ++ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface; 1.36 ++ 1.37 ++ if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ) 1.38 ++ return NULL; 1.39 ++ 1.40 ++ if (!clip->path) { 1.41 ++ if (clip->all_clipped) { 1.42 ++ /* Save the state before we set an empty clip rect so that 1.43 ++ * our previous clip will be restored */ 1.44 ++ CGContextSaveGState (quartz->cgContext); 1.45 ++ 1.46 ++ /* _cairo_surface_clipper_set_clip doesn't deal with 1.47 ++ * clip->all_clipped because drawing is normally discarded earlier */ 1.48 ++ CGRect empty = {{0,0}, {0,0}}; 1.49 ++ CGContextClipToRect (quartz->cgContext, empty); 1.50 ++ 1.51 ++ return quartz->cgContext; 1.52 ++ } 1.53 ++ 1.54 ++ /* an empty clip is represented by NULL */ 1.55 ++ clip = NULL; 1.56 ++ } 1.57 ++ 1.58 ++ status = _cairo_surface_clipper_set_clip (&quartz->clipper, clip); 1.59 ++ 1.60 ++ /* Save the state after we set the clip so that it persists 1.61 ++ * after we restore */ 1.62 ++ CGContextSaveGState (quartz->cgContext); 1.63 ++ 1.64 ++ if (unlikely (status)) 1.65 ++ return NULL; 1.66 ++ 1.67 ++ return quartz->cgContext; 1.68 ++} 1.69 ++ 1.70 ++void 1.71 ++cairo_quartz_finish_cg_context_with_clip (cairo_t *cr) 1.72 ++{ 1.73 ++ cairo_surface_t *surface = cr->gstate->target; 1.74 ++ 1.75 ++ cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface; 1.76 ++ 1.77 ++ if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ) 1.78 ++ return; 1.79 ++ 1.80 ++ CGContextRestoreGState (quartz->cgContext); 1.81 ++} 1.82 + 1.83 + /* Debug stuff */ 1.84 + 1.85 +diff --git a/src/cairo-quartz.h b/src/cairo-quartz.h 1.86 +index e8b71ba..aa1cdd2 100644 1.87 +--- a/src/cairo-quartz.h 1.88 ++++ b/src/cairo-quartz.h 1.89 +@@ -57,6 +57,12 @@ cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, 1.90 + cairo_public CGContextRef 1.91 + cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); 1.92 + 1.93 ++cairo_public CGContextRef 1.94 ++cairo_quartz_get_cg_context_with_clip (cairo_t *cr); 1.95 ++ 1.96 ++cairo_public void 1.97 ++cairo_quartz_finish_cg_context_with_clip (cairo_t *cr); 1.98 ++ 1.99 + #if CAIRO_HAS_QUARTZ_FONT 1.100 + 1.101 + /* 1.102 +diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c 1.103 +index d4575a3..c10e134 100644 1.104 +--- a/src/cairo-win32-surface.c 1.105 ++++ b/src/cairo-win32-surface.c 1.106 +@@ -52,7 +52,9 @@ 1.107 + #include "cairo-win32-private.h" 1.108 + #include "cairo-scaled-font-subsets-private.h" 1.109 + #include "cairo-surface-fallback-private.h" 1.110 +- 1.111 ++#include "cairo-surface-clipper-private.h" 1.112 ++#include "cairo-gstate-private.h" 1.113 ++#include "cairo-private.h" 1.114 + #include <wchar.h> 1.115 + #include <windows.h> 1.116 + 1.117 +@@ -1914,6 +1916,61 @@ cairo_win32_surface_get_dc (cairo_surface_t *surface) 1.118 + return NULL; 1.119 + } 1.120 + 1.121 ++ 1.122 ++HDC 1.123 ++cairo_win32_get_dc_with_clip (cairo_t *cr) 1.124 ++{ 1.125 ++ cairo_surface_t *surface = cr->gstate->target; 1.126 ++ cairo_clip_t clip; 1.127 ++ _cairo_clip_init_copy(&clip, &cr->gstate->clip); 1.128 ++ 1.129 ++ if (_cairo_surface_is_win32 (surface)){ 1.130 ++ cairo_win32_surface_t *winsurf = (cairo_win32_surface_t *) surface; 1.131 ++ cairo_region_t *clip_region = NULL; 1.132 ++ cairo_status_t status; 1.133 ++ 1.134 ++ if (clip.path) { 1.135 ++ status = _cairo_clip_get_region (&clip, &clip_region); 1.136 ++ assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO); 1.137 ++ if (status) { 1.138 ++ _cairo_clip_fini(&clip); 1.139 ++ return NULL; 1.140 ++ } 1.141 ++ } 1.142 ++ _cairo_win32_surface_set_clip_region (winsurf, clip_region); 1.143 ++ 1.144 ++ _cairo_clip_fini(&clip); 1.145 ++ return winsurf->dc; 1.146 ++ } 1.147 ++ 1.148 ++ if (_cairo_surface_is_paginated (surface)) { 1.149 ++ cairo_surface_t *target; 1.150 ++ 1.151 ++ target = _cairo_paginated_surface_get_target (surface); 1.152 ++ 1.153 ++#ifndef CAIRO_OMIT_WIN32_PRINTING 1.154 ++ if (_cairo_surface_is_win32_printing (target)) { 1.155 ++ cairo_status_t status; 1.156 ++ cairo_win32_surface_t *winsurf = (cairo_win32_surface_t *) target; 1.157 ++ 1.158 ++ status = _cairo_surface_clipper_set_clip (&winsurf->clipper, &clip); 1.159 ++ 1.160 ++ _cairo_clip_fini(&clip); 1.161 ++ 1.162 ++ if (status) 1.163 ++ return NULL; 1.164 ++ 1.165 ++ return winsurf->dc; 1.166 ++ } 1.167 ++#endif 1.168 ++ } 1.169 ++ 1.170 ++ _cairo_clip_fini(&clip); 1.171 ++ return NULL; 1.172 ++} 1.173 ++ 1.174 ++ 1.175 ++ 1.176 + /** 1.177 + * cairo_win32_surface_get_image 1.178 + * @surface: a #cairo_surface_t 1.179 +diff --git a/src/cairo-win32.h b/src/cairo-win32.h 1.180 +index 7d04d2a..c304f92 100644 1.181 +--- a/src/cairo-win32.h 1.182 ++++ b/src/cairo-win32.h 1.183 +@@ -65,6 +65,9 @@ cairo_win32_surface_create_with_dib (cairo_format_t format, 1.184 + cairo_public HDC 1.185 + cairo_win32_surface_get_dc (cairo_surface_t *surface); 1.186 + 1.187 ++cairo_public HDC 1.188 ++cairo_win32_get_dc_with_clip (cairo_t *cr); 1.189 ++ 1.190 + cairo_public cairo_surface_t * 1.191 + cairo_win32_surface_get_image (cairo_surface_t *surface); 1.192 +