1// Copyright 2011 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/resources/bitmap_content_layer_updater.h" 6 7#include "cc/debug/devtools_instrumentation.h" 8#include "cc/debug/rendering_stats_instrumentation.h" 9#include "cc/resources/layer_painter.h" 10#include "cc/resources/prioritized_resource.h" 11#include "cc/resources/resource_update.h" 12#include "cc/resources/resource_update_queue.h" 13#include "skia/ext/platform_canvas.h" 14 15namespace cc { 16 17BitmapContentLayerUpdater::Resource::Resource( 18 BitmapContentLayerUpdater* updater, 19 scoped_ptr<PrioritizedResource> texture) 20 : LayerUpdater::Resource(texture.Pass()), updater_(updater) {} 21 22BitmapContentLayerUpdater::Resource::~Resource() {} 23 24void BitmapContentLayerUpdater::Resource::Update( 25 ResourceUpdateQueue* queue, 26 const gfx::Rect& source_rect, 27 const gfx::Vector2d& dest_offset, 28 bool partial_update) { 29 updater_->UpdateTexture( 30 queue, texture(), source_rect, dest_offset, partial_update); 31} 32 33scoped_refptr<BitmapContentLayerUpdater> BitmapContentLayerUpdater::Create( 34 scoped_ptr<LayerPainter> painter, 35 RenderingStatsInstrumentation* stats_instrumentation, 36 int layer_id) { 37 return make_scoped_refptr( 38 new BitmapContentLayerUpdater(painter.Pass(), 39 stats_instrumentation, 40 layer_id)); 41} 42 43BitmapContentLayerUpdater::BitmapContentLayerUpdater( 44 scoped_ptr<LayerPainter> painter, 45 RenderingStatsInstrumentation* stats_instrumentation, 46 int layer_id) 47 : ContentLayerUpdater(painter.Pass(), stats_instrumentation, layer_id) {} 48 49BitmapContentLayerUpdater::~BitmapContentLayerUpdater() {} 50 51scoped_ptr<LayerUpdater::Resource> BitmapContentLayerUpdater::CreateResource( 52 PrioritizedResourceManager* manager) { 53 return scoped_ptr<LayerUpdater::Resource>( 54 new Resource(this, PrioritizedResource::Create(manager))); 55} 56 57void BitmapContentLayerUpdater::PrepareToUpdate(const gfx::Size& content_size, 58 const gfx::Rect& paint_rect, 59 const gfx::Size& tile_size, 60 float contents_width_scale, 61 float contents_height_scale) { 62 if (canvas_size_ != paint_rect.size()) { 63 devtools_instrumentation::ScopedLayerTask paint_setup( 64 devtools_instrumentation::kPaintSetup, layer_id_); 65 canvas_size_ = paint_rect.size(); 66 bitmap_backing_.allocN32Pixels( 67 canvas_size_.width(), canvas_size_.height(), layer_is_opaque_); 68 // TODO(danak): Remove when skia does the check for us: crbug.com/360384 69 canvas_ = skia::AdoptRef(new SkCanvas(bitmap_backing_)); 70 DCHECK_EQ(paint_rect.width(), canvas_->getBaseLayerSize().width()); 71 DCHECK_EQ(paint_rect.height(), canvas_->getBaseLayerSize().height()); 72 } 73 74 base::TimeTicks start_time = 75 rendering_stats_instrumentation_->StartRecording(); 76 PaintContents(canvas_.get(), 77 content_size, 78 paint_rect, 79 contents_width_scale, 80 contents_height_scale); 81 base::TimeDelta duration = 82 rendering_stats_instrumentation_->EndRecording(start_time); 83 rendering_stats_instrumentation_->AddPaint( 84 duration, paint_rect.width() * paint_rect.height()); 85} 86 87void BitmapContentLayerUpdater::UpdateTexture(ResourceUpdateQueue* queue, 88 PrioritizedResource* texture, 89 const gfx::Rect& source_rect, 90 const gfx::Vector2d& dest_offset, 91 bool partial_update) { 92 CHECK(canvas_); 93 ResourceUpdate upload = ResourceUpdate::Create( 94 texture, &bitmap_backing_, paint_rect(), source_rect, dest_offset); 95 if (partial_update) 96 queue->AppendPartialUpload(upload); 97 else 98 queue->AppendFullUpload(upload); 99} 100 101void BitmapContentLayerUpdater::ReduceMemoryUsage() { 102 canvas_.clear(); 103 canvas_size_ = gfx::Size(); 104} 105 106void BitmapContentLayerUpdater::SetOpaque(bool opaque) { 107 if (opaque != layer_is_opaque_) { 108 canvas_.clear(); 109 canvas_size_ = gfx::Size(); 110 } 111 112 ContentLayerUpdater::SetOpaque(opaque); 113} 114 115} // namespace cc 116