Index: cc/DecorationLayerChromium.cpp |
diff --git a/cc/DecorationLayerChromium.cpp b/cc/DecorationLayerChromium.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6f9d48744da26486b5b609c6a23f4a3bb50a6697 |
--- /dev/null |
+++ b/cc/DecorationLayerChromium.cpp |
@@ -0,0 +1,158 @@ |
+// Copyright 2012 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 "DecorationLayerChromium.h" |
+ |
+#include "CCLayerTreeHost.h" |
+#include "CCDecorationLayerImpl.h" |
+#include "CCTextureUpdateQueue.h" |
+#include "LayerTextureUpdater.h" |
+#include "PlatformColor.h" |
+#include "TextureUploader.h" |
+ |
+namespace cc { |
+ |
+class DecorationLayerTextureUpdater : public LayerTextureUpdater { |
+public: |
+ class Texture : public LayerTextureUpdater::Texture { |
+ public: |
+ Texture(DecorationLayerTextureUpdater* textureUpdater, scoped_ptr<CCPrioritizedTexture> texture) |
+ : LayerTextureUpdater::Texture(texture.Pass()) |
+ , m_textureUpdater(textureUpdater) |
+ { |
+ } |
+ |
+ virtual void update(CCTextureUpdateQueue& queue, const IntRect& sourceRect, const IntSize& destOffset, bool partialUpdate, CCRenderingStats&) OVERRIDE |
+ { |
+ } |
+ |
+ private: |
+ DecorationLayerTextureUpdater* textureUpdater() { return m_textureUpdater; } |
+ |
+ DecorationLayerTextureUpdater* m_textureUpdater; |
+ }; |
+ |
+ static PassRefPtr<DecorationLayerTextureUpdater> create() |
+ { |
+ return adoptRef(new DecorationLayerTextureUpdater()); |
+ } |
+ |
+ virtual ~DecorationLayerTextureUpdater() { } |
+ |
+ virtual PassOwnPtr<LayerTextureUpdater::Texture> createTexture(CCPrioritizedTextureManager* manager) |
+ { |
+ ASSERT(!m_bitmap.isNull()); |
+ |
+ scoped_ptr<CCPrioritizedTexture> texture = CCPrioritizedTexture::create(manager); |
+ return adoptPtr(new Texture(this, texture.Pass())); |
+ } |
+ |
+ virtual SampledTexelFormat sampledTexelFormat(GC3Denum textureFormat) OVERRIDE |
+ { |
+ return PlatformColor::sameComponentOrder(textureFormat) ? |
+ LayerTextureUpdater::SampledTexelFormatRGBA : LayerTextureUpdater::SampledTexelFormatBGRA; |
+ } |
+ |
+ void setBitmap(const SkBitmap& bitmap) |
+ { |
+ m_bitmap = bitmap; |
+ } |
+ |
+private: |
+ DecorationLayerTextureUpdater() { } |
+ SkBitmap m_bitmap; |
+}; |
+ |
+scoped_refptr<DecorationLayerChromium> DecorationLayerChromium::create() |
+{ |
+ return make_scoped_refptr(new DecorationLayerChromium()); |
+} |
+ |
+DecorationLayerChromium::DecorationLayerChromium() |
+ : LayerChromium() |
+ , m_bitmapDirty(false) |
+{ |
+} |
+ |
+DecorationLayerChromium::~DecorationLayerChromium() |
+{ |
+} |
+ |
+scoped_ptr<CCLayerImpl> DecorationLayerChromium::createCCLayerImpl() |
+{ |
+ return CCDecorationLayerImpl::create(id()).PassAs<CCLayerImpl>(); |
+} |
+ |
+void DecorationLayerChromium::setTexturePriorities(const CCPriorityCalculator& priorityCalc) |
+{ |
+ if (m_needsDisplay && m_bitmapDirty && drawsContent()) { |
+ ASSERT(!m_bitmap.isNull()); |
+ createTextureUpdaterIfNeeded(); |
+ m_textureUpdater->setBitmap(m_bitmap); |
+ m_needsDisplay = false; |
+ |
+ if (!m_texture.get()) |
+ m_texture = m_textureUpdater->createTexture(layerTreeHost()->contentsTextureManager()); |
+ } |
+ |
+ if (m_texture.get()) { |
+ m_texture->texture()->setRequestPriority(CCPriorityCalculator::uiPriority(true)); |
+ // FIXME: Need to support swizzle in the shader for !PlatformColor::sameComponentOrder(textureFormat) |
+ GC3Denum textureFormat = layerTreeHost()->rendererCapabilities().bestTextureFormat; |
+ m_texture->texture()->setDimensions(IntSize(m_bitmap.width(), m_bitmap.height()), textureFormat); |
+ } |
+} |
+ |
+void DecorationLayerChromium::setBitmap(const SkBitmap& bitmap, const IntRect& aperture) { |
+ m_bitmap = bitmap; |
+ m_imageAperture = aperture; |
+ m_bitmapDirty = true; |
+ setNeedsDisplay(); |
+} |
+ |
+void DecorationLayerChromium::update(CCTextureUpdateQueue& queue, const CCOcclusionTracker* occlusion, CCRenderingStats& stats) |
+{ |
+ createTextureUpdaterIfNeeded(); |
+ |
+ // FIXME: Or should this query backingResourceWasEvicted()? |
+ if (m_texture.get() && (m_bitmapDirty || !m_texture->texture()->haveBackingTexture())) { |
+ IntRect contentRect = IntRect(IntPoint(), IntSize(m_bitmap.width(), m_bitmap.height())); |
+ TextureUploader::Parameters upload = { m_texture->texture(), &m_bitmap, NULL, { contentRect, contentRect, IntSize() } }; |
+ queue.appendFullUpload(upload); |
+ m_bitmapDirty = false; |
+ } |
+} |
+ |
+void DecorationLayerChromium::createTextureUpdaterIfNeeded() |
+{ |
+ if (m_textureUpdater) |
+ return; |
+ |
+ m_textureUpdater = DecorationLayerTextureUpdater::create(); |
+} |
+ |
+bool DecorationLayerChromium::drawsContent() const |
+{ |
+ bool draws = !m_bitmap.isNull() && LayerChromium::drawsContent() && m_bitmap.width() && m_bitmap.height(); |
+ return draws; |
+} |
+ |
+bool DecorationLayerChromium::needsContentsScale() const |
+{ |
+ return false; |
+} |
+ |
+void DecorationLayerChromium::pushPropertiesTo(CCLayerImpl* layer) |
+{ |
+ LayerChromium::pushPropertiesTo(layer); |
+ CCDecorationLayerImpl* layerImpl = static_cast<CCDecorationLayerImpl*>(layer); |
+ |
+ if (m_texture.get()) |
+ layerImpl->setResourceId(m_texture->texture()->resourceId()); |
+ layerImpl->setDecorationLayout(IntSize(m_bitmap.width(), m_bitmap.height()), m_imageAperture); |
+} |
+ |
+} |