// Copyright 2011 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/resources/bitmap_content_layer_updater.h" #include "cc/debug/devtools_instrumentation.h" #include "cc/debug/rendering_stats_instrumentation.h" #include "cc/resources/layer_painter.h" #include "cc/resources/prioritized_resource.h" #include "cc/resources/resource_update.h" #include "cc/resources/resource_update_queue.h" #include "skia/ext/platform_canvas.h" namespace cc { BitmapContentLayerUpdater::Resource::Resource( BitmapContentLayerUpdater* updater, scoped_ptr<PrioritizedResource> texture) : LayerUpdater::Resource(texture.Pass()), updater_(updater) {} BitmapContentLayerUpdater::Resource::~Resource() {} void BitmapContentLayerUpdater::Resource::Update( ResourceUpdateQueue* queue, const gfx::Rect& source_rect, const gfx::Vector2d& dest_offset, bool partial_update) { updater_->UpdateTexture( queue, texture(), source_rect, dest_offset, partial_update); } scoped_refptr<BitmapContentLayerUpdater> BitmapContentLayerUpdater::Create( scoped_ptr<LayerPainter> painter, RenderingStatsInstrumentation* stats_instrumentation, int layer_id) { return make_scoped_refptr( new BitmapContentLayerUpdater(painter.Pass(), stats_instrumentation, layer_id)); } BitmapContentLayerUpdater::BitmapContentLayerUpdater( scoped_ptr<LayerPainter> painter, RenderingStatsInstrumentation* stats_instrumentation, int layer_id) : ContentLayerUpdater(painter.Pass(), stats_instrumentation, layer_id) {} BitmapContentLayerUpdater::~BitmapContentLayerUpdater() {} scoped_ptr<LayerUpdater::Resource> BitmapContentLayerUpdater::CreateResource( PrioritizedResourceManager* manager) { return scoped_ptr<LayerUpdater::Resource>( new Resource(this, PrioritizedResource::Create(manager))); } void BitmapContentLayerUpdater::PrepareToUpdate( const gfx::Rect& content_rect, const gfx::Size& tile_size, float contents_width_scale, float contents_height_scale, gfx::Rect* resulting_opaque_rect) { if (canvas_size_ != content_rect.size()) { devtools_instrumentation::ScopedLayerTask paint_setup( devtools_instrumentation::kPaintSetup, layer_id_); canvas_size_ = content_rect.size(); bool alloc = bitmap_backing_.allocN32Pixels( canvas_size_.width(), canvas_size_.height(), layer_is_opaque_); // TODO(danak): Remove when skia does the check for us: crbug.com/360384 CHECK(alloc); canvas_ = skia::AdoptRef(new SkCanvas(bitmap_backing_)); DCHECK_EQ(content_rect.width(), canvas_->getBaseLayerSize().width()); DCHECK_EQ(content_rect.height(), canvas_->getBaseLayerSize().height()); } base::TimeTicks start_time = rendering_stats_instrumentation_->StartRecording(); PaintContents(canvas_.get(), content_rect, contents_width_scale, contents_height_scale, resulting_opaque_rect); base::TimeDelta duration = rendering_stats_instrumentation_->EndRecording(start_time); rendering_stats_instrumentation_->AddPaint( duration, content_rect.width() * content_rect.height()); } void BitmapContentLayerUpdater::UpdateTexture(ResourceUpdateQueue* queue, PrioritizedResource* texture, const gfx::Rect& source_rect, const gfx::Vector2d& dest_offset, bool partial_update) { CHECK(canvas_); ResourceUpdate upload = ResourceUpdate::Create(texture, &bitmap_backing_, content_rect(), source_rect, dest_offset); if (partial_update) queue->AppendPartialUpload(upload); else queue->AppendFullUpload(upload); } void BitmapContentLayerUpdater::ReduceMemoryUsage() { canvas_.clear(); canvas_size_ = gfx::Size(); } void BitmapContentLayerUpdater::SetOpaque(bool opaque) { if (opaque != layer_is_opaque_) { canvas_.clear(); canvas_size_ = gfx::Size(); } ContentLayerUpdater::SetOpaque(opaque); } } // namespace cc