Index: cc/nine_patch_layer.cc |
diff --git a/cc/nine_patch_layer.cc b/cc/nine_patch_layer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ad31742a094364aee92b1752af3906d5f533a4f |
--- /dev/null |
+++ b/cc/nine_patch_layer.cc |
@@ -0,0 +1,99 @@ |
+// 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 "cc/nine_patch_layer.h" |
+ |
+#include "cc/layer_tree_host.h" |
+#include "cc/nine_patch_layer_impl.h" |
+#include "cc/resource_update.h" |
+#include "cc/resource_update_queue.h" |
+ |
+namespace cc { |
+ |
+scoped_refptr<NinePatchLayer> NinePatchLayer::create() |
+{ |
+ return make_scoped_refptr(new NinePatchLayer()); |
+} |
+ |
+NinePatchLayer::NinePatchLayer() |
+ : m_bitmapDirty(false) |
+{ |
+} |
+ |
+NinePatchLayer::~NinePatchLayer() |
+{ |
+} |
+ |
+scoped_ptr<LayerImpl> NinePatchLayer::createLayerImpl() |
+{ |
+ return NinePatchLayerImpl::create(id()).PassAs<LayerImpl>(); |
+} |
+ |
+void NinePatchLayer::setTexturePriorities(const PriorityCalculator& priorityCalc) |
+{ |
+ if (m_needsDisplay && m_bitmapDirty && drawsContent()) { |
+ DCHECK(!m_bitmap.isNull()); |
+ createUpdaterIfNeeded(); |
+ m_updater->setBitmap(m_bitmap); |
+ m_needsDisplay = false; |
+ |
+ if (!m_resource) |
+ m_resource = m_updater->createResource(layerTreeHost()->contentsTextureManager()); |
+ } |
+ |
+ if (m_resource) { |
+ m_resource->texture()->setRequestPriority(PriorityCalculator::uiPriority(true)); |
+ // FIXME: Need to support swizzle in the shader for !PlatformColor::sameComponentOrder(textureFormat) |
+ GLenum textureFormat = layerTreeHost()->rendererCapabilities().bestTextureFormat; |
+ m_resource->texture()->setDimensions(gfx::Size(m_bitmap.width(), m_bitmap.height()), textureFormat); |
+ } |
+} |
+ |
+void NinePatchLayer::setBitmap(const SkBitmap& bitmap, const gfx::Rect& aperture) { |
+ m_bitmap = bitmap; |
+ m_imageAperture = aperture; |
+ m_bitmapDirty = true; |
+ setNeedsDisplay(); |
+} |
+ |
+void NinePatchLayer::update(ResourceUpdateQueue& queue, const OcclusionTracker* occlusion, RenderingStats& stats) |
+{ |
+ createUpdaterIfNeeded(); |
+ |
+ if (m_resource && (m_bitmapDirty || m_resource->texture()->backingResourceWasEvicted())) { |
+ gfx::Rect contentRect(gfx::Point(), gfx::Size(m_bitmap.width(), m_bitmap.height())); |
+ ResourceUpdate upload = ResourceUpdate::Create(m_resource->texture(), &m_bitmap, contentRect, contentRect, gfx::Vector2d()); |
+ queue.appendFullUpload(upload); |
+ m_bitmapDirty = false; |
+ } |
+} |
+ |
+void NinePatchLayer::createUpdaterIfNeeded() |
+{ |
+ if (m_updater) |
+ return; |
+ |
+ m_updater = ImageLayerUpdater::create(); |
+} |
+ |
+bool NinePatchLayer::drawsContent() const |
+{ |
+ bool draws = !m_bitmap.isNull() && Layer::drawsContent() && m_bitmap.width() && m_bitmap.height(); |
+ return draws; |
+} |
+ |
+void NinePatchLayer::pushPropertiesTo(LayerImpl* layer) |
+{ |
+ Layer::pushPropertiesTo(layer); |
+ NinePatchLayerImpl* layerImpl = static_cast<NinePatchLayerImpl*>(layer); |
+ |
+ DCHECK(!m_bitmap.isNull()); |
+ DCHECK(m_resource); |
+ layerImpl->setResourceId(m_resource->texture()->resourceId()); |
+ layerImpl->setLayout(gfx::Size(m_bitmap.width(), m_bitmap.height()), m_imageAperture); |
+} |
+ |
+} |