#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "cc/CCQuadCuller.h"
#include "Region.h"
#include "TransformationMatrix.h"
#include "cc/CCLayerImpl.h"
#include "cc/CCOverdrawMetrics.h"
#include "cc/CCRenderPass.h"
#include "cc/CCRenderSurfaceDrawQuad.h"
using namespace std;
namespace WebCore {
CCQuadCuller::CCQuadCuller(CCQuadList& quadList, CCLayerImpl* layer, const CCOcclusionTrackerImpl* occlusionTracker)
: m_quadList(quadList)
, m_layer(layer)
, m_occlusionTracker(occlusionTracker)
{
}
static inline bool appendQuadInternal(PassOwnPtr<CCDrawQuad> passDrawQuad, const IntRect& culledRect, CCQuadList& quadList, const CCOcclusionTrackerImpl& occlusionTracker)
{
OwnPtr<CCDrawQuad> drawQuad(passDrawQuad);
bool keepQuad = !culledRect.isEmpty();
if (keepQuad)
drawQuad->setQuadVisibleRect(culledRect);
occlusionTracker.overdrawMetrics().didCullForDrawing(drawQuad->quadTransform(), drawQuad->quadRect(), culledRect);
occlusionTracker.overdrawMetrics().didDraw(drawQuad->quadTransform(), culledRect, drawQuad->opaqueRect());
if (keepQuad)
quadList.append(drawQuad.release());
return keepQuad;
}
bool CCQuadCuller::append(PassOwnPtr<CCDrawQuad> passDrawQuad)
{
IntRect culledRect = m_occlusionTracker->unoccludedContentRect(m_layer, passDrawQuad->quadRect());
return appendQuadInternal(passDrawQuad, culledRect, m_quadList, *m_occlusionTracker);
}
bool CCQuadCuller::appendSurface(PassOwnPtr<CCDrawQuad> passDrawQuad)
{
IntRect culledRect = m_occlusionTracker->unoccludedContributingSurfaceContentRect(m_layer->renderSurface(), false, passDrawQuad->quadRect());
return appendQuadInternal(passDrawQuad, culledRect, m_quadList, *m_occlusionTracker);
}
bool CCQuadCuller::appendReplica(PassOwnPtr<CCDrawQuad> passDrawQuad)
{
IntRect culledRect = m_occlusionTracker->unoccludedContributingSurfaceContentRect(m_layer->renderSurface(), true, passDrawQuad->quadRect());
return appendQuadInternal(passDrawQuad, culledRect, m_quadList, *m_occlusionTracker);
}
} #endif // USE(ACCELERATED_COMPOSITING)