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) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::Resource::Resource( 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BitmapSkPictureContentLayerUpdater* updater, 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ContentLayerUpdater::Resource(texture.Pass()), updater_(updater) {} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BitmapSkPictureContentLayerUpdater::Resource::Update( 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdateQueue* queue, 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& source_rect, 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Vector2d& dest_offset, 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool partial_update) { 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkAlphaType at = 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) updater_->layer_is_opaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bitmap_.allocPixels(SkImageInfo::Make( 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_rect.width(), source_rect.height(), kN32_SkColorType, at)); 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkCanvas canvas(bitmap_); 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch updater_->PaintContentsRect(&canvas, source_rect); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture(), &bitmap_, source_rect, source_rect, dest_offset); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (partial_update) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendPartialUpload(upload); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendFullUpload(upload); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<BitmapSkPictureContentLayerUpdater> 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::Create( 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerPainter> painter, 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation, 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int layer_id) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_refptr( 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new BitmapSkPictureContentLayerUpdater(painter.Pass(), 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) stats_instrumentation, 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_id)); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::BitmapSkPictureContentLayerUpdater( 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<LayerPainter> painter, 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* stats_instrumentation, 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int layer_id) 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : SkPictureContentLayerUpdater(painter.Pass(), 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) stats_instrumentation, 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer_id) {} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::~BitmapSkPictureContentLayerUpdater() {} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerUpdater::Resource> 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BitmapSkPictureContentLayerUpdater::CreateResource( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager* manager) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<LayerUpdater::Resource>( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new Resource(this, PrioritizedResource::Create(manager))); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BitmapSkPictureContentLayerUpdater::PaintContentsRect( 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkCanvas* canvas, 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& source_rect) { 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!canvas) 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Translate the origin of content_rect to that of source_rect. 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci canvas->translate(paint_rect().x() - source_rect.x(), 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paint_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, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source_rect.width() * source_rect.height()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 88