Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1120)

Unified Diff: Source/core/rendering/svg/RenderSVGResourceFilter.cpp

Issue 500233002: First pass at ripping out non-deferred SVG filter path. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Update to ToT Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/svg/RenderSVGResourceFilter.cpp
diff --git a/Source/core/rendering/svg/RenderSVGResourceFilter.cpp b/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
index ea938d175959279c1c2f50df0db8ec02ab3eb351..4b6f58dc2a8f19795abf057b9216e4c37fc53703 100644
--- a/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
+++ b/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
@@ -69,12 +69,8 @@ void RenderSVGResourceFilter::removeClientFromCache(RenderObject* client, bool m
{
ASSERT(client);
- if (FilterData* filterData = m_filter.get(client)) {
- if (filterData->savedContext)
- filterData->state = FilterData::MarkedForRemoval;
f(malita) 2014/09/23 21:54:54 I believe this was the only setter for MarkedForRe
- else
- m_filter.remove(client);
- }
+ if (m_filter.get(client))
+ m_filter.remove(client);
f(malita) 2014/09/23 21:54:54 We can drop the conditional and just remove() to a
Stephen White 2014/09/23 22:01:59 Done.
markClientForInvalidation(client, markForInvalidation ? BoundariesInvalidation : ParentOnlyInvalidation);
}
@@ -106,43 +102,6 @@ PassRefPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives(SVGFilter*
return builder.release();
}
-void RenderSVGResourceFilter::adjustScaleForMaximumImageSize(const FloatSize& size, FloatSize& filterScale)
-{
- FloatSize scaledSize(size);
- scaledSize.scale(filterScale.width(), filterScale.height());
- float scaledArea = scaledSize.width() * scaledSize.height();
-
- if (scaledArea <= FilterEffect::maxFilterArea())
- return;
-
- // If area of scaled size is bigger than the upper limit, adjust the scale
- // to fit.
- filterScale.scale(sqrt(FilterEffect::maxFilterArea() / scaledArea));
-}
-
-static bool createImageBuffer(const Filter* filter, OwnPtr<ImageBuffer>& imageBuffer)
-{
- IntRect paintRect = filter->sourceImageRect();
- // Don't create empty ImageBuffers.
- if (paintRect.isEmpty())
- return false;
-
- OwnPtr<ImageBufferSurface> surface = adoptPtr(new UnacceleratedImageBufferSurface(paintRect.size()));
- if (!surface->isValid())
- return false;
- OwnPtr<ImageBuffer> image = ImageBuffer::create(surface.release());
- if (!image)
- return false;
-
- GraphicsContext* imageContext = image->context();
- ASSERT(imageContext);
-
- imageContext->translate(-paintRect.x(), -paintRect.y());
- imageContext->concatCTM(filter->absoluteTransform());
- imageBuffer = image.release();
- return true;
-}
-
static void beginDeferredFilter(GraphicsContext* context, FilterData* filterData)
{
context->beginRecording(filterData->boundaries);
@@ -233,7 +192,6 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*,
clearInvalidationMask();
- bool deferredFiltersEnabled = object->document().settings()->deferredFiltersEnabled();
if (m_filter.contains(object)) {
FilterData* filterData = m_filter.get(object);
if (filterData->state == FilterData::PaintingSource || filterData->state == FilterData::Applying)
@@ -255,38 +213,13 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*,
if (!absoluteTransform.isInvertible())
return false;
- // Filters cannot handle a full transformation, only scales in each direction.
- FloatSize filterScale;
-
- // Calculate the scale factor for the filter.
- // Also see http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion
- if (filterElement->hasAttribute(SVGNames::filterResAttr)) {
- // If resolution is specified, scale to match it.
- filterScale = FloatSize(
- filterElement->filterResX()->currentValue()->value() / filterData->boundaries.width(),
- filterElement->filterResY()->currentValue()->value() / filterData->boundaries.height());
- } else {
- // Otherwise, use the scale of the absolute transform.
- filterScale = FloatSize(absoluteTransform.xScale(), absoluteTransform.yScale());
- }
- // The size of the scaled filter boundaries shouldn't be bigger than kMaxFilterSize.
- // Intermediate filters are limited by the filter boundaries so they can't be bigger than this.
- adjustScaleForMaximumImageSize(filterData->boundaries.size(), filterScale);
-
filterData->drawingRegion = object->strokeBoundingBox();
filterData->drawingRegion.intersect(filterData->boundaries);
- FloatRect absoluteDrawingRegion = filterData->drawingRegion;
- if (!deferredFiltersEnabled)
- absoluteDrawingRegion.scale(filterScale.width(), filterScale.height());
-
- IntRect intDrawingRegion = enclosingIntRect(absoluteDrawingRegion);
+ IntRect intDrawingRegion = enclosingIntRect(filterData->drawingRegion);
// Create the SVGFilter object.
bool primitiveBoundingBoxMode = filterElement->primitiveUnits()->currentValue()->enumValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
- filterData->shearFreeAbsoluteTransform = AffineTransform();
- if (!deferredFiltersEnabled)
- filterData->shearFreeAbsoluteTransform.scale(filterScale.width(), filterScale.height());
- filterData->filter = SVGFilter::create(filterData->shearFreeAbsoluteTransform, intDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBoundingBoxMode);
+ filterData->filter = SVGFilter::create(intDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBoundingBoxMode);
// Create all relevant filter primitives.
filterData->builder = buildPrimitives(filterData->filter.get());
@@ -299,41 +232,9 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*,
lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion);
- if (deferredFiltersEnabled) {
- FilterData* data = filterData.get();
- m_filter.set(object, filterData.release());
- beginDeferredFilter(context, data);
- return true;
- }
-
- // If the drawingRegion is empty, we have something like <g filter=".."/>.
- // Even if the target objectBoundingBox() is empty, we still have to draw the last effect result image in postApplyResource.
- if (filterData->drawingRegion.isEmpty()) {
- ASSERT(!m_filter.contains(object));
- filterData->savedContext = context;
- m_filter.set(object, filterData.release());
- return false;
- }
-
- OwnPtr<ImageBuffer> sourceGraphic;
- if (!createImageBuffer(filterData->filter.get(), sourceGraphic)) {
- ASSERT(!m_filter.contains(object));
- filterData->savedContext = context;
- m_filter.set(object, filterData.release());
- return false;
- }
-
- GraphicsContext* sourceGraphicContext = sourceGraphic->context();
- ASSERT(sourceGraphicContext);
-
- filterData->sourceGraphicBuffer = sourceGraphic.release();
- filterData->savedContext = context;
-
- context = sourceGraphicContext;
-
- ASSERT(!m_filter.contains(object));
+ FilterData* data = filterData.get();
m_filter.set(object, filterData.release());
-
+ beginDeferredFilter(context, data);
return true;
}
@@ -346,13 +247,7 @@ void RenderSVGResourceFilter::postApplyResource(RenderObject* object, GraphicsCo
if (!filterData)
return;
- bool deferredFiltersEnabled = object->document().settings()->deferredFiltersEnabled();
-
switch (filterData->state) {
- case FilterData::MarkedForRemoval:
- m_filter.remove(object);
- return;
-
case FilterData::CycleDetected:
case FilterData::Applying:
// We have a cycle if we are already applying the data.
@@ -363,52 +258,14 @@ void RenderSVGResourceFilter::postApplyResource(RenderObject* object, GraphicsCo
return;
case FilterData::PaintingSource:
- if (deferredFiltersEnabled) {
- endDeferredFilter(context, filterData);
- } else {
- if (!filterData->savedContext) {
- removeClientFromCache(object);
- return;
- }
-
- context = filterData->savedContext;
- filterData->savedContext = 0;
- }
+ endDeferredFilter(context, filterData);
break;
case FilterData::Built: { } // Empty
}
- if (deferredFiltersEnabled) {
- drawDeferredFilter(context, filterData, toSVGFilterElement(element()));
- filterData->state = FilterData::Built;
- return;
- }
-
- FilterEffect* lastEffect = filterData->builder->lastEffect();
-
- if (lastEffect && !filterData->boundaries.isEmpty() && !lastEffect->filterPrimitiveSubregion().isEmpty()) {
- // This is the real filtering of the object. It just needs to be called on the
- // initial filtering process. We just take the stored filter result on a
- // second drawing.
- if (filterData->state != FilterData::Built)
- filterData->filter->setSourceImage(filterData->sourceGraphicBuffer.release());
-
- // Always true if filterData is just built (filterData->state == FilterData::Built).
- if (!lastEffect->hasResult()) {
- filterData->state = FilterData::Applying;
- lastEffect->apply();
- lastEffect->correctFilterResultIfNeeded();
- lastEffect->transformResultColorSpace(ColorSpaceDeviceRGB);
- }
- filterData->state = FilterData::Built;
-
- ImageBuffer* resultImage = lastEffect->asImageBuffer();
- if (resultImage) {
- context->drawImageBuffer(resultImage, filterData->filter->mapAbsoluteRectToLocalRect(lastEffect->absolutePaintRect()));
- }
- }
- filterData->sourceGraphicBuffer.clear();
+ drawDeferredFilter(context, filterData, toSVGFilterElement(element()));
+ filterData->state = FilterData::Built;
}
FloatRect RenderSVGResourceFilter::resourceBoundingBox(const RenderObject* object)
« no previous file with comments | « Source/core/rendering/svg/RenderSVGResourceFilter.h ('k') | Source/core/rendering/svg/SVGRenderTreeAsText.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698