bool FilterEffectRenderer::updateBackingStoreRect(const FloatRect& filterRect) { if (!filterRect.isZero() && isFilterSizeValid(filterRect)) { FloatRect currentSourceRect = sourceImageRect(); if (filterRect != currentSourceRect) { setSourceImageRect(filterRect); return true; } } return false; }
void FilterEffectRenderer::updateBackingStoreRect(const FloatRect& floatFilterRect) { IntRect filterRect = enclosingIntRect(floatFilterRect); if (!filterRect.isEmpty() && FilterEffect::isFilterSizeValid(filterRect)) { FloatRect currentSourceRect = sourceImageRect(); if (filterRect != currentSourceRect) { setSourceImageRect(filterRect); return; } } }
PassRefPtr<FilterEffect> FilterEffectRenderer::buildReferenceFilter(RenderObject* renderer, PassRefPtr<FilterEffect> previousEffect, ReferenceFilterOperation* filterOperation) { if (!renderer) return 0; Document* document = renderer->document(); ASSERT(document); CachedSVGDocumentReference* cachedSVGDocumentReference = filterOperation->cachedSVGDocumentReference(); CachedDocument* cachedSVGDocument = cachedSVGDocumentReference ? cachedSVGDocumentReference->document() : 0; // If we have an SVG document, this is an external reference. Otherwise // we look up the referenced node in the current document. if (cachedSVGDocument) document = cachedSVGDocument->document(); if (!document) return 0; Element* filter = document->getElementById(filterOperation->fragment()); if (!filter) { // Although we did not find the referenced filter, it might exist later // in the document document->accessSVGExtensions()->addPendingResource(filterOperation->fragment(), toElement(renderer->node())); return 0; } if (!filter->isSVGElement() || !filter->hasTagName(SVGNames::filterTag)) return 0; SVGFilterElement* filterElement = toSVGFilterElement(toSVGElement(filter)); RefPtr<FilterEffect> effect; // FIXME: Figure out what to do with SourceAlpha. Right now, we're // using the alpha of the original input layer, which is obviously // wrong. We should probably be extracting the alpha from the // previousEffect, but this requires some more processing. // This may need a spec clarification. RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(previousEffect, SourceAlpha::create(this)); for (Node* node = filterElement->firstChild(); node; node = node->nextSibling()) { if (!node->isSVGElement()) continue; SVGElement* element = toSVGElement(node); if (!element->isFilterEffect()) continue; SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(element); effect = effectElement->build(builder.get(), this); if (!effect) continue; effectElement->setStandardAttributes(effect.get()); effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(effectElement, filterElement->primitiveUnits(), sourceImageRect())); builder->add(effectElement->result(), effect); m_effects.append(effect); } return effect; }