BlitRowTest.cpp revision 54f0d1b7113cb0dc184e522539aab1030a28a421
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "Test.h"
978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkBitmap.h"
1078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkCanvas.h"
1178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkColorPriv.h"
129f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com#include "SkGradientShader.h"
1378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "SkRect.h"
1478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic inline const char* boolStr(bool value) {
1678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return value ? "true" : "false";
1778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
1878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com// these are in the same order as the SkBitmap::Config enum
2078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic const char* gConfigName[] = {
2178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    "None", "A1", "A8", "Index8", "565", "4444", "8888", "RLE_Index8"
2278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com};
2378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
2478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com/** Returns -1 on success, else the x coord of the first bad pixel, return its
2578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    value in bad
2678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com */
2778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comtypedef int (*Proc)(const void*, int width, uint32_t expected, uint32_t* bad);
2878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
2978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic int proc_32(const void* ptr, int w, uint32_t expected, uint32_t* bad) {
3078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    const SkPMColor* addr = static_cast<const SkPMColor*>(ptr);
3178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int x = 0; x < w; x++) {
3278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (addr[x] != expected) {
3378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *bad = addr[x];
3478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return x;
3578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
3678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
3778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return -1;
3878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
3978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
4078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic int proc_16(const void* ptr, int w, uint32_t expected, uint32_t* bad) {
4178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    const uint16_t* addr = static_cast<const uint16_t*>(ptr);
4278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int x = 0; x < w; x++) {
4378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (addr[x] != expected) {
4478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *bad = addr[x];
4578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return x;
4678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
4778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
4878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return -1;
4978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
5078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
5178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic int proc_8(const void* ptr, int w, uint32_t expected, uint32_t* bad) {
5278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    const SkPMColor* addr = static_cast<const SkPMColor*>(ptr);
5378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int x = 0; x < w; x++) {
5478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (SkGetPackedA32(addr[x]) != expected) {
5578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *bad = SkGetPackedA32(addr[x]);
5678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return x;
5778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
5878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
5978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return -1;
6078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
6178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
6254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic int proc_bad(const void*, int, uint32_t, uint32_t* bad) {
6378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    *bad = 0;
6478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return 0;
6578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
6678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
6778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic Proc find_proc(const SkBitmap& bm, SkPMColor expect32, uint16_t expect16,
6878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                      uint8_t expect8, uint32_t* expect) {
6978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    switch (bm.config()) {
7078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        case SkBitmap::kARGB_8888_Config:
7178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = expect32;
7278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_32;
7378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        case SkBitmap::kARGB_4444_Config:
7478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        case SkBitmap::kRGB_565_Config:
7578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = expect16;
7678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_16;
7778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        case SkBitmap::kA8_Config:
7878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = expect8;
7978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_8;
8078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        default:
8178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            *expect = 0;
8278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return proc_bad;
8378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
8478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
8578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
8678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comstatic bool check_color(const SkBitmap& bm, SkPMColor expect32,
8778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                        uint16_t expect16, uint8_t expect8,
8878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                        skiatest::Reporter* reporter) {
8978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    uint32_t expect;
9078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    Proc proc = find_proc(bm, expect32, expect16, expect8, &expect);
9178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (int y = 0; y < bm.height(); y++) {
9278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        uint32_t bad;
9378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        int x = proc(bm.getAddr(0, y), bm.width(), expect, &bad);
9478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        if (x >= 0) {
9578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            SkString str;
9678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            str.printf("BlitRow config=%s [%d %d] expected %x got %x",
9778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com                       gConfigName[bm.config()], x, y, expect, bad);
9878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            reporter->reportFailed(str);
9978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            return false;
10078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
10178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
10278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    return true;
10378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
10478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1059f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com// Make sure our blits always map src==0 to a noop, and src==FF to full opaque
1069f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void test_00_FF(skiatest::Reporter* reporter) {
10778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    static const int W = 256;
10878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
10978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    static const SkBitmap::Config gDstConfig[] = {
11078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkBitmap::kARGB_8888_Config,
11178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkBitmap::kRGB_565_Config,
1128e4c93b04cdaa8caeba6b76d612fb2dd58a57a61reed@android.com//        SkBitmap::kARGB_4444_Config,
11378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com//        SkBitmap::kA8_Config,
11478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    };
11578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
11678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    static const struct {
11778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkColor     fSrc;
11878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkColor     fDst;
11978cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkPMColor   fResult32;
12078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        uint16_t    fResult16;
12178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        uint8_t     fResult8;
12278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    } gSrcRec[] = {
12378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0,            0,          0,                                    0,      0 },
12478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0,            0xFFFFFFFF, SkPackARGB32(0xFF, 0xFF, 0xFF, 0xFF), 0xFFFF, 0xFF },
12578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0xFFFFFFFF,   0,          SkPackARGB32(0xFF, 0xFF, 0xFF, 0xFF), 0xFFFF, 0xFF },
12678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        { 0xFFFFFFFF,   0xFFFFFFFF, SkPackARGB32(0xFF, 0xFF, 0xFF, 0xFF), 0xFFFF, 0xFF },
12778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    };
1281db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com
1291db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com    SkPaint paint;
1301db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com
13178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    SkBitmap srcBM;
13278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    srcBM.setConfig(SkBitmap::kARGB_8888_Config, W, 1);
13378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    srcBM.allocPixels();
1349f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
13578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gDstConfig); i++) {
13678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkBitmap dstBM;
13778cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        dstBM.setConfig(gDstConfig[i], W, 1);
13878cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        dstBM.allocPixels();
139d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
14078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        SkCanvas canvas(dstBM);
14178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gSrcRec); j++) {
14278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            srcBM.eraseColor(gSrcRec[j].fSrc);
14378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            dstBM.eraseColor(gSrcRec[j].fDst);
14478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1451db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com            for (int k = 0; k < 4; k++) {
1461db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                bool dither = (k & 1) != 0;
1471db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                bool blend = (k & 2) != 0;
1481db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                if (gSrcRec[j].fSrc != 0 && blend) {
1491db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                    // can't make a numerical promise about blending anything
1501db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                    // but 0
1518e4c93b04cdaa8caeba6b76d612fb2dd58a57a61reed@android.com                 //   continue;
1521db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                }
1531db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                paint.setDither(dither);
1541db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                paint.setAlpha(blend ? 0x80 : 0xFF);
1551db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                canvas.drawBitmap(srcBM, 0, 0, &paint);
1561db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                if (!check_color(dstBM, gSrcRec[j].fResult32, gSrcRec[j].fResult16,
1571db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                                 gSrcRec[j].fResult8, reporter)) {
1581db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                    SkDebugf("--- src index %d dither %d blend %d\n", j, dither, blend);
1591db89dc9a5ffa52e2f4206e9a52b334451c37465reed@android.com                }
16078cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com            }
16178cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com        }
16278cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com    }
16378cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com}
16478cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com
1659f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com///////////////////////////////////////////////////////////////////////////////
1669f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1679f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstruct Mesh {
1689f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkPoint     fPts[4];
1699f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    uint16_t    fIndices[6];
1709f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1719f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    Mesh(const SkBitmap& bm, SkPaint* paint) {
1729f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        const SkScalar w = SkIntToScalar(bm.width());
1739f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        const SkScalar h = SkIntToScalar(bm.height());
1749f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[0].set(0, 0);
1759f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[1].set(w, 0);
1769f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[2].set(w, h);
1779f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        fPts[3].set(0, h);
1789f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
1799f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                                                   SkShader::kClamp_TileMode);
1809f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        paint->setShader(s)->unref();
181d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1829f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    }
1839f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1849f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    void draw(SkCanvas* canvas, SkPaint* paint) {
1859f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, fPts, fPts,
1869f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                             NULL, NULL, NULL, 0, *paint);
1879f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    }
1889f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com};
1899f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1909f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com#include "SkImageEncoder.h"
1919f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void save_bm(const SkBitmap& bm, const char name[]) {
1929f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkImageEncoder::EncodeFile(name, bm, SkImageEncoder::kPNG_Type, 100);
1939f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com}
1949f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1959f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic bool gOnce;
1969f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
1979f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com// Make sure our blits are invariant with the width of the blit (i.e. that
1989f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com// special case for 8 at a time have the same results as narrower blits)
1999f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void test_diagonal(skiatest::Reporter* reporter) {
2009f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const int W = 64;
2019f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const int H = W;
202d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2039f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const SkBitmap::Config gDstConfig[] = {
2049f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkBitmap::kARGB_8888_Config,
2059f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkBitmap::kRGB_565_Config,
2069f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        //        SkBitmap::kARGB_4444_Config,
2079f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        //        SkBitmap::kA8_Config,
2089f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    };
2099f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2109f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    static const SkColor gDstBG[] = { 0, 0xFFFFFFFF };
2119f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2129f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkPaint paint;
213d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2149f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    SkBitmap srcBM;
2159f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    srcBM.setConfig(SkBitmap::kARGB_8888_Config, W, H);
2169f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    srcBM.allocPixels();
217d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com    SkRect srcR = {
218d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com        0, 0, SkIntToScalar(srcBM.width()), SkIntToScalar(srcBM.height()) };
2199f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2209f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    // cons up a mesh to draw the bitmap with
2219f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    Mesh mesh(srcBM, &paint);
2229f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2239f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gDstConfig); i++) {
2249f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkBitmap dstBM0, dstBM1;
2259f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        dstBM0.setConfig(gDstConfig[i], W, H);
2269f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        dstBM1.setConfig(gDstConfig[i], W, H);
2279f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        dstBM0.allocPixels();
2289f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        dstBM1.allocPixels();
229d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2309f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkCanvas canvas0(dstBM0);
2319f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkCanvas canvas1(dstBM1);
2329f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        SkColor bgColor;
2339f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2349f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        for (size_t j = 0; j < SK_ARRAY_COUNT(gDstBG); j++) {
2359f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com            bgColor = gDstBG[j];
2369f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2379f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com            for (int c = 0; c <= 0xFF; c++) {
2389f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                srcBM.eraseARGB(0xFF, c, c, c);
239d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2409f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                for (int k = 0; k < 4; k++) {
2419f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    bool dither = (k & 1) != 0;
2429f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    uint8_t alpha = (k & 2) ? 0x80 : 0xFF;
2439f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    paint.setDither(dither);
2449f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    paint.setAlpha(alpha);
2459f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2469f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    dstBM0.eraseColor(bgColor);
2479f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    dstBM1.eraseColor(bgColor);
2489f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2499f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    canvas0.drawRect(srcR, paint);
2509f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    mesh.draw(&canvas1, &paint);
2519f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2529f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    if (!gOnce && false) {
2539f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        save_bm(dstBM0, "drawBitmap.png");
2549f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        save_bm(dstBM1, "drawMesh.png");
2559f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        gOnce = true;
2569f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    }
2579f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2589f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    if (memcmp(dstBM0.getPixels(), dstBM1.getPixels(), dstBM0.getSize())) {
2599f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        SkString str;
2609f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        str.printf("Diagonal config=%s bg=0x%x dither=%d alpha=0x%x src=0x%x",
2619f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                                   gConfigName[gDstConfig[i]], bgColor, dither, alpha, c);
2629f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                        reporter->reportFailed(str);
2639f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                    }
2649f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com                }
2659f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com            }
2669f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com        }
2679f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    }
2689f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com}
2699f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
2709f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.comstatic void TestBlitRow(skiatest::Reporter* reporter) {
2719f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    test_00_FF(reporter);
2729f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com    test_diagonal(reporter);
2739f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com}
2749f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0cereed@android.com
27578cd10529b0a1e5cb987972a19234ad2d13442aareed@android.com#include "TestClassDef.h"
27678cd10529b0a1e5cb987972a19234ad2d13442aareed@android.comDEFINE_TESTCLASS("BlitRow", TestBlitRowClass, TestBlitRow)
277