bool FilterEffectRendererHelper::prepareFilterEffect(RenderLayer* renderLayer, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect, const LayoutRect& layerRepaintRect) { ASSERT(m_haveFilterEffect && renderLayer->filterRenderer()); m_renderLayer = renderLayer; m_repaintRect = dirtyRect; FilterEffectRenderer* filter = renderLayer->filterRenderer(); LayoutRect filterSourceRect = filter->computeSourceImageRectForDirtyRect(filterBoxRect, dirtyRect); if (filterSourceRect.isEmpty()) { // The dirty rect is not in view, just bail out. m_haveFilterEffect = false; return false; } AffineTransform absoluteTransform; absoluteTransform.translate(filterBoxRect.x(), filterBoxRect.y()); filter->setAbsoluteTransform(absoluteTransform); filter->setAbsoluteFilterRegion(filterSourceRect); filter->setFilterRegion(absoluteTransform.inverse().mapRect(filterSourceRect)); filter->lastEffect()->determineFilterPrimitiveSubregion(); bool hasUpdatedBackingStore = filter->updateBackingStoreRect(filterSourceRect); if (filter->hasFilterThatMovesPixels()) { if (hasUpdatedBackingStore) m_repaintRect = filterSourceRect; else { m_repaintRect.unite(layerRepaintRect); m_repaintRect.intersect(filterSourceRect); } } return true; }
bool FilterEffectRendererHelper::prepareFilterEffect(RenderLayer* renderLayer, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect) { ASSERT(m_haveFilterEffect && renderLayer->filterRenderer()); m_renderLayer = renderLayer; m_repaintRect = dirtyRect; // Get the zoom factor to scale the filterSourceRect input const RenderLayerModelObject* renderer = renderLayer->renderer(); const RenderStyle* style = renderer ? renderer->style() : 0; float zoom = style ? style->effectiveZoom() : 1.0f; // Prepare a transformation that brings the coordinates into the space // filter coordinates are defined in. AffineTransform absoluteTransform; // FIXME: Should these really be upconverted to doubles and not rounded? crbug.com/350474 absoluteTransform.translate(filterBoxRect.x().toDouble(), filterBoxRect.y().toDouble()); absoluteTransform.scale(zoom, zoom); FilterEffectRenderer* filter = renderLayer->filterRenderer(); filter->setAbsoluteTransform(absoluteTransform); IntRect filterSourceRect = pixelSnappedIntRect(filter->computeSourceImageRectForDirtyRect(filterBoxRect, dirtyRect)); if (filterSourceRect.isEmpty()) { // The dirty rect is not in view, just bail out. m_haveFilterEffect = false; return false; } filter->setFilterRegion(filter->mapAbsoluteRectToLocalRect(filterSourceRect)); filter->lastEffect()->determineFilterPrimitiveSubregion(MapRectForward); bool hasUpdatedBackingStore = filter->updateBackingStoreRect(filterSourceRect); if (filter->hasFilterThatMovesPixels()) { if (hasUpdatedBackingStore) m_repaintRect = filterSourceRect; else m_repaintRect.intersect(filterSourceRect); } return true; }