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.
5 #include "cc/resources/bitmap_content_layer_updater.h"
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"
17 BitmapContentLayerUpdater::Resource::Resource(
18 BitmapContentLayerUpdater
* updater
,
19 scoped_ptr
<PrioritizedResource
> texture
)
20 : LayerUpdater::Resource(texture
.Pass()), updater_(updater
) {}
22 BitmapContentLayerUpdater::Resource::~Resource() {}
24 void 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
);
33 scoped_refptr
<BitmapContentLayerUpdater
> BitmapContentLayerUpdater::Create(
34 scoped_ptr
<LayerPainter
> painter
,
36 return make_scoped_refptr(
37 new BitmapContentLayerUpdater(painter
.Pass(),
41 BitmapContentLayerUpdater::BitmapContentLayerUpdater(
42 scoped_ptr
<LayerPainter
> painter
,
44 : ContentLayerUpdater(painter
.Pass(), layer_id
) {
47 BitmapContentLayerUpdater::~BitmapContentLayerUpdater() {}
49 scoped_ptr
<LayerUpdater::Resource
> BitmapContentLayerUpdater::CreateResource(
50 PrioritizedResourceManager
* manager
) {
51 return make_scoped_ptr(
52 new Resource(this, PrioritizedResource::Create(manager
)));
55 void BitmapContentLayerUpdater::PrepareToUpdate(const gfx::Size
& content_size
,
56 const gfx::Rect
& paint_rect
,
57 const gfx::Size
& tile_size
,
58 float contents_width_scale
,
59 float contents_height_scale
) {
60 if (canvas_size_
!= paint_rect
.size()) {
61 devtools_instrumentation::ScopedLayerTask
paint_setup(
62 devtools_instrumentation::kPaintSetup
, layer_id_
);
63 canvas_size_
= paint_rect
.size();
64 bitmap_backing_
.allocN32Pixels(
65 canvas_size_
.width(), canvas_size_
.height(), layer_is_opaque_
);
66 // TODO(danak): Remove when skia does the check for us: crbug.com/360384
67 canvas_
= skia::AdoptRef(new SkCanvas(bitmap_backing_
));
68 DCHECK_EQ(paint_rect
.width(), canvas_
->getBaseLayerSize().width());
69 DCHECK_EQ(paint_rect
.height(), canvas_
->getBaseLayerSize().height());
72 PaintContents(canvas_
.get(),
76 contents_height_scale
);
79 void BitmapContentLayerUpdater::UpdateTexture(ResourceUpdateQueue
* queue
,
80 PrioritizedResource
* texture
,
81 const gfx::Rect
& source_rect
,
82 const gfx::Vector2d
& dest_offset
,
83 bool partial_update
) {
85 ResourceUpdate upload
= ResourceUpdate::Create(
86 texture
, &bitmap_backing_
, paint_rect(), source_rect
, dest_offset
);
88 queue
->AppendPartialUpload(upload
);
90 queue
->AppendFullUpload(upload
);
93 void BitmapContentLayerUpdater::ReduceMemoryUsage() {
95 canvas_size_
= gfx::Size();
98 void BitmapContentLayerUpdater::SetOpaque(bool opaque
) {
99 if (opaque
!= layer_is_opaque_
) {
101 canvas_size_
= gfx::Size();
104 ContentLayerUpdater::SetOpaque(opaque
);