Example #1
0
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());
}
Example #3
0
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;
}