Пример #1
0
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;
                }
            }
        }
    }
}