diff options
author | Caleb Michael Moore <cmoore@src.gnome.org> | 2005-10-12 15:50:00 +0000 |
---|---|---|
committer | Caleb Michael Moore <cmoore@src.gnome.org> | 2005-10-12 15:50:00 +0000 |
commit | 5b0807b866c1c2c1a49a91f2d31664bf943d17e2 (patch) | |
tree | ac10152c0d276025e055e5e344f4c11f55385d34 /rsvg-cairo-draw.c | |
parent | a00dea214d04889ca8717a85de9dbecb65ea3eac (diff) | |
download | librsvg-5b0807b866c1c2c1a49a91f2d31664bf943d17e2.tar.gz |
mask efficiency improvement
Diffstat (limited to 'rsvg-cairo-draw.c')
-rw-r--r-- | rsvg-cairo-draw.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/rsvg-cairo-draw.c b/rsvg-cairo-draw.c index 38327484..ba292ffe 100644 --- a/rsvg-cairo-draw.c +++ b/rsvg-cairo-draw.c @@ -589,11 +589,11 @@ static cairo_surface_t * rsvg_cairo_generate_mask(RsvgMask * self, RsvgDrawingCtx *ctx, RsvgCairoBbox * bbox) { - cairo_surface_t *surface, *mask; + cairo_surface_t *surface; cairo_t *mask_cr, *save_cr; RsvgCairoRender *render = (RsvgCairoRender *)ctx->render; RsvgState *state = rsvg_state_current(ctx); - guint8 * pixels, *mpixels; + guint8 * pixels; guint32 width = render->width, height = render->height; guint32 rowstride = width * 4, row, i; double affinesave[6]; @@ -603,16 +603,8 @@ rsvg_cairo_generate_mask(RsvgMask * self, RsvgDrawingCtx *ctx, CAIRO_FORMAT_ARGB32, width, height, rowstride); - /* Originally this was CAIRO_FORMAT_A8, but for some reason it wouldnt - work as a mask over the CAIRO_FORMAT_ARGB32. Is this a bug in cairo?*/ - mpixels = g_new(guint8, rowstride * height); - mask = cairo_image_surface_create_for_data (mpixels, - CAIRO_FORMAT_ARGB32, - width, height, - rowstride); mask_cr = cairo_create (surface); - cairo_surface_destroy (surface); save_cr = render->cr; render->cr = mask_cr; @@ -656,20 +648,18 @@ rsvg_cairo_generate_mask(RsvgMask * self, RsvgDrawingCtx *ctx, for(row = 0; row < height; row++) { guint8 *row_data = (pixels + (row * rowstride)); - guint8 *out_data = (mpixels + (row * rowstride)); for(i = 0; i < width; i++) { guint32 *pixel = (guint32 *)row_data + i; - guint32 *out = (guint32 *)out_data + i; - *out = ((((*pixel & 0x00ff0000) >> 16) * 13817 + - ((*pixel & 0x0000ff00) >> 8) * 46518 + - ((*pixel & 0x000000ff) ) * 4688) * - state->opacity); + *pixel = ((((*pixel & 0x00ff0000) >> 16) * 13817 + + ((*pixel & 0x0000ff00) >> 8) * 46518 + + ((*pixel & 0x000000ff) ) * 4688) * + state->opacity); } } cairo_destroy (mask_cr); - return mask; + return surface; } static void |