1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/test/fake_content_layer_client.h"
#include "cc/playback/clip_display_item.h"
#include "cc/playback/display_item_list_settings.h"
#include "cc/playback/drawing_display_item.h"
#include "cc/playback/transform_display_item.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "ui/gfx/skia_util.h"
namespace cc {
FakeContentLayerClient::ImageData::ImageData(const SkImage* img,
const gfx::Point& point,
const SkPaint& paint)
: image(skia::SharePtr(img)), point(point), paint(paint) {}
FakeContentLayerClient::ImageData::ImageData(const SkImage* img,
const gfx::Transform& transform,
const SkPaint& paint)
: image(skia::SharePtr(img)), transform(transform), paint(paint) {}
FakeContentLayerClient::ImageData::~ImageData() {}
FakeContentLayerClient::FakeContentLayerClient()
: fill_with_nonsolid_color_(false),
last_canvas_(nullptr),
last_painting_control_(PAINTING_BEHAVIOR_NORMAL),
reported_memory_usage_(0) {}
FakeContentLayerClient::~FakeContentLayerClient() {
}
scoped_refptr<DisplayItemList>
FakeContentLayerClient::PaintContentsToDisplayList(
const gfx::Rect& clip,
PaintingControlSetting painting_control) {
// Cached picture is used because unit tests expect to be able to
// use GatherPixelRefs.
DisplayItemListSettings settings;
settings.use_cached_picture = true;
scoped_refptr<DisplayItemList> display_list =
DisplayItemList::Create(clip, settings);
SkPictureRecorder recorder;
skia::RefPtr<SkCanvas> canvas;
skia::RefPtr<SkPicture> picture;
auto* item = display_list->CreateAndAppendItem<ClipDisplayItem>();
item->SetNew(clip, std::vector<SkRRect>());
for (RectPaintVector::const_iterator it = draw_rects_.begin();
it != draw_rects_.end(); ++it) {
const gfx::RectF& draw_rect = it->first;
const SkPaint& paint = it->second;
canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectFToSkRect(draw_rect)));
canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint);
picture = skia::AdoptRef(recorder.endRecordingAsPicture());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>();
item->SetNew(std::move(picture));
}
for (ImageVector::const_iterator it = draw_images_.begin();
it != draw_images_.end(); ++it) {
if (!it->transform.IsIdentity()) {
auto* item = display_list->CreateAndAppendItem<TransformDisplayItem>();
item->SetNew(it->transform);
}
canvas = skia::SharePtr(
recorder.beginRecording(it->image->width(), it->image->height()));
canvas->drawImage(it->image.get(), it->point.x(), it->point.y(),
&it->paint);
picture = skia::AdoptRef(recorder.endRecordingAsPicture());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>();
item->SetNew(std::move(picture));
if (!it->transform.IsIdentity()) {
display_list->CreateAndAppendItem<EndTransformDisplayItem>();
}
}
if (fill_with_nonsolid_color_) {
gfx::Rect draw_rect = clip;
bool red = true;
while (!draw_rect.IsEmpty()) {
SkPaint paint;
paint.setColor(red ? SK_ColorRED : SK_ColorBLUE);
canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(draw_rect)));
canvas->drawIRect(gfx::RectToSkIRect(draw_rect), paint);
picture = skia::AdoptRef(recorder.endRecordingAsPicture());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>();
item->SetNew(std::move(picture));
draw_rect.Inset(1, 1);
}
}
display_list->CreateAndAppendItem<EndClipDisplayItem>();
display_list->Finalize();
return display_list;
}
bool FakeContentLayerClient::FillsBoundsCompletely() const { return false; }
size_t FakeContentLayerClient::GetApproximateUnsharedMemoryUsage() const {
return reported_memory_usage_;
}
} // namespace cc
|