OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/raster/raster_source.h" | 5 #include "cc/raster/raster_source.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "cc/test/fake_recording_source.h" | 11 #include "cc/test/fake_recording_source.h" |
12 #include "cc/test/skia_common.h" | 12 #include "cc/test/skia_common.h" |
13 #include "cc/tiles/software_image_decode_cache.h" | 13 #include "cc/tiles/software_image_decode_cache.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "third_party/skia/include/core/SkPixelRef.h" | 15 #include "third_party/skia/include/core/SkPixelRef.h" |
16 #include "third_party/skia/include/core/SkRefCnt.h" | 16 #include "third_party/skia/include/core/SkRefCnt.h" |
17 #include "third_party/skia/include/core/SkShader.h" | 17 #include "third_party/skia/include/core/SkShader.h" |
| 18 #include "ui/gfx/geometry/axis_transform2d.h" |
18 #include "ui/gfx/geometry/rect.h" | 19 #include "ui/gfx/geometry/rect.h" |
19 #include "ui/gfx/geometry/size_conversions.h" | 20 #include "ui/gfx/geometry/size_conversions.h" |
20 | 21 |
21 namespace cc { | 22 namespace cc { |
22 namespace { | 23 namespace { |
23 | 24 |
24 gfx::ColorSpace ColorSpaceForTesting() { | 25 gfx::ColorSpace ColorSpaceForTesting() { |
25 return gfx::ColorSpace(); | 26 return gfx::ColorSpace(); |
26 } | 27 } |
27 | 28 |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 // up to one pixel outside the content rect is guaranteed to be opaque. | 284 // up to one pixel outside the content rect is guaranteed to be opaque. |
284 // Outside of that is undefined. | 285 // Outside of that is undefined. |
285 gfx::Rect canvas_rect(content_rect); | 286 gfx::Rect canvas_rect(content_rect); |
286 canvas_rect.Inset(0, 0, -1, -1); | 287 canvas_rect.Inset(0, 0, -1, -1); |
287 | 288 |
288 SkBitmap bitmap; | 289 SkBitmap bitmap; |
289 bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); | 290 bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); |
290 SkCanvas canvas(bitmap); | 291 SkCanvas canvas(bitmap); |
291 canvas.clear(SK_ColorTRANSPARENT); | 292 canvas.clear(SK_ColorTRANSPARENT); |
292 | 293 |
293 raster->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), canvas_rect, | 294 raster->PlaybackToCanvas( |
294 canvas_rect, contents_scale, | 295 &canvas, ColorSpaceForTesting(), canvas_rect, canvas_rect, |
295 RasterSource::PlaybackSettings()); | 296 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), |
| 297 RasterSource::PlaybackSettings()); |
296 | 298 |
297 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); | 299 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); |
298 int num_pixels = bitmap.width() * bitmap.height(); | 300 int num_pixels = bitmap.width() * bitmap.height(); |
299 bool all_white = true; | 301 bool all_white = true; |
300 for (int i = 0; i < num_pixels; ++i) { | 302 for (int i = 0; i < num_pixels; ++i) { |
301 EXPECT_EQ(SkColorGetA(pixels[i]), 255u); | 303 EXPECT_EQ(SkColorGetA(pixels[i]), 255u); |
302 all_white &= (SkColorGetR(pixels[i]) == 255); | 304 all_white &= (SkColorGetR(pixels[i]) == 255); |
303 all_white &= (SkColorGetG(pixels[i]) == 255); | 305 all_white &= (SkColorGetG(pixels[i]) == 255); |
304 all_white &= (SkColorGetB(pixels[i]) == 255); | 306 all_white &= (SkColorGetB(pixels[i]) == 255); |
305 } | 307 } |
(...skipping 29 matching lines...) Expand all Loading... |
335 gfx::ScaleToCeiledSize(layer_bounds, contents_scale)); | 337 gfx::ScaleToCeiledSize(layer_bounds, contents_scale)); |
336 | 338 |
337 SkBitmap bitmap; | 339 SkBitmap bitmap; |
338 bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); | 340 bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); |
339 SkCanvas canvas(bitmap); | 341 SkCanvas canvas(bitmap); |
340 canvas.clear(SK_ColorTRANSPARENT); | 342 canvas.clear(SK_ColorTRANSPARENT); |
341 | 343 |
342 // Playback the full rect which should make everything white. | 344 // Playback the full rect which should make everything white. |
343 gfx::Rect raster_full_rect(content_bounds); | 345 gfx::Rect raster_full_rect(content_bounds); |
344 gfx::Rect playback_rect(content_bounds); | 346 gfx::Rect playback_rect(content_bounds); |
345 raster->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), raster_full_rect, | 347 raster->PlaybackToCanvas( |
346 playback_rect, contents_scale, | 348 &canvas, ColorSpaceForTesting(), raster_full_rect, playback_rect, |
347 RasterSource::PlaybackSettings()); | 349 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), |
| 350 RasterSource::PlaybackSettings()); |
348 | 351 |
349 { | 352 { |
350 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); | 353 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); |
351 for (int i = 0; i < bitmap.width(); ++i) { | 354 for (int i = 0; i < bitmap.width(); ++i) { |
352 for (int j = 0; j < bitmap.height(); ++j) { | 355 for (int j = 0; j < bitmap.height(); ++j) { |
353 SCOPED_TRACE(i); | 356 SCOPED_TRACE(i); |
354 SCOPED_TRACE(j); | 357 SCOPED_TRACE(j); |
355 EXPECT_EQ(255u, SkColorGetA(pixels[i + j * bitmap.width()])); | 358 EXPECT_EQ(255u, SkColorGetA(pixels[i + j * bitmap.width()])); |
356 EXPECT_EQ(255u, SkColorGetR(pixels[i + j * bitmap.width()])); | 359 EXPECT_EQ(255u, SkColorGetR(pixels[i + j * bitmap.width()])); |
357 EXPECT_EQ(255u, SkColorGetG(pixels[i + j * bitmap.width()])); | 360 EXPECT_EQ(255u, SkColorGetG(pixels[i + j * bitmap.width()])); |
358 EXPECT_EQ(255u, SkColorGetB(pixels[i + j * bitmap.width()])); | 361 EXPECT_EQ(255u, SkColorGetB(pixels[i + j * bitmap.width()])); |
359 } | 362 } |
360 } | 363 } |
361 } | 364 } |
362 | 365 |
363 // Re-record everything as black. | 366 // Re-record everything as black. |
364 PaintFlags black_flags; | 367 PaintFlags black_flags; |
365 black_flags.setColor(SK_ColorBLACK); | 368 black_flags.setColor(SK_ColorBLACK); |
366 recording_source->add_draw_rect_with_flags(gfx::Rect(layer_bounds), | 369 recording_source->add_draw_rect_with_flags(gfx::Rect(layer_bounds), |
367 black_flags); | 370 black_flags); |
368 recording_source->Rerecord(); | 371 recording_source->Rerecord(); |
369 | 372 |
370 // Make a new RasterSource from the new recording. | 373 // Make a new RasterSource from the new recording. |
371 raster = | 374 raster = |
372 RasterSource::CreateFromRecordingSource(recording_source.get(), false); | 375 RasterSource::CreateFromRecordingSource(recording_source.get(), false); |
373 | 376 |
374 // We're going to playback from "everything is black" into a smaller area, | 377 // We're going to playback from "everything is black" into a smaller area, |
375 // that touches the edge pixels of the recording. | 378 // that touches the edge pixels of the recording. |
376 playback_rect.Inset(1, 2, 0, 1); | 379 playback_rect.Inset(1, 2, 0, 1); |
377 raster->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), raster_full_rect, | 380 raster->PlaybackToCanvas( |
378 playback_rect, contents_scale, | 381 &canvas, ColorSpaceForTesting(), raster_full_rect, playback_rect, |
379 RasterSource::PlaybackSettings()); | 382 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), |
| 383 RasterSource::PlaybackSettings()); |
380 | 384 |
381 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); | 385 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); |
382 int num_black = 0; | 386 int num_black = 0; |
383 int num_white = 0; | 387 int num_white = 0; |
384 for (int i = 0; i < bitmap.width(); ++i) { | 388 for (int i = 0; i < bitmap.width(); ++i) { |
385 for (int j = 0; j < bitmap.height(); ++j) { | 389 for (int j = 0; j < bitmap.height(); ++j) { |
386 SCOPED_TRACE(j); | 390 SCOPED_TRACE(j); |
387 SCOPED_TRACE(i); | 391 SCOPED_TRACE(i); |
388 bool expect_black = playback_rect.Contains(i, j); | 392 bool expect_black = playback_rect.Contains(i, j); |
389 if (expect_black) { | 393 if (expect_black) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 gfx::ScaleToCeiledSize(layer_bounds, contents_scale)); | 436 gfx::ScaleToCeiledSize(layer_bounds, contents_scale)); |
433 | 437 |
434 SkBitmap bitmap; | 438 SkBitmap bitmap; |
435 bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); | 439 bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); |
436 SkCanvas canvas(bitmap); | 440 SkCanvas canvas(bitmap); |
437 canvas.clear(SK_ColorTRANSPARENT); | 441 canvas.clear(SK_ColorTRANSPARENT); |
438 | 442 |
439 // Playback the full rect which should make everything light gray (alpha=10). | 443 // Playback the full rect which should make everything light gray (alpha=10). |
440 gfx::Rect raster_full_rect(content_bounds); | 444 gfx::Rect raster_full_rect(content_bounds); |
441 gfx::Rect playback_rect(content_bounds); | 445 gfx::Rect playback_rect(content_bounds); |
442 raster->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), raster_full_rect, | 446 raster->PlaybackToCanvas( |
443 playback_rect, contents_scale, | 447 &canvas, ColorSpaceForTesting(), raster_full_rect, playback_rect, |
444 RasterSource::PlaybackSettings()); | 448 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), |
| 449 RasterSource::PlaybackSettings()); |
445 | 450 |
446 { | 451 { |
447 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); | 452 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); |
448 for (int i = 0; i < bitmap.width(); ++i) { | 453 for (int i = 0; i < bitmap.width(); ++i) { |
449 for (int j = 0; j < bitmap.height(); ++j) { | 454 for (int j = 0; j < bitmap.height(); ++j) { |
450 SCOPED_TRACE(i); | 455 SCOPED_TRACE(i); |
451 SCOPED_TRACE(j); | 456 SCOPED_TRACE(j); |
452 EXPECT_EQ(alpha_dark, SkColorGetA(pixels[i + j * bitmap.width()])); | 457 EXPECT_EQ(alpha_dark, SkColorGetA(pixels[i + j * bitmap.width()])); |
453 EXPECT_EQ(alpha_dark, SkColorGetR(pixels[i + j * bitmap.width()])); | 458 EXPECT_EQ(alpha_dark, SkColorGetR(pixels[i + j * bitmap.width()])); |
454 EXPECT_EQ(alpha_dark, SkColorGetG(pixels[i + j * bitmap.width()])); | 459 EXPECT_EQ(alpha_dark, SkColorGetG(pixels[i + j * bitmap.width()])); |
(...skipping 17 matching lines...) Expand all Loading... |
472 | 477 |
473 // Make a new RasterSource from the new recording. | 478 // Make a new RasterSource from the new recording. |
474 raster = RasterSource::CreateFromRecordingSource(recording_source_light.get(), | 479 raster = RasterSource::CreateFromRecordingSource(recording_source_light.get(), |
475 false); | 480 false); |
476 | 481 |
477 // We're going to playback from alpha(18) white rectangle into a smaller area | 482 // We're going to playback from alpha(18) white rectangle into a smaller area |
478 // of the recording resulting in a smaller lighter white rectangle over a | 483 // of the recording resulting in a smaller lighter white rectangle over a |
479 // darker white background rectangle. | 484 // darker white background rectangle. |
480 playback_rect = | 485 playback_rect = |
481 gfx::Rect(gfx::ScaleToCeiledSize(partial_bounds, contents_scale)); | 486 gfx::Rect(gfx::ScaleToCeiledSize(partial_bounds, contents_scale)); |
482 raster->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), raster_full_rect, | 487 raster->PlaybackToCanvas( |
483 playback_rect, contents_scale, | 488 &canvas, ColorSpaceForTesting(), raster_full_rect, playback_rect, |
484 RasterSource::PlaybackSettings()); | 489 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), |
| 490 RasterSource::PlaybackSettings()); |
485 | 491 |
486 // Test that the whole playback_rect was cleared and repainted with new alpha. | 492 // Test that the whole playback_rect was cleared and repainted with new alpha. |
487 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); | 493 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); |
488 for (int i = 0; i < playback_rect.width(); ++i) { | 494 for (int i = 0; i < playback_rect.width(); ++i) { |
489 for (int j = 0; j < playback_rect.height(); ++j) { | 495 for (int j = 0; j < playback_rect.height(); ++j) { |
490 SCOPED_TRACE(j); | 496 SCOPED_TRACE(j); |
491 SCOPED_TRACE(i); | 497 SCOPED_TRACE(i); |
492 EXPECT_EQ(alpha_light, SkColorGetA(pixels[i + j * bitmap.width()])); | 498 EXPECT_EQ(alpha_light, SkColorGetA(pixels[i + j * bitmap.width()])); |
493 EXPECT_EQ(alpha_light, SkColorGetR(pixels[i + j * bitmap.width()])); | 499 EXPECT_EQ(alpha_light, SkColorGetR(pixels[i + j * bitmap.width()])); |
494 EXPECT_EQ(alpha_light, SkColorGetG(pixels[i + j * bitmap.width()])); | 500 EXPECT_EQ(alpha_light, SkColorGetG(pixels[i + j * bitmap.width()])); |
(...skipping 18 matching lines...) Expand all Loading... |
513 gfx::Size content_bounds( | 519 gfx::Size content_bounds( |
514 gfx::ScaleToCeiledSize(layer_bounds, contents_scale)); | 520 gfx::ScaleToCeiledSize(layer_bounds, contents_scale)); |
515 | 521 |
516 gfx::Rect canvas_rect(content_bounds); | 522 gfx::Rect canvas_rect(content_bounds); |
517 canvas_rect.Inset(0, 0, -1, -1); | 523 canvas_rect.Inset(0, 0, -1, -1); |
518 | 524 |
519 SkBitmap bitmap; | 525 SkBitmap bitmap; |
520 bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); | 526 bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); |
521 SkCanvas canvas(bitmap); | 527 SkCanvas canvas(bitmap); |
522 | 528 |
523 raster->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), canvas_rect, | 529 raster->PlaybackToCanvas( |
524 canvas_rect, contents_scale, | 530 &canvas, ColorSpaceForTesting(), canvas_rect, canvas_rect, |
525 RasterSource::PlaybackSettings()); | 531 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), |
| 532 RasterSource::PlaybackSettings()); |
526 | 533 |
527 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); | 534 SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); |
528 int num_pixels = bitmap.width() * bitmap.height(); | 535 int num_pixels = bitmap.width() * bitmap.height(); |
529 for (int i = 0; i < num_pixels; ++i) { | 536 for (int i = 0; i < num_pixels; ++i) { |
530 EXPECT_EQ(SkColorGetA(pixels[i]), 0u); | 537 EXPECT_EQ(SkColorGetA(pixels[i]), 0u); |
531 } | 538 } |
532 } | 539 } |
533 | 540 |
534 TEST(RasterSourceTest, GetPictureMemoryUsageIncludesClientReportedMemory) { | 541 TEST(RasterSourceTest, GetPictureMemoryUsageIncludesClientReportedMemory) { |
535 const size_t kReportedMemoryUsageInBytes = 100 * 1024 * 1024; | 542 const size_t kReportedMemoryUsageInBytes = 100 * 1024 * 1024; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 | 595 |
589 SkBitmap bitmap; | 596 SkBitmap bitmap; |
590 bitmap.allocN32Pixels(size.width() * 0.5f, size.height() * 0.25f); | 597 bitmap.allocN32Pixels(size.width() * 0.5f, size.height() * 0.25f); |
591 SkCanvas canvas(bitmap); | 598 SkCanvas canvas(bitmap); |
592 canvas.scale(0.5f, 0.25f); | 599 canvas.scale(0.5f, 0.25f); |
593 | 600 |
594 RasterSource::PlaybackSettings settings; | 601 RasterSource::PlaybackSettings settings; |
595 settings.playback_to_shared_canvas = true; | 602 settings.playback_to_shared_canvas = true; |
596 settings.use_image_hijack_canvas = true; | 603 settings.use_image_hijack_canvas = true; |
597 raster_source->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), | 604 raster_source->PlaybackToCanvas(&canvas, ColorSpaceForTesting(), |
598 gfx::Rect(size), gfx::Rect(size), 1.f, | 605 gfx::Rect(size), gfx::Rect(size), |
599 settings); | 606 gfx::AxisTransform2d(), settings); |
600 | 607 |
601 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 0)); | 608 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 0)); |
602 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(49, 0)); | 609 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(49, 0)); |
603 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 24)); | 610 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 24)); |
604 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(49, 24)); | 611 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(49, 24)); |
605 for (int x = 0; x < 49; ++x) | 612 for (int x = 0; x < 49; ++x) |
606 EXPECT_EQ(SK_ColorRED, bitmap.getColor(x, 12)); | 613 EXPECT_EQ(SK_ColorRED, bitmap.getColor(x, 12)); |
607 for (int y = 0; y < 24; ++y) | 614 for (int y = 0; y < 24; ++y) |
608 EXPECT_EQ(SK_ColorRED, bitmap.getColor(24, y)); | 615 EXPECT_EQ(SK_ColorRED, bitmap.getColor(24, y)); |
609 } | 616 } |
610 | 617 |
611 } // namespace | 618 } // namespace |
612 } // namespace cc | 619 } // namespace cc |
OLD | NEW |