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

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

Issue 2229603002: cc: Do a safe intersect when gathering images. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 4 years, 4 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/discardable_image_map.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/playback/discardable_image_map.h" 5 #include "cc/playback/discardable_image_map.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 DiscardableImageMap image_map; 301 DiscardableImageMap image_map;
302 { 302 {
303 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, 303 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
304 visible_rect.size()); 304 visible_rect.size());
305 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); 305 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
306 } 306 }
307 std::vector<PositionDrawImage> images = 307 std::vector<PositionDrawImage> images =
308 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); 308 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
309 EXPECT_EQ(1u, images.size()); 309 EXPECT_EQ(1u, images.size());
310 EXPECT_TRUE(images[0].image == discardable_image); 310 EXPECT_TRUE(images[0].image == discardable_image);
311 EXPECT_EQ(gfx::Rect(0, 0, 1 << 25, 1 << 25), images[0].image_rect); 311 EXPECT_EQ(gfx::Rect(0, 0, 2048, 2048), images[0].image_rect);
312 } 312 }
313 313
314 TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) { 314 TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) {
315 gfx::Rect visible_rect(2048, 2048); 315 gfx::Rect visible_rect(2048, 2048);
316 FakeContentLayerClient content_layer_client; 316 FakeContentLayerClient content_layer_client;
317 content_layer_client.set_bounds(visible_rect.size()); 317 content_layer_client.set_bounds(visible_rect.size());
318 318
319 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); 319 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10));
320 320
321 DiscardableImageMap image_map; 321 DiscardableImageMap image_map;
322 { 322 {
323 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, 323 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
324 visible_rect.size()); 324 visible_rect.size());
325 { 325 {
326 std::unique_ptr<SkPaint> paint(new SkPaint()); 326 std::unique_ptr<SkPaint> paint(new SkPaint());
327 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), 327 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect),
328 paint.get()); 328 paint.get());
329 } 329 }
330 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); 330 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr);
331 generator.canvas()->restore(); 331 generator.canvas()->restore();
332 } 332 }
333 333
334 std::vector<PositionDrawImage> images = 334 std::vector<PositionDrawImage> images =
335 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); 335 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
336 EXPECT_EQ(1u, images.size()); 336 EXPECT_EQ(1u, images.size());
337 EXPECT_TRUE(images[0].image == discardable_image); 337 EXPECT_TRUE(images[0].image == discardable_image);
338 } 338 }
339 339
340 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) {
341 gfx::Rect visible_rect(2048, 2048);
342 FakeContentLayerClient content_layer_client;
343 content_layer_client.set_bounds(visible_rect.size());
344
345 int dimension = std::numeric_limits<int>::max();
346 sk_sp<SkImage> discardable_image =
347 CreateDiscardableImage(gfx::Size(dimension, dimension));
348 SkPaint paint;
349 content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42),
350 paint);
351
352 scoped_refptr<DisplayItemList> display_list =
353 content_layer_client.PaintContentsToDisplayList(
354 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
355
356 DiscardableImageMap image_map;
357 {
358 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
359 visible_rect.size());
360 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
361 }
362 std::vector<PositionDrawImage> images =
363 GetDiscardableImagesInRect(image_map, gfx::Rect(42, 42, 1, 1));
364 EXPECT_EQ(1u, images.size());
365 EXPECT_TRUE(images[0].image == discardable_image);
366 EXPECT_EQ(gfx::Rect(42, 42, 2006, 2006), images[0].image_rect);
367 }
368
369 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImageMaxLayer) {
370 // At large values of integer x, x != static_cast<int>(static_cast<float>(x)).
371 // So, make sure the dimension can be converted back and forth for the
372 // purposes of the unittest. Also, at near max int values, Skia seems to skip
373 // some draw calls, so we subtract 64 since we only care about "really large"
374 // values, not necessarily max int values.
375 int dimension = static_cast<int>(
376 static_cast<float>(std::numeric_limits<int>::max() - 64));
377 gfx::Rect visible_rect(dimension, dimension);
378 FakeContentLayerClient content_layer_client;
379 content_layer_client.set_bounds(visible_rect.size());
380
381 sk_sp<SkImage> discardable_image =
382 CreateDiscardableImage(gfx::Size(dimension, dimension));
383 SkPaint paint;
384 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0),
385 paint);
386 content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0),
387 paint);
388 content_layer_client.add_draw_image(discardable_image,
389 gfx::Point(-10000, 500), paint);
390
391 scoped_refptr<DisplayItemList> display_list =
392 content_layer_client.PaintContentsToDisplayList(
393 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
394
395 DiscardableImageMap image_map;
396 {
397 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
398 visible_rect.size());
399 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
400 }
401 std::vector<PositionDrawImage> images =
402 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
403 EXPECT_EQ(1u, images.size());
404 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect);
405
406 images = GetDiscardableImagesInRect(image_map, gfx::Rect(10000, 0, 1, 1));
407 EXPECT_EQ(2u, images.size());
408 int expected10k = static_cast<int>(static_cast<float>(dimension - 10000));
409 int expected500 = static_cast<int>(static_cast<float>(dimension - 500));
410 EXPECT_EQ(gfx::Rect(10000, 0, expected10k, dimension), images[1].image_rect);
411 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect);
412
413 images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1));
414 EXPECT_EQ(2u, images.size());
415 EXPECT_EQ(gfx::Rect(0, 500, expected10k, expected500), images[1].image_rect);
416 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect);
417 }
418
419 TEST_F(DiscardableImageMapTest, GetDiscardableImagesRectInBounds) {
420 gfx::Rect visible_rect(1000, 1000);
421 FakeContentLayerClient content_layer_client;
422 content_layer_client.set_bounds(visible_rect.size());
423
424 sk_sp<SkImage> discardable_image =
425 CreateDiscardableImage(gfx::Size(100, 100));
426 sk_sp<SkImage> long_discardable_image =
427 CreateDiscardableImage(gfx::Size(10000, 100));
428
429 SkPaint paint;
430 content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11),
431 paint);
432 content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951),
433 paint);
434 content_layer_client.add_draw_image(long_discardable_image,
435 gfx::Point(-100, 500), paint);
436
437 scoped_refptr<DisplayItemList> display_list =
438 content_layer_client.PaintContentsToDisplayList(
439 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
440
441 DiscardableImageMap image_map;
442 {
443 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
444 visible_rect.size());
445 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
446 }
447 std::vector<PositionDrawImage> images =
448 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
449 EXPECT_EQ(1u, images.size());
450 EXPECT_EQ(gfx::Rect(0, 0, 90, 89), images[0].image_rect);
451
452 images = GetDiscardableImagesInRect(image_map, gfx::Rect(999, 999, 1, 1));
453 EXPECT_EQ(1u, images.size());
454 EXPECT_EQ(gfx::Rect(950, 951, 50, 49), images[0].image_rect);
455
456 images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1));
457 EXPECT_EQ(1u, images.size());
458 EXPECT_EQ(gfx::Rect(0, 500, 1000, 100), images[0].image_rect);
459 }
460
340 } // namespace cc 461 } // namespace cc
OLDNEW
« no previous file with comments | « cc/playback/discardable_image_map.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698