Chromium Code Reviews| 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..f4686cb9658859977fc9089d45473ec24215ab3c |
| --- /dev/null |
| +++ b/cc/nine_patch_layer.cc |
| @@ -0,0 +1,98 @@ |
| +// 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(IntSize(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.get() && (m_bitmapDirty || m_resource->texture()->backingResourceWasEvicted())) { |
|
jamesr
2012/11/05 23:10:53
just "if (m_resource && ...", no need for the .get
aelias_OOO_until_Jul13
2012/11/06 01:15:00
Changed to DCHECK anyway.
|
| + 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); |
| + |
| + if (m_resource) |
| + layerImpl->setResourceId(m_resource->texture()->resourceId()); |
| + layerImpl->setLayout(gfx::Size(m_bitmap.width(), m_bitmap.height()), m_imageAperture); |
| +} |
| + |
| +} |