[webkit-reviews] review denied: [Bug 47174] Moving all bounding box related calculation to RenderSVGResourceFilterPrimitive : [Attachment 69780] patch

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Thu Oct 7 00:05:29 PDT 2010


Dirk Schulze <krit at webkit.org> has denied Zoltan Herczeg
<zherczeg at webkit.org>'s request for review:
Bug 47174: Moving all bounding box related calculation to
RenderSVGResourceFilterPrimitive
https://bugs.webkit.org/show_bug.cgi?id=47174

Attachment 69780: patch
https://bugs.webkit.org/attachment.cgi?id=69780&action=review

------- Additional Comments from Dirk Schulze <krit at webkit.org>
View in context: https://bugs.webkit.org/attachment.cgi?id=69780&action=review

Good start. But you still forgot some of the things we spoke of, like
calculating the subregions in buildPrimitives and not to make the functions in
RenderSVGResourceFilterPrimitives static.

> WebCore/platform/graphics/filters/Filter.h:50
>	   virtual bool effectBoundingBoxMode() const = 0;

Do we still need this function?

> WebCore/rendering/RenderSVGResourceFilter.cpp:200
> +    FloatRect subRegion = lastEffect->repaintRectInLocalCoordinates();
>      // At least one FilterEffect has a too big image size,
>      // recalculate the effect sizes with new scale factors.
> -    if (!fitsInMaximumImageSize(filterData->filter->maxImageSize(), scale))
{
> +    if (!fitsInMaximumImageSize(subRegion.size(), scale)) {

Interesting, sound like a good idea to take repaintRectInLocalCoordinates
(alias absolutePaintRect). But please name the variable paintRect.

> WebCore/rendering/RenderSVGResourceFilter.cpp:202
> +	  
RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(lastEffect,
filterData->filter.get());

We already talked about it on IRC. I wouldn't make this static. Its better to
manage it in the class.

> WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp:47
> +    if (effect->isSourceInput()) {
> +	   // For SourceAlpha and SourceGraphic
> +	   FloatRect clippedSourceRect = filter->sourceImageRect();
> +	   if (filter->sourceImageRect().x() < filter->filterRegion().x())
> +	       clippedSourceRect.setX(filter->filterRegion().x());
> +	   if (filter->sourceImageRect().y() < filter->filterRegion().y())
> +	       clippedSourceRect.setY(filter->filterRegion().y());
> +	   effect->setFilterPrimitiveSubregion(clippedSourceRect);
> +	   clippedSourceRect.scale(filter->filterResolution().width(),
filter->filterResolution().height());
> +	   effect->setRepaintRectInLocalCoordinates(clippedSourceRect);
> +	   return filter->filterRegion();
> +    }

This isn't needed anymore

> WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp:64
> +    if (!effect->isTile()) {
> +	   // FETurbulence, FEImage and FEFlood don't have input effects, take
the filter region as unite rect.
> +	   if (unsigned numberOfInputEffects = effect->inputEffects().size()) {

> +	       for (unsigned i = 0; i < numberOfInputEffects; ++i)
> +		  
uniteRect.unite(determineFilterPrimitiveSubregion(effect->inputEffect(i),
filter));
> +	   } else
> +	       uniteRect = filter->filterRegion();
> +    }
> +    else {
> +	   determineFilterPrimitiveSubregion(effect->inputEffect(0), filter);
> +	   uniteRect = filter->filterRegion();
> +    }

Maybe we should move this to an inline

> WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp:95
> +    if (filter->effectBoundingBoxMode()) {
> +	   newSubRegion = uniteRect;
> +	   // Avoid the calling of a virtual method several times.
> +	   FloatRect targetBoundingBox = filter->sourceImageRect();
> +
> +	   if (effect->hasX())
> +	       newSubRegion.setX(targetBoundingBox.x() +
subRegionBoundingBox.x() * targetBoundingBox.width());
> +
> +	  if (effect->hasY())
> +	       newSubRegion.setY(targetBoundingBox.y() +
subRegionBoundingBox.y() * targetBoundingBox.height());
> +
> +	   if (effect->hasWidth())
> +	       newSubRegion.setWidth(subRegionBoundingBox.width() *
targetBoundingBox.width());
> +
> +	   if (effect->hasHeight())
> +	       newSubRegion.setHeight(subRegionBoundingBox.height() *
targetBoundingBox.height());
> +    } else {
> +	   if (!effect->hasX())
> +	       newSubRegion.setX(uniteRect.x());
> +
> +	   if (!effect->hasY())
> +	       newSubRegion.setY(uniteRect.y());
> +
> +	   if (!effect->hasWidth())
> +	       newSubRegion.setWidth(uniteRect.width());
> +
> +	   if (!effect->hasHeight())
> +	       newSubRegion.setHeight(uniteRect.height());
> +    }
> +

We really don't want the effects to store hasX, hasY and so on anymore. You can
ask your node() directly now.

> WebCore/rendering/RenderSVGResourceFilterPrimitive.cpp:105
> +    FloatRect scaledSubRegion(newSubRegion);
> +    scaledSubRegion.scale(filter->filterResolution().width(),
filter->filterResolution().height());
> +    effect->setRepaintRectInLocalCoordinates(scaledSubRegion);
> +    return newSubRegion;
>  }

I already begun to give the variables better name. Maybe you can continue this
here.

> WebCore/rendering/RenderSVGResourceFilterPrimitive.h:43
> +    RenderSVGResourceFilterPrimitive(SVGFilterPrimitiveStandardAttributes*
filterPrimitiveElement)
> +	   : RenderSVGHiddenContainer(filterPrimitiveElement)
> +    {
> +    }
> +

I would move the ctor to the cpp. Looks more like the other classes. Not sure
if we have a style rule for it yet. But still..

> WebCore/rendering/RenderSVGResourceFilterPrimitive.h:46
> +    static FloatRect determineFilterPrimitiveSubregion(FilterEffect* effect,
Filter* filter);

hm...


More information about the webkit-reviews mailing list