gfx/cairo/win32-raster.patch

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/cairo/win32-raster.patch	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,262 @@
     1.4 +changeset:   29338:f2a10f325734
     1.5 +tag:         qtip
     1.6 +tag:         tip
     1.7 +tag:         win32-raster-mask2.patch
     1.8 +tag:         qbase
     1.9 +user:        Jeff Muizelaar <jmuizelaar@mozilla.com>
    1.10 +date:        Mon Jun 22 14:26:07 2009 -0400
    1.11 +summary:     imported patch win32-raster-mask2.patch
    1.12 +
    1.13 +diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c
    1.14 +--- a/gfx/cairo/cairo/src/cairo-image-surface.c
    1.15 ++++ b/gfx/cairo/cairo/src/cairo-image-surface.c
    1.16 +@@ -1232,27 +1232,27 @@ typedef struct _cairo_image_surface_span
    1.17 +     cairo_composite_rectangles_t composite_rectangles;
    1.18 + } cairo_image_surface_span_renderer_t;
    1.19 + 
    1.20 +-static cairo_status_t
    1.21 +-_cairo_image_surface_span_renderer_render_row (
    1.22 +-    void				*abstract_renderer,
    1.23 ++void
    1.24 ++_cairo_image_surface_span_render_row (
    1.25 +     int					 y,
    1.26 +     const cairo_half_open_span_t	*spans,
    1.27 +-    unsigned				 num_spans)
    1.28 ++    unsigned				 num_spans,
    1.29 ++    cairo_image_surface_t               *mask,
    1.30 ++    const cairo_composite_rectangles_t  *rects)
    1.31 + {
    1.32 +-    cairo_image_surface_span_renderer_t *renderer = abstract_renderer;
    1.33 +-    int xmin = renderer->composite_rectangles.mask.x;
    1.34 +-    int xmax = xmin + renderer->composite_rectangles.width;
    1.35 ++    int xmin = rects->mask.x;
    1.36 ++    int xmax = xmin + rects->width;
    1.37 +     uint8_t *row;
    1.38 +     int prev_x = xmin;
    1.39 +     int prev_alpha = 0;
    1.40 +     unsigned i;
    1.41 + 
    1.42 +     /* Make sure we're within y-range. */
    1.43 +-    y -= renderer->composite_rectangles.mask.y;
    1.44 +-    if (y < 0 || y >= renderer->composite_rectangles.height)
    1.45 ++    y -= rects->mask.y;
    1.46 ++    if (y < 0 || y >= rects->height)
    1.47 + 	return CAIRO_STATUS_SUCCESS;
    1.48 + 
    1.49 +-    row = (uint8_t*)(renderer->mask->data) + y*(size_t)renderer->mask->stride - xmin;
    1.50 ++    row = (uint8_t*)(mask->data) + y*(size_t)mask->stride - xmin;
    1.51 + 
    1.52 +     /* Find the first span within x-range. */
    1.53 +     for (i=0; i < num_spans && spans[i].x < xmin; i++) {}
    1.54 +@@ -1286,7 +1286,17 @@ _cairo_image_surface_span_renderer_rende
    1.55 +     if (prev_alpha != 0 && prev_x < xmax) {
    1.56 + 	memset(row + prev_x, prev_alpha, xmax - prev_x);
    1.57 +     }
    1.58 ++}
    1.59 + 
    1.60 ++static cairo_status_t
    1.61 ++_cairo_image_surface_span_renderer_render_row (
    1.62 ++    void				*abstract_renderer,
    1.63 ++    int					 y,
    1.64 ++    const cairo_half_open_span_t	*spans,
    1.65 ++    unsigned				 num_spans)
    1.66 ++{
    1.67 ++    cairo_image_surface_span_renderer_t *renderer = abstract_renderer;
    1.68 ++    _cairo_image_surface_span_render_row (y, spans, num_spans, renderer->mask, &renderer->composite_rectangles);
    1.69 +     return CAIRO_STATUS_SUCCESS;
    1.70 + }
    1.71 + 
    1.72 +diff --git a/gfx/cairo/cairo/src/cairo-tor-scan-converter.c b/gfx/cairo/cairo/src/cairo-tor-scan-converter.c
    1.73 +--- a/gfx/cairo/cairo/src/cairo-tor-scan-converter.c
    1.74 ++++ b/gfx/cairo/cairo/src/cairo-tor-scan-converter.c
    1.75 +@@ -295,9 +295,9 @@ typedef int grid_area_t;
    1.76 + #elif GRID_XY == 15
    1.77 + #  define  GRID_AREA_TO_ALPHA(c)  (((c) << 4) + (c))
    1.78 + #elif GRID_XY == 2*256*15
    1.79 +-#  define  GRID_AREA_TO_ALPHA(c)  (((c) + ((c)<<4)) >> 9)
    1.80 ++#  define  GRID_AREA_TO_ALPHA(c)  (((c) + ((c)<<4) + 256) >> 9)
    1.81 + #else
    1.82 +-#  define  GRID_AREA_TO_ALPHA(c)  ((c)*255 / GRID_XY) /* tweak me for rounding */
    1.83 ++#  define  GRID_AREA_TO_ALPHA(c)  (((c)*255 + GRID_XY/2) / GRID_XY)
    1.84 + #endif
    1.85 + 
    1.86 + #define UNROLL3(x) x x x
    1.87 +diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c
    1.88 +--- a/gfx/cairo/cairo/src/cairo-win32-surface.c
    1.89 ++++ b/gfx/cairo/cairo/src/cairo-win32-surface.c
    1.90 +@@ -2048,6 +2048,148 @@ _cairo_win32_surface_reset (void *abstra
    1.91 +     return CAIRO_STATUS_SUCCESS;
    1.92 + }
    1.93 + 
    1.94 ++typedef struct _cairo_win32_surface_span_renderer {
    1.95 ++    cairo_span_renderer_t base;
    1.96 ++
    1.97 ++    cairo_operator_t op;
    1.98 ++    const cairo_pattern_t *pattern;
    1.99 ++    cairo_antialias_t antialias;
   1.100 ++
   1.101 ++    cairo_image_surface_t *mask;
   1.102 ++    cairo_win32_surface_t *dst;
   1.103 ++
   1.104 ++    cairo_composite_rectangles_t composite_rectangles;
   1.105 ++} cairo_win32_surface_span_renderer_t;
   1.106 ++
   1.107 ++static cairo_status_t
   1.108 ++_cairo_win32_surface_span_renderer_render_row (
   1.109 ++    void				*abstract_renderer,
   1.110 ++    int					 y,
   1.111 ++    const cairo_half_open_span_t	*spans,
   1.112 ++    unsigned				 num_spans)
   1.113 ++{
   1.114 ++    cairo_win32_surface_span_renderer_t *renderer = abstract_renderer;
   1.115 ++    _cairo_image_surface_span_render_row (y, spans, num_spans, renderer->mask, &renderer->composite_rectangles);
   1.116 ++    return CAIRO_STATUS_SUCCESS;
   1.117 ++}
   1.118 ++
   1.119 ++static void
   1.120 ++_cairo_win32_surface_span_renderer_destroy (void *abstract_renderer)
   1.121 ++{
   1.122 ++    cairo_win32_surface_span_renderer_t *renderer = abstract_renderer;
   1.123 ++    if (!renderer) return;
   1.124 ++
   1.125 ++    if (renderer->mask != NULL)
   1.126 ++	cairo_surface_destroy (&renderer->mask->base);
   1.127 ++
   1.128 ++    free (renderer);
   1.129 ++}
   1.130 ++
   1.131 ++static cairo_status_t
   1.132 ++_cairo_win32_surface_span_renderer_finish (void *abstract_renderer)
   1.133 ++{
   1.134 ++    cairo_win32_surface_span_renderer_t *renderer = abstract_renderer;
   1.135 ++    cairo_status_t status = CAIRO_STATUS_SUCCESS;
   1.136 ++
   1.137 ++    if (renderer->pattern == NULL || renderer->mask == NULL)
   1.138 ++	return CAIRO_STATUS_SUCCESS;
   1.139 ++
   1.140 ++    status = cairo_surface_status (&renderer->mask->base);
   1.141 ++    if (status == CAIRO_STATUS_SUCCESS) {
   1.142 ++	cairo_composite_rectangles_t *rects = &renderer->composite_rectangles;
   1.143 ++	cairo_win32_surface_t *dst = renderer->dst;
   1.144 ++	cairo_pattern_t *mask_pattern = cairo_pattern_create_for_surface (&renderer->mask->base);
   1.145 ++	/* composite onto the image surface directly if we can */
   1.146 ++	if (dst->image) {
   1.147 ++	    GdiFlush();
   1.148 ++
   1.149 ++	    status = dst->image->backend->composite (renderer->op,
   1.150 ++		    renderer->pattern, mask_pattern, dst->image,
   1.151 ++		    rects->src.x,
   1.152 ++		    rects->src.y,
   1.153 ++		    0, 0,		/* mask.x, mask.y */
   1.154 ++		    rects->dst.x, rects->dst.y,
   1.155 ++		    rects->width, rects->height);
   1.156 ++	} else {
   1.157 ++	    /* otherwise go through the fallback_composite path which
   1.158 ++	     * will do the appropriate surface acquisition */
   1.159 ++	    status = _cairo_surface_fallback_composite (
   1.160 ++		    renderer->op,
   1.161 ++		    renderer->pattern, mask_pattern, dst,
   1.162 ++		    rects->src.x,
   1.163 ++		    rects->src.y,
   1.164 ++		    0, 0,		/* mask.x, mask.y */
   1.165 ++		    rects->dst.x, rects->dst.y,
   1.166 ++		    rects->width, rects->height);
   1.167 ++	}
   1.168 ++	cairo_pattern_destroy (mask_pattern);
   1.169 ++
   1.170 ++    }
   1.171 ++    if (status != CAIRO_STATUS_SUCCESS)
   1.172 ++	return _cairo_span_renderer_set_error (abstract_renderer,
   1.173 ++					       status);
   1.174 ++    return CAIRO_STATUS_SUCCESS;
   1.175 ++}
   1.176 ++
   1.177 ++static cairo_bool_t
   1.178 ++_cairo_win32_surface_check_span_renderer (cairo_operator_t	  op,
   1.179 ++					  const cairo_pattern_t  *pattern,
   1.180 ++					  void			 *abstract_dst,
   1.181 ++					  cairo_antialias_t	  antialias,
   1.182 ++					  const cairo_composite_rectangles_t *rects)
   1.183 ++{
   1.184 ++    (void) op;
   1.185 ++    (void) pattern;
   1.186 ++    (void) abstract_dst;
   1.187 ++    (void) antialias;
   1.188 ++    (void) rects;
   1.189 ++    return TRUE;
   1.190 ++}
   1.191 ++
   1.192 ++static cairo_span_renderer_t *
   1.193 ++_cairo_win32_surface_create_span_renderer (cairo_operator_t	 op,
   1.194 ++					   const cairo_pattern_t  *pattern,
   1.195 ++					   void			*abstract_dst,
   1.196 ++					   cairo_antialias_t	 antialias,
   1.197 ++					   const cairo_composite_rectangles_t *rects)
   1.198 ++{
   1.199 ++    cairo_win32_surface_t *dst = abstract_dst;
   1.200 ++    cairo_win32_surface_span_renderer_t *renderer
   1.201 ++	= calloc(1, sizeof(*renderer));
   1.202 ++    cairo_status_t status;
   1.203 ++    int width = rects->width;
   1.204 ++    int height = rects->height;
   1.205 ++
   1.206 ++    if (renderer == NULL)
   1.207 ++	return _cairo_span_renderer_create_in_error (CAIRO_STATUS_NO_MEMORY);
   1.208 ++
   1.209 ++    renderer->base.destroy = _cairo_win32_surface_span_renderer_destroy;
   1.210 ++    renderer->base.finish = _cairo_win32_surface_span_renderer_finish;
   1.211 ++    renderer->base.render_row =
   1.212 ++	_cairo_win32_surface_span_renderer_render_row;
   1.213 ++    renderer->op = op;
   1.214 ++    renderer->pattern = pattern;
   1.215 ++    renderer->antialias = antialias;
   1.216 ++    renderer->dst = dst;
   1.217 ++
   1.218 ++    renderer->composite_rectangles = *rects;
   1.219 ++
   1.220 ++    /* TODO: support rendering to A1 surfaces (or: go add span
   1.221 ++     * compositing to pixman.) */
   1.222 ++    renderer->mask = (cairo_image_surface_t *)
   1.223 ++	cairo_image_surface_create (CAIRO_FORMAT_A8,
   1.224 ++				    width, height);
   1.225 ++
   1.226 ++    status = cairo_surface_status (&renderer->mask->base);
   1.227 ++
   1.228 ++    if (status != CAIRO_STATUS_SUCCESS) {
   1.229 ++	_cairo_win32_surface_span_renderer_destroy (renderer);
   1.230 ++	return _cairo_span_renderer_create_in_error (status);
   1.231 ++    }
   1.232 ++    return &renderer->base;
   1.233 ++}
   1.234 ++
   1.235 ++
   1.236 + static const cairo_surface_backend_t cairo_win32_surface_backend = {
   1.237 +     CAIRO_SURFACE_TYPE_WIN32,
   1.238 +     _cairo_win32_surface_create_similar,
   1.239 +@@ -2060,8 +2202,8 @@ static const cairo_surface_backend_t cai
   1.240 +     _cairo_win32_surface_composite,
   1.241 +     _cairo_win32_surface_fill_rectangles,
   1.242 +     NULL, /* composite_trapezoids */
   1.243 +-    NULL, /* create_span_renderer */
   1.244 +-    NULL, /* check_span_renderer */
   1.245 ++    _cairo_win32_surface_create_span_renderer,
   1.246 ++    _cairo_win32_surface_check_span_renderer,
   1.247 +     NULL, /* copy_page */
   1.248 +     NULL, /* show_page */
   1.249 +     _cairo_win32_surface_set_clip_region,
   1.250 +diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h
   1.251 +--- a/gfx/cairo/cairo/src/cairoint.h
   1.252 ++++ b/gfx/cairo/cairo/src/cairoint.h
   1.253 +@@ -2193,6 +2193,12 @@ _cairo_image_surface_set_clip_region (vo
   1.254 + cairo_private cairo_image_surface_t *
   1.255 + _cairo_image_surface_coerce (cairo_image_surface_t	*surface,
   1.256 + 			     cairo_format_t		 format);
   1.257 ++cairo_private void
   1.258 ++_cairo_image_surface_span_render_row (int				 y,
   1.259 ++				      const cairo_half_open_span_t	 *spans,
   1.260 ++				      unsigned				 num_spans,
   1.261 ++				      cairo_image_surface_t              *mask,
   1.262 ++				      const cairo_composite_rectangles_t *rects);
   1.263 + 
   1.264 + cairo_private cairo_image_transparency_t
   1.265 + _cairo_image_analyze_transparency (cairo_image_surface_t      *image);

mercurial