OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/render_surface_impl.h" | 5 #include "cc/render_surface_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 DelegatedRendererLayerImpl* delegatedRendererLayer = static_cast<DelegatedRe
ndererLayerImpl*>(layer); | 143 DelegatedRendererLayerImpl* delegatedRendererLayer = static_cast<DelegatedRe
ndererLayerImpl*>(layer); |
144 m_contributingDelegatedRenderPassLayerList.push_back(delegatedRendererLayer)
; | 144 m_contributingDelegatedRenderPassLayerList.push_back(delegatedRendererLayer)
; |
145 } | 145 } |
146 | 146 |
147 void RenderSurfaceImpl::clearLayerLists() | 147 void RenderSurfaceImpl::clearLayerLists() |
148 { | 148 { |
149 m_layerList.clear(); | 149 m_layerList.clear(); |
150 m_contributingDelegatedRenderPassLayerList.clear(); | 150 m_contributingDelegatedRenderPassLayerList.clear(); |
151 } | 151 } |
152 | 152 |
153 static inline gfx::Rect computeClippedRectInTarget(const LayerImpl* owningLayer) | |
154 { | |
155 DCHECK(owningLayer->parent()); | |
156 | |
157 const LayerImpl* renderTarget = owningLayer->parent()->renderTarget(); | |
158 const RenderSurfaceImpl* self = owningLayer->renderSurface(); | |
159 | |
160 gfx::Rect clippedRectInTarget = self->clipRect(); | |
161 if (owningLayer->backgroundFilters().hasFilterThatMovesPixels()) { | |
162 // If the layer has background filters that move pixels, we cannot sciss
or as tightly. | |
163 // FIXME: this should be able to be a tighter scissor, perhaps expanded
by the filter outsets? | |
164 clippedRectInTarget = renderTarget->renderSurface()->contentRect(); | |
165 } else if (clippedRectInTarget.IsEmpty()) { | |
166 // For surfaces, empty clipRect means that the surface does not clip any
thing. | |
167 clippedRectInTarget = renderTarget->renderSurface()->contentRect(); | |
168 clippedRectInTarget.Intersect(gfx::ToEnclosingRect(self->drawableContent
Rect())); | |
169 } else | |
170 clippedRectInTarget.Intersect(gfx::ToEnclosingRect(self->drawableContent
Rect())); | |
171 return clippedRectInTarget; | |
172 } | |
173 | |
174 RenderPass::Id RenderSurfaceImpl::renderPassId() | 153 RenderPass::Id RenderSurfaceImpl::renderPassId() |
175 { | 154 { |
176 int layerId = m_owningLayer->id(); | 155 int layerId = m_owningLayer->id(); |
177 int subId = 0; | 156 int subId = 0; |
178 DCHECK(layerId > 0); | 157 DCHECK(layerId > 0); |
179 return RenderPass::Id(layerId, subId); | 158 return RenderPass::Id(layerId, subId); |
180 } | 159 } |
181 | 160 |
182 void RenderSurfaceImpl::appendRenderPasses(RenderPassSink& passSink) | 161 void RenderSurfaceImpl::appendRenderPasses(RenderPassSink& passSink) |
183 { | 162 { |
184 for (size_t i = 0; i < m_contributingDelegatedRenderPassLayerList.size(); ++
i) | 163 for (size_t i = 0; i < m_contributingDelegatedRenderPassLayerList.size(); ++
i) |
185 m_contributingDelegatedRenderPassLayerList[i]->appendContributingRenderP
asses(passSink); | 164 m_contributingDelegatedRenderPassLayerList[i]->appendContributingRenderP
asses(passSink); |
186 | 165 |
187 scoped_ptr<RenderPass> pass = RenderPass::Create(); | 166 scoped_ptr<RenderPass> pass = RenderPass::Create(); |
188 pass->SetNew(renderPassId(), m_contentRect, m_damageTracker->currentDamageRe
ct(), m_screenSpaceTransform); | 167 pass->SetNew(renderPassId(), m_contentRect, m_damageTracker->currentDamageRe
ct(), m_screenSpaceTransform); |
189 passSink.appendRenderPass(pass.Pass()); | 168 passSink.appendRenderPass(pass.Pass()); |
190 } | 169 } |
191 | 170 |
192 void RenderSurfaceImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQ
uadsData, bool forReplica, RenderPass::Id renderPassId) | 171 void RenderSurfaceImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQ
uadsData, bool forReplica, RenderPass::Id renderPassId) |
193 { | 172 { |
194 DCHECK(!forReplica || m_owningLayer->hasReplica()); | 173 DCHECK(!forReplica || m_owningLayer->hasReplica()); |
195 | 174 |
196 gfx::Rect clippedRectInTarget = computeClippedRectInTarget(m_owningLayer); | |
197 const gfx::Transform& drawTransform = forReplica ? m_replicaDrawTransform :
m_drawTransform; | 175 const gfx::Transform& drawTransform = forReplica ? m_replicaDrawTransform :
m_drawTransform; |
198 SharedQuadState* sharedQuadState = quadSink.useSharedQuadState(SharedQuadSta
te::Create()); | 176 SharedQuadState* sharedQuadState = quadSink.useSharedQuadState(SharedQuadSta
te::Create()); |
199 sharedQuadState->SetAll(drawTransform, m_contentRect, clippedRectInTarget, m
_clipRect, m_isClipped, m_drawOpacity); | 177 sharedQuadState->SetAll(drawTransform, m_contentRect, m_clipRect, m_isClippe
d, m_drawOpacity); |
200 | 178 |
201 if (m_owningLayer->showDebugBorders()) { | 179 if (m_owningLayer->showDebugBorders()) { |
202 SkColor color = forReplica ? DebugColors::SurfaceReplicaBorderColor() :
DebugColors::SurfaceBorderColor(); | 180 SkColor color = forReplica ? DebugColors::SurfaceReplicaBorderColor() :
DebugColors::SurfaceBorderColor(); |
203 float width = forReplica ? DebugColors::SurfaceReplicaBorderWidth(m_owni
ngLayer->layerTreeImpl()) : DebugColors::SurfaceBorderWidth(m_owningLayer->layer
TreeImpl()); | 181 float width = forReplica ? DebugColors::SurfaceReplicaBorderWidth(m_owni
ngLayer->layerTreeImpl()) : DebugColors::SurfaceBorderWidth(m_owningLayer->layer
TreeImpl()); |
204 scoped_ptr<DebugBorderDrawQuad> debugBorderQuad = DebugBorderDrawQuad::C
reate(); | 182 scoped_ptr<DebugBorderDrawQuad> debugBorderQuad = DebugBorderDrawQuad::C
reate(); |
205 debugBorderQuad->SetNew(sharedQuadState, contentRect(), color, width); | 183 debugBorderQuad->SetNew(sharedQuadState, contentRect(), color, width); |
206 quadSink.append(debugBorderQuad.PassAs<DrawQuad>(), appendQuadsData); | 184 quadSink.append(debugBorderQuad.PassAs<DrawQuad>(), appendQuadsData); |
207 } | 185 } |
208 | 186 |
209 // FIXME: By using the same RenderSurfaceImpl for both the content and its r
eflection, | 187 // FIXME: By using the same RenderSurfaceImpl for both the content and its r
eflection, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 | 223 |
246 ResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->content
sResourceId() : 0; | 224 ResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->content
sResourceId() : 0; |
247 gfx::Rect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect
: gfx::Rect(); | 225 gfx::Rect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect
: gfx::Rect(); |
248 | 226 |
249 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create(); | 227 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create(); |
250 quad->SetNew(sharedQuadState, contentRect(), renderPassId, forReplica, maskR
esourceId, contentsChangedSinceLastFrame, maskUVRect, m_owningLayer->filters(),
m_owningLayer->filter(), m_owningLayer->backgroundFilters()); | 228 quad->SetNew(sharedQuadState, contentRect(), renderPassId, forReplica, maskR
esourceId, contentsChangedSinceLastFrame, maskUVRect, m_owningLayer->filters(),
m_owningLayer->filter(), m_owningLayer->backgroundFilters()); |
251 quadSink.append(quad.PassAs<DrawQuad>(), appendQuadsData); | 229 quadSink.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
252 } | 230 } |
253 | 231 |
254 } // namespace cc | 232 } // namespace cc |
OLD | NEW |