提交 ef1b30fa 编写于 作者: O Ojan Vafai

Move FilterEffectRenderer out of RenderLayer into RenderBox.

It doesn't do anything RenderLayer specific anymore. This
does mean adding another pointer to RenderBox. We might want
to do something about that eventually, but for now it seems fine
to make forward progress in terms of getting rid of the RenderLayer
tree.

R=eseidel@chromium.org

Review URL: https://codereview.chromium.org/963253002
上级 d679a524
......@@ -287,18 +287,16 @@ LayoutRect FilterEffectRenderer::computeSourceImageRectForDirtyRect(const Layout
return LayoutRect(rectForPaintInvalidation);
}
bool FilterEffectRendererHelper::prepareFilterEffect(RenderLayer* renderLayer, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect)
bool FilterEffectRendererHelper::prepareFilterEffect(FilterEffectRenderer* filter, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect)
{
ASSERT(m_haveFilterEffect && renderLayer->filterRenderer());
m_renderLayer = renderLayer;
ASSERT(m_haveFilterEffect && filter);
m_filter = filter;
// 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());
FilterEffectRenderer* filter = renderLayer->filterRenderer();
filter->setAbsoluteTransform(absoluteTransform);
IntRect filterSourceRect = pixelSnappedIntRect(filter->computeSourceImageRectForDirtyRect(filterBoxRect, dirtyRect));
......@@ -319,11 +317,9 @@ bool FilterEffectRendererHelper::prepareFilterEffect(RenderLayer* renderLayer, c
GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(GraphicsContext* context)
{
ASSERT(m_renderLayer);
FilterEffectRenderer* filter = m_renderLayer->filterRenderer();
ASSERT(m_filter);
SkiaImageFilterBuilder builder(context);
RefPtr<ImageFilter> imageFilter = builder.build(filter->lastEffect().get(), ColorSpaceDeviceRGB);
RefPtr<ImageFilter> imageFilter = builder.build(m_filter->lastEffect().get(), ColorSpaceDeviceRGB);
if (!imageFilter) {
m_haveFilterEffect = false;
return context;
......@@ -340,7 +336,7 @@ GraphicsContext* FilterEffectRendererHelper::beginFilterEffect(GraphicsContext*
GraphicsContext* FilterEffectRendererHelper::applyFilterEffect()
{
ASSERT(m_haveFilterEffect && m_renderLayer->filterRenderer());
ASSERT(m_haveFilterEffect && m_filter);
GraphicsContext* context = m_savedGraphicsContext;
context->endLayer();
context->restore();
......
......@@ -40,15 +40,15 @@
namespace blink {
class FilterEffectRenderer;
class GraphicsContext;
class RenderLayer;
class RenderObject;
class FilterEffectRendererHelper {
public:
FilterEffectRendererHelper(bool haveFilterEffect)
: m_savedGraphicsContext(0)
, m_renderLayer(0)
, m_filter(0)
, m_haveFilterEffect(haveFilterEffect)
{
}
......@@ -56,12 +56,12 @@ public:
bool haveFilterEffect() const { return m_haveFilterEffect; }
bool hasStartedFilterEffect() const { return m_savedGraphicsContext; }
bool prepareFilterEffect(RenderLayer*, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect);
bool prepareFilterEffect(FilterEffectRenderer*, const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect);
GraphicsContext* beginFilterEffect(GraphicsContext* oldContext);
GraphicsContext* applyFilterEffect();
private:
GraphicsContext* m_savedGraphicsContext;
RenderLayer* m_renderLayer;
FilterEffectRenderer* m_filter;
FloatRect m_filterBoxRect;
bool m_haveFilterEffect;
......
......@@ -37,7 +37,6 @@
#include "sky/engine/core/html/HTMLElement.h"
#include "sky/engine/core/page/EventHandler.h"
#include "sky/engine/core/page/Page.h"
#include "sky/engine/core/rendering/FilterEffectRenderer.h"
#include "sky/engine/core/rendering/HitTestResult.h"
#include "sky/engine/core/rendering/HitTestingTransformState.h"
#include "sky/engine/core/rendering/PaintInfo.h"
......@@ -172,6 +171,22 @@ void RenderBox::updateFromStyle()
}
setHasTransform(styleToUse->hasTransformRelatedProperty());
updateFilters();
}
void RenderBox::updateFilters()
{
if (!style()->hasFilter()) {
m_filterRenderer = nullptr;
return;
}
m_filterRenderer = FilterEffectRenderer::create();
// If the filter fails to build, remove it from the layer. It will still attempt to
// go through regular processing (e.g. compositing), but never apply anything.
if (!m_filterRenderer->build(this, style()->filter()))
m_filterRenderer = nullptr;
}
void RenderBox::layout()
......@@ -856,13 +871,13 @@ void RenderBox::paintLayerContents(GraphicsContext* context, const LayerPainting
layer()->clipToRect(localPaintingInfo, context, contentRect);
FilterEffectRendererHelper filterPainter(layer()->filterRenderer() && hasFilter());
FilterEffectRendererHelper filterPainter(m_filterRenderer && style()->hasFilter());
if (filterPainter.haveFilterEffect()) {
if (!rootRelativeBoundsComputed)
rootRelativeBounds = layer()->physicalBoundingBoxIncludingReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot);
if (filterPainter.prepareFilterEffect(layer(), rootRelativeBounds, paintingInfo.paintDirtyRect))
if (filterPainter.prepareFilterEffect(m_filterRenderer.get(), rootRelativeBounds, paintingInfo.paintDirtyRect))
context = filterPainter.beginFilterEffect(context);
}
......
......@@ -23,6 +23,7 @@
#ifndef SKY_ENGINE_CORE_RENDERING_RENDERBOX_H_
#define SKY_ENGINE_CORE_RENDERING_RENDERBOX_H_
#include "sky/engine/core/rendering/FilterEffectRenderer.h"
#include "sky/engine/core/rendering/RenderBoxModelObject.h"
#include "sky/engine/core/rendering/RenderOverflow.h"
......@@ -485,6 +486,7 @@ protected:
private:
void updateFromStyle();
void updateFilters();
PassRefPtr<HitTestingTransformState> createLocalTransformState(
RenderLayer* rootLayer, RenderLayer* containerLayer,
......@@ -555,6 +557,8 @@ protected:
// Our overflow information.
OwnPtr<RenderOverflow> m_overflow;
OwnPtr<FilterEffectRenderer> m_filterRenderer;
private:
OwnPtr<RenderLayer> m_layer;
OwnPtr<RenderBoxRareData> m_rareData;
......
......@@ -52,7 +52,6 @@
#include "sky/engine/core/frame/LocalFrame.h"
#include "sky/engine/core/frame/Settings.h"
#include "sky/engine/core/page/Page.h"
#include "sky/engine/core/rendering/FilterEffectRenderer.h"
#include "sky/engine/core/rendering/HitTestRequest.h"
#include "sky/engine/core/rendering/HitTestResult.h"
#include "sky/engine/core/rendering/HitTestingTransformState.h"
......@@ -607,24 +606,6 @@ bool RenderLayer::shouldBeSelfPaintingLayer() const
return m_layerType == NormalLayer;
}
void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle)
{
if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter()))
return;
if (!renderer()->hasFilter()) {
m_filterRenderer = nullptr;
return;
}
m_filterRenderer = FilterEffectRenderer::create();
// If the filter fails to build, remove it from the layer. It will still attempt to
// go through regular processing (e.g. compositing), but never apply anything.
if (!m_filterRenderer->build(renderer(), renderer()->style()->filter()))
m_filterRenderer = nullptr;
}
void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle)
{
m_stackingNode->updateIsNormalFlowOnly();
......@@ -635,7 +616,6 @@ void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle
m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
updateTransform(oldStyle, renderer()->style());
updateFilters(oldStyle, renderer()->style());
}
} // namespace blink
......@@ -55,7 +55,6 @@
namespace blink {
class FilterEffectRenderer;
class FilterOperations;
class HitTestRequest;
class HitTestResult;
......@@ -143,11 +142,6 @@ public:
// Only safe to call from RenderBox::destroyLayer()
void operator delete(void*);
FilterEffectRenderer* filterRenderer() const
{
return m_filterRenderer.get();
}
RenderLayerClipper& clipper() { return m_clipper; }
const RenderLayerClipper& clipper() const { return m_clipper; }
......@@ -171,7 +165,6 @@ private:
bool shouldBeSelfPaintingLayer() const;
void updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle);
void updateTransform(const RenderStyle* oldStyle, RenderStyle* newStyle);
void dirty3DTransformedDescendantStatus();
......@@ -199,7 +192,6 @@ private:
RenderLayer* m_last;
OwnPtr<TransformationMatrix> m_transform;
OwnPtr<FilterEffectRenderer> m_filterRenderer;
RenderLayerClipper m_clipper; // FIXME: Lazily allocate?
OwnPtr<RenderLayerStackingNode> m_stackingNode;
......
......@@ -358,8 +358,6 @@ public:
bool hasClipPath() const { return style() && style()->clipPath(); }
bool hasHiddenBackface() const { return style() && style()->backfaceVisibility() == BackfaceVisibilityHidden; }
bool hasFilter() const { return style() && style()->hasFilter(); }
inline bool preservesNewline() const;
RenderView* view() const { return document().renderView(); };
......@@ -608,7 +606,7 @@ public:
bool shouldUseTransformFromContainer(const RenderObject* container) const;
void getTransformFromContainer(const RenderObject* container, const LayoutSize& offsetInContainer, TransformationMatrix&) const;
bool createsGroup() const { return isTransparent() || hasFilter(); }
bool createsGroup() const { return isTransparent() || style()->hasFilter(); }
virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint& /* additionalOffset */, const RenderBox* /* paintContainer */ = 0) const { };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册