diff options
Diffstat (limited to 'chromium/cc/layers/image_layer.cc')
-rw-r--r-- | chromium/cc/layers/image_layer.cc | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/chromium/cc/layers/image_layer.cc b/chromium/cc/layers/image_layer.cc new file mode 100644 index 00000000000..8ba1908131d --- /dev/null +++ b/chromium/cc/layers/image_layer.cc @@ -0,0 +1,96 @@ +// Copyright 2010 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 "cc/layers/image_layer.h" + +#include "base/compiler_specific.h" +#include "cc/resources/image_layer_updater.h" +#include "cc/resources/layer_updater.h" +#include "cc/resources/prioritized_resource.h" +#include "cc/resources/resource_update_queue.h" +#include "cc/trees/layer_tree_host.h" + +namespace cc { + +scoped_refptr<ImageLayer> ImageLayer::Create() { + return make_scoped_refptr(new ImageLayer()); +} + +ImageLayer::ImageLayer() : TiledLayer() {} + +ImageLayer::~ImageLayer() {} + +void ImageLayer::SetBitmap(const SkBitmap& bitmap) { + // SetBitmap() currently gets called whenever there is any + // style change that affects the layer even if that change doesn't + // affect the actual contents of the image (e.g. a CSS animation). + // With this check in place we avoid unecessary texture uploads. + if (bitmap.pixelRef() && bitmap.pixelRef() == bitmap_.pixelRef()) + return; + + bitmap_ = bitmap; + SetNeedsDisplay(); +} + +void ImageLayer::SetTexturePriorities(const PriorityCalculator& priority_calc) { + // Update the tile data before creating all the layer's tiles. + UpdateTileSizeAndTilingOption(); + + TiledLayer::SetTexturePriorities(priority_calc); +} + +bool ImageLayer::Update(ResourceUpdateQueue* queue, + const OcclusionTracker* occlusion) { + CreateUpdaterIfNeeded(); + if (!updater_->UsingBitmap(bitmap_)) { + updater_->SetBitmap(bitmap_); + UpdateTileSizeAndTilingOption(); + InvalidateContentRect(gfx::Rect(content_bounds())); + } + return TiledLayer::Update(queue, occlusion); +} + +void ImageLayer::CreateUpdaterIfNeeded() { + if (updater_.get()) + return; + + updater_ = ImageLayerUpdater::Create(); + GLenum texture_format = + layer_tree_host()->GetRendererCapabilities().best_texture_format; + SetTextureFormat(texture_format); +} + +LayerUpdater* ImageLayer::Updater() const { + return updater_.get(); +} + +void ImageLayer::CalculateContentsScale(float ideal_contents_scale, + float device_scale_factor, + float page_scale_factor, + bool animating_transform_to_screen, + float* contents_scale_x, + float* contents_scale_y, + gfx::Size* content_bounds) { + *contents_scale_x = ImageContentsScaleX(); + *contents_scale_y = ImageContentsScaleY(); + *content_bounds = gfx::Size(bitmap_.width(), bitmap_.height()); +} + +bool ImageLayer::DrawsContent() const { + return !bitmap_.isNull() && TiledLayer::DrawsContent(); +} + +float ImageLayer::ImageContentsScaleX() const { + if (bounds().IsEmpty() || bitmap_.width() == 0) + return 1; + return static_cast<float>(bitmap_.width()) / bounds().width(); +} + +float ImageLayer::ImageContentsScaleY() const { + if (bounds().IsEmpty() || bitmap_.height() == 0) + return 1; + return static_cast<float>(bitmap_.height()) / bounds().height(); +} + +} // namespace cc |