SVGFEMerge* SVGFEMergeElement::filterEffect() const { if (!m_filterEffect) m_filterEffect = static_cast<SVGFEMerge*>(SVGResourceFilter::createFilterEffect(FE_MERGE)); if (!m_filterEffect) return 0; setStandardAttributes(m_filterEffect); Vector<String> mergeInputs; for (Node* n = firstChild(); n != 0; n = n->nextSibling()) { if (n->hasTagName(SVGNames::feMergeNodeTag)) mergeInputs.append(static_cast<SVGFEMergeNodeElement*>(n)->in1()); } m_filterEffect->setMergeInputs(mergeInputs); return m_filterEffect; }
std::unique_ptr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives(SVGFilter* filter) { FloatRect targetBoundingBox = filter->targetBoundingBox(); // Add effects to the builder auto builder = std::make_unique<SVGFilterBuilder>(SourceGraphic::create(filter), SourceAlpha::create(filter)); auto children = childrenOfType<SVGFilterPrimitiveStandardAttributes>(filterElement()); for (auto element = children.begin(), end = children.end(); element != end; ++element) { RefPtr<FilterEffect> effect = element->build(builder.get(), filter); if (!effect) { builder->clearEffects(); return nullptr; } builder->appendEffectToEffectReferences(effect, element->renderer()); element->setStandardAttributes(effect.get()); effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(&*element, filterElement().primitiveUnits(), targetBoundingBox)); effect->setOperatingColorSpace(element->renderer()->style()->svgStyle()->colorInterpolationFilters() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB); builder->add(element->result(), effect.release()); } return builder; }