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