void SVGFilterElement::setFilterRes(unsigned x, unsigned y) { filterResX()->baseValue()->setValue(x); filterResY()->baseValue()->setValue(y); invalidateSVGAttributes(); svgAttributeChanged(SVGNames::filterResAttr); }
void SVGFilterElement::buildFilter(const FloatRect& targetRect) const { bool filterBBoxMode = filterUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; bool primitiveBBoxMode = primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; FloatRect filterBBox; if (filterBBoxMode) filterBBox = FloatRect(x().valueAsPercentage(), y().valueAsPercentage(), width().valueAsPercentage(), height().valueAsPercentage()); else filterBBox = FloatRect(x().value(this), y().value(this), width().value(this), height().value(this)); FloatRect filterRect = filterBBox; if (filterBBoxMode) filterRect = FloatRect(targetRect.x() + filterRect.x() * targetRect.width(), targetRect.y() + filterRect.y() * targetRect.height(), filterRect.width() * targetRect.width(), filterRect.height() * targetRect.height()); m_filter->setFilterBoundingBox(filterRect); m_filter->setFilterRect(filterBBox); m_filter->setEffectBoundingBoxMode(primitiveBBoxMode); m_filter->setFilterBoundingBoxMode(filterBBoxMode); if (hasAttribute(SVGNames::filterResAttr)) { m_filter->setHasFilterResolution(true); m_filter->setFilterResolution(FloatSize(filterResX(), filterResY())); } // Add effects to the filter m_filter->builder()->clearEffects(); for (Node* n = firstChild(); n != 0; n = n->nextSibling()) { SVGElement* element = 0; if (n->isSVGElement()) { element = static_cast<SVGElement*>(n); if (element->isFilterEffect()) { SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(element); if (!effectElement->build(m_filter.get())) { m_filter->builder()->clearEffects(); break; } } } } }