Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: sky/engine/core/rendering/RenderLayer.cpp

Issue 962543003: Simplify RenderLayer's handling of filters. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 #include "sky/engine/core/rendering/RenderInline.h" 60 #include "sky/engine/core/rendering/RenderInline.h"
61 #include "sky/engine/core/rendering/RenderTreeAsText.h" 61 #include "sky/engine/core/rendering/RenderTreeAsText.h"
62 #include "sky/engine/core/rendering/RenderView.h" 62 #include "sky/engine/core/rendering/RenderView.h"
63 #include "sky/engine/platform/LengthFunctions.h" 63 #include "sky/engine/platform/LengthFunctions.h"
64 #include "sky/engine/platform/Partitions.h" 64 #include "sky/engine/platform/Partitions.h"
65 #include "sky/engine/platform/TraceEvent.h" 65 #include "sky/engine/platform/TraceEvent.h"
66 #include "sky/engine/platform/geometry/FloatPoint3D.h" 66 #include "sky/engine/platform/geometry/FloatPoint3D.h"
67 #include "sky/engine/platform/geometry/FloatRect.h" 67 #include "sky/engine/platform/geometry/FloatRect.h"
68 #include "sky/engine/platform/geometry/TransformState.h" 68 #include "sky/engine/platform/geometry/TransformState.h"
69 #include "sky/engine/platform/graphics/GraphicsContextStateSaver.h" 69 #include "sky/engine/platform/graphics/GraphicsContextStateSaver.h"
70 #include "sky/engine/platform/graphics/filters/ReferenceFilter.h"
71 #include "sky/engine/platform/graphics/filters/SourceGraphic.h" 70 #include "sky/engine/platform/graphics/filters/SourceGraphic.h"
72 #include "sky/engine/platform/transforms/ScaleTransformOperation.h" 71 #include "sky/engine/platform/transforms/ScaleTransformOperation.h"
73 #include "sky/engine/platform/transforms/TransformationMatrix.h" 72 #include "sky/engine/platform/transforms/TransformationMatrix.h"
74 #include "sky/engine/platform/transforms/TranslateTransformOperation.h" 73 #include "sky/engine/platform/transforms/TranslateTransformOperation.h"
75 #include "sky/engine/public/platform/Platform.h" 74 #include "sky/engine/public/platform/Platform.h"
76 #include "sky/engine/wtf/StdLibExtras.h" 75 #include "sky/engine/wtf/StdLibExtras.h"
77 #include "sky/engine/wtf/text/CString.h" 76 #include "sky/engine/wtf/text/CString.h"
78 77
79 namespace blink { 78 namespace blink {
80 79
81 RenderLayer::RenderLayer(RenderBox* renderer, LayerType type) 80 RenderLayer::RenderLayer(RenderBox* renderer, LayerType type)
82 : m_layerType(type) 81 : m_layerType(type)
83 , m_isRootLayer(renderer->isRenderView()) 82 , m_isRootLayer(renderer->isRenderView())
84 , m_3DTransformedDescendantStatusDirty(true) 83 , m_3DTransformedDescendantStatusDirty(true)
85 , m_has3DTransformedDescendant(false) 84 , m_has3DTransformedDescendant(false)
86 , m_hasFilterInfo(false)
87 , m_renderer(renderer) 85 , m_renderer(renderer)
88 , m_parent(0) 86 , m_parent(0)
89 , m_previous(0) 87 , m_previous(0)
90 , m_next(0) 88 , m_next(0)
91 , m_first(0) 89 , m_first(0)
92 , m_last(0) 90 , m_last(0)
93 , m_clipper(*renderer) 91 , m_clipper(*renderer)
94 { 92 {
95 m_stackingNode = adoptPtr(new RenderLayerStackingNode(this)); 93 m_stackingNode = adoptPtr(new RenderLayerStackingNode(this));
96 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); 94 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
97 } 95 }
98 96
99 RenderLayer::~RenderLayer() 97 RenderLayer::~RenderLayer()
100 { 98 {
101 removeFilterInfoIfNeeded();
102 } 99 }
103 100
104 void RenderLayer::updateLayerPositionsAfterLayout() 101 void RenderLayer::updateLayerPositionsAfterLayout()
105 { 102 {
106 m_clipper.clearClipRectsIncludingDescendants(); 103 m_clipper.clearClipRectsIncludingDescendants();
107 } 104 }
108 105
109 void RenderLayer::updateTransformationMatrix() 106 void RenderLayer::updateTransformationMatrix()
110 { 107 {
111 if (m_transform) { 108 if (m_transform) {
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 { 606 {
610 return m_layerType == NormalLayer; 607 return m_layerType == NormalLayer;
611 } 608 }
612 609
613 void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle) 610 void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle)
614 { 611 {
615 if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter())) 612 if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter()))
616 return; 613 return;
617 614
618 if (!renderer()->hasFilter()) { 615 if (!renderer()->hasFilter()) {
619 removeFilterInfoIfNeeded(); 616 m_filterRenderer = nullptr;
620 return; 617 return;
621 } 618 }
622 619
623 if (renderer()->style()->filter().hasReferenceFilter()) 620 m_filterRenderer = FilterEffectRenderer::create();
624 ensureFilterInfo()->updateReferenceFilterClients(renderer()->style()->fi lter());
625 else if (hasFilterInfo())
626 filterInfo()->removeReferenceFilterClients();
627
628 // FilterEffectRenderer is only used to render the filters in software mode,
629 // so we always need to run updateOrRemoveFilterEffectRenderer after the com posited
630 // mode might have changed for this layer.
631 if (!renderer()->hasFilter()) {
632 // Don't delete the whole filter info here, because we might use it
633 // for loading CSS shader files.
634 if (RenderLayerFilterInfo* filterInfo = this->filterInfo())
635 filterInfo->setRenderer(nullptr);
636
637 return;
638 }
639
640 RenderLayerFilterInfo* filterInfo = ensureFilterInfo();
641 if (!filterInfo->renderer()) {
642 RefPtr<FilterEffectRenderer> filterRenderer = FilterEffectRenderer::crea te();
643 filterInfo->setRenderer(filterRenderer.release());
644
645 // We can optimize away code paths in other places if we know that there are no software filters.
646 renderer()->document().view()->setHasSoftwareFilters(true);
647 }
648 621
649 // If the filter fails to build, remove it from the layer. It will still att empt to 622 // If the filter fails to build, remove it from the layer. It will still att empt to
650 // go through regular processing (e.g. compositing), but never apply anythin g. 623 // go through regular processing (e.g. compositing), but never apply anythin g.
651 if (!filterInfo->renderer()->build(renderer(), renderer()->style()->filter() )) 624 if (!m_filterRenderer->build(renderer(), renderer()->style()->filter()))
652 filterInfo->setRenderer(nullptr); 625 m_filterRenderer = nullptr;
653 } 626 }
654 627
655 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle ) 628 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle )
656 { 629 {
657 m_stackingNode->updateIsNormalFlowOnly(); 630 m_stackingNode->updateIsNormalFlowOnly();
658 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle); 631 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle);
659 632
660 // Overlay scrollbars can make this layer self-painting so we need 633 // Overlay scrollbars can make this layer self-painting so we need
661 // to recompute the bit once scrollbars have been updated. 634 // to recompute the bit once scrollbars have been updated.
662 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); 635 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
663 636
664 updateTransform(oldStyle, renderer()->style()); 637 updateTransform(oldStyle, renderer()->style());
665 updateFilters(oldStyle, renderer()->style()); 638 updateFilters(oldStyle, renderer()->style());
666 } 639 }
667 640
668 } // namespace blink 641 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/core/rendering/RenderLayer.h ('k') | sky/engine/core/rendering/RenderLayerFilterInfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698