diff options
author | fmalita <fmalita@chromium.org> | 2015-07-09 17:10:31 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-09 17:10:31 -0700 |
commit | ea561bf055bb803f4c10ca323ea60a9d94da7956 (patch) | |
tree | 170de1a02b6829fe9de73c7489de901a2e88b4f1 /tests | |
parent | 694307c9f1ade20a3c5f968c248a66b6a2d151a8 (diff) |
Fix SkImage::asLegacyBitmap() rowBytes assert
When reusing the pixel ref, we need to observe its rowBytes.
R=reed@google.com
Review URL: https://codereview.chromium.org/1227413002
Diffstat (limited to 'tests')
-rw-r--r-- | tests/SurfaceTest.cpp | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index e8ff63cca0..57ad5e0ca8 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -390,6 +390,25 @@ static void test_image_readpixels(skiatest::Reporter* reporter, SkImage* image, REPORTER_ASSERT(reporter, has_pixels(&pixels[1], w*h - 1, notExpected)); } +static void check_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* image, + const SkBitmap& bitmap, SkImage::LegacyBitmapMode mode) { + REPORTER_ASSERT(reporter, image->width() == bitmap.width()); + REPORTER_ASSERT(reporter, image->height() == bitmap.height()); + REPORTER_ASSERT(reporter, image->isOpaque() == bitmap.isOpaque()); + + if (SkImage::kRO_LegacyBitmapMode == mode) { + REPORTER_ASSERT(reporter, bitmap.isImmutable()); + } + + SkAutoLockPixels alp(bitmap); + REPORTER_ASSERT(reporter, bitmap.getPixels()); + + const SkImageInfo info = SkImageInfo::MakeN32(1, 1, bitmap.alphaType()); + SkPMColor imageColor; + REPORTER_ASSERT(reporter, image->readPixels(info, &imageColor, sizeof(SkPMColor), 0, 0)); + REPORTER_ASSERT(reporter, imageColor == *bitmap.getAddr32(0, 0)); +} + static void test_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* image) { const SkImage::LegacyBitmapMode modes[] = { SkImage::kRO_LegacyBitmapMode, @@ -398,22 +417,18 @@ static void test_legacy_bitmap(skiatest::Reporter* reporter, const SkImage* imag for (size_t i = 0; i < SK_ARRAY_COUNT(modes); ++i) { SkBitmap bitmap; REPORTER_ASSERT(reporter, image->asLegacyBitmap(&bitmap, modes[i])); - - REPORTER_ASSERT(reporter, image->width() == bitmap.width()); - REPORTER_ASSERT(reporter, image->height() == bitmap.height()); - REPORTER_ASSERT(reporter, image->isOpaque() == bitmap.isOpaque()); - - bitmap.lockPixels(); - REPORTER_ASSERT(reporter, bitmap.getPixels()); - - const SkImageInfo info = SkImageInfo::MakeN32(1, 1, bitmap.alphaType()); - SkPMColor imageColor; - REPORTER_ASSERT(reporter, image->readPixels(info, &imageColor, sizeof(SkPMColor), 0, 0)); - REPORTER_ASSERT(reporter, imageColor == *bitmap.getAddr32(0, 0)); - - if (SkImage::kRO_LegacyBitmapMode == modes[i]) { - REPORTER_ASSERT(reporter, bitmap.isImmutable()); - } + check_legacy_bitmap(reporter, image, bitmap, modes[i]); + + // Test subsetting to exercise the rowBytes logic. + SkBitmap tmp; + REPORTER_ASSERT(reporter, bitmap.extractSubset(&tmp, SkIRect::MakeWH(image->width() / 2, + image->height() / 2))); + SkAutoTUnref<SkImage> subsetImage(SkImage::NewFromBitmap(tmp)); + REPORTER_ASSERT(reporter, subsetImage); + + SkBitmap subsetBitmap; + REPORTER_ASSERT(reporter, subsetImage->asLegacyBitmap(&subsetBitmap, modes[i])); + check_legacy_bitmap(reporter, subsetImage, subsetBitmap, modes[i]); } } |