SVGResource* SVGFilterElement::canvasResource() { if (!attached()) return 0; if (!m_resourceFilter) m_resourceFilter = new SVGResourceFilter(); FilterBuilder* builder; bool filterBBoxMode = filterUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; m_resourceFilter->setFilterBoundingBoxMode(filterBBoxMode); float _x, _y, _width, _height; if (filterBBoxMode) { _x = x().valueAsPercentage(); _y = y().valueAsPercentage(); _width = width().valueAsPercentage(); _height = height().valueAsPercentage(); } else { m_resourceFilter->setXBoundingBoxMode(x().unitType() == LengthTypePercentage); m_resourceFilter->setYBoundingBoxMode(y().unitType() == LengthTypePercentage); _x = x().value(); _y = y().value(); _width = width().value(); _height = height().value(); } m_resourceFilter->setFilterRect(FloatRect(_x, _y, _width, _height)); bool primitiveBBoxMode = primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; m_resourceFilter->setEffectBoundingBoxMode(primitiveBBoxMode); // TODO : use switch/case instead? m_resourceFilter->clearEffects(); for (Node* n = firstChild(); n != 0; n = n->nextSibling()) { SVGElement* element = 0; if (n->isSVGElement()) element = static_cast(n); if (element && element->isFilterEffect()) { printf("filterEffect found\n"); SVGFilterPrimitiveStandardAttributes* effectElement = static_cast(element); if (effectElement->build(builder)) continue; } } m_resourceFilter->setFilter(builder->filter()); return m_resourceFilter.get(); }