FloatRect FilterEffect::determineAbsolutePaintRect(const FloatRect& originalRequestedRect) { FloatRect requestedRect = originalRequestedRect; // Filters in SVG clip to primitive subregion, while CSS doesn't. if (m_clipsToBounds) requestedRect.intersect(maxEffectRect()); // We may be called multiple times if result is used more than once. Return // quickly if if nothing new is required. if (absolutePaintRect().contains(enclosingIntRect(requestedRect))) return requestedRect; FloatRect inputRect = mapPaintRect(requestedRect, false); FloatRect inputUnion; unsigned size = m_inputEffects.size(); for (unsigned i = 0; i < size; ++i) inputUnion.unite(m_inputEffects.at(i)->determineAbsolutePaintRect(inputRect)); inputUnion = mapPaintRect(inputUnion, true); if (affectsTransparentPixels() || !size) { inputUnion = requestedRect; } else { // Rect may have inflated. Re-intersect with request. inputUnion.intersect(requestedRect); } addAbsolutePaintRect(inputUnion); return inputUnion; }
FloatRect FEDisplacementMap::determineAbsolutePaintRect(const FloatRect& requestedRect) { FloatRect rect = requestedRect; if (clipsToBounds()) rect.intersect(maxEffectRect()); if (absolutePaintRect().contains(enclosingIntRect(rect))) return rect; rect = mapPaintRect(rect, false); rect = inputEffect(0)->determineAbsolutePaintRect(rect); rect = mapPaintRect(rect, true); rect.intersect(requestedRect); addAbsolutePaintRect(rect); return rect; }