BitmapTest.cpp revision 4cba3fe576de7f48edd0271498745462564fdd6d
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"
104428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com#include "Test.h"
114428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com
12cb674144545866ed31a9ab5dd8e7152282017e40reedstatic void test_peekpixels(skiatest::Reporter* reporter) {
13cb674144545866ed31a9ab5dd8e7152282017e40reed    const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
14cb674144545866ed31a9ab5dd8e7152282017e40reed
15cb674144545866ed31a9ab5dd8e7152282017e40reed    SkPixmap pmap;
16cb674144545866ed31a9ab5dd8e7152282017e40reed    SkBitmap bm;
17cb674144545866ed31a9ab5dd8e7152282017e40reed
18cb674144545866ed31a9ab5dd8e7152282017e40reed    // empty should return false
1996fcdcc219d2a0d3579719b84b28bede76efba64halcanary    REPORTER_ASSERT(reporter, !bm.peekPixels(nullptr));
20cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, !bm.peekPixels(&pmap));
21cb674144545866ed31a9ab5dd8e7152282017e40reed
22cb674144545866ed31a9ab5dd8e7152282017e40reed    // no pixels should return false
23cb674144545866ed31a9ab5dd8e7152282017e40reed    bm.setInfo(SkImageInfo::MakeN32Premul(10, 10));
2496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    REPORTER_ASSERT(reporter, !bm.peekPixels(nullptr));
25cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, !bm.peekPixels(&pmap));
26cb674144545866ed31a9ab5dd8e7152282017e40reed
27cb674144545866ed31a9ab5dd8e7152282017e40reed    // real pixels should return true
28cb674144545866ed31a9ab5dd8e7152282017e40reed    bm.allocPixels(info);
2996fcdcc219d2a0d3579719b84b28bede76efba64halcanary    REPORTER_ASSERT(reporter, bm.peekPixels(nullptr));
30cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, bm.peekPixels(&pmap));
31cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, pmap.info() == bm.info());
32cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, pmap.addr() == bm.getPixels());
33cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, pmap.rowBytes() == bm.rowBytes());
34cb674144545866ed31a9ab5dd8e7152282017e40reed    REPORTER_ASSERT(reporter, pmap.ctable() == bm.getColorTable());
35cb674144545866ed31a9ab5dd8e7152282017e40reed}
36cb674144545866ed31a9ab5dd8e7152282017e40reed
372ff257bd95c732b9cebc3aac03fbed72d6e6082areed// https://code.google.com/p/chromium/issues/detail?id=446164
382ff257bd95c732b9cebc3aac03fbed72d6e6082areedstatic void test_bigalloc(skiatest::Reporter* reporter) {
392ff257bd95c732b9cebc3aac03fbed72d6e6082areed    const int width = 0x40000001;
402ff257bd95c732b9cebc3aac03fbed72d6e6082areed    const int height = 0x00000096;
412ff257bd95c732b9cebc3aac03fbed72d6e6082areed    const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
422ff257bd95c732b9cebc3aac03fbed72d6e6082areed
432ff257bd95c732b9cebc3aac03fbed72d6e6082areed    SkBitmap bm;
442ff257bd95c732b9cebc3aac03fbed72d6e6082areed    REPORTER_ASSERT(reporter, !bm.tryAllocPixels(info));
452ff257bd95c732b9cebc3aac03fbed72d6e6082areed
4696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    SkPixelRef* pr = SkMallocPixelRef::NewAllocate(info, info.minRowBytes(), nullptr);
472ff257bd95c732b9cebc3aac03fbed72d6e6082areed    REPORTER_ASSERT(reporter, !pr);
482ff257bd95c732b9cebc3aac03fbed72d6e6082areed}
492ff257bd95c732b9cebc3aac03fbed72d6e6082areed
50f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reedstatic void test_allocpixels(skiatest::Reporter* reporter) {
51f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    const int width = 10;
52f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    const int height = 10;
53f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
54f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    const size_t explicitRowBytes = info.minRowBytes() + 24;
55f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed
56f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    SkBitmap bm;
57f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.setInfo(info);
58f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
59f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.allocPixels();
60f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
61f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.reset();
62f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.allocPixels(info);
63f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
64f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed
65f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.setInfo(info, explicitRowBytes);
66f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
67f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.allocPixels();
68f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
69f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.reset();
70f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.allocPixels(info, explicitRowBytes);
71f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
72f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed
73f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.reset();
74f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.setInfo(info, 0);
75f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
76f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.reset();
77f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.allocPixels(info, 0);
78f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
79f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed
80f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bm.reset();
81f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    bool success = bm.setInfo(info, info.minRowBytes() - 1);   // invalid for 32bit
82f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, !success);
83f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    REPORTER_ASSERT(reporter, bm.isNull());
84f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed}
85f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed
864856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.comstatic void test_bigwidth(skiatest::Reporter* reporter) {
874856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    SkBitmap bm;
884856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    int width = 1 << 29;    // *4 will be the high-bit of 32bit int
894856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com
90a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org    SkImageInfo info = SkImageInfo::MakeA8(width, 1);
91a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org    REPORTER_ASSERT(reporter, bm.setInfo(info));
92e5ea500d4714a7d84de2bf913e81be3b65d2de68reed    REPORTER_ASSERT(reporter, bm.setInfo(info.makeColorType(kRGB_565_SkColorType)));
93f5e1f63461d0a4dcb4bd5d0388ec6d392b97e5f0skia.committer@gmail.com
944856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    // for a 4-byte config, this width will compute a rowbytes of 0x80000000,
954856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    // which does not fit in a int32_t. setConfig should detect this, and fail.
964856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com
974856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    // TODO: perhaps skia can relax this, and only require that rowBytes fit
984856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    //       in a uint32_t (or larger), but for now this is the constraint.
994856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com
100e5ea500d4714a7d84de2bf913e81be3b65d2de68reed    REPORTER_ASSERT(reporter, !bm.setInfo(info.makeColorType(kN32_SkColorType)));
1014856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com}
1024856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com
1034428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com/**
1044428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com *  This test contains basic sanity checks concerning bitmaps.
1054428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com */
1064428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.comDEF_TEST(Bitmap, reporter) {
1074428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com    // Zero-sized bitmaps are allowed
1084428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com    for (int width = 0; width < 2; ++width) {
1094428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com        for (int height = 0; height < 2; ++height) {
1104428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com            SkBitmap bm;
111a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org            bool setConf = bm.setInfo(SkImageInfo::MakeN32Premul(width, height));
1124428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com            REPORTER_ASSERT(reporter, setConf);
1134428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com            if (setConf) {
114848250415eddc54075f7eb8795e8db79e749c6abreed                bm.allocPixels();
1154428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com            }
1162af6c1204de73a2513189007b9623fec0e296dc2halcanary@google.com            REPORTER_ASSERT(reporter, SkToBool(width & height) != bm.empty());
1174428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com        }
1184428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com    }
119f5e1f63461d0a4dcb4bd5d0388ec6d392b97e5f0skia.committer@gmail.com
1204856964eae9cdb779baa08ef9e5646ccb9a3140dreed@google.com    test_bigwidth(reporter);
121f0aed97aec3fa1c7f6460d8d6327358f3dcbabe6reed    test_allocpixels(reporter);
1222ff257bd95c732b9cebc3aac03fbed72d6e6082areed    test_bigalloc(reporter);
123cb674144545866ed31a9ab5dd8e7152282017e40reed    test_peekpixels(reporter);
1244428734907480cdb4ccecb47152d7be8cd1aec32halcanary@google.com}
125b260d130ca8bead7713b290ff0b56b427761922dhalcanary
126b260d130ca8bead7713b290ff0b56b427761922dhalcanary/**
127b260d130ca8bead7713b290ff0b56b427761922dhalcanary *  This test checks that getColor works for both swizzles.
128b260d130ca8bead7713b290ff0b56b427761922dhalcanary */
129b260d130ca8bead7713b290ff0b56b427761922dhalcanaryDEF_TEST(Bitmap_getColor_Swizzle, r) {
130b260d130ca8bead7713b290ff0b56b427761922dhalcanary    SkBitmap source;
131b260d130ca8bead7713b290ff0b56b427761922dhalcanary    source.allocN32Pixels(1,1);
132b260d130ca8bead7713b290ff0b56b427761922dhalcanary    source.eraseColor(SK_ColorRED);
133b260d130ca8bead7713b290ff0b56b427761922dhalcanary    SkColorType colorTypes[] = {
134b260d130ca8bead7713b290ff0b56b427761922dhalcanary        kRGBA_8888_SkColorType,
135b260d130ca8bead7713b290ff0b56b427761922dhalcanary        kBGRA_8888_SkColorType,
136b260d130ca8bead7713b290ff0b56b427761922dhalcanary    };
137b260d130ca8bead7713b290ff0b56b427761922dhalcanary    for (SkColorType ct : colorTypes) {
138b260d130ca8bead7713b290ff0b56b427761922dhalcanary        SkBitmap copy;
139b260d130ca8bead7713b290ff0b56b427761922dhalcanary        if (!source.copyTo(&copy, ct)) {
140b260d130ca8bead7713b290ff0b56b427761922dhalcanary            ERRORF(r, "SkBitmap::copy failed %d", (int)ct);
141b260d130ca8bead7713b290ff0b56b427761922dhalcanary            continue;
142b260d130ca8bead7713b290ff0b56b427761922dhalcanary        }
143b260d130ca8bead7713b290ff0b56b427761922dhalcanary        SkAutoLockPixels autoLockPixels1(copy);
144b260d130ca8bead7713b290ff0b56b427761922dhalcanary        SkAutoLockPixels autoLockPixels2(source);
145b260d130ca8bead7713b290ff0b56b427761922dhalcanary        REPORTER_ASSERT(r, source.getColor(0, 0) == copy.getColor(0, 0));
146b260d130ca8bead7713b290ff0b56b427761922dhalcanary    }
147b260d130ca8bead7713b290ff0b56b427761922dhalcanary}
148a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner
149a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagnerstatic void test_erasecolor_premul(skiatest::Reporter* reporter, SkColorType ct, SkColor input,
150a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner                                   SkColor expected) {
151a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner  SkBitmap bm;
152a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner  bm.allocPixels(SkImageInfo::Make(1, 1, ct, kPremul_SkAlphaType));
153a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner  bm.eraseColor(input);
1547d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary  INFOF(reporter, "expected: %x actual: %x\n", expected, bm.getColor(0, 0));
155a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner  REPORTER_ASSERT(reporter, bm.getColor(0, 0) == expected);
156a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner}
157a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner
158a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner/**
159a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner *  This test checks that eraseColor premultiplies the color correctly.
160a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner */
161a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagnerDEF_TEST(Bitmap_eraseColor_Premul, r) {
162a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner    SkColor color = 0x80FF0080;
163a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner    test_erasecolor_premul(r, kAlpha_8_SkColorType, color, 0x80000000);
164a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner    test_erasecolor_premul(r, kRGB_565_SkColorType, color, 0xFF840042);
165a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner    test_erasecolor_premul(r, kARGB_4444_SkColorType, color, 0x88FF0080);
166a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner    test_erasecolor_premul(r, kRGBA_8888_SkColorType, color, color);
167a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner    test_erasecolor_premul(r, kBGRA_8888_SkColorType, color, color);
168a1bb8e02fe7956b2f85a0afadbca5f607a804403benjaminwagner}
1694cba3fe576de7f48edd0271498745462564fdd6dHal Canary
1704cba3fe576de7f48edd0271498745462564fdd6dHal Canary// Test that SkBitmap::ComputeOpaque() is correct for various colortypes.
1714cba3fe576de7f48edd0271498745462564fdd6dHal CanaryDEF_TEST(Bitmap_compute_is_opaque, r) {
1724cba3fe576de7f48edd0271498745462564fdd6dHal Canary    struct {
1734cba3fe576de7f48edd0271498745462564fdd6dHal Canary        SkColorType fCT;
1744cba3fe576de7f48edd0271498745462564fdd6dHal Canary        SkAlphaType fAT;
1754cba3fe576de7f48edd0271498745462564fdd6dHal Canary    } types[] = {
1764cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kGray_8_SkColorType,    kOpaque_SkAlphaType },
1774cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kAlpha_8_SkColorType,   kPremul_SkAlphaType },
1784cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kARGB_4444_SkColorType, kPremul_SkAlphaType },
1794cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kRGB_565_SkColorType,   kOpaque_SkAlphaType },
1804cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kBGRA_8888_SkColorType, kPremul_SkAlphaType },
1814cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kRGBA_8888_SkColorType, kPremul_SkAlphaType },
1824cba3fe576de7f48edd0271498745462564fdd6dHal Canary        { kRGBA_F16_SkColorType,  kPremul_SkAlphaType },
1834cba3fe576de7f48edd0271498745462564fdd6dHal Canary    };
1844cba3fe576de7f48edd0271498745462564fdd6dHal Canary    for (auto type : types) {
1854cba3fe576de7f48edd0271498745462564fdd6dHal Canary        SkBitmap bm;
1864cba3fe576de7f48edd0271498745462564fdd6dHal Canary        REPORTER_ASSERT(r, !SkBitmap::ComputeIsOpaque(bm));
1874cba3fe576de7f48edd0271498745462564fdd6dHal Canary
1884cba3fe576de7f48edd0271498745462564fdd6dHal Canary        bm.allocPixels(SkImageInfo::Make(13, 17, type.fCT, type.fAT));
1894cba3fe576de7f48edd0271498745462564fdd6dHal Canary        bm.eraseColor(SkColorSetARGB(255, 10, 20, 30));
1904cba3fe576de7f48edd0271498745462564fdd6dHal Canary        REPORTER_ASSERT(r, SkBitmap::ComputeIsOpaque(bm));
1914cba3fe576de7f48edd0271498745462564fdd6dHal Canary
1924cba3fe576de7f48edd0271498745462564fdd6dHal Canary        bm.eraseColor(SkColorSetARGB(128, 255, 255, 255));
1934cba3fe576de7f48edd0271498745462564fdd6dHal Canary        bool isOpaque = SkBitmap::ComputeIsOpaque(bm);
1944cba3fe576de7f48edd0271498745462564fdd6dHal Canary        bool shouldBeOpaque = (type.fAT == kOpaque_SkAlphaType);
1954cba3fe576de7f48edd0271498745462564fdd6dHal Canary        REPORTER_ASSERT(r, isOpaque == shouldBeOpaque);
1964cba3fe576de7f48edd0271498745462564fdd6dHal Canary    }
1974cba3fe576de7f48edd0271498745462564fdd6dHal Canary}
1984cba3fe576de7f48edd0271498745462564fdd6dHal Canary
1994cba3fe576de7f48edd0271498745462564fdd6dHal Canary// Test that erase+getColor round trips with RGBA_F16 pixels.
2004cba3fe576de7f48edd0271498745462564fdd6dHal CanaryDEF_TEST(Bitmap_erase_f16_erase_getColor, r) {
2014cba3fe576de7f48edd0271498745462564fdd6dHal Canary    SkRandom random;
2024cba3fe576de7f48edd0271498745462564fdd6dHal Canary    SkPixmap pm;
2034cba3fe576de7f48edd0271498745462564fdd6dHal Canary    SkBitmap bm;
2044cba3fe576de7f48edd0271498745462564fdd6dHal Canary    bm.allocPixels(SkImageInfo::Make(1, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType));
2054cba3fe576de7f48edd0271498745462564fdd6dHal Canary    REPORTER_ASSERT(r, bm.peekPixels(&pm));
2064cba3fe576de7f48edd0271498745462564fdd6dHal Canary    for (unsigned i = 0; i < 0x100; ++i) {
2074cba3fe576de7f48edd0271498745462564fdd6dHal Canary        // Test all possible values of blue component.
2084cba3fe576de7f48edd0271498745462564fdd6dHal Canary        SkColor color1 = (SkColor)((random.nextU() & 0xFFFFFF00) | i);
2094cba3fe576de7f48edd0271498745462564fdd6dHal Canary        // Test all possible values of alpha component.
2104cba3fe576de7f48edd0271498745462564fdd6dHal Canary        SkColor color2 = (SkColor)((random.nextU() & 0x00FFFFFF) | (i << 24));
2114cba3fe576de7f48edd0271498745462564fdd6dHal Canary        for (SkColor color : {color1, color2}) {
2124cba3fe576de7f48edd0271498745462564fdd6dHal Canary            pm.erase(color);
2134cba3fe576de7f48edd0271498745462564fdd6dHal Canary            if (SkColorGetA(color) != 0) {
2144cba3fe576de7f48edd0271498745462564fdd6dHal Canary                REPORTER_ASSERT(r, color == pm.getColor(0, 0));
2154cba3fe576de7f48edd0271498745462564fdd6dHal Canary            } else {
2164cba3fe576de7f48edd0271498745462564fdd6dHal Canary                REPORTER_ASSERT(r, 0 == SkColorGetA(pm.getColor(0, 0)));
2174cba3fe576de7f48edd0271498745462564fdd6dHal Canary            }
2184cba3fe576de7f48edd0271498745462564fdd6dHal Canary        }
2194cba3fe576de7f48edd0271498745462564fdd6dHal Canary    }
2204cba3fe576de7f48edd0271498745462564fdd6dHal Canary}
2214cba3fe576de7f48edd0271498745462564fdd6dHal Canary
222