ReadPixelsTest.cpp revision 15a140599942f70e47380e3f700a825c7cece3b4
1c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com/* 2c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com * Copyright 2011 Google Inc. 3c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com * 4c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 5c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com * found in the LICENSE file. 6c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com */ 7c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 873672254a3e498081967d00d27b17ada443e2ab2robertphillips@google.com#include "SkBitmapDevice.h" 9c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com#include "SkCanvas.h" 10cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#include "SkColorPriv.h" 114b163ed2c22facbe8891616874ae07ba7827d9c9reed@google.com#include "SkMathPriv.h" 12c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com#include "SkRegion.h" 134ee16bfaedb14aff8cf102f1f0722ff2529a9699tfarina@chromium.org#include "Test.h" 144ee16bfaedb14aff8cf102f1f0722ff2529a9699tfarina@chromium.org 15cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 1667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com#include "GrContextFactory.h" 178f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkGpuDevice.h" 18cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 19c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 20c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.comstatic const int DEV_W = 100, DEV_H = 100; 21c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.comstatic const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H); 22d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const SkRect DEV_RECT_S = SkRect::MakeWH(DEV_W * SK_Scalar1, 23c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com DEV_H * SK_Scalar1); 24c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 25ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic SkPMColor getCanvasColor(int x, int y) { 26c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(x >= 0 && x < DEV_W); 27c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(y >= 0 && y < DEV_H); 286850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com 296850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com U8CPU r = x; 306850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com U8CPU g = y; 316850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com U8CPU b = 0xc; 326850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com 336850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com U8CPU a = 0xff; 34c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com switch ((x+y) % 5) { 356850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case 0: 366850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = 0xff; 376850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 386850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case 1: 396850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = 0x80; 406850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 416850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case 2: 426850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = 0xCC; 436850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 446850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case 4: 456850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = 0x01; 466850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 476850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case 3: 486850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = 0x00; 496850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 506850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 516850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com return SkPremultiplyARGBInline(a, r, g, b); 52c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 53d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 54ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic SkPMColor getBitmapColor(int x, int y, int w) { 55c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int n = y * w + x; 566850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com 57c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com U8CPU b = n & 0xff; 58c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com U8CPU g = (n >> 8) & 0xff; 59c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com U8CPU r = (n >> 16) & 0xff; 60c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com return SkPackARGB32(0xff, r, g , b); 61c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 62c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 63ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic SkPMColor convertConfig8888ToPMColor(SkCanvas::Config8888 config8888, 64ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org uint32_t color, 65ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org bool* premul) { 666850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com const uint8_t* c = reinterpret_cast<uint8_t*>(&color); 676850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com U8CPU a,r,g,b; 68c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com *premul = false; 696850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com switch (config8888) { 706850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case SkCanvas::kNative_Premul_Config8888: 716850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com return color; 726850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case SkCanvas::kNative_Unpremul_Config8888: 73c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com *premul = true; 746850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = SkGetPackedA32(color); 756850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com r = SkGetPackedR32(color); 766850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com g = SkGetPackedG32(color); 776850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com b = SkGetPackedB32(color); 786850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 796850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case SkCanvas::kBGRA_Unpremul_Config8888: 80c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com *premul = true; // fallthru 816850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case SkCanvas::kBGRA_Premul_Config8888: 826850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = static_cast<U8CPU>(c[3]); 836850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com r = static_cast<U8CPU>(c[2]); 846850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com g = static_cast<U8CPU>(c[1]); 856850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com b = static_cast<U8CPU>(c[0]); 866850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 876850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case SkCanvas::kRGBA_Unpremul_Config8888: 88c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com *premul = true; // fallthru 896850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com case SkCanvas::kRGBA_Premul_Config8888: 906850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com a = static_cast<U8CPU>(c[3]); 916850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com r = static_cast<U8CPU>(c[0]); 926850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com g = static_cast<U8CPU>(c[1]); 936850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com b = static_cast<U8CPU>(c[2]); 946850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com break; 95ccaa002dd81a6a8bd5acb7a2fa69a2437873c1fdbsalomon@google.com default: 96ccaa002dd81a6a8bd5acb7a2fa69a2437873c1fdbsalomon@google.com SkDEBUGFAIL("Unexpected Config8888"); 97ccaa002dd81a6a8bd5acb7a2fa69a2437873c1fdbsalomon@google.com return 0; 986850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 99c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com if (*premul) { 1006850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com r = SkMulDiv255Ceiling(r, a); 1016850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com g = SkMulDiv255Ceiling(g, a); 1026850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com b = SkMulDiv255Ceiling(b, a); 1036850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 1046850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com return SkPackARGB32(a, r, g, b); 1056850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com} 1066850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com 107ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic void fillCanvas(SkCanvas* canvas) { 108c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com static SkBitmap bmp; 109c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com if (bmp.isNull()) { 110fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org SkDEBUGCODE(bool alloc =) bmp.allocN32Pixels(DEV_W, DEV_H); 111c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(alloc); 112c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkAutoLockPixels alp(bmp); 113c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com intptr_t pixels = reinterpret_cast<intptr_t>(bmp.getPixels()); 114c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com for (int y = 0; y < DEV_H; ++y) { 115c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com for (int x = 0; x < DEV_W; ++x) { 116c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bmp.rowBytes() + x * bmp.bytesPerPixel()); 117c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com *pixel = getCanvasColor(x, y); 118c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 119c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 120c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 121c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com canvas->save(); 122c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com canvas->setMatrix(SkMatrix::I()); 123c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com canvas->clipRect(DEV_RECT_S, SkRegion::kReplace_Op); 124c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkPaint paint; 125c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com paint.setXfermodeMode(SkXfermode::kSrc_Mode); 126c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com canvas->drawBitmap(bmp, 0, 0, &paint); 127c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com canvas->restore(); 128c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 130ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic void fillBitmap(SkBitmap* bitmap) { 131c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(bitmap->lockPixelsAreWritable()); 132c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkAutoLockPixels alp(*bitmap); 133c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int w = bitmap->width(); 134c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int h = bitmap->height(); 135c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com intptr_t pixels = reinterpret_cast<intptr_t>(bitmap->getPixels()); 136c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com for (int y = 0; y < h; ++y) { 137c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com for (int x = 0; x < w; ++x) { 138c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bitmap->rowBytes() + x * bitmap->bytesPerPixel()); 13954f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com *pixel = getBitmapColor(x, y, w); 140c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 141c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 142c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 143c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 144ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic bool checkPixel(SkPMColor a, SkPMColor b, bool didPremulConversion) { 145c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com if (!didPremulConversion) { 146c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com return a == b; 147c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com } 148c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t aA = static_cast<int32_t>(SkGetPackedA32(a)); 149c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t aR = static_cast<int32_t>(SkGetPackedR32(a)); 150c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t aG = static_cast<int32_t>(SkGetPackedG32(a)); 151c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t aB = SkGetPackedB32(a); 152c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com 153c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t bA = static_cast<int32_t>(SkGetPackedA32(b)); 154c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t bR = static_cast<int32_t>(SkGetPackedR32(b)); 155c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t bG = static_cast<int32_t>(SkGetPackedG32(b)); 156c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com int32_t bB = static_cast<int32_t>(SkGetPackedB32(b)); 157c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com 158c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com return aA == bA && 159c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com SkAbs32(aR - bR) <= 1 && 160c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com SkAbs32(aG - bG) <= 1 && 161c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com SkAbs32(aB - bB) <= 1; 162c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com} 163c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com 164c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com// checks the bitmap contains correct pixels after the readPixels 165c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com// if the bitmap was prefilled with pixels it checks that these weren't 166c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com// overwritten in the area outside the readPixels. 167ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic bool checkRead(skiatest::Reporter* reporter, 168ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org const SkBitmap& bitmap, 169ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org int x, int y, 170ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org bool checkCanvasPixels, 171ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org bool checkBitmapPixels, 172ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.org SkCanvas::Config8888 config8888) { 173c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); 174c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(!bitmap.isNull()); 1756850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com SkASSERT(checkCanvasPixels || checkBitmapPixels); 176d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 177c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int bw = bitmap.width(); 178c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int bh = bitmap.height(); 179c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 180c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect srcRect = SkIRect::MakeXYWH(x, y, bw, bh); 181c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect clippedSrcRect = DEV_RECT; 182c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com if (!clippedSrcRect.intersect(srcRect)) { 183c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com clippedSrcRect.setEmpty(); 184c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 185c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkAutoLockPixels alp(bitmap); 186c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com intptr_t pixels = reinterpret_cast<intptr_t>(bitmap.getPixels()); 187c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com for (int by = 0; by < bh; ++by) { 188c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com for (int bx = 0; bx < bw; ++bx) { 189c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int devx = bx + srcRect.fLeft; 190c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int devy = by + srcRect.fTop; 191d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 192c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com uint32_t pixel = *reinterpret_cast<SkPMColor*>(pixels + by * bitmap.rowBytes() + bx * bitmap.bytesPerPixel()); 193c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 194c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com if (clippedSrcRect.contains(devx, devy)) { 1956850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com if (checkCanvasPixels) { 1966850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com SkPMColor canvasPixel = getCanvasColor(devx, devy); 197c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com bool didPremul; 198c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com SkPMColor pmPixel = convertConfig8888ToPMColor(config8888, pixel, &didPremul); 199c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com bool check; 200c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com REPORTER_ASSERT(reporter, check = checkPixel(pmPixel, canvasPixel, didPremul)); 201c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com if (!check) { 20272f3dca451f4739e20be0b4b198813677339205cbsalomon@google.com return false; 2036850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 204c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 2056850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } else if (checkBitmapPixels) { 20654f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com REPORTER_ASSERT(reporter, getBitmapColor(bx, by, bw) == pixel); 20754f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com if (getBitmapColor(bx, by, bw) != pixel) { 20872f3dca451f4739e20be0b4b198813677339205cbsalomon@google.com return false; 209c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 210c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 211c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 212c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 21372f3dca451f4739e20be0b4b198813677339205cbsalomon@google.com return true; 214c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 215c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 216c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.comenum BitmapInit { 217c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com kFirstBitmapInit = 0, 218d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 219c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com kNoPixels_BitmapInit = kFirstBitmapInit, 220c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com kTight_BitmapInit, 221c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com kRowBytes_BitmapInit, 222d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 223c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com kBitmapInitCnt 224c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com}; 225c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 226ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic BitmapInit nextBMI(BitmapInit bmi) { 227c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com int x = bmi; 228c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com return static_cast<BitmapInit>(++x); 229c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 230c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 231ddf94cf108ae430877f009bd67b9070341426947commit-bot@chromium.orgstatic void init_bitmap(SkBitmap* bitmap, const SkIRect& rect, BitmapInit init) { 232fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(rect.width(), rect.height()); 233fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org size_t rowBytes = 0; 234c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com bool alloc = true; 235c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com switch (init) { 236c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com case kNoPixels_BitmapInit: 237c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com alloc = false; 238c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com case kTight_BitmapInit: 239c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com break; 240c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com case kRowBytes_BitmapInit: 241fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org rowBytes = (info.width() + 16) * sizeof(SkPMColor); 242c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com break; 243c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com default: 244c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkASSERT(0); 245c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com break; 246c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 24702d6f546161e2c98d69066373cec3f54f3c46252skia.committer@gmail.com 248c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com if (alloc) { 249fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org bitmap->allocPixels(info); 250fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org } else { 251fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org bitmap->setConfig(info, rowBytes); 252c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 253c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 254c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 2554ee16bfaedb14aff8cf102f1f0722ff2529a9699tfarina@chromium.orgDEF_GPUTEST(ReadPixels, reporter, factory) { 256c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com const SkIRect testRects[] = { 257c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // entire thing 258c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com DEV_RECT, 259c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // larger on all sides 260c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, DEV_W + 10, DEV_H + 10), 261c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // fully contained 262c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(DEV_W / 4, DEV_H / 4, 3 * DEV_W / 4, 3 * DEV_H / 4), 263c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // outside top left 264c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, -1, -1), 265c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // touching top left corner 266c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, 0, 0), 267c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping top left corner 268c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, DEV_W / 4, DEV_H / 4), 269c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping top left and top right corners 270c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, DEV_W + 10, DEV_H / 4), 271c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // touching entire top edge 272c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, DEV_W + 10, 0), 273c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping top right corner 274c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(3 * DEV_W / 4, -10, DEV_W + 10, DEV_H / 4), 275c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // contained in x, overlapping top edge 276c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(DEV_W / 4, -10, 3 * DEV_W / 4, DEV_H / 4), 277c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // outside top right corner 278c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(DEV_W + 1, -10, DEV_W + 10, -1), 279c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // touching top right corner 280c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(DEV_W, -10, DEV_W + 10, 0), 281c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping top left and bottom left corners 282c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, DEV_W / 4, DEV_H + 10), 283c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // touching entire left edge 284c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, -10, 0, DEV_H + 10), 285c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping bottom left corner 286c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, 3 * DEV_H / 4, DEV_W / 4, DEV_H + 10), 287c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // contained in y, overlapping left edge 288c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, DEV_H / 4, DEV_W / 4, 3 * DEV_H / 4), 289c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // outside bottom left corner 290c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, DEV_H + 1, -1, DEV_H + 10), 291c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // touching bottom left corner 292c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, DEV_H, 0, DEV_H + 10), 293c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping bottom left and bottom right corners 294c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(-10, 3 * DEV_H / 4, DEV_W + 10, DEV_H + 10), 295c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // touching entire left edge 296c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(0, DEV_H, DEV_W, DEV_H + 10), 297c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping bottom right corner 298c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(3 * DEV_W / 4, 3 * DEV_H / 4, DEV_W + 10, DEV_H + 10), 299c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com // overlapping top right and bottom right corners 300c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com SkIRect::MakeLTRB(3 * DEV_W / 4, -10, DEV_W + 10, DEV_H + 10), 301c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com }; 302c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 3033cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org for (int dtype = 0; dtype < 3; ++dtype) { 30467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com int glCtxTypeCnt = 1; 30567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com#if SK_SUPPORT_GPU 30667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (0 != dtype) { 30767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt; 30867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } 30967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com#endif 31067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com for (int glCtxType = 0; glCtxType < glCtxTypeCnt; ++glCtxType) { 3111f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkAutoTUnref<SkBaseDevice> device; 31267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (0 == dtype) { 31315a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(DEV_W, DEV_H); 31415a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org device.reset(SkBitmapDevice::Create(info)); 31567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } else { 31667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com#if SK_SUPPORT_GPU 31767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com GrContextFactory::GLContextType type = 31867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com static_cast<GrContextFactory::GLContextType>(glCtxType); 31967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (!GrContextFactory::IsRenderingGLContext(type)) { 32067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com continue; 32167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } 32267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com GrContext* context = factory->get(type); 32367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (NULL == context) { 32467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com continue; 32567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } 3263cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org GrTextureDesc desc; 3273cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; 3283cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org desc.fWidth = DEV_W; 3293cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org desc.fHeight = DEV_H; 330fec0bc3fc13481f5bcb341ab2d2d695911f39bd4bsalomon@google.com desc.fConfig = kSkia8888_GrPixelConfig; 3313cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org desc.fOrigin = 1 == dtype ? kBottomLeft_GrSurfaceOrigin 3323cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org : kTopLeft_GrSurfaceOrigin; 3333cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org GrAutoScratchTexture ast(context, desc, GrContext::kExact_ScratchTexMatch); 3343cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org SkAutoTUnref<GrTexture> tex(ast.detach()); 3353cb406bb88f5aa09cf9f5a9554b4b1314cf1a2eesenorblanco@chromium.org device.reset(new SkGpuDevice(context, tex)); 336cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else 33767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com continue; 338cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 33967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } 34067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas canvas(device); 34167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com fillCanvas(&canvas); 342c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com 34367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com static const SkCanvas::Config8888 gReadConfigs[] = { 34467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kNative_Premul_Config8888, 34567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kNative_Unpremul_Config8888, 34628621517f42682f1e028cbbf87c6afbf6e27a0f6commit-bot@chromium.org 34767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kBGRA_Premul_Config8888, 34867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kBGRA_Unpremul_Config8888, 34928621517f42682f1e028cbbf87c6afbf6e27a0f6commit-bot@chromium.org 35067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kRGBA_Premul_Config8888, 35167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kRGBA_Unpremul_Config8888, 35267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com }; 35367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com for (size_t rect = 0; rect < SK_ARRAY_COUNT(testRects); ++rect) { 35467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com const SkIRect& srcRect = testRects[rect]; 35567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com for (BitmapInit bmi = kFirstBitmapInit; 35667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com bmi < kBitmapInitCnt; 35767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com bmi = nextBMI(bmi)) { 35867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com for (size_t c = 0; c < SK_ARRAY_COUNT(gReadConfigs); ++c) { 35967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::Config8888 config8888 = gReadConfigs[c]; 36067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkBitmap bmp; 36167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com init_bitmap(&bmp, srcRect, bmi); 36267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com 36367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // if the bitmap has pixels allocated before the readPixels, 36467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // note that and fill them with pattern 36567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com bool startsWithPixels = !bmp.isNull(); 36667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (startsWithPixels) { 36767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com fillBitmap(&bmp); 36867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } 36967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com uint32_t idBefore = canvas.getDevice()->accessBitmap(false).getGenerationID(); 37067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com bool success = 37167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com canvas.readPixels(&bmp, srcRect.fLeft, 37267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com srcRect.fTop, config8888); 37367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com uint32_t idAfter = canvas.getDevice()->accessBitmap(false).getGenerationID(); 37467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com 37567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // we expect to succeed when the read isn't fully clipped 37667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // out. 37767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com bool expectSuccess = SkIRect::Intersects(srcRect, DEV_RECT); 37867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // determine whether we expected the read to succeed. 37967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com REPORTER_ASSERT(reporter, success == expectSuccess); 38067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // read pixels should never change the gen id 38167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com REPORTER_ASSERT(reporter, idBefore == idAfter); 38267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com 38367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (success || startsWithPixels) { 38467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com checkRead(reporter, bmp, srcRect.fLeft, srcRect.fTop, 38567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com success, startsWithPixels, config8888); 38667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } else { 38767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // if we had no pixels beforehand and the readPixels 38867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // failed then our bitmap should still not have pixels 38967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com REPORTER_ASSERT(reporter, bmp.isNull()); 39067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com } 3916850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 39267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // check the old webkit version of readPixels that clips the 39367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com // bitmap size 39467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkBitmap wkbmp; 39567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com bool success = canvas.readPixels(srcRect, &wkbmp); 39667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkIRect clippedRect = DEV_RECT; 39767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com if (clippedRect.intersect(srcRect)) { 39867b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com REPORTER_ASSERT(reporter, success); 39967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com checkRead(reporter, wkbmp, clippedRect.fLeft, 40067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com clippedRect.fTop, true, false, 40167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com SkCanvas::kNative_Premul_Config8888); 4026850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } else { 40367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com REPORTER_ASSERT(reporter, !success); 4046850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 4056850eab42ba4c2a7033a99824b02a2846ce0ef2absalomon@google.com } 406c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 407c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 408c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com } 409c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com} 410