diff options
Diffstat (limited to 'WebCore/rendering/RenderSVGResourceFilter.cpp')
-rw-r--r-- | WebCore/rendering/RenderSVGResourceFilter.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/WebCore/rendering/RenderSVGResourceFilter.cpp b/WebCore/rendering/RenderSVGResourceFilter.cpp index 50cf68e..38d2357 100644 --- a/WebCore/rendering/RenderSVGResourceFilter.cpp +++ b/WebCore/rendering/RenderSVGResourceFilter.cpp @@ -88,13 +88,13 @@ void RenderSVGResourceFilter::removeClientFromCache(RenderObject* client, bool m markClientForInvalidation(client, markForInvalidation ? BoundariesInvalidation : ParentOnlyInvalidation); } -PassRefPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives() +PassRefPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives(Filter* filter) { SVGFilterElement* filterElement = static_cast<SVGFilterElement*>(node()); bool primitiveBoundingBoxMode = filterElement->primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; // Add effects to the builder - RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(); + RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(filter); for (Node* node = filterElement->firstChild(); node; node = node->nextSibling()) { if (!node->isSVGElement()) continue; @@ -104,7 +104,7 @@ PassRefPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives() continue; SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(element); - RefPtr<FilterEffect> effect = effectElement->build(builder.get()); + RefPtr<FilterEffect> effect = effectElement->build(builder.get(), filter); if (!effect) { builder->clearEffects(); return 0; @@ -179,7 +179,7 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*, filterData->filter = SVGFilter::create(filterData->shearFreeAbsoluteTransform, absoluteDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBoundingBoxMode); // Create all relevant filter primitives. - filterData->builder = buildPrimitives(); + filterData->builder = buildPrimitives(filterData->filter.get()); if (!filterData->builder) return false; @@ -227,8 +227,12 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*, absoluteDrawingRegion.scale(scale.width(), scale.height()); OwnPtr<ImageBuffer> sourceGraphic; - if (!SVGImageBufferTools::createImageBuffer(absoluteDrawingRegion, absoluteDrawingRegion, sourceGraphic, ColorSpaceLinearRGB)) + if (!SVGImageBufferTools::createImageBuffer(absoluteDrawingRegion, absoluteDrawingRegion, sourceGraphic, ColorSpaceLinearRGB)) { + ASSERT(!m_filter.contains(object)); + filterData->savedContext = context; + m_filter.set(object, filterData.leakPtr()); return false; + } GraphicsContext* sourceGraphicContext = sourceGraphic->context(); ASSERT(sourceGraphicContext); @@ -250,7 +254,7 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*, return true; } -void RenderSVGResourceFilter::postApplyResource(RenderObject* object, GraphicsContext*& context, unsigned short resourceMode) +void RenderSVGResourceFilter::postApplyResource(RenderObject* object, GraphicsContext*& context, unsigned short resourceMode, const Path*) { ASSERT(object); ASSERT(context); @@ -286,7 +290,7 @@ void RenderSVGResourceFilter::postApplyResource(RenderObject* object, GraphicsCo // second drawing. if (!filterData->builded) { filterData->filter->setSourceImage(filterData->sourceGraphicBuffer.release()); - lastEffect->apply(filterData->filter.get()); + lastEffect->apply(); #if !PLATFORM(CG) ImageBuffer* resultImage = lastEffect->resultImage(); if (resultImage) |