image_layer.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1// Copyright 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/layers/image_layer.h"
6
7#include "base/compiler_specific.h"
8#include "cc/resources/image_layer_updater.h"
9#include "cc/resources/layer_updater.h"
10#include "cc/resources/prioritized_resource.h"
11#include "cc/resources/resource_update_queue.h"
12#include "cc/trees/layer_tree_host.h"
13
14namespace cc {
15
16scoped_refptr<ImageLayer> ImageLayer::Create() {
17  return make_scoped_refptr(new ImageLayer());
18}
19
20ImageLayer::ImageLayer() : TiledLayer() {}
21
22ImageLayer::~ImageLayer() {}
23
24void ImageLayer::SetBitmap(const SkBitmap& bitmap) {
25  // SetBitmap() currently gets called whenever there is any
26  // style change that affects the layer even if that change doesn't
27  // affect the actual contents of the image (e.g. a CSS animation).
28  // With this check in place we avoid unecessary texture uploads.
29  if (bitmap.pixelRef() && bitmap.pixelRef() == bitmap_.pixelRef())
30    return;
31
32  bitmap_ = bitmap;
33  SetNeedsDisplay();
34}
35
36void ImageLayer::SetTexturePriorities(const PriorityCalculator& priority_calc) {
37  // Update the tile data before creating all the layer's tiles.
38  UpdateTileSizeAndTilingOption();
39
40  TiledLayer::SetTexturePriorities(priority_calc);
41}
42
43void ImageLayer::Update(ResourceUpdateQueue* queue,
44                        const OcclusionTracker* occlusion,
45                        RenderingStats* stats) {
46  CreateUpdaterIfNeeded();
47  if (needs_display_) {
48    updater_->set_bitmap(bitmap_);
49    UpdateTileSizeAndTilingOption();
50    InvalidateContentRect(gfx::Rect(content_bounds()));
51    needs_display_ = false;
52  }
53  TiledLayer::Update(queue, occlusion, stats);
54}
55
56void ImageLayer::CreateUpdaterIfNeeded() {
57  if (updater_.get())
58    return;
59
60  updater_ = ImageLayerUpdater::Create();
61  GLenum texture_format =
62      layer_tree_host()->GetRendererCapabilities().best_texture_format;
63  SetTextureFormat(texture_format);
64}
65
66LayerUpdater* ImageLayer::Updater() const {
67  return updater_.get();
68}
69
70void ImageLayer::CalculateContentsScale(float ideal_contents_scale,
71                                        float device_scale_factor,
72                                        float page_scale_factor,
73                                        bool animating_transform_to_screen,
74                                        float* contents_scale_x,
75                                        float* contents_scale_y,
76                                        gfx::Size* content_bounds) {
77  *contents_scale_x = ImageContentsScaleX();
78  *contents_scale_y = ImageContentsScaleY();
79  *content_bounds = gfx::Size(bitmap_.width(), bitmap_.height());
80}
81
82bool ImageLayer::DrawsContent() const {
83  return !bitmap_.isNull() && TiledLayer::DrawsContent();
84}
85
86float ImageLayer::ImageContentsScaleX() const {
87  if (bounds().IsEmpty() || bitmap_.width() == 0)
88    return 1;
89  return static_cast<float>(bitmap_.width()) / bounds().width();
90}
91
92float ImageLayer::ImageContentsScaleY() const {
93  if (bounds().IsEmpty() || bitmap_.height() == 0)
94    return 1;
95  return static_cast<float>(bitmap_.height()) / bounds().height();
96}
97
98}  // namespace cc
99