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(&copy, 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