[webkit-reviews] review granted: [Bug 30960] [CAIRO] shadow support for Canvas and SVG : [Attachment 43089] Update patch for Simon Fraser and Eric Seidel's comments.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Thu Nov 12 15:22:11 PST 2009


Simon Fraser (smfr) <simon.fraser at apple.com> has granted Brent Fulgham
<bfulgham at webkit.org>'s request for review:
Bug 30960: [CAIRO] shadow support for Canvas and SVG
https://bugs.webkit.org/show_bug.cgi?id=30960

Attachment 43089: Update patch for Simon Fraser and Eric Seidel's comments.
https://bugs.webkit.org/attachment.cgi?id=43089&action=review

------- Additional Comments from Simon Fraser (smfr) <simon.fraser at apple.com>
> Index: WebCore/GNUmakefile.am
> ===================================================================
> --- WebCore/GNUmakefile.am	(revision 50863)
> +++ WebCore/GNUmakefile.am	(working copy)
> @@ -2625,6 +2625,8 @@ webcore_sources += \
>	WebCore/platform/graphics/filters/Filter.h \
>	WebCore/platform/graphics/filters/FilterEffect.cpp \
>	WebCore/platform/graphics/filters/FilterEffect.h \
> +	WebCore/platform/graphics/filters/GraphicsContextFilter.cpp \
> +	WebCore/platform/graphics/filters/GraphicsContextFilter.h \

Stale file names.

Should you add ImageBufferFilter to the xcode project as well? It seems
generally useful.

> Index: WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp
> ===================================================================


> +	   Color fillColor = colorWithOverrideAlpha(context->fillColor().rgb(),
context->fillColor().alpha() / 255.f * gcp->state.globalAlpha);

If alpha() returns a float no need to make the 255 literal a float; the
compiler will promote it.

> +static inline void drawPathShadow(GraphicsContext* context,
GraphicsContextPrivate* gcp, bool fillShadow, bool strokeShadow)
> +{
> +#if ENABLE(FILTERS)
> +    IntSize shadowSize;
> +    int shadowBlur;
> +    Color shadowColor;
> +    if (context->getShadow(shadowSize, shadowBlur, shadowColor)) {
> +	   //calculate filter values
> +	   cairo_t* cr = context->platformContext();
> +	   cairo_path_t* path = cairo_copy_path(cr);
> +	   double x0, x1, y0, y1;
> +	   cairo_stroke_extents(cr, &x0, &y0, &x1, &y1);
> +	   FloatRect rect(x0, y0, x1 - x0, y1 - y0);
> +
> +	   IntSize shadowBufferSize;
> +	   FloatRect shadowRect;
> +	   float kernelSize (0.0);
> +	   GraphicsContext::calculateShadowBufferDimensions(shadowBufferSize,
shadowRect, kernelSize, rect, shadowSize, shadowBlur);
> +
> +	   // create suitably-sized ImageBuffer to hold the shadow
> +	   OwnPtr<ImageBuffer> shadowBuffer =
ImageBuffer::create(shadowBufferSize);
> +
> +	   //draw shadow into a new ImageBuffer
> +	   cairo_t* shadowContext = shadowBuffer->context()->platformContext();

> +	   copyContextProperties(cr, shadowContext);
> +	   cairo_translate(shadowContext, -rect.x() + kernelSize, -rect.y() +
kernelSize);
> +	   cairo_new_path(shadowContext);
> +	   cairo_append_path(shadowContext, path);
> +
> +	   if (fillShadow)
> +	       setPlatformFill(context, shadowContext, gcp);
> +	   if (strokeShadow)
> +	       setPlatformStroke(context, shadowContext, gcp);
> +
> +	   context->createPlatformShadow(shadowBuffer.release(), shadowColor,
shadowRect, kernelSize);
> +    }

This would be cleaner with an early return.

> -void GraphicsContext::setPlatformShadow(IntSize const&, int, Color const&,
ColorSpace)
> +void GraphicsContext::setPlatformShadow(IntSize const& size, int, Color
const&, ColorSpace)
>  {
> -    notImplemented();
> +    // Cairo doesn't support shadows natively, they are drawn manually in
the draw*
> +    // functions
> +
> +    if (m_common->state.shadowsIgnoreTransforms) {
> +	   // Meaning that this graphics context is associated with a
CanvasRenderingContext

For now, but what if this changes? We may decide that shadows ignore CSS
transforms at some point.

> Index: WebCore/platform/graphics/cairo/ImageCairo.cpp
> ===================================================================
> --- WebCore/platform/graphics/cairo/ImageCairo.cpp	(revision 50863)
> +++ WebCore/platform/graphics/cairo/ImageCairo.cpp	(working copy)
> @@ -132,6 +132,30 @@ void BitmapImage::draw(GraphicsContext* 
>      cairo_matrix_t matrix = { scaleX, 0, 0, scaleY, srcRect.x(), srcRect.y()
};
>      cairo_pattern_set_matrix(pattern, &matrix);
>  
> +    // Draw the shadow
> +#if ENABLE(FILTERS)
> +    IntSize shadowSize;
> +    int shadowBlur;
> +    Color shadowColor;
> +    if (context->getShadow(shadowSize, shadowBlur, shadowColor)) {
> +	   IntSize shadowBufferSize;
> +	   FloatRect shadowRect;
> +	   float kernelSize (0.0);
> +	   GraphicsContext::calculateShadowBufferDimensions(shadowBufferSize,
shadowRect, kernelSize, dstRect, shadowSize, shadowBlur);
> +	   shadowColor = colorWithOverrideAlpha(shadowColor.rgb(),
(shadowColor.alpha() *	context->getAlpha()) / 255.f);
> +
> +	   //draw shadow into a new ImageBuffer
> +	   OwnPtr<ImageBuffer> shadowBuffer =
ImageBuffer::create(shadowBufferSize);
> +	   cairo_t* shadowContext = shadowBuffer->context()->platformContext();

> +	   cairo_set_source(shadowContext, pattern);
> +	   cairo_translate(shadowContext, -dstRect.x(), -dstRect.y());
> +	   cairo_rectangle(shadowContext, 0, 0, dstRect.width(),
dstRect.height());
> +	   cairo_fill(shadowContext);
> +
> +	   context->createPlatformShadow(shadowBuffer.release(), shadowColor,
shadowRect, kernelSize);
> +    }
> +#endif
> +
>      // Draw the image.
>      cairo_translate(cr, dstRect.x(), dstRect.y());
>      cairo_set_source(cr, pattern);
> Index: WebCore/platform/graphics/filters/Filter.h
> ===================================================================

>	   // SVG specific
> +	   virtual void calculateEffectSubRegion(FilterEffect*) const = 0;

It's not clear why this can be const. Does it change state in |this|, or the
filter effect?

> +	   virtual bool effectBoundingBoxMode() const = 0;

I can't figure out what this means from the signature. Bool return? Not your
fault, but it seems like this needs an enum for the return value.

> Index: WebCore/platform/graphics/filters/ImageBufferFilter.h
> ===================================================================

> +namespace WebCore {
> +
> +    class ImageBufferFilter : public Filter {

We don't generally indent for namespaces.


More information about the webkit-reviews mailing list