OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkCodecPriv.h" | 8 #include "SkCodecPriv.h" |
9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
10 #include "SkMaskSwizzler.h" | 10 #include "SkMaskSwizzler.h" |
11 | 11 |
12 /* | 12 static SkSwizzler::ResultAlpha swizzle_mask16_to_n32_opaque( |
13 * | |
14 * Row procedure for masked color components with 16 bits per pixel | |
15 * | |
16 */ | |
17 static SkSwizzler::ResultAlpha swizzle_mask16_to_n32( | |
18 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 13 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
19 | 14 |
20 // Use the masks to decode to the destination | 15 // Use the masks to decode to the destination |
21 uint16_t* srcPtr = (uint16_t*) srcRow; | 16 uint16_t* srcPtr = (uint16_t*) srcRow; |
22 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 17 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
23 for (int i = 0; i < width; i++) { | 18 for (int i = 0; i < width; i++) { |
24 uint16_t p = srcPtr[i]; | 19 uint16_t p = srcPtr[i]; |
25 uint8_t red = masks->getRed(p); | 20 uint8_t red = masks->getRed(p); |
26 uint8_t green = masks->getGreen(p); | 21 uint8_t green = masks->getGreen(p); |
27 uint8_t blue = masks->getBlue(p); | 22 uint8_t blue = masks->getBlue(p); |
28 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 23 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
29 } | 24 } |
30 return SkSwizzler::kOpaque_ResultAlpha; | 25 return SkSwizzler::kOpaque_ResultAlpha; |
31 } | 26 } |
32 | 27 |
33 /* | 28 static SkSwizzler::ResultAlpha swizzle_mask16_to_n32_unpremul( |
34 * | |
35 * Row procedure for masked color components with 16 bits per pixel with alpha | |
36 * | |
37 */ | |
38 static SkSwizzler::ResultAlpha swizzle_mask16_alpha_to_n32( | |
39 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 29 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
40 | 30 |
41 // Use the masks to decode to the destination | 31 // Use the masks to decode to the destination |
42 uint16_t* srcPtr = (uint16_t*) srcRow; | 32 uint16_t* srcPtr = (uint16_t*) srcRow; |
43 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 33 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
44 INIT_RESULT_ALPHA; | 34 INIT_RESULT_ALPHA; |
45 for (int i = 0; i < width; i++) { | 35 for (int i = 0; i < width; i++) { |
46 uint16_t p = srcPtr[i]; | 36 uint16_t p = srcPtr[i]; |
47 uint8_t red = masks->getRed(p); | 37 uint8_t red = masks->getRed(p); |
48 uint8_t green = masks->getGreen(p); | 38 uint8_t green = masks->getGreen(p); |
49 uint8_t blue = masks->getBlue(p); | 39 uint8_t blue = masks->getBlue(p); |
50 uint8_t alpha = masks->getAlpha(p); | 40 uint8_t alpha = masks->getAlpha(p); |
51 UPDATE_RESULT_ALPHA(alpha); | 41 UPDATE_RESULT_ALPHA(alpha); |
52 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); | 42 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); |
53 } | 43 } |
54 return COMPUTE_RESULT_ALPHA; | 44 return COMPUTE_RESULT_ALPHA; |
55 } | 45 } |
56 | 46 |
57 /* | 47 static SkSwizzler::ResultAlpha swizzle_mask16_to_n32_premul( |
58 * | |
59 * Row procedure for masked color components with 24 bits per pixel | |
60 * | |
61 */ | |
62 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32( | |
63 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 48 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
64 | 49 |
65 // Use the masks to decode to the destination | 50 // Use the masks to decode to the destination |
51 uint16_t* srcPtr = (uint16_t*) srcRow; | |
52 SkPMColor* dstPtr = (SkPMColor*) dstRow; | |
53 INIT_RESULT_ALPHA; | |
54 for (int i = 0; i < width; i++) { | |
55 uint16_t p = srcPtr[i]; | |
56 uint8_t red = masks->getRed(p); | |
57 uint8_t green = masks->getGreen(p); | |
58 uint8_t blue = masks->getBlue(p); | |
59 uint8_t alpha = masks->getAlpha(p); | |
60 UPDATE_RESULT_ALPHA(alpha); | |
61 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | |
62 } | |
63 return COMPUTE_RESULT_ALPHA; | |
64 } | |
65 | |
66 static SkSwizzler::ResultAlpha swizzle_mask16_to_565_opaque( | |
67 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
68 | |
69 // Use the masks to decode to the destination | |
70 uint16_t* srcPtr = (uint16_t*) srcRow; | |
71 uint16_t* dstPtr = (uint16_t*) dstRow; | |
72 for (int i = 0; i < width; i++) { | |
73 uint16_t p = srcPtr[i]; | |
74 uint8_t red = masks->getRed(p); | |
75 uint8_t green = masks->getGreen(p); | |
76 uint8_t blue = masks->getBlue(p); | |
77 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | |
78 } | |
79 return SkSwizzler::kOpaque_ResultAlpha; | |
80 } | |
81 | |
82 static SkSwizzler::ResultAlpha swizzle_mask16_to_565_premul( | |
83 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
84 | |
85 // Use the masks to decode to the destination | |
86 uint16_t* srcPtr = (uint16_t*) srcRow; | |
87 uint16_t* dstPtr = (uint16_t*) dstRow; | |
88 INIT_RESULT_ALPHA; | |
89 for (int i = 0; i < width; i++) { | |
90 uint16_t p = srcPtr[i]; | |
91 uint8_t red = masks->getRed(p); | |
92 uint8_t green = masks->getGreen(p); | |
93 uint8_t blue = masks->getBlue(p); | |
94 uint8_t alpha = masks->getAlpha(p); | |
95 UPDATE_RESULT_ALPHA(alpha); | |
96 dstPtr[i] = SkPixel32ToPixel16( | |
97 SkPreMultiplyARGB(alpha, red, green, blue)); | |
98 } | |
99 return COMPUTE_RESULT_ALPHA; | |
100 } | |
101 | |
102 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque( | |
103 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
104 | |
105 // Use the masks to decode to the destination | |
66 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 106 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
67 for (int i = 0; i < 3*width; i += 3) { | 107 for (int i = 0; i < 3*width; i += 3) { |
68 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | 108 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
69 uint8_t red = masks->getRed(p); | 109 uint8_t red = masks->getRed(p); |
70 uint8_t green = masks->getGreen(p); | 110 uint8_t green = masks->getGreen(p); |
71 uint8_t blue = masks->getBlue(p); | 111 uint8_t blue = masks->getBlue(p); |
72 dstPtr[i/3] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 112 dstPtr[i/3] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
73 } | 113 } |
74 return SkSwizzler::kOpaque_ResultAlpha; | 114 return SkSwizzler::kOpaque_ResultAlpha; |
75 } | 115 } |
76 | 116 |
77 /* | 117 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_unpremul( |
78 * | |
79 * Row procedure for masked color components with 24 bits per pixel with alpha | |
80 * | |
81 */ | |
82 static SkSwizzler::ResultAlpha swizzle_mask24_alpha_to_n32( | |
83 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 118 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
84 | 119 |
85 // Use the masks to decode to the destination | 120 // Use the masks to decode to the destination |
86 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 121 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
87 INIT_RESULT_ALPHA; | 122 INIT_RESULT_ALPHA; |
88 for (int i = 0; i < 3*width; i += 3) { | 123 for (int i = 0; i < 3*width; i += 3) { |
89 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | 124 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
90 uint8_t red = masks->getRed(p); | 125 uint8_t red = masks->getRed(p); |
91 uint8_t green = masks->getGreen(p); | 126 uint8_t green = masks->getGreen(p); |
92 uint8_t blue = masks->getBlue(p); | 127 uint8_t blue = masks->getBlue(p); |
93 uint8_t alpha = masks->getAlpha(p); | 128 uint8_t alpha = masks->getAlpha(p); |
94 UPDATE_RESULT_ALPHA(alpha); | 129 UPDATE_RESULT_ALPHA(alpha); |
95 dstPtr[i/3] = SkPackARGB32NoCheck(alpha, red, green, blue); | 130 dstPtr[i/3] = SkPackARGB32NoCheck(alpha, red, green, blue); |
96 } | 131 } |
97 return COMPUTE_RESULT_ALPHA; | 132 return COMPUTE_RESULT_ALPHA; |
98 } | 133 } |
99 | 134 |
100 /* | 135 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_premul( |
101 * | |
102 * Row procedure for masked color components with 32 bits per pixel | |
103 * | |
104 */ | |
105 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32( | |
106 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 136 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
107 | 137 |
108 // Use the masks to decode to the destination | 138 // Use the masks to decode to the destination |
139 SkPMColor* dstPtr = (SkPMColor*) dstRow; | |
140 INIT_RESULT_ALPHA; | |
141 for (int i = 0; i < 3*width; i += 3) { | |
142 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | |
143 uint8_t red = masks->getRed(p); | |
144 uint8_t green = masks->getGreen(p); | |
145 uint8_t blue = masks->getBlue(p); | |
146 uint8_t alpha = masks->getAlpha(p); | |
147 UPDATE_RESULT_ALPHA(alpha); | |
148 dstPtr[i/3] = SkPreMultiplyARGB(alpha, red, green, blue); | |
149 } | |
150 return COMPUTE_RESULT_ALPHA; | |
151 } | |
152 | |
153 static SkSwizzler::ResultAlpha swizzle_mask24_to_565_opaque( | |
154 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
155 | |
156 // Use the masks to decode to the destination | |
157 uint16_t* dstPtr = (uint16_t*) dstRow; | |
158 for (int i = 0; i < 3*width; i += 3) { | |
159 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | |
160 uint8_t red = masks->getRed(p); | |
161 uint8_t green = masks->getGreen(p); | |
162 uint8_t blue = masks->getBlue(p); | |
163 dstPtr[i/3] = SkPack888ToRGB16(red, green, blue); | |
164 } | |
165 return SkSwizzler::kOpaque_ResultAlpha; | |
166 } | |
167 | |
168 static SkSwizzler::ResultAlpha swizzle_mask24_to_565_premul( | |
169 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
170 | |
171 // Use the masks to decode to the destination | |
172 uint16_t* dstPtr = (uint16_t*) dstRow; | |
173 INIT_RESULT_ALPHA; | |
174 for (int i = 0; i < 3*width; i += 3) { | |
175 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | |
176 uint8_t red = masks->getRed(p); | |
177 uint8_t green = masks->getGreen(p); | |
178 uint8_t blue = masks->getBlue(p); | |
179 uint8_t alpha = masks->getAlpha(p); | |
180 UPDATE_RESULT_ALPHA(alpha); | |
181 dstPtr[i/3] = SkPixel32ToPixel16( | |
182 SkPreMultiplyARGB(alpha, red, green, blue)); | |
183 } | |
184 return COMPUTE_RESULT_ALPHA; | |
185 } | |
186 | |
187 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( | |
188 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
189 | |
190 // Use the masks to decode to the destination | |
109 uint32_t* srcPtr = (uint32_t*) srcRow; | 191 uint32_t* srcPtr = (uint32_t*) srcRow; |
110 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 192 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
111 for (int i = 0; i < width; i++) { | 193 for (int i = 0; i < width; i++) { |
112 uint32_t p = srcPtr[i]; | 194 uint32_t p = srcPtr[i]; |
113 uint8_t red = masks->getRed(p); | 195 uint8_t red = masks->getRed(p); |
114 uint8_t green = masks->getGreen(p); | 196 uint8_t green = masks->getGreen(p); |
115 uint8_t blue = masks->getBlue(p); | 197 uint8_t blue = masks->getBlue(p); |
116 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 198 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
117 } | 199 } |
118 return SkSwizzler::kOpaque_ResultAlpha; | 200 return SkSwizzler::kOpaque_ResultAlpha; |
119 } | 201 } |
120 | 202 |
121 /* | 203 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_unpremul( |
122 * | |
123 * Row procedure for masked color components with 32 bits per pixel | |
124 * | |
125 */ | |
126 static SkSwizzler::ResultAlpha swizzle_mask32_alpha_to_n32( | |
127 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 204 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
128 | 205 |
129 // Use the masks to decode to the destination | 206 // Use the masks to decode to the destination |
130 uint32_t* srcPtr = (uint32_t*) srcRow; | 207 uint32_t* srcPtr = (uint32_t*) srcRow; |
131 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 208 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
132 INIT_RESULT_ALPHA; | 209 INIT_RESULT_ALPHA; |
133 for (int i = 0; i < width; i++) { | 210 for (int i = 0; i < width; i++) { |
134 uint32_t p = srcPtr[i]; | 211 uint32_t p = srcPtr[i]; |
135 uint8_t red = masks->getRed(p); | 212 uint8_t red = masks->getRed(p); |
136 uint8_t green = masks->getGreen(p); | 213 uint8_t green = masks->getGreen(p); |
137 uint8_t blue = masks->getBlue(p); | 214 uint8_t blue = masks->getBlue(p); |
138 uint8_t alpha = masks->getAlpha(p); | 215 uint8_t alpha = masks->getAlpha(p); |
139 UPDATE_RESULT_ALPHA(alpha); | 216 UPDATE_RESULT_ALPHA(alpha); |
140 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); | 217 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); |
141 } | 218 } |
142 return COMPUTE_RESULT_ALPHA; | 219 return COMPUTE_RESULT_ALPHA; |
143 } | 220 } |
144 | 221 |
222 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_premul( | |
223 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
224 | |
225 // Use the masks to decode to the destination | |
226 uint32_t* srcPtr = (uint32_t*) srcRow; | |
227 SkPMColor* dstPtr = (SkPMColor*) dstRow; | |
228 INIT_RESULT_ALPHA; | |
229 for (int i = 0; i < width; i++) { | |
230 uint32_t p = srcPtr[i]; | |
231 uint8_t red = masks->getRed(p); | |
232 uint8_t green = masks->getGreen(p); | |
233 uint8_t blue = masks->getBlue(p); | |
234 uint8_t alpha = masks->getAlpha(p); | |
235 UPDATE_RESULT_ALPHA(alpha); | |
236 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | |
237 } | |
238 return COMPUTE_RESULT_ALPHA; | |
239 } | |
240 | |
241 static SkSwizzler::ResultAlpha swizzle_mask32_to_565_opaque( | |
242 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
243 | |
244 // Use the masks to decode to the destination | |
245 uint32_t* srcPtr = (uint32_t*) srcRow; | |
246 uint16_t* dstPtr = (uint16_t*) dstRow; | |
247 for (int i = 0; i < width; i++) { | |
248 uint32_t p = srcPtr[i]; | |
249 uint8_t red = masks->getRed(p); | |
250 uint8_t green = masks->getGreen(p); | |
251 uint8_t blue = masks->getBlue(p); | |
252 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | |
253 } | |
254 return SkSwizzler::kOpaque_ResultAlpha; | |
255 } | |
256 | |
257 static SkSwizzler::ResultAlpha swizzle_mask32_to_565_premul( | |
258 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
259 | |
260 // Use the masks to decode to the destination | |
261 uint32_t* srcPtr = (uint32_t*) srcRow; | |
262 uint16_t* dstPtr = (uint16_t*) dstRow; | |
263 INIT_RESULT_ALPHA; | |
264 for (int i = 0; i < width; i++) { | |
265 uint32_t p = srcPtr[i]; | |
266 uint8_t red = masks->getRed(p); | |
267 uint8_t green = masks->getGreen(p); | |
268 uint8_t blue = masks->getBlue(p); | |
269 uint8_t alpha = masks->getAlpha(p); | |
270 UPDATE_RESULT_ALPHA(alpha); | |
271 dstPtr[i] = SkPixel32ToPixel16( | |
272 SkPreMultiplyARGB(alpha, red, green, blue)); | |
273 } | |
274 return COMPUTE_RESULT_ALPHA; | |
275 } | |
276 | |
145 /* | 277 /* |
146 * | 278 * |
147 * Create a new mask swizzler | 279 * Create a new mask swizzler |
148 * | 280 * |
149 */ | 281 */ |
150 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( | 282 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
151 const SkImageInfo& imageInfo, SkMasks* masks, uint32_t bitsPerPixel) { | 283 const SkImageInfo& info, SkMasks* masks, uint32_t bitsPerPixel) { |
152 | 284 |
153 // Choose the appropriate row procedure | 285 // Choose the appropriate row procedure |
154 RowProc proc = NULL; | 286 RowProc proc = NULL; |
155 uint32_t alphaMask = masks->getAlphaMask(); | |
156 switch (bitsPerPixel) { | 287 switch (bitsPerPixel) { |
157 case 16: | 288 case 16: |
158 if (0 == alphaMask) { | 289 switch (info.colorType()) { |
159 proc = &swizzle_mask16_to_n32; | 290 case kN32_SkColorType: |
160 } else { | 291 switch (info.alphaType()) { |
161 proc = &swizzle_mask16_alpha_to_n32; | 292 case kUnpremul_SkAlphaType: |
293 proc = &swizzle_mask16_to_n32_unpremul; | |
294 break; | |
295 case kPremul_SkAlphaType: | |
296 proc = &swizzle_mask16_to_n32_premul; | |
297 break; | |
298 case kOpaque_SkAlphaType: | |
299 proc = &swizzle_mask16_to_n32_opaque; | |
300 default: | |
301 break; | |
302 } | |
303 break; | |
304 case kRGB_565_SkColorType: | |
305 switch (info.alphaType()) { | |
306 case kPremul_SkAlphaType: | |
307 proc = &swizzle_mask16_to_565_premul; | |
scroggo
2015/03/17 13:27:22
565 is only opaque, so we 565 premul does not make
msarett
2015/03/17 16:54:06
That's good news. Reduces the number of cases and
| |
308 break; | |
309 case kOpaque_SkAlphaType: | |
310 proc = &swizzle_mask16_to_565_opaque; | |
311 default: | |
312 break; | |
313 } | |
314 break; | |
315 default: | |
316 break; | |
162 } | 317 } |
163 break; | 318 break; |
164 case 24: | 319 case 24: |
165 if (0 == alphaMask) { | 320 switch (info.colorType()) { |
166 proc = &swizzle_mask24_to_n32; | 321 case kN32_SkColorType: |
167 } else { | 322 switch (info.alphaType()) { |
168 proc = &swizzle_mask24_alpha_to_n32; | 323 case kUnpremul_SkAlphaType: |
324 proc = &swizzle_mask24_to_n32_unpremul; | |
325 break; | |
326 case kPremul_SkAlphaType: | |
327 proc = &swizzle_mask24_to_n32_premul; | |
328 break; | |
329 case kOpaque_SkAlphaType: | |
330 proc = &swizzle_mask24_to_n32_opaque; | |
331 default: | |
332 break; | |
333 } | |
334 break; | |
335 case kRGB_565_SkColorType: | |
336 switch (info.alphaType()) { | |
337 case kPremul_SkAlphaType: | |
338 proc = &swizzle_mask24_to_565_premul; | |
339 break; | |
340 case kOpaque_SkAlphaType: | |
341 proc = &swizzle_mask24_to_565_opaque; | |
342 default: | |
343 break; | |
344 } | |
345 break; | |
346 default: | |
347 break; | |
169 } | 348 } |
170 break; | 349 break; |
171 case 32: | 350 case 32: |
172 if (0 == alphaMask) { | 351 switch (info.colorType()) { |
173 proc = &swizzle_mask32_to_n32; | 352 case kN32_SkColorType: |
174 } else { | 353 switch (info.alphaType()) { |
175 proc = &swizzle_mask32_alpha_to_n32; | 354 case kUnpremul_SkAlphaType: |
355 proc = &swizzle_mask32_to_n32_unpremul; | |
356 break; | |
357 case kPremul_SkAlphaType: | |
358 proc = &swizzle_mask32_to_n32_premul; | |
359 break; | |
360 case kOpaque_SkAlphaType: | |
361 proc = &swizzle_mask32_to_n32_opaque; | |
362 default: | |
363 break; | |
364 } | |
365 break; | |
366 case kRGB_565_SkColorType: | |
367 switch (info.alphaType()) { | |
368 case kPremul_SkAlphaType: | |
369 proc = &swizzle_mask32_to_565_premul; | |
370 break; | |
371 case kOpaque_SkAlphaType: | |
372 proc = &swizzle_mask32_to_565_opaque; | |
373 default: | |
374 break; | |
375 } | |
376 break; | |
377 default: | |
378 break; | |
176 } | 379 } |
177 break; | 380 break; |
178 default: | 381 default: |
179 SkASSERT(false); | 382 SkASSERT(false); |
180 return NULL; | 383 return NULL; |
181 } | 384 } |
182 return SkNEW_ARGS(SkMaskSwizzler, (imageInfo, masks, proc)); | 385 return SkNEW_ARGS(SkMaskSwizzler, (info, masks, proc)); |
183 } | 386 } |
184 | 387 |
185 /* | 388 /* |
186 * | 389 * |
187 * Constructor for mask swizzler | 390 * Constructor for mask swizzler |
188 * | 391 * |
189 */ | 392 */ |
190 SkMaskSwizzler::SkMaskSwizzler(const SkImageInfo& imageInfo, | 393 SkMaskSwizzler::SkMaskSwizzler(const SkImageInfo& imageInfo, |
191 SkMasks* masks, RowProc proc) | 394 SkMasks* masks, RowProc proc) |
192 : fImageInfo(imageInfo) | 395 : fImageInfo(imageInfo) |
193 , fMasks(masks) | 396 , fMasks(masks) |
194 , fRowProc(proc) | 397 , fRowProc(proc) |
195 {} | 398 {} |
196 | 399 |
197 /* | 400 /* |
198 * | 401 * |
199 * Swizzle the next row | 402 * Swizzle the next row |
200 * | 403 * |
201 */ | 404 */ |
202 SkSwizzler::ResultAlpha SkMaskSwizzler::next(void* dst, | 405 SkSwizzler::ResultAlpha SkMaskSwizzler::next(void* dst, |
203 const uint8_t* src) { | 406 const uint8_t* src) { |
204 return fRowProc(dst, src, fImageInfo.width(), fMasks); | 407 return fRowProc(dst, src, fImageInfo.width(), fMasks); |
205 } | 408 } |
OLD | NEW |