gfx/cairo/native-clipping.patch

changeset 0
6474c204b198
     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 + 

mercurial