Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: cc/playback/recording_source_unittest.cc

Issue 2748263002: Move cc::DisplayItemList and related classes into cc/paint/ (Closed)
Patch Set: Merge branch 'master' into ccpaint Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/playback/recording_source.cc ('k') | cc/playback/skip_image_canvas.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 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.
4
5 #include <vector>
6
7 #include "base/memory/ptr_util.h"
8 #include "cc/base/region.h"
9 #include "cc/playback/raster_source.h"
10 #include "cc/test/fake_content_layer_client.h"
11 #include "cc/test/fake_recording_source.h"
12 #include "cc/test/skia_common.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/skia/include/core/SkRefCnt.h"
16
17 namespace cc {
18 namespace {
19
20 std::unique_ptr<FakeRecordingSource> CreateRecordingSource(
21 const gfx::Rect& viewport) {
22 gfx::Rect layer_rect(viewport.right(), viewport.bottom());
23 std::unique_ptr<FakeRecordingSource> recording_source =
24 FakeRecordingSource::CreateRecordingSource(viewport, layer_rect.size());
25 return recording_source;
26 }
27
28 scoped_refptr<RasterSource> CreateRasterSource(
29 FakeRecordingSource* recording_source) {
30 bool can_use_lcd_text = true;
31 return RasterSource::CreateFromRecordingSource(recording_source,
32 can_use_lcd_text);
33 }
34
35 TEST(RecordingSourceTest, DiscardableImagesWithTransform) {
36 gfx::Rect recorded_viewport(256, 256);
37
38 std::unique_ptr<FakeRecordingSource> recording_source =
39 FakeRecordingSource::CreateFilledRecordingSource(
40 recorded_viewport.size());
41 sk_sp<SkImage> discardable_image[2][2];
42 gfx::Transform identity_transform;
43 discardable_image[0][0] = CreateDiscardableImage(gfx::Size(32, 32));
44 // Translate transform is equivalent to moving using point.
45 gfx::Transform translate_transform;
46 translate_transform.Translate(0, 130);
47 discardable_image[1][0] = CreateDiscardableImage(gfx::Size(32, 32));
48 // This moves the bitmap to center of viewport and rotate, this would make
49 // this bitmap in all four tile grids.
50 gfx::Transform rotate_transform;
51 rotate_transform.Translate(112, 112);
52 rotate_transform.Rotate(45);
53 discardable_image[1][1] = CreateDiscardableImage(gfx::Size(32, 32));
54
55 gfx::RectF rect(0, 0, 32, 32);
56 gfx::RectF translate_rect = rect;
57 translate_transform.TransformRect(&translate_rect);
58 gfx::RectF rotate_rect = rect;
59 rotate_transform.TransformRect(&rotate_rect);
60
61 recording_source->add_draw_image_with_transform(discardable_image[0][0],
62 identity_transform);
63 recording_source->add_draw_image_with_transform(discardable_image[1][0],
64 translate_transform);
65 recording_source->add_draw_image_with_transform(discardable_image[1][1],
66 rotate_transform);
67 recording_source->SetGenerateDiscardableImagesMetadata(true);
68 recording_source->Rerecord();
69
70 bool can_use_lcd_text = true;
71 scoped_refptr<RasterSource> raster_source =
72 RasterSource::CreateFromRecordingSource(recording_source.get(),
73 can_use_lcd_text);
74
75 // Tile sized iterators. These should find only one pixel ref.
76 {
77 std::vector<DrawImage> images;
78 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
79 &images);
80 EXPECT_EQ(2u, images.size());
81 EXPECT_TRUE(images[0].image() == discardable_image[0][0]);
82 EXPECT_TRUE(images[1].image() == discardable_image[1][1]);
83 }
84
85 // Shifted tile sized iterators. These should find only one pixel ref.
86 {
87 std::vector<DrawImage> images;
88 raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 140, 128, 128),
89 1.f, &images);
90 EXPECT_EQ(1u, images.size());
91 EXPECT_TRUE(images[0].image() == discardable_image[1][1]);
92 }
93
94 // The rotated bitmap would still be in the top right tile.
95 {
96 std::vector<DrawImage> images;
97 raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 0, 128, 128), 1.f,
98 &images);
99 EXPECT_EQ(1u, images.size());
100 EXPECT_TRUE(images[0].image() == discardable_image[1][1]);
101 }
102
103 // Layer sized iterators. These should find all pixel refs.
104 {
105 std::vector<DrawImage> images;
106 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
107 &images);
108 EXPECT_EQ(3u, images.size());
109 // Top left tile with bitmap[0][0] and bitmap[1][1].
110 EXPECT_TRUE(images[0].image() == discardable_image[0][0]);
111 EXPECT_TRUE(images[1].image() == discardable_image[1][0]);
112 EXPECT_TRUE(images[2].image() == discardable_image[1][1]);
113 }
114
115 // Verify different raster scales
116 for (float scale = 1.f; scale <= 5.f; scale += 0.5f) {
117 std::vector<DrawImage> images;
118 raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 0, 128, 128),
119 scale, &images);
120 EXPECT_EQ(1u, images.size());
121 EXPECT_FLOAT_EQ(scale, images[0].scale().width());
122 EXPECT_FLOAT_EQ(scale, images[0].scale().height());
123 }
124 }
125
126 TEST(RecordingSourceTest, NoGatherImageEmptyImages) {
127 gfx::Rect recorded_viewport(0, 0, 256, 256);
128
129 std::unique_ptr<FakeRecordingSource> recording_source =
130 CreateRecordingSource(recorded_viewport);
131 recording_source->SetGenerateDiscardableImagesMetadata(false);
132 recording_source->Rerecord();
133
134 scoped_refptr<RasterSource> raster_source =
135 CreateRasterSource(recording_source.get());
136
137 // If recording source do not gather images, raster source is not going to
138 // get images.
139 {
140 std::vector<DrawImage> images;
141 raster_source->GetDiscardableImagesInRect(recorded_viewport, 1.f, &images);
142 EXPECT_TRUE(images.empty());
143 }
144 }
145
146 TEST(RecordingSourceTest, EmptyImages) {
147 gfx::Rect recorded_viewport(0, 0, 256, 256);
148
149 std::unique_ptr<FakeRecordingSource> recording_source =
150 CreateRecordingSource(recorded_viewport);
151 recording_source->SetGenerateDiscardableImagesMetadata(true);
152 recording_source->Rerecord();
153
154 scoped_refptr<RasterSource> raster_source =
155 CreateRasterSource(recording_source.get());
156
157 // Tile sized iterators.
158 {
159 std::vector<DrawImage> images;
160 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
161 &images);
162 EXPECT_TRUE(images.empty());
163 }
164 // Shifted tile sized iterators.
165 {
166 std::vector<DrawImage> images;
167 raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 140, 128, 128),
168 1.f, &images);
169 EXPECT_TRUE(images.empty());
170 }
171 // Layer sized iterators.
172 {
173 std::vector<DrawImage> images;
174 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
175 &images);
176 EXPECT_TRUE(images.empty());
177 }
178 }
179
180 TEST(RecordingSourceTest, NoDiscardableImages) {
181 gfx::Rect recorded_viewport(0, 0, 256, 256);
182
183 std::unique_ptr<FakeRecordingSource> recording_source =
184 CreateRecordingSource(recorded_viewport);
185
186 PaintFlags simple_flags;
187 simple_flags.setColor(SkColorSetARGB(255, 12, 23, 34));
188
189 SkBitmap non_discardable_bitmap;
190 non_discardable_bitmap.allocN32Pixels(128, 128);
191 non_discardable_bitmap.setImmutable();
192 sk_sp<SkImage> non_discardable_image =
193 SkImage::MakeFromBitmap(non_discardable_bitmap);
194
195 recording_source->add_draw_rect_with_flags(gfx::Rect(0, 0, 256, 256),
196 simple_flags);
197 recording_source->add_draw_rect_with_flags(gfx::Rect(128, 128, 512, 512),
198 simple_flags);
199 recording_source->add_draw_rect_with_flags(gfx::Rect(512, 0, 256, 256),
200 simple_flags);
201 recording_source->add_draw_rect_with_flags(gfx::Rect(0, 512, 256, 256),
202 simple_flags);
203 recording_source->add_draw_image(non_discardable_image, gfx::Point(128, 0));
204 recording_source->add_draw_image(non_discardable_image, gfx::Point(0, 128));
205 recording_source->add_draw_image(non_discardable_image, gfx::Point(150, 150));
206 recording_source->SetGenerateDiscardableImagesMetadata(true);
207 recording_source->Rerecord();
208
209 scoped_refptr<RasterSource> raster_source =
210 CreateRasterSource(recording_source.get());
211
212 // Tile sized iterators.
213 {
214 std::vector<DrawImage> images;
215 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
216 &images);
217 EXPECT_TRUE(images.empty());
218 }
219 // Shifted tile sized iterators.
220 {
221 std::vector<DrawImage> images;
222 raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 140, 128, 128),
223 1.f, &images);
224 EXPECT_TRUE(images.empty());
225 }
226 // Layer sized iterators.
227 {
228 std::vector<DrawImage> images;
229 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
230 &images);
231 EXPECT_TRUE(images.empty());
232 }
233 }
234
235 TEST(RecordingSourceTest, DiscardableImages) {
236 gfx::Rect recorded_viewport(0, 0, 256, 256);
237
238 std::unique_ptr<FakeRecordingSource> recording_source =
239 CreateRecordingSource(recorded_viewport);
240
241 sk_sp<SkImage> discardable_image[2][2];
242 discardable_image[0][0] = CreateDiscardableImage(gfx::Size(32, 32));
243 discardable_image[1][0] = CreateDiscardableImage(gfx::Size(32, 32));
244 discardable_image[1][1] = CreateDiscardableImage(gfx::Size(32, 32));
245
246 // Discardable images are found in the following cells:
247 // |---|---|
248 // | x | |
249 // |---|---|
250 // | x | x |
251 // |---|---|
252 recording_source->add_draw_image(discardable_image[0][0], gfx::Point(0, 0));
253 recording_source->add_draw_image(discardable_image[1][0], gfx::Point(0, 130));
254 recording_source->add_draw_image(discardable_image[1][1],
255 gfx::Point(140, 140));
256 recording_source->SetGenerateDiscardableImagesMetadata(true);
257 recording_source->Rerecord();
258
259 scoped_refptr<RasterSource> raster_source =
260 CreateRasterSource(recording_source.get());
261
262 // Tile sized iterators. These should find only one image.
263 {
264 std::vector<DrawImage> images;
265 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
266 &images);
267 EXPECT_EQ(1u, images.size());
268 EXPECT_TRUE(images[0].image() == discardable_image[0][0]);
269 }
270
271 // Shifted tile sized iterators. These should find only one image.
272 {
273 std::vector<DrawImage> images;
274 raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 140, 128, 128),
275 1.f, &images);
276 EXPECT_EQ(1u, images.size());
277 EXPECT_TRUE(images[0].image() == discardable_image[1][1]);
278 }
279
280 // Ensure there's no discardable images in the empty cell
281 {
282 std::vector<DrawImage> images;
283 raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 0, 128, 128), 1.f,
284 &images);
285 EXPECT_TRUE(images.empty());
286 }
287
288 // Layer sized iterators. These should find all 3 images.
289 {
290 std::vector<DrawImage> images;
291 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
292 &images);
293 EXPECT_EQ(3u, images.size());
294 EXPECT_TRUE(images[0].image() == discardable_image[0][0]);
295 EXPECT_TRUE(images[1].image() == discardable_image[1][0]);
296 EXPECT_TRUE(images[2].image() == discardable_image[1][1]);
297 }
298 }
299
300 TEST(RecordingSourceTest, DiscardableImagesBaseNonDiscardable) {
301 gfx::Rect recorded_viewport(0, 0, 512, 512);
302
303 std::unique_ptr<FakeRecordingSource> recording_source =
304 CreateRecordingSource(recorded_viewport);
305
306 SkBitmap non_discardable_bitmap;
307 non_discardable_bitmap.allocN32Pixels(512, 512);
308 non_discardable_bitmap.setImmutable();
309 sk_sp<SkImage> non_discardable_image =
310 SkImage::MakeFromBitmap(non_discardable_bitmap);
311
312 sk_sp<SkImage> discardable_image[2][2];
313 discardable_image[0][0] = CreateDiscardableImage(gfx::Size(128, 128));
314 discardable_image[0][1] = CreateDiscardableImage(gfx::Size(128, 128));
315 discardable_image[1][1] = CreateDiscardableImage(gfx::Size(128, 128));
316
317 // One large non-discardable image covers the whole grid.
318 // Discardable images are found in the following cells:
319 // |---|---|
320 // | x | x |
321 // |---|---|
322 // | | x |
323 // |---|---|
324 recording_source->add_draw_image(non_discardable_image, gfx::Point(0, 0));
325 recording_source->add_draw_image(discardable_image[0][0], gfx::Point(0, 0));
326 recording_source->add_draw_image(discardable_image[0][1], gfx::Point(260, 0));
327 recording_source->add_draw_image(discardable_image[1][1],
328 gfx::Point(260, 260));
329 recording_source->SetGenerateDiscardableImagesMetadata(true);
330 recording_source->Rerecord();
331
332 scoped_refptr<RasterSource> raster_source =
333 CreateRasterSource(recording_source.get());
334
335 // Tile sized iterators. These should find only one image.
336 {
337 std::vector<DrawImage> images;
338 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
339 &images);
340 EXPECT_EQ(1u, images.size());
341 EXPECT_TRUE(images[0].image() == discardable_image[0][0]);
342 }
343 // Shifted tile sized iterators. These should find only one image.
344 {
345 std::vector<DrawImage> images;
346 raster_source->GetDiscardableImagesInRect(gfx::Rect(260, 260, 256, 256),
347 1.f, &images);
348 EXPECT_EQ(1u, images.size());
349 EXPECT_TRUE(images[0].image() == discardable_image[1][1]);
350 }
351 // Ensure there's no discardable images in the empty cell
352 {
353 std::vector<DrawImage> images;
354 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 256, 256, 256), 1.f,
355 &images);
356 EXPECT_TRUE(images.empty());
357 }
358 // Layer sized iterators. These should find three images.
359 {
360 std::vector<DrawImage> images;
361 raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 512, 512), 1.f,
362 &images);
363 EXPECT_EQ(3u, images.size());
364 EXPECT_TRUE(images[0].image() == discardable_image[0][0]);
365 EXPECT_TRUE(images[1].image() == discardable_image[0][1]);
366 EXPECT_TRUE(images[2].image() == discardable_image[1][1]);
367 }
368 }
369
370 } // namespace
371 } // namespace cc
OLDNEW
« no previous file with comments | « cc/playback/recording_source.cc ('k') | cc/playback/skip_image_canvas.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698