ReadPixelsTest.cpp revision 02d6f546161e2c98d69066373cec3f54f3c46252
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) {
313772c4e6d09f5e0971a584d2035ee789483d6f47askia.committer@gmail.com                device.reset(new SkBitmapDevice(SkBitmap::kARGB_8888_Config,
3141f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com                                                DEV_W, DEV_H, false));
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