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
,
35 RenderingStatsInstrumentation
* stats_instrumentation
,
37 return make_scoped_refptr(
38 new BitmapContentLayerUpdater(painter
.Pass(),
39 stats_instrumentation
,
43 BitmapContentLayerUpdater::BitmapContentLayerUpdater(
44 scoped_ptr
<LayerPainter
> painter
,
45 RenderingStatsInstrumentation
* stats_instrumentation
,
47 : ContentLayerUpdater(painter
.Pass(), stats_instrumentation
, layer_id
) {}
49 BitmapContentLayerUpdater::~BitmapContentLayerUpdater() {}
51 scoped_ptr
<LayerUpdater::Resource
> BitmapContentLayerUpdater::CreateResource(
52 PrioritizedResourceManager
* manager
) {
53 return scoped_ptr
<LayerUpdater::Resource
>(
54 new Resource(this, PrioritizedResource::Create(manager
)));
57 void BitmapContentLayerUpdater::PrepareToUpdate(
58 const gfx::Rect
& content_rect
,
59 const gfx::Size
& tile_size
,
60 float contents_width_scale
,
61 float contents_height_scale
,
62 gfx::Rect
* resulting_opaque_rect
) {
63 if (canvas_size_
!= content_rect
.size()) {
64 devtools_instrumentation::ScopedLayerTask
paint_setup(
65 devtools_instrumentation::kPaintSetup
, layer_id_
);
66 canvas_size_
= content_rect
.size();
67 bool alloc
= bitmap_backing_
.allocN32Pixels(
68 canvas_size_
.width(), canvas_size_
.height(), layer_is_opaque_
);
69 // TODO(danak): Remove when skia does the check for us: crbug.com/360384
71 canvas_
= skia::AdoptRef(new SkCanvas(bitmap_backing_
));
72 DCHECK_EQ(content_rect
.width(), canvas_
->getBaseLayerSize().width());
73 DCHECK_EQ(content_rect
.height(), canvas_
->getBaseLayerSize().height());
76 base::TimeTicks start_time
=
77 rendering_stats_instrumentation_
->StartRecording();
78 PaintContents(canvas_
.get(),
81 contents_height_scale
,
82 resulting_opaque_rect
);
83 base::TimeDelta duration
=
84 rendering_stats_instrumentation_
->EndRecording(start_time
);
85 rendering_stats_instrumentation_
->AddPaint(
87 content_rect
.width() * content_rect
.height());
90 void BitmapContentLayerUpdater::UpdateTexture(ResourceUpdateQueue
* queue
,
91 PrioritizedResource
* texture
,
92 const gfx::Rect
& source_rect
,
93 const gfx::Vector2d
& dest_offset
,
94 bool partial_update
) {
96 ResourceUpdate upload
= ResourceUpdate::Create(texture
,
102 queue
->AppendPartialUpload(upload
);
104 queue
->AppendFullUpload(upload
);
107 void BitmapContentLayerUpdater::ReduceMemoryUsage() {
109 canvas_size_
= gfx::Size();
112 void BitmapContentLayerUpdater::SetOpaque(bool opaque
) {
113 if (opaque
!= layer_is_opaque_
) {
115 canvas_size_
= gfx::Size();
118 ContentLayerUpdater::SetOpaque(opaque
);