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

Side by Side Diff: Source/core/rendering/compositing/CompositingReasonFinder.cpp

Issue 197533013: CompositingReasonFinder should use a virtual function instead of a nest of branches (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add missing file Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/rendering/compositing/CompositingReasonFinder.h" 6 #include "core/rendering/compositing/CompositingReasonFinder.h"
7 7
8 #include "CSSPropertyNames.h" 8 #include "CSSPropertyNames.h"
9 #include "HTMLNames.h" 9 #include "HTMLNames.h"
10 #include "core/animation/ActiveAnimations.h" 10 #include "core/animation/ActiveAnimations.h"
(...skipping 16 matching lines...) Expand all
27 #include "core/rendering/RenderLayerStackingNodeIterator.h" 27 #include "core/rendering/RenderLayerStackingNodeIterator.h"
28 #include "core/rendering/RenderReplica.h" 28 #include "core/rendering/RenderReplica.h"
29 #include "core/rendering/RenderVideo.h" 29 #include "core/rendering/RenderVideo.h"
30 #include "core/rendering/RenderView.h" 30 #include "core/rendering/RenderView.h"
31 #include "core/rendering/compositing/RenderLayerCompositor.h" 31 #include "core/rendering/compositing/RenderLayerCompositor.h"
32 32
33 namespace WebCore { 33 namespace WebCore {
34 34
35 CompositingReasonFinder::CompositingReasonFinder(RenderView& renderView) 35 CompositingReasonFinder::CompositingReasonFinder(RenderView& renderView)
36 : m_renderView(renderView) 36 : m_renderView(renderView)
37 , m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(C hromeClient::AllTriggers)) 37 , m_compositingTriggers(static_cast<CompositingTriggerFlags>(AllCompositingT riggers))
38 { 38 {
39 } 39 }
40 40
41 void CompositingReasonFinder::updateTriggers() 41 void CompositingReasonFinder::updateTriggers()
42 { 42 {
43 m_compositingTriggers = m_renderView.document().page()->chrome().client().al lowedCompositingTriggers(); 43 m_compositingTriggers = m_renderView.document().page()->chrome().client().al lowedCompositingTriggers();
44 } 44 }
45 45
46 bool CompositingReasonFinder::has3DTransformTrigger() const 46 bool CompositingReasonFinder::has3DTransformTrigger() const
47 { 47 {
48 return m_compositingTriggers & ChromeClient::ThreeDTransformTrigger; 48 return m_compositingTriggers & ThreeDTransformTrigger;
49 } 49 }
50 50
51 bool CompositingReasonFinder::hasAnimationTrigger() const 51 bool CompositingReasonFinder::hasAnimationTrigger() const
52 { 52 {
53 return m_compositingTriggers & ChromeClient::AnimationTrigger; 53 return m_compositingTriggers & AnimationTrigger;
54 } 54 }
55 55
56 bool CompositingReasonFinder::isMainFrame() const 56 bool CompositingReasonFinder::isMainFrame() const
57 { 57 {
58 // FIXME: LocalFrame::isMainFrame() is probably better. 58 // FIXME: LocalFrame::isMainFrame() is probably better.
59 return !m_renderView.document().ownerElement(); 59 return !m_renderView.document().ownerElement();
60 } 60 }
61 61
62 CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay er, bool* needToRecomputeCompositingRequirements) const 62 CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay er, bool* needToRecomputeCompositingRequirements) const
63 { 63 {
64 RenderObject* renderer = layer->renderer(); 64 RenderObject* renderer = layer->renderer();
65 CompositingReasons directReasons = CompositingReasonNone; 65 CompositingReasons directReasons = CompositingReasonNone;
66 66
67 if (requiresCompositingForTransform(renderer)) 67 if (requiresCompositingForTransform(renderer))
68 directReasons |= CompositingReason3DTransform; 68 directReasons |= CompositingReason3DTransform;
69 69
70 // Only zero or one of the following conditions will be true for a given Ren derLayer. 70 // Only zero or one of the following conditions will be true for a given Ren derLayer.
71 if (requiresCompositingForVideo(renderer)) 71 // FIXME: These should be handled by overrides of RenderObject::additionalCo mpositingReasons.
72 directReasons |= CompositingReasonVideo; 72 if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRequire ments))
73 else if (requiresCompositingForCanvas(renderer))
74 directReasons |= CompositingReasonCanvas;
75 else if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRe quirements))
76 directReasons |= CompositingReasonPlugin; 73 directReasons |= CompositingReasonPlugin;
77 else if (requiresCompositingForFrame(renderer, needToRecomputeCompositingReq uirements)) 74 else if (requiresCompositingForFrame(renderer, needToRecomputeCompositingReq uirements))
78 directReasons |= CompositingReasonIFrame; 75 directReasons |= CompositingReasonIFrame;
79 76
80 if (requiresCompositingForBackfaceVisibilityHidden(renderer)) 77 if (requiresCompositingForBackfaceVisibilityHidden(renderer))
81 directReasons |= CompositingReasonBackfaceVisibilityHidden; 78 directReasons |= CompositingReasonBackfaceVisibilityHidden;
82 79
83 if (requiresCompositingForAnimation(renderer)) 80 if (requiresCompositingForAnimation(renderer))
84 directReasons |= CompositingReasonActiveAnimation; 81 directReasons |= CompositingReasonActiveAnimation;
85 82
(...skipping 11 matching lines...) Expand all
97 94
98 if (requiresCompositingForOverflowScrollingParent(layer)) 95 if (requiresCompositingForOverflowScrollingParent(layer))
99 directReasons |= CompositingReasonOverflowScrollingParent; 96 directReasons |= CompositingReasonOverflowScrollingParent;
100 97
101 if (requiresCompositingForOutOfFlowClipping(layer)) 98 if (requiresCompositingForOutOfFlowClipping(layer))
102 directReasons |= CompositingReasonOutOfFlowClipping; 99 directReasons |= CompositingReasonOutOfFlowClipping;
103 100
104 if (requiresCompositingForWillChange(renderer)) 101 if (requiresCompositingForWillChange(renderer))
105 directReasons |= CompositingReasonWillChange; 102 directReasons |= CompositingReasonWillChange;
106 103
104 directReasons |= renderer->additionalCompositingReasons(m_compositingTrigger s);
105
107 return directReasons; 106 return directReasons;
108 } 107 }
109 108
110 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const 109 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const
111 { 110 {
112 // Need this done first to determine overflow. 111 // Need this done first to determine overflow.
113 ASSERT(!m_renderView.needsLayout()); 112 ASSERT(!m_renderView.needsLayout());
114 if (isMainFrame()) 113 if (isMainFrame())
115 return false; 114 return false;
116 115
117 if (!(m_compositingTriggers & ChromeClient::ScrollableInnerFrameTrigger)) 116 if (!(m_compositingTriggers & ScrollableInnerFrameTrigger))
118 return false; 117 return false;
119 118
120 FrameView* frameView = m_renderView.frameView(); 119 FrameView* frameView = m_renderView.frameView();
121 return frameView->isScrollable(); 120 return frameView->isScrollable();
122 } 121 }
123 122
124 bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend erer) const 123 bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend erer) const
125 { 124 {
126 if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger)) 125 if (!(m_compositingTriggers & ThreeDTransformTrigger))
127 return false; 126 return false;
128 127
129 RenderStyle* style = renderer->style(); 128 RenderStyle* style = renderer->style();
130 // Note that we ask the renderer if it has a transform, because the style ma y have transforms, 129 // Note that we ask the renderer if it has a transform, because the style ma y have transforms,
131 // but the renderer may be an inline that doesn't suppport them. 130 // but the renderer may be an inline that doesn't suppport them.
132 return renderer->hasTransform() && style->transform().has3DOperation(); 131 return renderer->hasTransform() && style->transform().has3DOperation();
133 } 132 }
134 133
135 bool CompositingReasonFinder::requiresCompositingForVideo(RenderObject* renderer ) const
136 {
137 if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled() && renderer->isV ideo()) {
138 HTMLMediaElement* media = toHTMLMediaElement(renderer->node());
139 if (media->isFullscreen())
140 return true;
141 }
142
143 if (!(m_compositingTriggers & ChromeClient::VideoTrigger))
144 return false;
145
146 if (renderer->isVideo()) {
147 RenderVideo* video = toRenderVideo(renderer);
148 return video->shouldDisplayVideo() && video->supportsAcceleratedRenderin g();
149 }
150 return false;
151 }
152
153 bool CompositingReasonFinder::requiresCompositingForCanvas(RenderObject* rendere r) const
154 {
155 if (!(m_compositingTriggers & ChromeClient::CanvasTrigger))
156 return false;
157
158 if (renderer->isCanvas()) {
159 HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node());
160 return canvas->renderingContext() && canvas->renderingContext()->isAccel erated();
161 }
162 return false;
163 }
164
165 bool CompositingReasonFinder::requiresCompositingForPlugin(RenderObject* rendere r, bool* needToRecomputeCompositingRequirements) const 134 bool CompositingReasonFinder::requiresCompositingForPlugin(RenderObject* rendere r, bool* needToRecomputeCompositingRequirements) const
166 { 135 {
167 if (!(m_compositingTriggers & ChromeClient::PluginTrigger)) 136 if (!(m_compositingTriggers & PluginTrigger))
168 return false; 137 return false;
169 138
170 if (!renderer->isEmbeddedObject() || !toRenderEmbeddedObject(renderer)->allo wsAcceleratedCompositing()) 139 if (!renderer->isEmbeddedObject() || !toRenderEmbeddedObject(renderer)->allo wsAcceleratedCompositing())
171 return false; 140 return false;
172 141
173 // FIXME: this seems bogus. If we don't know the layout position/size of the plugin yet, would't that be handled elsewhere? 142 // FIXME: this seems bogus. If we don't know the layout position/size of the plugin yet, would't that be handled elsewhere?
174 *needToRecomputeCompositingRequirements = true; 143 *needToRecomputeCompositingRequirements = true;
175 144
176 RenderWidget* pluginRenderer = toRenderWidget(renderer); 145 RenderWidget* pluginRenderer = toRenderWidget(renderer);
177 // If we can't reliably know the size of the plugin yet, don't change compos iting state. 146 // If we can't reliably know the size of the plugin yet, don't change compos iting state.
(...skipping 29 matching lines...) Expand all
207 if (renderer->needsLayout()) 176 if (renderer->needsLayout())
208 return frameRenderer->hasLayer() && frameRenderer->layer()->hasComposite dLayerMapping(); 177 return frameRenderer->hasLayer() && frameRenderer->layer()->hasComposite dLayerMapping();
209 178
210 // Don't go into compositing mode if height or width are zero. 179 // Don't go into compositing mode if height or width are zero.
211 IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect()); 180 IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect());
212 return contentBox.height() * contentBox.width() > 0; 181 return contentBox.height() * contentBox.width() > 0;
213 } 182 }
214 183
215 bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(Ren derObject* renderer) const 184 bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(Ren derObject* renderer) const
216 { 185 {
217 if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger)) 186 if (!(m_compositingTriggers & ThreeDTransformTrigger))
218 return false; 187 return false;
219 188
220 return renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden; 189 return renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden;
221 } 190 }
222 191
223 bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend erer) const 192 bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend erer) const
224 { 193 {
225 if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) 194 if (!(m_compositingTriggers & AnimationTrigger))
226 return false; 195 return false;
227 196
228 return shouldCompositeForActiveAnimations(*renderer); 197 return shouldCompositeForActiveAnimations(*renderer);
229 } 198 }
230 199
231 bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* ren derer) const 200 bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* ren derer) const
232 { 201 {
233 if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) 202 if (!(m_compositingTriggers & AnimationTrigger))
234 return false; 203 return false;
235 204
236 if (Settings* settings = m_renderView.document().settings()) { 205 if (Settings* settings = m_renderView.document().settings()) {
237 if (!settings->acceleratedCompositingForTransitionEnabled()) 206 if (!settings->acceleratedCompositingForTransitionEnabled())
238 return false; 207 return false;
239 } 208 }
240 209
241 return renderer->style()->transitionForProperty(CSSPropertyOpacity) 210 return renderer->style()->transitionForProperty(CSSPropertyOpacity)
242 || renderer->style()->transitionForProperty(CSSPropertyWebkitFilter) 211 || renderer->style()->transitionForProperty(CSSPropertyWebkitFilter)
243 || renderer->style()->transitionForProperty(CSSPropertyWebkitTransform); 212 || renderer->style()->transitionForProperty(CSSPropertyWebkitTransform);
244 } 213 }
245 214
246 bool CompositingReasonFinder::requiresCompositingForFilters(RenderObject* render er) const 215 bool CompositingReasonFinder::requiresCompositingForFilters(RenderObject* render er) const
247 { 216 {
248 if (!(m_compositingTriggers & ChromeClient::FilterTrigger)) 217 if (!(m_compositingTriggers & FilterTrigger))
249 return false; 218 return false;
250 219
251 return renderer->hasFilter(); 220 return renderer->hasFilter();
252 } 221 }
253 222
254 bool CompositingReasonFinder::requiresCompositingForOverflowScrollingParent(cons t RenderLayer* layer) const 223 bool CompositingReasonFinder::requiresCompositingForOverflowScrollingParent(cons t RenderLayer* layer) const
255 { 224 {
256 return !!layer->scrollParent(); 225 return !!layer->scrollParent();
257 } 226 }
258 227
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 361
393 return true; 362 return true;
394 } 363 }
395 364
396 bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend erLayer* layer) const 365 bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend erLayer* layer) const
397 { 366 {
398 return layer->needsCompositedScrolling(); 367 return layer->needsCompositedScrolling();
399 } 368 }
400 369
401 } 370 }
OLDNEW
« no previous file with comments | « Source/core/rendering/compositing/CompositingReasonFinder.h ('k') | Source/core/rendering/compositing/CompositingTriggers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698