Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: tests/PremulAlphaRoundTripTest.cpp

Issue 180113010: Add SkCanvas::writePixels that takes info+pixels directly (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tests/DeferredCanvasTest.cpp ('k') | tests/WritePixelsTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * 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
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBitmapDevice.h" 8 #include "SkBitmapDevice.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkConfig8888.h" 10 #include "SkConfig8888.h"
11 #include "Test.h" 11 #include "Test.h"
12 #include "sk_tool_utils.h"
12 13
13 #if SK_SUPPORT_GPU 14 #if SK_SUPPORT_GPU
14 #include "GrContextFactory.h" 15 #include "GrContextFactory.h"
15 #include "SkGpuDevice.h" 16 #include "SkGpuDevice.h"
16 #endif 17 #endif
17 18
18 static void fillCanvas(SkCanvas* canvas, SkCanvas::Config8888 unpremulConfig) { 19 static uint32_t pack_unpremul_rgba(SkColor c) {
20 uint32_t packed;
21 uint8_t* byte = reinterpret_cast<uint8_t*>(&packed);
22 byte[0] = SkColorGetR(c);
23 byte[1] = SkColorGetG(c);
24 byte[2] = SkColorGetB(c);
25 byte[3] = SkColorGetA(c);
26 return packed;
27 }
28
29 static uint32_t pack_unpremul_bgra(SkColor c) {
30 uint32_t packed;
31 uint8_t* byte = reinterpret_cast<uint8_t*>(&packed);
32 byte[0] = SkColorGetB(c);
33 byte[1] = SkColorGetG(c);
34 byte[2] = SkColorGetR(c);
35 byte[3] = SkColorGetA(c);
36 return packed;
37 }
38
39 typedef uint32_t (*PackUnpremulProc)(SkColor);
40
41 const struct {
42 SkColorType fColorType;
43 PackUnpremulProc fPackProc;
44 SkCanvas::Config8888 fConfig8888;
45 } gUnpremul[] = {
46 { kRGBA_8888_SkColorType, pack_unpremul_rgba, SkCanvas::kRGBA_Unpremul_Confi g8888 },
47 { kBGRA_8888_SkColorType, pack_unpremul_bgra, SkCanvas::kBGRA_Unpremul_Confi g8888 },
48 };
49
50 static void fillCanvas(SkCanvas* canvas, SkColorType colorType, PackUnpremulProc proc) {
51 // Don't strictly need a bitmap, but its a handy way to allocate the pixels
19 SkBitmap bmp; 52 SkBitmap bmp;
20 bmp.allocN32Pixels(256, 256); 53 bmp.allocN32Pixels(256, 256);
21 SkAutoLockPixels alp(bmp);
22 uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels());
23 54
24 for (int a = 0; a < 256; ++a) { 55 for (int a = 0; a < 256; ++a) {
56 uint32_t* pixels = bmp.getAddr32(0, a);
25 for (int r = 0; r < 256; ++r) { 57 for (int r = 0; r < 256; ++r) {
26 pixels[a * 256 + r] = SkPackConfig8888(unpremulConfig, a, r, 0, 0); 58 pixels[r] = proc(SkColorSetARGB(a, r, 0, 0));
27 } 59 }
28 } 60 }
29 canvas->writePixels(bmp, 0, 0, unpremulConfig); 61
62 SkImageInfo info = bmp.info();
63 info.fColorType = colorType;
64 info.fAlphaType = kUnpremul_SkAlphaType;
65 canvas->writePixels(info, bmp.getPixels(), bmp.rowBytes(), 0, 0);
30 } 66 }
31 67
32 static const SkCanvas::Config8888 gUnpremulConfigs[] = {
33 SkCanvas::kNative_Unpremul_Config8888,
34 SkCanvas::kBGRA_Unpremul_Config8888,
35 SkCanvas::kRGBA_Unpremul_Config8888,
36 };
37
38 DEF_GPUTEST(PremulAlphaRoundTrip, reporter, factory) { 68 DEF_GPUTEST(PremulAlphaRoundTrip, reporter, factory) {
39 const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256); 69 const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256);
40 70
41 SkAutoTUnref<SkBaseDevice> device; 71 SkAutoTUnref<SkBaseDevice> device;
42 for (int dtype = 0; dtype < 2; ++dtype) { 72 for (int dtype = 0; dtype < 2; ++dtype) {
43 73
44 int glCtxTypeCnt = 1; 74 int glCtxTypeCnt = 1;
45 #if SK_SUPPORT_GPU 75 #if SK_SUPPORT_GPU
46 if (0 != dtype) { 76 if (0 != dtype) {
47 glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt; 77 glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt;
(...skipping 19 matching lines...) Expand all
67 continue; 97 continue;
68 #endif 98 #endif
69 } 99 }
70 SkCanvas canvas(device); 100 SkCanvas canvas(device);
71 101
72 SkBitmap readBmp1; 102 SkBitmap readBmp1;
73 readBmp1.allocN32Pixels(256, 256); 103 readBmp1.allocN32Pixels(256, 256);
74 SkBitmap readBmp2; 104 SkBitmap readBmp2;
75 readBmp2.allocN32Pixels(256, 256); 105 readBmp2.allocN32Pixels(256, 256);
76 106
77 for (size_t upmaIdx = 0; 107 for (size_t upmaIdx = 0; upmaIdx < SK_ARRAY_COUNT(gUnpremul); ++upma Idx) {
78 upmaIdx < SK_ARRAY_COUNT(gUnpremulConfigs); 108 fillCanvas(&canvas, gUnpremul[upmaIdx].fColorType, gUnpremul[upm aIdx].fPackProc);
79 ++upmaIdx) { 109
80 fillCanvas(&canvas, gUnpremulConfigs[upmaIdx]); 110 readBmp1.eraseColor(0);
81 { 111 readBmp2.eraseColor(0);
82 SkAutoLockPixels alp1(readBmp1);
83 SkAutoLockPixels alp2(readBmp2);
84 sk_bzero(readBmp1.getPixels(), readBmp1.getSafeSize());
85 sk_bzero(readBmp2.getPixels(), readBmp2.getSafeSize());
86 }
87 112
88 canvas.readPixels(&readBmp1, 0, 0, gUnpremulConfigs[upmaIdx]); 113 canvas.readPixels(&readBmp1, 0, 0, gUnpremul[upmaIdx].fConfig888 8);
89 canvas.writePixels(readBmp1, 0, 0, gUnpremulConfigs[upmaIdx]); 114 sk_tool_utils::write_pixels(&canvas, readBmp1, 0, 0, gUnpremul[u pmaIdx].fColorType,
90 canvas.readPixels(&readBmp2, 0, 0, gUnpremulConfigs[upmaIdx]); 115 kUnpremul_SkAlphaType);
116 canvas.readPixels(&readBmp2, 0, 0, gUnpremul[upmaIdx].fConfig888 8);
91 117
92 SkAutoLockPixels alp1(readBmp1);
93 SkAutoLockPixels alp2(readBmp2);
94 uint32_t* pixels1 =
95 reinterpret_cast<uint32_t*>(readBmp1.getPixels());
96 uint32_t* pixels2 =
97 reinterpret_cast<uint32_t*>(readBmp2.getPixels());
98 bool success = true; 118 bool success = true;
99 for (int y = 0; y < 256 && success; ++y) { 119 for (int y = 0; y < 256 && success; ++y) {
120 const uint32_t* pixels1 = readBmp1.getAddr32(0, y);
121 const uint32_t* pixels2 = readBmp2.getAddr32(0, y);
100 for (int x = 0; x < 256 && success; ++x) { 122 for (int x = 0; x < 256 && success; ++x) {
101 int i = y * 256 + x; 123 REPORTER_ASSERT(reporter, success = pixels1[x] == pixels 2[x]);
102 REPORTER_ASSERT(reporter, success = pixels1[i] == pixels 2[i]);
103 } 124 }
104 } 125 }
105 } 126 }
106 } 127 }
107 } 128 }
108 } 129 }
OLDNEW
« no previous file with comments | « tests/DeferredCanvasTest.cpp ('k') | tests/WritePixelsTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698