1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org
878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkBitmap.h"
978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkCanvas.h"
1078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkColorPriv.h"
119f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com#include "SkGradientShader.h"
1278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkRect.h"
138f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
1478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
15fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org// these are in the same order as the SkColorType enum
168ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.orgstatic const char* gColorTypeName[] = {
178ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org    "None", "A8", "565", "4444", "RGBA", "BGRA", "Index8"
1878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com};
1978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
2078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com/** Returns -1 on success, else the x coord of the first bad pixel, return its
2178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    value in bad
2278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com */
2378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comtypedef int (*Proc)(const void*, int width, uint32_t expected, uint32_t* bad);
2478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
2578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic int proc_32(const void* ptr, int w, uint32_t expected, uint32_t* bad) {
2678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    const SkPMColor* addr = static_cast<const SkPMColor*>(ptr);
2778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int x = 0; x < w; x++) {
2878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (addr[x] != expected) {
2978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *bad = addr[x];
3078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return x;
3178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
3278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
3378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return -1;
3478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
3578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
3678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic int proc_16(const void* ptr, int w, uint32_t expected, uint32_t* bad) {
3778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    const uint16_t* addr = static_cast<const uint16_t*>(ptr);
3878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int x = 0; x < w; x++) {
3978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (addr[x] != expected) {
4078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *bad = addr[x];
4178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return x;
4278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
4378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
4478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return -1;
4578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
4678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
4778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic int proc_8(const void* ptr, int w, uint32_t expected, uint32_t* bad) {
4878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    const SkPMColor* addr = static_cast<const SkPMColor*>(ptr);
4978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int x = 0; x < w; x++) {
5078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (SkGetPackedA32(addr[x]) != expected) {
5178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *bad = SkGetPackedA32(addr[x]);
5278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return x;
5378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
5478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
5578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return -1;
5678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
5778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
5854f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic int proc_bad(const void*, int, uint32_t, uint32_t* bad) {
5978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    *bad = 0;
6078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return 0;
6178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
6278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
6378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic Proc find_proc(const SkBitmap& bm, SkPMColor expect32, uint16_t expect16,
6478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                      uint8_t expect8, uint32_t* expect) {
658ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org    switch (bm.colorType()) {
6628fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org        case kN32_SkColorType:
6778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = expect32;
6878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_32;
698ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org        case kARGB_4444_SkColorType:
708ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org        case kRGB_565_SkColorType:
7178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = expect16;
7278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_16;
738ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org        case kAlpha_8_SkColorType:
7478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = expect8;
7578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_8;
7678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        default:
7778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = 0;
7878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_bad;
7978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
8078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
8178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
8278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic bool check_color(const SkBitmap& bm, SkPMColor expect32,
8378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                        uint16_t expect16, uint8_t expect8,
8478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                        skiatest::Reporter* reporter) {
8578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    uint32_t expect;
8678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    Proc proc = find_proc(bm, expect32, expect16, expect8, &expect);
8778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int y = 0; y < bm.height(); y++) {
8878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        uint32_t bad;
8978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        int x = proc(bm.getAddr(0, y), bm.width(), expect, &bad);
9078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (x >= 0) {
918ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org            ERRORF(reporter, "BlitRow colortype=%s [%d %d] expected %x got %x",
928ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org                   gColorTypeName[bm.colorType()], x, y, expect, bad);
9378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return false;
9478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
9578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
9678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return true;
9778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
9878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
999f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com// Make sure our blits always map src==0 to a noop, and src==FF to full opaque
1009f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void test_00_FF(skiatest::Reporter* reporter) {
10178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    static const int W = 256;
10278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
103fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    static const SkColorType gDstColorType[] = {
10428fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org        kN32_SkColorType,
105fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        kRGB_565_SkColorType,
10678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    };
10778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
10878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    static const struct {
10978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkColor     fSrc;
11078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkColor     fDst;
11178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkPMColor   fResult32;
11278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        uint16_t    fResult16;
11378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        uint8_t     fResult8;
11478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    } gSrcRec[] = {
11578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0,            0,          0,                                    0,      0 },
11678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0,            0xFFFFFFFF, SkPackARGB32(0xFF, 0xFF, 0xFF, 0xFF), 0xFFFF, 0xFF },
11778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0xFFFFFFFF,   0,          SkPackARGB32(0xFF, 0xFF, 0xFF, 0xFF), 0xFFFF, 0xFF },
11878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0xFFFFFFFF,   0xFFFFFFFF, SkPackARGB32(0xFF, 0xFF, 0xFF, 0xFF), 0xFFFF, 0xFF },
11978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    };
1201db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com
1211db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com    SkPaint paint;
1221db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com
12378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    SkBitmap srcBM;
124fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    srcBM.allocN32Pixels(W, 1);
1259f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
126fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    for (size_t i = 0; i < SK_ARRAY_COUNT(gDstColorType); i++) {
127fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        SkImageInfo info = SkImageInfo::Make(W, 1, gDstColorType[i],
128fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org                                             kPremul_SkAlphaType);
12978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkBitmap dstBM;
130fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        dstBM.allocPixels(info);
131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
13278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkCanvas canvas(dstBM);
13378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gSrcRec); j++) {
13478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            srcBM.eraseColor(gSrcRec[j].fSrc);
13578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            dstBM.eraseColor(gSrcRec[j].fDst);
13678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1371db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com            for (int k = 0; k < 4; k++) {
1381db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                bool dither = (k & 1) != 0;
1391db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                bool blend = (k & 2) != 0;
1401db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                if (gSrcRec[j].fSrc != 0 && blend) {
1411db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                    // can't make a numerical promise about blending anything
1421db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                    // but 0
1438e4c93b04cdaa8caeba6b76d612fb2dd58a57a61reed@android.com                 //   continue;
1441db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                }
1451db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                paint.setDither(dither);
1461db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                paint.setAlpha(blend ? 0x80 : 0xFF);
1471db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                canvas.drawBitmap(srcBM, 0, 0, &paint);
1481db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                if (!check_color(dstBM, gSrcRec[j].fResult32, gSrcRec[j].fResult16,
1491db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                                 gSrcRec[j].fResult8, reporter)) {
1501db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                    SkDebugf("--- src index %d dither %d blend %d\n", j, dither, blend);
1511db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                }
15278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            }
15378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
15478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
15578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
15678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1579f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com///////////////////////////////////////////////////////////////////////////////
1589f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1599f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstruct Mesh {
1609f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkPoint     fPts[4];
1619f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1629f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    Mesh(const SkBitmap& bm, SkPaint* paint) {
1639f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        const SkScalar w = SkIntToScalar(bm.width());
1649f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        const SkScalar h = SkIntToScalar(bm.height());
1659f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[0].set(0, 0);
1669f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[1].set(w, 0);
1679f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[2].set(w, h);
1689f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[3].set(0, h);
1699f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
1709f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                                                   SkShader::kClamp_TileMode);
1719f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        paint->setShader(s)->unref();
172d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1739f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    }
1749f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1759f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    void draw(SkCanvas* canvas, SkPaint* paint) {
1769f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, fPts, fPts,
1779f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                             NULL, NULL, NULL, 0, *paint);
1789f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    }
1799f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com};
1809f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1819f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com#include "SkImageEncoder.h"
1829f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void save_bm(const SkBitmap& bm, const char name[]) {
1839f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkImageEncoder::EncodeFile(name, bm, SkImageEncoder::kPNG_Type, 100);
1849f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com}
1859f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1869f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic bool gOnce;
1879f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1889f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com// Make sure our blits are invariant with the width of the blit (i.e. that
1899f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com// special case for 8 at a time have the same results as narrower blits)
1909f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void test_diagonal(skiatest::Reporter* reporter) {
1919f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const int W = 64;
1929f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const int H = W;
193d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
194fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    static const SkColorType gDstColorType[] = {
19528fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org        kN32_SkColorType,
196fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        kRGB_565_SkColorType,
1979f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    };
1989f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1999f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const SkColor gDstBG[] = { 0, 0xFFFFFFFF };
2009f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2019f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkPaint paint;
202d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2039f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkBitmap srcBM;
204fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    srcBM.allocN32Pixels(W, H);
205d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com    SkRect srcR = {
206d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com        0, 0, SkIntToScalar(srcBM.width()), SkIntToScalar(srcBM.height()) };
2079f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2089f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    // cons up a mesh to draw the bitmap with
2099f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    Mesh mesh(srcBM, &paint);
2109f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
211fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    SkImageInfo info = SkImageInfo::Make(W, H, kUnknown_SkColorType,
212fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org                                         kPremul_SkAlphaType);
213fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org
214fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    for (size_t i = 0; i < SK_ARRAY_COUNT(gDstColorType); i++) {
215fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        info.fColorType = gDstColorType[i];
216fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org
2179f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkBitmap dstBM0, dstBM1;
218fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        dstBM0.allocPixels(info);
219fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        dstBM1.allocPixels(info);
220d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2219f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkCanvas canvas0(dstBM0);
2229f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkCanvas canvas1(dstBM1);
2239f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkColor bgColor;
2249f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2259f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gDstBG); j++) {
2269f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com            bgColor = gDstBG[j];
2279f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2289f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com            for (int c = 0; c <= 0xFF; c++) {
2299f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                srcBM.eraseARGB(0xFF, c, c, c);
230d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2319f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                for (int k = 0; k < 4; k++) {
2329f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    bool dither = (k & 1) != 0;
2339f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    uint8_t alpha = (k & 2) ? 0x80 : 0xFF;
2349f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    paint.setDither(dither);
2359f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    paint.setAlpha(alpha);
2369f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2379f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    dstBM0.eraseColor(bgColor);
2389f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    dstBM1.eraseColor(bgColor);
2399f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2409f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    canvas0.drawRect(srcR, paint);
2419f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    mesh.draw(&canvas1, &paint);
2429f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2439f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    if (!gOnce && false) {
2449f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        save_bm(dstBM0, "drawBitmap.png");
2459f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        save_bm(dstBM1, "drawMesh.png");
2469f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        gOnce = true;
2479f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    }
2489f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2499f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    if (memcmp(dstBM0.getPixels(), dstBM1.getPixels(), dstBM0.getSize())) {
250fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org                        ERRORF(reporter, "Diagonal colortype=%s bg=0x%x dither=%d"
251a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com                               " alpha=0x%x src=0x%x",
2528ef51b975c2bdb8fa332f091863e5410c18576c7commit-bot@chromium.org                               gColorTypeName[gDstColorType[i]], bgColor, dither,
253a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com                               alpha, c);
2549f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    }
2559f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                }
2569f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com            }
2579f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        }
2589f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    }
2599f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com}
2609f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
261e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(BlitRow, reporter) {
2629f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    test_00_FF(reporter);
2639f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    test_diagonal(reporter);
2649f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com}
265