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