void BeginFilterDisplayItem::replay(GraphicsContext* context) { context->save(); FloatRect boundaries = mapImageFilterRect(m_imageFilter.get(), m_bounds); context->translate(m_bounds.x().toFloat(), m_bounds.y().toFloat()); boundaries.move(-m_bounds.x().toFloat(), -m_bounds.y().toFloat()); context->beginLayer(1, CompositeSourceOver, &boundaries, ColorFilterNone, m_imageFilter.get()); context->translate(-m_bounds.x().toFloat(), -m_bounds.y().toFloat()); }
void BeginFilterDisplayItem::replay(GraphicsContext& context) const { context.save(); FloatRect imageFilterBounds = mapImageFilterRect(m_imageFilter.get(), m_bounds); context.translate(m_bounds.x(), m_bounds.y()); context.beginLayer(1, SkXfermode::kSrcOver_Mode, &imageFilterBounds, ColorFilterNone, m_imageFilter.get()); context.translate(-m_bounds.x(), -m_bounds.y()); }
GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(GraphicsContext* context) { ASSERT(m_filter); SkiaImageFilterBuilder builder(context); RefPtr<ImageFilter> imageFilter = builder.build(m_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; }
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; }