Chromium Code Reviews| 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) |