14428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com/* 24428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com * Copyright 2013 Google Inc. 34428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com * 44428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com * Use of this source code is governed by a BSD-style license that can be 54428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com * found in the LICENSE file. 64428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com */ 74428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com 84428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com#include "SkBitmap.h" 92ff257bd95c732b9cebc3aac03fbed72d6e6082areed#include "SkMallocPixelRef.h" 1002e65df343d7b6d2116d6ed2a17cea3f222978e0Hal Canary#include "SkRandom.h" 114428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com#include "Test.h" 1268b8e3d50d0954eb5eeb7f625f06026c7fbd38c1Matt Sarett#include "sk_tool_utils.h" 134428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com 14cb674144545866ed31a9ab5dd8e7152282017e40reedstatic void test_peekpixels(skiatest::Reporter* reporter) { 15cb674144545866ed31a9ab5dd8e7152282017e40reed const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); 16cb674144545866ed31a9ab5dd8e7152282017e40reed 17cb674144545866ed31a9ab5dd8e7152282017e40reed SkPixmap pmap; 18cb674144545866ed31a9ab5dd8e7152282017e40reed SkBitmap bm; 19cb674144545866ed31a9ab5dd8e7152282017e40reed 20cb674144545866ed31a9ab5dd8e7152282017e40reed // empty should return false 2196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !bm.peekPixels(nullptr)); 22cb674144545866ed31a9ab5dd8e7152282017e40reed REPORTER_ASSERT(reporter, !bm.peekPixels(&pmap)); 23cb674144545866ed31a9ab5dd8e7152282017e40reed 24cb674144545866ed31a9ab5dd8e7152282017e40reed // no pixels should return false 25cb674144545866ed31a9ab5dd8e7152282017e40reed bm.setInfo(SkImageInfo::MakeN32Premul(10, 10)); 2696fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !bm.peekPixels(nullptr)); 27cb674144545866ed31a9ab5dd8e7152282017e40reed REPORTER_ASSERT(reporter, !bm.peekPixels(&pmap)); 28cb674144545866ed31a9ab5dd8e7152282017e40reed 29cb674144545866ed31a9ab5dd8e7152282017e40reed // real pixels should return true 30cb674144545866ed31a9ab5dd8e7152282017e40reed bm.allocPixels(info); 3196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, bm.peekPixels(nullptr)); 32cb674144545866ed31a9ab5dd8e7152282017e40reed REPORTER_ASSERT(reporter, bm.peekPixels(&pmap)); 33cb674144545866ed31a9ab5dd8e7152282017e40reed REPORTER_ASSERT(reporter, pmap.info() == bm.info()); 34cb674144545866ed31a9ab5dd8e7152282017e40reed REPORTER_ASSERT(reporter, pmap.addr() == bm.getPixels()); 35cb674144545866ed31a9ab5dd8e7152282017e40reed REPORTER_ASSERT(reporter, pmap.rowBytes() == bm.rowBytes()); 36cb674144545866ed31a9ab5dd8e7152282017e40reed} 37cb674144545866ed31a9ab5dd8e7152282017e40reed 382ff257bd95c732b9cebc3aac03fbed72d6e6082areed// https://code.google.com/p/chromium/issues/detail?id=446164 392ff257bd95c732b9cebc3aac03fbed72d6e6082areedstatic void test_bigalloc(skiatest::Reporter* reporter) { 402ff257bd95c732b9cebc3aac03fbed72d6e6082areed const int width = 0x40000001; 412ff257bd95c732b9cebc3aac03fbed72d6e6082areed const int height = 0x00000096; 422ff257bd95c732b9cebc3aac03fbed72d6e6082areed const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); 432ff257bd95c732b9cebc3aac03fbed72d6e6082areed 442ff257bd95c732b9cebc3aac03fbed72d6e6082areed SkBitmap bm; 452ff257bd95c732b9cebc3aac03fbed72d6e6082areed REPORTER_ASSERT(reporter, !bm.tryAllocPixels(info)); 462ff257bd95c732b9cebc3aac03fbed72d6e6082areed 47086a427b0cee3862f25c492fc5082ff24105dc53Mike Reed sk_sp<SkPixelRef> pr = SkMallocPixelRef::MakeAllocate(info, info.minRowBytes()); 482ff257bd95c732b9cebc3aac03fbed72d6e6082areed REPORTER_ASSERT(reporter, !pr); 492ff257bd95c732b9cebc3aac03fbed72d6e6082areed} 502ff257bd95c732b9cebc3aac03fbed72d6e6082areed 51f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reedstatic void test_allocpixels(skiatest::Reporter* reporter) { 52f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed const int width = 10; 53f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed const int height = 10; 54f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); 55f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed const size_t explicitRowBytes = info.minRowBytes() + 24; 56f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed 57f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed SkBitmap bm; 58f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.setInfo(info); 59f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes()); 60f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.allocPixels(); 61f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes()); 62f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.reset(); 63f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.allocPixels(info); 64f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes()); 65f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed 66f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.setInfo(info, explicitRowBytes); 67f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes()); 68f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.allocPixels(); 69f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes()); 70f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.reset(); 71f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.allocPixels(info, explicitRowBytes); 72f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes()); 73f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed 74f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.reset(); 75f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.setInfo(info, 0); 76f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes()); 77f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.reset(); 78f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.allocPixels(info, 0); 79f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes()); 80f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed 81f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bm.reset(); 82f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed bool success = bm.setInfo(info, info.minRowBytes() - 1); // invalid for 32bit 83f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, !success); 84f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed REPORTER_ASSERT(reporter, bm.isNull()); 85f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed} 86f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed 874856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.comstatic void test_bigwidth(skiatest::Reporter* reporter) { 884856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com SkBitmap bm; 894856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com int width = 1 << 29; // *4 will be the high-bit of 32bit int 904856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com 91a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeA8(width, 1); 92a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org REPORTER_ASSERT(reporter, bm.setInfo(info)); 93e5ea500d4714a7d84de2bf913e81be3b65d2de68reed REPORTER_ASSERT(reporter, bm.setInfo(info.makeColorType(kRGB_565_SkColorType))); 94f5e1f63461d0a4dcb4bd5d0388ec6d392b97e5f0skia.committer@gmail.com 954856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com // for a 4-byte config, this width will compute a rowbytes of 0x80000000, 964856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com // which does not fit in a int32_t. setConfig should detect this, and fail. 974856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com 984856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com // TODO: perhaps skia can relax this, and only require that rowBytes fit 994856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com // in a uint32_t (or larger), but for now this is the constraint. 1004856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com 101e5ea500d4714a7d84de2bf913e81be3b65d2de68reed REPORTER_ASSERT(reporter, !bm.setInfo(info.makeColorType(kN32_SkColorType))); 1024856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com} 1034856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com 1044428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com/** 1054428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com * This test contains basic sanity checks concerning bitmaps. 1064428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com */ 1074428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.comDEF_TEST(Bitmap, reporter) { 1084428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com // Zero-sized bitmaps are allowed 1094428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com for (int width = 0; width < 2; ++width) { 1104428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com for (int height = 0; height < 2; ++height) { 1114428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com SkBitmap bm; 112a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org bool setConf = bm.setInfo(SkImageInfo::MakeN32Premul(width, height)); 1134428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com REPORTER_ASSERT(reporter, setConf); 1144428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com if (setConf) { 115848250415eddc54075f7eb8795e8db79e749c6abreed bm.allocPixels(); 1164428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com } 1172af6c1204de73a2513189007b9623fec0e296dc2halcanary@google.com REPORTER_ASSERT(reporter, SkToBool(width & height) != bm.empty()); 1184428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com } 1194428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com } 120f5e1f63461d0a4dcb4bd5d0388ec6d392b97e5f0skia.committer@gmail.com 1214856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com test_bigwidth(reporter); 122f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed test_allocpixels(reporter); 1232ff257bd95c732b9cebc3aac03fbed72d6e6082areed test_bigalloc(reporter); 124cb674144545866ed31a9ab5dd8e7152282017e40reed test_peekpixels(reporter); 1254428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com} 126b260d130ca8bead7713b290ff0b56b427761922dhalcanary 127b260d130ca8bead7713b290ff0b56b427761922dhalcanary/** 128b260d130ca8bead7713b290ff0b56b427761922dhalcanary * This test checks that getColor works for both swizzles. 129b260d130ca8bead7713b290ff0b56b427761922dhalcanary */ 130b260d130ca8bead7713b290ff0b56b427761922dhalcanaryDEF_TEST(Bitmap_getColor_Swizzle, r) { 131b260d130ca8bead7713b290ff0b56b427761922dhalcanary SkBitmap source; 132b260d130ca8bead7713b290ff0b56b427761922dhalcanary source.allocN32Pixels(1,1); 133b260d130ca8bead7713b290ff0b56b427761922dhalcanary source.eraseColor(SK_ColorRED); 134b260d130ca8bead7713b290ff0b56b427761922dhalcanary SkColorType colorTypes[] = { 135b260d130ca8bead7713b290ff0b56b427761922dhalcanary kRGBA_8888_SkColorType, 136b260d130ca8bead7713b290ff0b56b427761922dhalcanary kBGRA_8888_SkColorType, 137b260d130ca8bead7713b290ff0b56b427761922dhalcanary }; 138b260d130ca8bead7713b290ff0b56b427761922dhalcanary for (SkColorType ct : colorTypes) { 139b260d130ca8bead7713b290ff0b56b427761922dhalcanary SkBitmap copy; 14068b8e3d50d0954eb5eeb7f625f06026c7fbd38c1Matt Sarett if (!sk_tool_utils::copy_to(©, ct, source)) { 141b260d130ca8bead7713b290ff0b56b427761922dhalcanary ERRORF(r, "SkBitmap::copy failed %d", (int)ct); 142b260d130ca8bead7713b290ff0b56b427761922dhalcanary continue; 143b260d130ca8bead7713b290ff0b56b427761922dhalcanary } 144b260d130ca8bead7713b290ff0b56b427761922dhalcanary REPORTER_ASSERT(r, source.getColor(0, 0) == copy.getColor(0, 0)); 145b260d130ca8bead7713b290ff0b56b427761922dhalcanary } 146b260d130ca8bead7713b290ff0b56b427761922dhalcanary} 147a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner 148a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagnerstatic void test_erasecolor_premul(skiatest::Reporter* reporter, SkColorType ct, SkColor input, 149a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner SkColor expected) { 150a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner SkBitmap bm; 151a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner bm.allocPixels(SkImageInfo::Make(1, 1, ct, kPremul_SkAlphaType)); 152a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner bm.eraseColor(input); 1537d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary INFOF(reporter, "expected: %x actual: %x\n", expected, bm.getColor(0, 0)); 154a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner REPORTER_ASSERT(reporter, bm.getColor(0, 0) == expected); 155a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner} 156a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner 157a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner/** 158a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner * This test checks that eraseColor premultiplies the color correctly. 159a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner */ 160a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagnerDEF_TEST(Bitmap_eraseColor_Premul, r) { 161a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner SkColor color = 0x80FF0080; 162a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner test_erasecolor_premul(r, kAlpha_8_SkColorType, color, 0x80000000); 163a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner test_erasecolor_premul(r, kRGB_565_SkColorType, color, 0xFF840042); 164a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner test_erasecolor_premul(r, kARGB_4444_SkColorType, color, 0x88FF0080); 165a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner test_erasecolor_premul(r, kRGBA_8888_SkColorType, color, color); 166a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner test_erasecolor_premul(r, kBGRA_8888_SkColorType, color, color); 167a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner} 1684cba3fe576de7f48edd0271498745462564fdd6dHal Canary 1694cba3fe576de7f48edd0271498745462564fdd6dHal Canary// Test that SkBitmap::ComputeOpaque() is correct for various colortypes. 1704cba3fe576de7f48edd0271498745462564fdd6dHal CanaryDEF_TEST(Bitmap_compute_is_opaque, r) { 1714cba3fe576de7f48edd0271498745462564fdd6dHal Canary struct { 1724cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkColorType fCT; 1734cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkAlphaType fAT; 1744cba3fe576de7f48edd0271498745462564fdd6dHal Canary } types[] = { 1754cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kGray_8_SkColorType, kOpaque_SkAlphaType }, 1764cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kAlpha_8_SkColorType, kPremul_SkAlphaType }, 1774cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kARGB_4444_SkColorType, kPremul_SkAlphaType }, 1784cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kRGB_565_SkColorType, kOpaque_SkAlphaType }, 1794cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kBGRA_8888_SkColorType, kPremul_SkAlphaType }, 1804cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kRGBA_8888_SkColorType, kPremul_SkAlphaType }, 1814cba3fe576de7f48edd0271498745462564fdd6dHal Canary { kRGBA_F16_SkColorType, kPremul_SkAlphaType }, 1824cba3fe576de7f48edd0271498745462564fdd6dHal Canary }; 1834cba3fe576de7f48edd0271498745462564fdd6dHal Canary for (auto type : types) { 1844cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkBitmap bm; 1854cba3fe576de7f48edd0271498745462564fdd6dHal Canary REPORTER_ASSERT(r, !SkBitmap::ComputeIsOpaque(bm)); 1864cba3fe576de7f48edd0271498745462564fdd6dHal Canary 1874cba3fe576de7f48edd0271498745462564fdd6dHal Canary bm.allocPixels(SkImageInfo::Make(13, 17, type.fCT, type.fAT)); 1884cba3fe576de7f48edd0271498745462564fdd6dHal Canary bm.eraseColor(SkColorSetARGB(255, 10, 20, 30)); 1894cba3fe576de7f48edd0271498745462564fdd6dHal Canary REPORTER_ASSERT(r, SkBitmap::ComputeIsOpaque(bm)); 1904cba3fe576de7f48edd0271498745462564fdd6dHal Canary 1914cba3fe576de7f48edd0271498745462564fdd6dHal Canary bm.eraseColor(SkColorSetARGB(128, 255, 255, 255)); 1924cba3fe576de7f48edd0271498745462564fdd6dHal Canary bool isOpaque = SkBitmap::ComputeIsOpaque(bm); 1934cba3fe576de7f48edd0271498745462564fdd6dHal Canary bool shouldBeOpaque = (type.fAT == kOpaque_SkAlphaType); 1944cba3fe576de7f48edd0271498745462564fdd6dHal Canary REPORTER_ASSERT(r, isOpaque == shouldBeOpaque); 1954cba3fe576de7f48edd0271498745462564fdd6dHal Canary } 1964cba3fe576de7f48edd0271498745462564fdd6dHal Canary} 1974cba3fe576de7f48edd0271498745462564fdd6dHal Canary 1984cba3fe576de7f48edd0271498745462564fdd6dHal Canary// Test that erase+getColor round trips with RGBA_F16 pixels. 1994cba3fe576de7f48edd0271498745462564fdd6dHal CanaryDEF_TEST(Bitmap_erase_f16_erase_getColor, r) { 2004cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkRandom random; 2014cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkPixmap pm; 2024cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkBitmap bm; 2034cba3fe576de7f48edd0271498745462564fdd6dHal Canary bm.allocPixels(SkImageInfo::Make(1, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType)); 2044cba3fe576de7f48edd0271498745462564fdd6dHal Canary REPORTER_ASSERT(r, bm.peekPixels(&pm)); 2054cba3fe576de7f48edd0271498745462564fdd6dHal Canary for (unsigned i = 0; i < 0x100; ++i) { 2064cba3fe576de7f48edd0271498745462564fdd6dHal Canary // Test all possible values of blue component. 2074cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkColor color1 = (SkColor)((random.nextU() & 0xFFFFFF00) | i); 2084cba3fe576de7f48edd0271498745462564fdd6dHal Canary // Test all possible values of alpha component. 2094cba3fe576de7f48edd0271498745462564fdd6dHal Canary SkColor color2 = (SkColor)((random.nextU() & 0x00FFFFFF) | (i << 24)); 2104cba3fe576de7f48edd0271498745462564fdd6dHal Canary for (SkColor color : {color1, color2}) { 2114cba3fe576de7f48edd0271498745462564fdd6dHal Canary pm.erase(color); 2124cba3fe576de7f48edd0271498745462564fdd6dHal Canary if (SkColorGetA(color) != 0) { 2134cba3fe576de7f48edd0271498745462564fdd6dHal Canary REPORTER_ASSERT(r, color == pm.getColor(0, 0)); 2144cba3fe576de7f48edd0271498745462564fdd6dHal Canary } else { 2154cba3fe576de7f48edd0271498745462564fdd6dHal Canary REPORTER_ASSERT(r, 0 == SkColorGetA(pm.getColor(0, 0))); 2164cba3fe576de7f48edd0271498745462564fdd6dHal Canary } 2174cba3fe576de7f48edd0271498745462564fdd6dHal Canary } 2184cba3fe576de7f48edd0271498745462564fdd6dHal Canary } 2194cba3fe576de7f48edd0271498745462564fdd6dHal Canary} 2204cba3fe576de7f48edd0271498745462564fdd6dHal Canary 221cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary// Make sure that the bitmap remains valid when pixelref is removed. 222cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal CanaryDEF_TEST(Bitmap_clear_pixelref_keep_info, r) { 223cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary SkBitmap bm; 224cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary bm.allocPixels(SkImageInfo::MakeN32Premul(100,100)); 225cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary bm.setPixelRef(nullptr, 0, 0); 226cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary SkDEBUGCODE(bm.validate();) 227cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary} 228cff9ab7d9804804f0805b59ca5712f70b2d93bb2Hal Canary 229