bitmap_skpicture_content_layer_updater.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/bitmap_skpicture_content_layer_updater.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/layer_painter.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkDevice.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::Resource::Resource( 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BitmapSkPictureContentLayerUpdater* updater, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ContentLayerUpdater::Resource(texture.Pass()), updater_(updater) {} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BitmapSkPictureContentLayerUpdater::Resource::Update( 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdateQueue* queue, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect source_rect, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d dest_offset, 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool partial_update) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_.setConfig( 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap::kARGB_8888_Config, source_rect.width(), source_rect.height()); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_.allocPixels(); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_.setIsOpaque(updater_->layer_is_opaque()); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkDevice device(bitmap_); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkCanvas canvas(&device); 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch updater_->PaintContentsRect(&canvas, source_rect); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture(), &bitmap_, source_rect, source_rect, dest_offset); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (partial_update) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendPartialUpload(upload); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendFullUpload(upload); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<BitmapSkPictureContentLayerUpdater> 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::Create( 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerPainter> painter, 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation, 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int layer_id) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_refptr( 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new BitmapSkPictureContentLayerUpdater(painter.Pass(), 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) stats_instrumentation, 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_id)); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::BitmapSkPictureContentLayerUpdater( 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerPainter> painter, 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation, 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int layer_id) 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : SkPictureContentLayerUpdater(painter.Pass(), 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) stats_instrumentation, 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_id) {} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::~BitmapSkPictureContentLayerUpdater() {} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerUpdater::Resource> 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::CreateResource( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager* manager) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<LayerUpdater::Resource>( 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new Resource(this, PrioritizedResource::Create(manager))); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BitmapSkPictureContentLayerUpdater::PaintContentsRect( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkCanvas* canvas, 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect source_rect) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Translate the origin of content_rect to that of source_rect. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->translate(content_rect().x() - source_rect.x(), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect().y() - source_rect.y()); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeTicks start_time = 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_instrumentation_->StartRecording(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DrawPicture(canvas); 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta duration = 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_instrumentation_->EndRecording(start_time); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rendering_stats_instrumentation_->AddRaster( 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch duration, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch duration, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source_rect.width() * source_rect.height(), 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 90