bitmap_content_layer_updater.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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( 58 const gfx::Rect& content_rect, 59 const gfx::Size& tile_size, 60 float contents_width_scale, 61 float contents_height_scale, 62 gfx::Rect* resulting_opaque_rect) { 63 if (canvas_size_ != content_rect.size()) { 64 devtools_instrumentation::ScopedLayerTask paint_setup( 65 devtools_instrumentation::kPaintSetup, layer_id_); 66 canvas_size_ = content_rect.size(); 67 bitmap_backing_.allocN32Pixels( 68 canvas_size_.width(), canvas_size_.height(), layer_is_opaque_); 69 canvas_ = skia::AdoptRef(new SkCanvas(bitmap_backing_)); 70 } 71 72 base::TimeTicks start_time = 73 rendering_stats_instrumentation_->StartRecording(); 74 PaintContents(canvas_.get(), 75 content_rect.origin(), 76 contents_width_scale, 77 contents_height_scale, 78 resulting_opaque_rect); 79 base::TimeDelta duration = 80 rendering_stats_instrumentation_->EndRecording(start_time); 81 rendering_stats_instrumentation_->AddPaint( 82 duration, 83 content_rect.width() * content_rect.height()); 84} 85 86void BitmapContentLayerUpdater::UpdateTexture(ResourceUpdateQueue* queue, 87 PrioritizedResource* texture, 88 const gfx::Rect& source_rect, 89 const gfx::Vector2d& dest_offset, 90 bool partial_update) { 91 CHECK(canvas_); 92 ResourceUpdate upload = ResourceUpdate::Create(texture, 93 &bitmap_backing_, 94 content_rect(), 95 source_rect, 96 dest_offset); 97 if (partial_update) 98 queue->AppendPartialUpload(upload); 99 else 100 queue->AppendFullUpload(upload); 101} 102 103void BitmapContentLayerUpdater::ReduceMemoryUsage() { 104 canvas_.clear(); 105 canvas_size_ = gfx::Size(); 106} 107 108void BitmapContentLayerUpdater::SetOpaque(bool opaque) { 109 if (opaque != layer_is_opaque_) { 110 canvas_.clear(); 111 canvas_size_ = gfx::Size(); 112 } 113 114 ContentLayerUpdater::SetOpaque(opaque); 115} 116 117} // namespace cc 118