| OLD | NEW |
| 1 | |
| 2 /* | 1 /* |
| 3 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 4 * | 3 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 7 */ | 6 */ |
| 8 | 7 |
| 9 #include "Test.h" | 8 #include "Test.h" |
| 10 #include "SkBitmapDevice.h" | 9 #include "SkBitmapDevice.h" |
| 11 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| 12 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
| 13 #include "SkMathPriv.h" | 12 #include "SkMathPriv.h" |
| 14 #include "SkRegion.h" | 13 #include "SkRegion.h" |
| 15 #if SK_SUPPORT_GPU | 14 #if SK_SUPPORT_GPU |
| 16 #include "SkGpuDevice.h" | 15 #include "SkGpuDevice.h" |
| 17 #include "GrContextFactory.h" | 16 #include "GrContextFactory.h" |
| 18 #endif | 17 #endif |
| 19 | 18 |
| 20 | |
| 21 static const int DEV_W = 100, DEV_H = 100; | 19 static const int DEV_W = 100, DEV_H = 100; |
| 22 static const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H); | 20 static const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H); |
| 23 static const SkRect DEV_RECT_S = SkRect::MakeWH(DEV_W * SK_Scalar1, | 21 static const SkRect DEV_RECT_S = SkRect::MakeWH(DEV_W * SK_Scalar1, |
| 24 DEV_H * SK_Scalar1); | 22 DEV_H * SK_Scalar1); |
| 25 | 23 |
| 26 namespace { | 24 static SkPMColor getCanvasColor(int x, int y) { |
| 27 SkPMColor getCanvasColor(int x, int y) { | |
| 28 SkASSERT(x >= 0 && x < DEV_W); | 25 SkASSERT(x >= 0 && x < DEV_W); |
| 29 SkASSERT(y >= 0 && y < DEV_H); | 26 SkASSERT(y >= 0 && y < DEV_H); |
| 30 | 27 |
| 31 U8CPU r = x; | 28 U8CPU r = x; |
| 32 U8CPU g = y; | 29 U8CPU g = y; |
| 33 U8CPU b = 0xc; | 30 U8CPU b = 0xc; |
| 34 | 31 |
| 35 U8CPU a = 0xff; | 32 U8CPU a = 0xff; |
| 36 switch ((x+y) % 5) { | 33 switch ((x+y) % 5) { |
| 37 case 0: | 34 case 0: |
| 38 a = 0xff; | 35 a = 0xff; |
| 39 break; | 36 break; |
| 40 case 1: | 37 case 1: |
| 41 a = 0x80; | 38 a = 0x80; |
| 42 break; | 39 break; |
| 43 case 2: | 40 case 2: |
| 44 a = 0xCC; | 41 a = 0xCC; |
| 45 break; | 42 break; |
| 46 case 4: | 43 case 4: |
| 47 a = 0x01; | 44 a = 0x01; |
| 48 break; | 45 break; |
| 49 case 3: | 46 case 3: |
| 50 a = 0x00; | 47 a = 0x00; |
| 51 break; | 48 break; |
| 52 } | 49 } |
| 53 return SkPremultiplyARGBInline(a, r, g, b); | 50 return SkPremultiplyARGBInline(a, r, g, b); |
| 54 } | 51 } |
| 55 | 52 |
| 56 SkPMColor getBitmapColor(int x, int y, int w) { | 53 static SkPMColor getBitmapColor(int x, int y, int w) { |
| 57 int n = y * w + x; | 54 int n = y * w + x; |
| 58 | 55 |
| 59 U8CPU b = n & 0xff; | 56 U8CPU b = n & 0xff; |
| 60 U8CPU g = (n >> 8) & 0xff; | 57 U8CPU g = (n >> 8) & 0xff; |
| 61 U8CPU r = (n >> 16) & 0xff; | 58 U8CPU r = (n >> 16) & 0xff; |
| 62 return SkPackARGB32(0xff, r, g , b); | 59 return SkPackARGB32(0xff, r, g , b); |
| 63 } | 60 } |
| 64 | 61 |
| 65 SkPMColor convertConfig8888ToPMColor(SkCanvas::Config8888 config8888, | 62 static SkPMColor convertConfig8888ToPMColor(SkCanvas::Config8888 config8888, |
| 66 uint32_t color, | 63 uint32_t color, |
| 67 bool* premul) { | 64 bool* premul) { |
| 68 const uint8_t* c = reinterpret_cast<uint8_t*>(&color); | 65 const uint8_t* c = reinterpret_cast<uint8_t*>(&color); |
| 69 U8CPU a,r,g,b; | 66 U8CPU a,r,g,b; |
| 70 *premul = false; | 67 *premul = false; |
| 71 switch (config8888) { | 68 switch (config8888) { |
| 72 case SkCanvas::kNative_Premul_Config8888: | 69 case SkCanvas::kNative_Premul_Config8888: |
| 73 return color; | 70 return color; |
| 74 case SkCanvas::kNative_Unpremul_Config8888: | 71 case SkCanvas::kNative_Unpremul_Config8888: |
| 75 *premul = true; | 72 *premul = true; |
| 76 a = SkGetPackedA32(color); | 73 a = SkGetPackedA32(color); |
| 77 r = SkGetPackedR32(color); | 74 r = SkGetPackedR32(color); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 99 return 0; | 96 return 0; |
| 100 } | 97 } |
| 101 if (*premul) { | 98 if (*premul) { |
| 102 r = SkMulDiv255Ceiling(r, a); | 99 r = SkMulDiv255Ceiling(r, a); |
| 103 g = SkMulDiv255Ceiling(g, a); | 100 g = SkMulDiv255Ceiling(g, a); |
| 104 b = SkMulDiv255Ceiling(b, a); | 101 b = SkMulDiv255Ceiling(b, a); |
| 105 } | 102 } |
| 106 return SkPackARGB32(a, r, g, b); | 103 return SkPackARGB32(a, r, g, b); |
| 107 } | 104 } |
| 108 | 105 |
| 109 void fillCanvas(SkCanvas* canvas) { | 106 static void fillCanvas(SkCanvas* canvas) { |
| 110 static SkBitmap bmp; | 107 static SkBitmap bmp; |
| 111 if (bmp.isNull()) { | 108 if (bmp.isNull()) { |
| 112 bmp.setConfig(SkBitmap::kARGB_8888_Config, DEV_W, DEV_H); | 109 bmp.setConfig(SkBitmap::kARGB_8888_Config, DEV_W, DEV_H); |
| 113 SkDEBUGCODE(bool alloc =) bmp.allocPixels(); | 110 SkDEBUGCODE(bool alloc =) bmp.allocPixels(); |
| 114 SkASSERT(alloc); | 111 SkASSERT(alloc); |
| 115 SkAutoLockPixels alp(bmp); | 112 SkAutoLockPixels alp(bmp); |
| 116 intptr_t pixels = reinterpret_cast<intptr_t>(bmp.getPixels()); | 113 intptr_t pixels = reinterpret_cast<intptr_t>(bmp.getPixels()); |
| 117 for (int y = 0; y < DEV_H; ++y) { | 114 for (int y = 0; y < DEV_H; ++y) { |
| 118 for (int x = 0; x < DEV_W; ++x) { | 115 for (int x = 0; x < DEV_W; ++x) { |
| 119 SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bmp
.rowBytes() + x * bmp.bytesPerPixel()); | 116 SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bmp
.rowBytes() + x * bmp.bytesPerPixel()); |
| 120 *pixel = getCanvasColor(x, y); | 117 *pixel = getCanvasColor(x, y); |
| 121 } | 118 } |
| 122 } | 119 } |
| 123 } | 120 } |
| 124 canvas->save(); | 121 canvas->save(); |
| 125 canvas->setMatrix(SkMatrix::I()); | 122 canvas->setMatrix(SkMatrix::I()); |
| 126 canvas->clipRect(DEV_RECT_S, SkRegion::kReplace_Op); | 123 canvas->clipRect(DEV_RECT_S, SkRegion::kReplace_Op); |
| 127 SkPaint paint; | 124 SkPaint paint; |
| 128 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 125 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 129 canvas->drawBitmap(bmp, 0, 0, &paint); | 126 canvas->drawBitmap(bmp, 0, 0, &paint); |
| 130 canvas->restore(); | 127 canvas->restore(); |
| 131 } | 128 } |
| 132 | 129 |
| 133 void fillBitmap(SkBitmap* bitmap) { | 130 static void fillBitmap(SkBitmap* bitmap) { |
| 134 SkASSERT(bitmap->lockPixelsAreWritable()); | 131 SkASSERT(bitmap->lockPixelsAreWritable()); |
| 135 SkAutoLockPixels alp(*bitmap); | 132 SkAutoLockPixels alp(*bitmap); |
| 136 int w = bitmap->width(); | 133 int w = bitmap->width(); |
| 137 int h = bitmap->height(); | 134 int h = bitmap->height(); |
| 138 intptr_t pixels = reinterpret_cast<intptr_t>(bitmap->getPixels()); | 135 intptr_t pixels = reinterpret_cast<intptr_t>(bitmap->getPixels()); |
| 139 for (int y = 0; y < h; ++y) { | 136 for (int y = 0; y < h; ++y) { |
| 140 for (int x = 0; x < w; ++x) { | 137 for (int x = 0; x < w; ++x) { |
| 141 SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bitmap-
>rowBytes() + x * bitmap->bytesPerPixel()); | 138 SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bitmap-
>rowBytes() + x * bitmap->bytesPerPixel()); |
| 142 *pixel = getBitmapColor(x, y, w); | 139 *pixel = getBitmapColor(x, y, w); |
| 143 } | 140 } |
| 144 } | 141 } |
| 145 } | 142 } |
| 146 | 143 |
| 147 bool checkPixel(SkPMColor a, SkPMColor b, bool didPremulConversion) { | 144 static bool checkPixel(SkPMColor a, SkPMColor b, bool didPremulConversion) { |
| 148 if (!didPremulConversion) { | 145 if (!didPremulConversion) { |
| 149 return a == b; | 146 return a == b; |
| 150 } | 147 } |
| 151 int32_t aA = static_cast<int32_t>(SkGetPackedA32(a)); | 148 int32_t aA = static_cast<int32_t>(SkGetPackedA32(a)); |
| 152 int32_t aR = static_cast<int32_t>(SkGetPackedR32(a)); | 149 int32_t aR = static_cast<int32_t>(SkGetPackedR32(a)); |
| 153 int32_t aG = static_cast<int32_t>(SkGetPackedG32(a)); | 150 int32_t aG = static_cast<int32_t>(SkGetPackedG32(a)); |
| 154 int32_t aB = SkGetPackedB32(a); | 151 int32_t aB = SkGetPackedB32(a); |
| 155 | 152 |
| 156 int32_t bA = static_cast<int32_t>(SkGetPackedA32(b)); | 153 int32_t bA = static_cast<int32_t>(SkGetPackedA32(b)); |
| 157 int32_t bR = static_cast<int32_t>(SkGetPackedR32(b)); | 154 int32_t bR = static_cast<int32_t>(SkGetPackedR32(b)); |
| 158 int32_t bG = static_cast<int32_t>(SkGetPackedG32(b)); | 155 int32_t bG = static_cast<int32_t>(SkGetPackedG32(b)); |
| 159 int32_t bB = static_cast<int32_t>(SkGetPackedB32(b)); | 156 int32_t bB = static_cast<int32_t>(SkGetPackedB32(b)); |
| 160 | 157 |
| 161 return aA == bA && | 158 return aA == bA && |
| 162 SkAbs32(aR - bR) <= 1 && | 159 SkAbs32(aR - bR) <= 1 && |
| 163 SkAbs32(aG - bG) <= 1 && | 160 SkAbs32(aG - bG) <= 1 && |
| 164 SkAbs32(aB - bB) <= 1; | 161 SkAbs32(aB - bB) <= 1; |
| 165 } | 162 } |
| 166 | 163 |
| 167 // checks the bitmap contains correct pixels after the readPixels | 164 // checks the bitmap contains correct pixels after the readPixels |
| 168 // if the bitmap was prefilled with pixels it checks that these weren't | 165 // if the bitmap was prefilled with pixels it checks that these weren't |
| 169 // overwritten in the area outside the readPixels. | 166 // overwritten in the area outside the readPixels. |
| 170 bool checkRead(skiatest::Reporter* reporter, | 167 static bool checkRead(skiatest::Reporter* reporter, |
| 171 const SkBitmap& bitmap, | 168 const SkBitmap& bitmap, |
| 172 int x, int y, | 169 int x, int y, |
| 173 bool checkCanvasPixels, | 170 bool checkCanvasPixels, |
| 174 bool checkBitmapPixels, | 171 bool checkBitmapPixels, |
| 175 SkCanvas::Config8888 config8888) { | 172 SkCanvas::Config8888 config8888) { |
| 176 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); | 173 SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); |
| 177 SkASSERT(!bitmap.isNull()); | 174 SkASSERT(!bitmap.isNull()); |
| 178 SkASSERT(checkCanvasPixels || checkBitmapPixels); | 175 SkASSERT(checkCanvasPixels || checkBitmapPixels); |
| 179 | 176 |
| 180 int bw = bitmap.width(); | 177 int bw = bitmap.width(); |
| 181 int bh = bitmap.height(); | 178 int bh = bitmap.height(); |
| 182 | 179 |
| 183 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bw, bh); | 180 SkIRect srcRect = SkIRect::MakeXYWH(x, y, bw, bh); |
| 184 SkIRect clippedSrcRect = DEV_RECT; | 181 SkIRect clippedSrcRect = DEV_RECT; |
| 185 if (!clippedSrcRect.intersect(srcRect)) { | 182 if (!clippedSrcRect.intersect(srcRect)) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 enum BitmapInit { | 216 enum BitmapInit { |
| 220 kFirstBitmapInit = 0, | 217 kFirstBitmapInit = 0, |
| 221 | 218 |
| 222 kNoPixels_BitmapInit = kFirstBitmapInit, | 219 kNoPixels_BitmapInit = kFirstBitmapInit, |
| 223 kTight_BitmapInit, | 220 kTight_BitmapInit, |
| 224 kRowBytes_BitmapInit, | 221 kRowBytes_BitmapInit, |
| 225 | 222 |
| 226 kBitmapInitCnt | 223 kBitmapInitCnt |
| 227 }; | 224 }; |
| 228 | 225 |
| 229 BitmapInit nextBMI(BitmapInit bmi) { | 226 static BitmapInit nextBMI(BitmapInit bmi) { |
| 230 int x = bmi; | 227 int x = bmi; |
| 231 return static_cast<BitmapInit>(++x); | 228 return static_cast<BitmapInit>(++x); |
| 232 } | 229 } |
| 233 | 230 |
| 234 | 231 static void init_bitmap(SkBitmap* bitmap, const SkIRect& rect, BitmapInit init)
{ |
| 235 void init_bitmap(SkBitmap* bitmap, const SkIRect& rect, BitmapInit init) { | |
| 236 int w = rect.width(); | 232 int w = rect.width(); |
| 237 int h = rect.height(); | 233 int h = rect.height(); |
| 238 int rowBytes = 0; | 234 int rowBytes = 0; |
| 239 bool alloc = true; | 235 bool alloc = true; |
| 240 switch (init) { | 236 switch (init) { |
| 241 case kNoPixels_BitmapInit: | 237 case kNoPixels_BitmapInit: |
| 242 alloc = false; | 238 alloc = false; |
| 243 case kTight_BitmapInit: | 239 case kTight_BitmapInit: |
| 244 break; | 240 break; |
| 245 case kRowBytes_BitmapInit: | 241 case kRowBytes_BitmapInit: |
| 246 rowBytes = w * sizeof(SkPMColor) + 16 * sizeof(SkPMColor); | 242 rowBytes = w * sizeof(SkPMColor) + 16 * sizeof(SkPMColor); |
| 247 break; | 243 break; |
| 248 default: | 244 default: |
| 249 SkASSERT(0); | 245 SkASSERT(0); |
| 250 break; | 246 break; |
| 251 } | 247 } |
| 252 bitmap->setConfig(SkBitmap::kARGB_8888_Config, w, h, rowBytes); | 248 bitmap->setConfig(SkBitmap::kARGB_8888_Config, w, h, rowBytes); |
| 253 if (alloc) { | 249 if (alloc) { |
| 254 bitmap->allocPixels(); | 250 bitmap->allocPixels(); |
| 255 } | 251 } |
| 256 } | 252 } |
| 257 | 253 |
| 258 void ReadPixelsTest(skiatest::Reporter* reporter, GrContextFactory* factory) { | 254 static void ReadPixelsTest(skiatest::Reporter* reporter, GrContextFactory* facto
ry) { |
| 259 const SkIRect testRects[] = { | 255 const SkIRect testRects[] = { |
| 260 // entire thing | 256 // entire thing |
| 261 DEV_RECT, | 257 DEV_RECT, |
| 262 // larger on all sides | 258 // larger on all sides |
| 263 SkIRect::MakeLTRB(-10, -10, DEV_W + 10, DEV_H + 10), | 259 SkIRect::MakeLTRB(-10, -10, DEV_W + 10, DEV_H + 10), |
| 264 // fully contained | 260 // fully contained |
| 265 SkIRect::MakeLTRB(DEV_W / 4, DEV_H / 4, 3 * DEV_W / 4, 3 * DEV_H / 4), | 261 SkIRect::MakeLTRB(DEV_W / 4, DEV_H / 4, 3 * DEV_W / 4, 3 * DEV_H / 4), |
| 266 // outside top left | 262 // outside top left |
| 267 SkIRect::MakeLTRB(-10, -10, -1, -1), | 263 SkIRect::MakeLTRB(-10, -10, -1, -1), |
| 268 // touching top left corner | 264 // touching top left corner |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 clippedRect.fTop, true, false, | 399 clippedRect.fTop, true, false, |
| 404 SkCanvas::kNative_Premul_Config8888); | 400 SkCanvas::kNative_Premul_Config8888); |
| 405 } else { | 401 } else { |
| 406 REPORTER_ASSERT(reporter, !success); | 402 REPORTER_ASSERT(reporter, !success); |
| 407 } | 403 } |
| 408 } | 404 } |
| 409 } | 405 } |
| 410 } | 406 } |
| 411 } | 407 } |
| 412 } | 408 } |
| 413 } | |
| 414 | 409 |
| 415 #include "TestClassDef.h" | 410 #include "TestClassDef.h" |
| 416 DEFINE_GPUTESTCLASS("ReadPixels", ReadPixelsTestClass, ReadPixelsTest) | 411 DEFINE_GPUTESTCLASS("ReadPixels", ReadPixelsTestClass, ReadPixelsTest) |
| OLD | NEW |