From 4e9269cc34b0895ac6d3f99aabba3d6288295d76 Mon Sep 17 00:00:00 2001 From: Hussein Jafferjee Date: Wed, 14 Oct 2015 15:22:09 -0700 Subject: [PATCH] implement blur on images (drawImage) --- src/CanvasRenderingContext2d.cc | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index 5736ef4..8fc1056 100755 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -883,10 +883,29 @@ NAN_METHOD(Context2d::DrawImage) { } if (context->hasShadow()) { - context->setSourceRGBA(context->state->shadow); - cairo_mask_surface(ctx, surface, - dx - sx + context->state->shadowOffsetX, - dy - sy + context->state->shadowOffsetY); + if(context->state->shadowBlur) { + // we need to create a new surface in order to blur + int pad = context->state->shadowBlur * 2; + cairo_surface_t *shadow_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, dw + 2 * pad, dh + 2 * pad); + cairo_t *shadow_context = cairo_create(shadow_surface); + + // mask and blur + context->setSourceRGBA(shadow_context, context->state->shadow); + cairo_mask_surface(shadow_context, surface, pad, pad); + context->blur(shadow_surface, context->state->shadowBlur / 2); + + // paint + // @todo figure out where the 1.15 comes from + cairo_set_source_surface(ctx, shadow_surface, + dx - sx + context->state->shadowOffsetX - pad + 1.15, + dx - sx + context->state->shadowOffsetY - pad + 1.15); + cairo_paint(ctx); + } else { + context->setSourceRGBA(context->state->shadow); + cairo_mask_surface(ctx, surface, + dx - sx + context->state->shadowOffsetX, + dy - sy + context->state->shadowOffsetY); + } } context->savePath();