GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(GraphicsContext* oldContext) { ASSERT(m_renderLayer); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->allocateBackingStoreIfNeeded(); // Paint into the context that represents the SourceGraphic of the filter. GraphicsContext* sourceGraphicsContext = filter->inputContext(); if (!sourceGraphicsContext || !FilterEffect::isFilterSizeValid(filter->absoluteFilterRegion())) { // Disable the filters and continue. m_haveFilterEffect = false; return oldContext; } m_savedGraphicsContext = oldContext; // Translate the context so that the contents of the layer is captuterd in the offscreen memory buffer. sourceGraphicsContext->save(); // FIXME: can we just use sourceImageRect for everything, and get rid of // m_repaintRect? FloatPoint offset = filter->sourceImageRect().location(); sourceGraphicsContext->translate(-offset.x(), -offset.y()); sourceGraphicsContext->clearRect(m_repaintRect); sourceGraphicsContext->clip(m_repaintRect); return sourceGraphicsContext; }
GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(RenderLayer* renderLayer, GraphicsContext* oldContext, const LayoutRect& filterRect) { ASSERT(m_haveFilterEffect && renderLayer->filter()); m_savedGraphicsContext = oldContext; m_renderLayer = renderLayer; m_paintOffset = filterRect.location(); FloatRect filterSourceRect = filterRect; filterSourceRect.setLocation(LayoutPoint()); FilterEffectRenderer* filter = renderLayer->filter(); filter->updateBackingStore(filterSourceRect); filter->prepare(); // Paint into the context that represents the SourceGraphic of the filter. GraphicsContext* sourceGraphicsContext = filter->inputContext(); if (!sourceGraphicsContext) { // Could not allocate a new graphics context. Disable the filters and continue. m_haveFilterEffect = false; return m_savedGraphicsContext; } sourceGraphicsContext->save(); sourceGraphicsContext->translate(-filterRect.x(), -filterRect.y()); sourceGraphicsContext->clearRect(filterRect); return sourceGraphicsContext; }
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); m_paintOffset = filterSourceRect.location(); if (filterSourceRect.isEmpty()) { // The dirty rect is not in view, just bail out. m_haveFilterEffect = false; return false; } bool hasUpdatedBackingStore = filter->updateBackingStoreRect(filterSourceRect); if (filter->hasFilterThatMovesPixels()) { if (hasUpdatedBackingStore) m_repaintRect = filterSourceRect; else { m_repaintRect.unite(layerRepaintRect); m_repaintRect.intersect(filterSourceRect); } } return true; }
GraphicsContext* FilterEffectRendererHelper::filterContext() const { if (!m_haveFilterEffect) return 0; FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); return filter->inputContext(); }
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; }
GraphicsContext* FilterEffectRendererHelper::applyFilterEffect() { ASSERT(m_haveFilterEffect && m_renderLayer->filterRenderer()); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->inputContext()->restore(); filter->apply(); // Get the filtered output and draw it in place. m_savedGraphicsContext->drawImageBuffer(filter->output(), m_renderLayer->renderer()->style()->colorSpace(), filter->outputRect(), CompositeSourceOver); filter->clearIntermediateResults(); return m_savedGraphicsContext; }
GraphicsContext* FilterEffectRendererHelper::applyFilterEffect() { ASSERT(m_haveFilterEffect && m_renderLayer->filter()); FilterEffectRenderer* filter = m_renderLayer->filter(); filter->apply(); filter->inputContext()->restore(); // Get the filtered output and draw it in place. IntRect destRect = filter->outputRect(); destRect.move(m_paintOffset.x(), m_paintOffset.y()); m_savedGraphicsContext->drawImageBuffer(filter->output(), m_renderLayer->renderer()->style()->colorSpace(), destRect, CompositeSourceOver); return m_savedGraphicsContext; }
bool FilterEffectRendererHelper::beginFilterEffect() { ASSERT(m_renderLayer); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->allocateBackingStoreIfNeeded(); // Paint into the context that represents the SourceGraphic of the filter. GraphicsContext* sourceGraphicsContext = filter->inputContext(); if (!sourceGraphicsContext || filter->filterRegion().isEmpty() || ImageBuffer::sizeNeedsClamping(filter->filterRegion().size())) { // Disable the filters and continue. m_haveFilterEffect = false; return false; } // Translate the context so that the contents of the layer is captuterd in the offscreen memory buffer. sourceGraphicsContext->save(); sourceGraphicsContext->translate(-m_paintOffset.x(), -m_paintOffset.y()); sourceGraphicsContext->clearRect(m_repaintRect); sourceGraphicsContext->clip(m_repaintRect); m_startedFilterEffect = true; return true; }
GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(GraphicsContext* oldContext) { ASSERT(m_renderLayer); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->allocateBackingStoreIfNeeded(); // Paint into the context that represents the SourceGraphic of the filter. GraphicsContext* sourceGraphicsContext = filter->inputContext(); if (!sourceGraphicsContext || !isFilterSizeValid(filter->filterRegion())) { // Disable the filters and continue. m_haveFilterEffect = false; return oldContext; } m_savedGraphicsContext = oldContext; // Translate the context so that the contents of the layer is captuterd in the offscreen memory buffer. sourceGraphicsContext->save(); sourceGraphicsContext->translate(-m_paintOffset.x(), -m_paintOffset.y()); sourceGraphicsContext->clearRect(m_repaintRect); sourceGraphicsContext->clip(m_repaintRect); return sourceGraphicsContext; }
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; }
void FilterEffectRendererHelper::applyFilterEffect(GraphicsContext* destinationContext) { ASSERT(m_haveFilterEffect && m_renderLayer->filterRenderer()); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->inputContext()->restore(); filter->apply(); // Get the filtered output and draw it in place. LayoutRect destRect = filter->outputRect(); destRect.move(m_paintOffset.x(), m_paintOffset.y()); destinationContext->drawImageBuffer(filter->output(), m_renderLayer->renderer().style()->colorSpace(), pixelSnappedIntRect(destRect), CompositeSourceOver); filter->clearIntermediateResults(); }
void FilterEffectRendererHelper::applyFilterEffect(GraphicsContext& destinationContext) { ASSERT(m_haveFilterEffect && m_renderLayer->filterRenderer()); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->inputContext()->restore(); filter->apply(); // Get the filtered output and draw it in place. LayoutRect destRect = filter->outputRect(); destRect.move(m_paintOffset.x(), m_paintOffset.y()); destinationContext.drawImageBuffer(filter->output(), m_renderLayer->renderer().style().colorSpace(), snapRectToDevicePixels(destRect, m_renderLayer->renderer().document().deviceScaleFactor())); filter->clearIntermediateResults(); }
GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(GraphicsContext* context) { ASSERT(m_renderLayer); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); if (m_renderLayer->renderer()->document().settings()->deferredFiltersEnabled()) { SkiaImageFilterBuilder builder(context); RefPtr<ImageFilter> imageFilter = builder.build(filter->lastEffect().get(), ColorSpaceDeviceRGB); if (!imageFilter) { m_haveFilterEffect = false; return context; } m_savedGraphicsContext = context; context->save(); FloatRect boundaries = mapImageFilterRect(imageFilter.get(), m_filterBoxRect); context->translate(m_filterBoxRect.x(), m_filterBoxRect.y()); boundaries.move(-m_filterBoxRect.x(), -m_filterBoxRect.y()); context->beginLayer(1, CompositeSourceOver, &boundaries, ColorFilterNone, imageFilter.get()); context->translate(-m_filterBoxRect.x(), -m_filterBoxRect.y()); return context; } filter->allocateBackingStoreIfNeeded(); // Paint into the context that represents the SourceGraphic of the filter. GraphicsContext* sourceGraphicsContext = filter->inputContext(); if (!sourceGraphicsContext || !FilterEffect::isFilterSizeValid(filter->absoluteFilterRegion())) { // Disable the filters and continue. m_haveFilterEffect = false; return context; } m_savedGraphicsContext = context; // Translate the context so that the contents of the layer is captuterd in the offscreen memory buffer. sourceGraphicsContext->save(); // FIXME: can we just use sourceImageRect for everything, and get rid of // m_paintInvalidationRect? FloatPoint offset = filter->sourceImageRect().location(); sourceGraphicsContext->translate(-offset.x(), -offset.y()); sourceGraphicsContext->clearRect(m_paintInvalidationRect); sourceGraphicsContext->clip(m_paintInvalidationRect); return sourceGraphicsContext; }
GraphicsContext* FilterEffectRendererHelper::applyFilterEffect() { ASSERT(m_haveFilterEffect && m_renderLayer->filterRenderer()); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); if (m_renderLayer->renderer()->document().settings()->deferredFiltersEnabled()) { GraphicsContext* context = m_savedGraphicsContext; context->endLayer(); context->restore(); return context; } filter->inputContext()->restore(); filter->apply(); // Get the filtered output and draw it in place. m_savedGraphicsContext->drawImageBuffer(filter->output(), filter->outputRect()); filter->clearIntermediateResults(); return m_savedGraphicsContext; }