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