| 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 |