void LayoutSVGResourceContainer::markAllClientsForInvalidation(InvalidationMode mode) { if ((m_clients.isEmpty() && m_resourceClients.isEmpty()) || m_isInvalidating) return; if (m_invalidationMask & mode) return; m_invalidationMask |= mode; m_isInvalidating = true; bool needsLayout = mode == LayoutAndBoundariesInvalidation; bool markForInvalidation = mode != ParentOnlyInvalidation; for (auto* client : m_clients) { if (client->isSVGResourceContainer()) { toLayoutSVGResourceContainer(client)->removeAllClientsFromCache(markForInvalidation); continue; } if (markForInvalidation) markClientForInvalidation(client, mode); LayoutSVGResourceContainer::markForLayoutAndParentResourceInvalidation(client, needsLayout); } markAllResourceClientsForInvalidation(); m_isInvalidating = false; }
void LayoutSVGResourceFilter::primitiveAttributeChanged(LayoutObject* object, const QualifiedName& attribute) { SVGFilterPrimitiveStandardAttributes* primitive = static_cast<SVGFilterPrimitiveStandardAttributes*>(object->node()); for (auto& filter : m_filter) { FilterData* filterData = filter.value.get(); if (filterData->m_state != FilterData::ReadyToPaint) continue; SVGFilterGraphNodeMap* nodeMap = filterData->nodeMap.get(); FilterEffect* effect = nodeMap->effectByRenderer(object); if (!effect) continue; // Since all effects shares the same attribute value, all // or none of them will be changed. if (!primitive->setFilterEffectAttribute(effect, attribute)) return; nodeMap->invalidateDependentEffects(effect); // Issue paint invalidations for the image on the screen. markClientForInvalidation(filter.key, PaintInvalidation); } markAllResourceClientsForInvalidation(); }