Implement android_webview url intercepting.
[chromium-blink-merge.git] / cc / quad_culler.cc
blob3a7c96cdced6d99ecb7fc8e80340a56790ce8e3c
1 // Copyright 2012 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.
5 #include "config.h"
7 #include "CCQuadCuller.h"
9 #include "CCAppendQuadsData.h"
10 #include "CCDebugBorderDrawQuad.h"
11 #include "CCLayerImpl.h"
12 #include "CCOcclusionTracker.h"
13 #include "CCOverdrawMetrics.h"
14 #include "CCRenderPass.h"
15 #include "Region.h"
16 #include "third_party/skia/include/core/SkColor.h"
17 #include <public/WebTransformationMatrix.h>
19 using namespace std;
21 namespace cc {
23 static const int debugTileBorderWidth = 1;
24 static const int debugTileBorderAlpha = 120;
25 static const int debugTileBorderColorRed = 160;
26 static const int debugTileBorderColorGreen = 100;
27 static const int debugTileBorderColorBlue = 0;
29 CCQuadCuller::CCQuadCuller(CCQuadList& quadList, CCSharedQuadStateList& sharedQuadStateList, CCLayerImpl* layer, const CCOcclusionTrackerImpl* occlusionTracker, bool showCullingWithDebugBorderQuads, bool forSurface)
30 : m_quadList(quadList)
31 , m_sharedQuadStateList(sharedQuadStateList)
32 , m_currentSharedQuadState(0)
33 , m_layer(layer)
34 , m_occlusionTracker(occlusionTracker)
35 , m_showCullingWithDebugBorderQuads(showCullingWithDebugBorderQuads)
36 , m_forSurface(forSurface)
40 CCSharedQuadState* CCQuadCuller::useSharedQuadState(scoped_ptr<CCSharedQuadState> sharedQuadState)
42 sharedQuadState->id = m_sharedQuadStateList.size();
44 // FIXME: If all quads are culled for the sharedQuadState, we can drop it from the list.
45 m_currentSharedQuadState = sharedQuadState.get();
46 m_sharedQuadStateList.append(sharedQuadState.Pass());
47 return m_currentSharedQuadState;
50 static inline bool appendQuadInternal(scoped_ptr<CCDrawQuad> drawQuad, const IntRect& culledRect, CCQuadList& quadList, const CCOcclusionTrackerImpl& occlusionTracker, bool createDebugBorderQuads)
52 bool keepQuad = !culledRect.isEmpty();
53 if (keepQuad)
54 drawQuad->setQuadVisibleRect(culledRect);
56 occlusionTracker.overdrawMetrics().didCullForDrawing(drawQuad->quadTransform(), drawQuad->quadRect(), culledRect);
57 occlusionTracker.overdrawMetrics().didDraw(drawQuad->quadTransform(), culledRect, drawQuad->opaqueRect());
59 if (keepQuad) {
60 if (createDebugBorderQuads && !drawQuad->isDebugQuad() && drawQuad->quadVisibleRect() != drawQuad->quadRect()) {
61 SkColor borderColor = SkColorSetARGB(debugTileBorderAlpha, debugTileBorderColorRed, debugTileBorderColorGreen, debugTileBorderColorBlue);
62 quadList.append(CCDebugBorderDrawQuad::create(drawQuad->sharedQuadState(), drawQuad->quadVisibleRect(), borderColor, debugTileBorderWidth).PassAs<CCDrawQuad>());
65 // Pass the quad after we're done using it.
66 quadList.append(drawQuad.Pass());
68 return keepQuad;
71 bool CCQuadCuller::append(scoped_ptr<CCDrawQuad> drawQuad, CCAppendQuadsData& appendQuadsData)
73 ASSERT(drawQuad->sharedQuadState() == m_currentSharedQuadState);
74 ASSERT(drawQuad->sharedQuadStateId() == m_currentSharedQuadState->id);
75 ASSERT(!m_sharedQuadStateList.isEmpty());
76 ASSERT(m_sharedQuadStateList.last() == m_currentSharedQuadState);
78 IntRect culledRect;
79 bool hasOcclusionFromOutsideTargetSurface;
81 if (m_forSurface)
82 culledRect = m_occlusionTracker->unoccludedContributingSurfaceContentRect(m_layer, false, drawQuad->quadRect(), &hasOcclusionFromOutsideTargetSurface);
83 else
84 culledRect = m_occlusionTracker->unoccludedContentRect(m_layer, drawQuad->quadRect(), &hasOcclusionFromOutsideTargetSurface);
86 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclusionFromOutsideTargetSurface;
88 return appendQuadInternal(drawQuad.Pass(), culledRect, m_quadList, *m_occlusionTracker, m_showCullingWithDebugBorderQuads);
91 } // namespace cc