// Copyright 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "config.h" #include "CCTextureLayerImpl.h" #include "base/stringprintf.h" #include "CCQuadSink.h" #include "CCRenderer.h" #include "CCTextureDrawQuad.h" namespace cc { CCTextureLayerImpl::CCTextureLayerImpl(int id) : CCLayerImpl(id) , m_textureId(0) , m_externalTextureResource(0) , m_premultipliedAlpha(true) , m_flipped(true) , m_uvRect(0, 0, 1, 1) { } CCTextureLayerImpl::~CCTextureLayerImpl() { } void CCTextureLayerImpl::willDraw(CCResourceProvider* resourceProvider) { if (!m_textureId) return; DCHECK(!m_externalTextureResource); m_externalTextureResource = resourceProvider->createResourceFromExternalTexture(m_textureId); } void CCTextureLayerImpl::appendQuads(CCQuadSink& quadSink, CCAppendQuadsData& appendQuadsData) { if (!m_externalTextureResource) return; CCSharedQuadState* sharedQuadState = quadSink.useSharedQuadState(createSharedQuadState()); appendDebugBorderQuad(quadSink, sharedQuadState, appendQuadsData); IntRect quadRect(IntPoint(), contentBounds()); quadSink.append(CCTextureDrawQuad::create(sharedQuadState, quadRect, m_externalTextureResource, m_premultipliedAlpha, m_uvRect, m_flipped).PassAs(), appendQuadsData); } void CCTextureLayerImpl::didDraw(CCResourceProvider* resourceProvider) { if (!m_externalTextureResource) return; // FIXME: the following assert will not be true when sending resources to a // parent compositor. A synchronization scheme (double-buffering or // pipelining of updates) for the client will need to exist to solve this. DCHECK(!resourceProvider->inUseByConsumer(m_externalTextureResource)); resourceProvider->deleteResource(m_externalTextureResource); m_externalTextureResource = 0; } void CCTextureLayerImpl::dumpLayerProperties(std::string* str, int indent) const { str->append(indentString(indent)); base::StringAppendF(str, "texture layer texture id: %u premultiplied: %d\n", m_textureId, m_premultipliedAlpha); CCLayerImpl::dumpLayerProperties(str, indent); } void CCTextureLayerImpl::didLoseContext() { m_textureId = 0; m_externalTextureResource = 0; } const char* CCTextureLayerImpl::layerTypeAsString() const { return "TextureLayer"; } }