OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 | |
7 #include "CCRenderPass.h" | |
8 | |
9 #include "CCLayerImpl.h" | |
10 #include "CCMathUtil.h" | |
11 #include "CCOcclusionTracker.h" | |
12 #include "CCQuadCuller.h" | |
13 #include "CCSharedQuadState.h" | |
14 #include "CCSolidColorDrawQuad.h" | |
15 | |
16 using WebKit::WebTransformationMatrix; | |
17 | |
18 namespace cc { | |
19 | |
20 scoped_ptr<CCRenderPass> CCRenderPass::create(Id id, IntRect outputRect, const W
ebKit::WebTransformationMatrix& transformToRootTarget) | |
21 { | |
22 return make_scoped_ptr(new CCRenderPass(id, outputRect, transformToRootTarge
t)); | |
23 } | |
24 | |
25 CCRenderPass::CCRenderPass(Id id, IntRect outputRect, const WebKit::WebTransform
ationMatrix& transformToRootTarget) | |
26 : m_id(id) | |
27 , m_transformToRootTarget(transformToRootTarget) | |
28 , m_outputRect(outputRect) | |
29 , m_hasTransparentBackground(true) | |
30 , m_hasOcclusionFromOutsideTargetSurface(false) | |
31 { | |
32 ASSERT(id.layerId > 0); | |
33 ASSERT(id.index >= 0); | |
34 } | |
35 | |
36 CCRenderPass::~CCRenderPass() | |
37 { | |
38 } | |
39 | |
40 scoped_ptr<CCRenderPass> CCRenderPass::copy(Id newId) const | |
41 { | |
42 ASSERT(newId != m_id); | |
43 | |
44 scoped_ptr<CCRenderPass> copyPass(create(newId, m_outputRect, m_transformToR
ootTarget)); | |
45 copyPass->setDamageRect(m_damageRect); | |
46 copyPass->setHasTransparentBackground(m_hasTransparentBackground); | |
47 copyPass->setHasOcclusionFromOutsideTargetSurface(m_hasOcclusionFromOutsideT
argetSurface); | |
48 copyPass->setFilters(m_filters); | |
49 copyPass->setBackgroundFilters(m_backgroundFilters); | |
50 return copyPass.Pass(); | |
51 } | |
52 | |
53 void CCRenderPass::appendQuadsForLayer(CCLayerImpl* layer, CCOcclusionTrackerImp
l* occlusionTracker, CCAppendQuadsData& appendQuadsData) | |
54 { | |
55 const bool forSurface = false; | |
56 CCQuadCuller quadCuller(m_quadList, m_sharedQuadStateList, layer, occlusionT
racker, layer->hasDebugBorders(), forSurface); | |
57 | |
58 layer->appendQuads(quadCuller, appendQuadsData); | |
59 } | |
60 | |
61 void CCRenderPass::appendQuadsForRenderSurfaceLayer(CCLayerImpl* layer, const CC
RenderPass* contributingRenderPass, CCOcclusionTrackerImpl* occlusionTracker, CC
AppendQuadsData& appendQuadsData) | |
62 { | |
63 const bool forSurface = true; | |
64 CCQuadCuller quadCuller(m_quadList, m_sharedQuadStateList, layer, occlusionT
racker, layer->hasDebugBorders(), forSurface); | |
65 | |
66 bool isReplica = false; | |
67 layer->renderSurface()->appendQuads(quadCuller, appendQuadsData, isReplica,
contributingRenderPass->id()); | |
68 | |
69 // Add replica after the surface so that it appears below the surface. | |
70 if (layer->hasReplica()) { | |
71 isReplica = true; | |
72 layer->renderSurface()->appendQuads(quadCuller, appendQuadsData, isRepli
ca, contributingRenderPass->id()); | |
73 } | |
74 } | |
75 | |
76 void CCRenderPass::appendQuadsToFillScreen(CCLayerImpl* rootLayer, SkColor scree
nBackgroundColor, const CCOcclusionTrackerImpl& occlusionTracker) | |
77 { | |
78 if (!rootLayer || !screenBackgroundColor) | |
79 return; | |
80 | |
81 Region fillRegion = occlusionTracker.computeVisibleRegionInScreen(); | |
82 if (fillRegion.isEmpty()) | |
83 return; | |
84 | |
85 bool forSurface = false; | |
86 CCQuadCuller quadCuller(m_quadList, m_sharedQuadStateList, rootLayer, &occlu
sionTracker, rootLayer->hasDebugBorders(), forSurface); | |
87 | |
88 // Manually create the quad state for the gutter quads, as the root layer | |
89 // doesn't have any bounds and so can't generate this itself. | |
90 // FIXME: Make the gutter quads generated by the solid color layer (make it
smarter about generating quads to fill unoccluded areas). | |
91 IntRect rootTargetRect = rootLayer->renderSurface()->contentRect(); | |
92 float opacity = 1; | |
93 bool opaque = true; | |
94 CCSharedQuadState* sharedQuadState = quadCuller.useSharedQuadState(CCSharedQ
uadState::create(rootLayer->drawTransform(), rootTargetRect, rootTargetRect, opa
city, opaque)); | |
95 ASSERT(rootLayer->screenSpaceTransform().isInvertible()); | |
96 WebTransformationMatrix transformToLayerSpace = rootLayer->screenSpaceTransf
orm().inverse(); | |
97 Vector<WebCore::IntRect> fillRects = fillRegion.rects(); | |
98 for (size_t i = 0; i < fillRects.size(); ++i) { | |
99 // The root layer transform is composed of translations and scales only,
no perspective, so mapping is sufficient. | |
100 IntRect layerRect = CCMathUtil::mapClippedRect(transformToLayerSpace, cc
::IntRect(fillRects[i])); | |
101 // Skip the quad culler and just append the quads directly to avoid occl
usion checks. | |
102 m_quadList.append(CCSolidColorDrawQuad::create(sharedQuadState, layerRec
t, screenBackgroundColor).PassAs<CCDrawQuad>()); | |
103 } | |
104 } | |
105 | |
106 } // namespace cc | |
OLD | NEW |