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( |
| 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_mask24_to_n32_opaque( |
| 83 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 84 |
| 85 // Use the masks to decode to the destination |
66 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 86 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
67 for (int i = 0; i < 3*width; i += 3) { | 87 for (int i = 0; i < 3*width; i += 3) { |
68 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | 88 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
69 uint8_t red = masks->getRed(p); | 89 uint8_t red = masks->getRed(p); |
70 uint8_t green = masks->getGreen(p); | 90 uint8_t green = masks->getGreen(p); |
71 uint8_t blue = masks->getBlue(p); | 91 uint8_t blue = masks->getBlue(p); |
72 dstPtr[i/3] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 92 dstPtr[i/3] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
73 } | 93 } |
74 return SkSwizzler::kOpaque_ResultAlpha; | 94 return SkSwizzler::kOpaque_ResultAlpha; |
75 } | 95 } |
76 | 96 |
77 /* | 97 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) { | 98 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
84 | 99 |
85 // Use the masks to decode to the destination | 100 // Use the masks to decode to the destination |
86 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 101 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
87 INIT_RESULT_ALPHA; | 102 INIT_RESULT_ALPHA; |
88 for (int i = 0; i < 3*width; i += 3) { | 103 for (int i = 0; i < 3*width; i += 3) { |
89 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | 104 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
90 uint8_t red = masks->getRed(p); | 105 uint8_t red = masks->getRed(p); |
91 uint8_t green = masks->getGreen(p); | 106 uint8_t green = masks->getGreen(p); |
92 uint8_t blue = masks->getBlue(p); | 107 uint8_t blue = masks->getBlue(p); |
93 uint8_t alpha = masks->getAlpha(p); | 108 uint8_t alpha = masks->getAlpha(p); |
94 UPDATE_RESULT_ALPHA(alpha); | 109 UPDATE_RESULT_ALPHA(alpha); |
95 dstPtr[i/3] = SkPackARGB32NoCheck(alpha, red, green, blue); | 110 dstPtr[i/3] = SkPackARGB32NoCheck(alpha, red, green, blue); |
96 } | 111 } |
97 return COMPUTE_RESULT_ALPHA; | 112 return COMPUTE_RESULT_ALPHA; |
98 } | 113 } |
99 | 114 |
100 /* | 115 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) { | 116 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
107 | 117 |
108 // Use the masks to decode to the destination | 118 // Use the masks to decode to the destination |
| 119 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 120 INIT_RESULT_ALPHA; |
| 121 for (int i = 0; i < 3*width; i += 3) { |
| 122 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
| 123 uint8_t red = masks->getRed(p); |
| 124 uint8_t green = masks->getGreen(p); |
| 125 uint8_t blue = masks->getBlue(p); |
| 126 uint8_t alpha = masks->getAlpha(p); |
| 127 UPDATE_RESULT_ALPHA(alpha); |
| 128 dstPtr[i/3] = SkPreMultiplyARGB(alpha, red, green, blue); |
| 129 } |
| 130 return COMPUTE_RESULT_ALPHA; |
| 131 } |
| 132 |
| 133 static SkSwizzler::ResultAlpha swizzle_mask24_to_565( |
| 134 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 135 |
| 136 // Use the masks to decode to the destination |
| 137 uint16_t* dstPtr = (uint16_t*) dstRow; |
| 138 for (int i = 0; i < 3*width; i += 3) { |
| 139 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
| 140 uint8_t red = masks->getRed(p); |
| 141 uint8_t green = masks->getGreen(p); |
| 142 uint8_t blue = masks->getBlue(p); |
| 143 dstPtr[i/3] = SkPack888ToRGB16(red, green, blue); |
| 144 } |
| 145 return SkSwizzler::kOpaque_ResultAlpha; |
| 146 } |
| 147 |
| 148 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( |
| 149 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 150 |
| 151 // Use the masks to decode to the destination |
109 uint32_t* srcPtr = (uint32_t*) srcRow; | 152 uint32_t* srcPtr = (uint32_t*) srcRow; |
110 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 153 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
111 for (int i = 0; i < width; i++) { | 154 for (int i = 0; i < width; i++) { |
112 uint32_t p = srcPtr[i]; | 155 uint32_t p = srcPtr[i]; |
113 uint8_t red = masks->getRed(p); | 156 uint8_t red = masks->getRed(p); |
114 uint8_t green = masks->getGreen(p); | 157 uint8_t green = masks->getGreen(p); |
115 uint8_t blue = masks->getBlue(p); | 158 uint8_t blue = masks->getBlue(p); |
116 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 159 dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
117 } | 160 } |
118 return SkSwizzler::kOpaque_ResultAlpha; | 161 return SkSwizzler::kOpaque_ResultAlpha; |
119 } | 162 } |
120 | 163 |
121 /* | 164 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) { | 165 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
128 | 166 |
129 // Use the masks to decode to the destination | 167 // Use the masks to decode to the destination |
130 uint32_t* srcPtr = (uint32_t*) srcRow; | 168 uint32_t* srcPtr = (uint32_t*) srcRow; |
131 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 169 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
132 INIT_RESULT_ALPHA; | 170 INIT_RESULT_ALPHA; |
133 for (int i = 0; i < width; i++) { | 171 for (int i = 0; i < width; i++) { |
134 uint32_t p = srcPtr[i]; | 172 uint32_t p = srcPtr[i]; |
135 uint8_t red = masks->getRed(p); | 173 uint8_t red = masks->getRed(p); |
136 uint8_t green = masks->getGreen(p); | 174 uint8_t green = masks->getGreen(p); |
137 uint8_t blue = masks->getBlue(p); | 175 uint8_t blue = masks->getBlue(p); |
138 uint8_t alpha = masks->getAlpha(p); | 176 uint8_t alpha = masks->getAlpha(p); |
139 UPDATE_RESULT_ALPHA(alpha); | 177 UPDATE_RESULT_ALPHA(alpha); |
140 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); | 178 dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); |
141 } | 179 } |
142 return COMPUTE_RESULT_ALPHA; | 180 return COMPUTE_RESULT_ALPHA; |
143 } | 181 } |
144 | 182 |
| 183 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_premul( |
| 184 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 185 |
| 186 // Use the masks to decode to the destination |
| 187 uint32_t* srcPtr = (uint32_t*) srcRow; |
| 188 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 189 INIT_RESULT_ALPHA; |
| 190 for (int i = 0; i < width; i++) { |
| 191 uint32_t p = srcPtr[i]; |
| 192 uint8_t red = masks->getRed(p); |
| 193 uint8_t green = masks->getGreen(p); |
| 194 uint8_t blue = masks->getBlue(p); |
| 195 uint8_t alpha = masks->getAlpha(p); |
| 196 UPDATE_RESULT_ALPHA(alpha); |
| 197 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
| 198 } |
| 199 return COMPUTE_RESULT_ALPHA; |
| 200 } |
| 201 |
| 202 static SkSwizzler::ResultAlpha swizzle_mask32_to_565( |
| 203 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 204 |
| 205 // Use the masks to decode to the destination |
| 206 uint32_t* srcPtr = (uint32_t*) srcRow; |
| 207 uint16_t* dstPtr = (uint16_t*) dstRow; |
| 208 for (int i = 0; i < width; i++) { |
| 209 uint32_t p = srcPtr[i]; |
| 210 uint8_t red = masks->getRed(p); |
| 211 uint8_t green = masks->getGreen(p); |
| 212 uint8_t blue = masks->getBlue(p); |
| 213 dstPtr[i] = SkPack888ToRGB16(red, green, blue); |
| 214 } |
| 215 return SkSwizzler::kOpaque_ResultAlpha; |
| 216 } |
| 217 |
145 /* | 218 /* |
146 * | 219 * |
147 * Create a new mask swizzler | 220 * Create a new mask swizzler |
148 * | 221 * |
149 */ | 222 */ |
150 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( | 223 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
151 const SkImageInfo& imageInfo, SkMasks* masks, uint32_t bitsPerPixel) { | 224 const SkImageInfo& info, SkMasks* masks, uint32_t bitsPerPixel) { |
152 | 225 |
153 // Choose the appropriate row procedure | 226 // Choose the appropriate row procedure |
154 RowProc proc = NULL; | 227 RowProc proc = NULL; |
155 uint32_t alphaMask = masks->getAlphaMask(); | |
156 switch (bitsPerPixel) { | 228 switch (bitsPerPixel) { |
157 case 16: | 229 case 16: |
158 if (0 == alphaMask) { | 230 switch (info.colorType()) { |
159 proc = &swizzle_mask16_to_n32; | 231 case kN32_SkColorType: |
160 } else { | 232 switch (info.alphaType()) { |
161 proc = &swizzle_mask16_alpha_to_n32; | 233 case kUnpremul_SkAlphaType: |
| 234 proc = &swizzle_mask16_to_n32_unpremul; |
| 235 break; |
| 236 case kPremul_SkAlphaType: |
| 237 proc = &swizzle_mask16_to_n32_premul; |
| 238 break; |
| 239 case kOpaque_SkAlphaType: |
| 240 proc = &swizzle_mask16_to_n32_opaque; |
| 241 break; |
| 242 default: |
| 243 break; |
| 244 } |
| 245 break; |
| 246 case kRGB_565_SkColorType: |
| 247 switch (info.alphaType()) { |
| 248 case kOpaque_SkAlphaType: |
| 249 proc = &swizzle_mask16_to_565; |
| 250 break; |
| 251 default: |
| 252 break; |
| 253 } |
| 254 break; |
| 255 default: |
| 256 break; |
162 } | 257 } |
163 break; | 258 break; |
164 case 24: | 259 case 24: |
165 if (0 == alphaMask) { | 260 switch (info.colorType()) { |
166 proc = &swizzle_mask24_to_n32; | 261 case kN32_SkColorType: |
167 } else { | 262 switch (info.alphaType()) { |
168 proc = &swizzle_mask24_alpha_to_n32; | 263 case kUnpremul_SkAlphaType: |
| 264 proc = &swizzle_mask24_to_n32_unpremul; |
| 265 break; |
| 266 case kPremul_SkAlphaType: |
| 267 proc = &swizzle_mask24_to_n32_premul; |
| 268 break; |
| 269 case kOpaque_SkAlphaType: |
| 270 proc = &swizzle_mask24_to_n32_opaque; |
| 271 break; |
| 272 default: |
| 273 break; |
| 274 } |
| 275 break; |
| 276 case kRGB_565_SkColorType: |
| 277 switch (info.alphaType()) { |
| 278 case kOpaque_SkAlphaType: |
| 279 proc = &swizzle_mask24_to_565; |
| 280 break; |
| 281 default: |
| 282 break; |
| 283 } |
| 284 break; |
| 285 default: |
| 286 break; |
169 } | 287 } |
170 break; | 288 break; |
171 case 32: | 289 case 32: |
172 if (0 == alphaMask) { | 290 switch (info.colorType()) { |
173 proc = &swizzle_mask32_to_n32; | 291 case kN32_SkColorType: |
174 } else { | 292 switch (info.alphaType()) { |
175 proc = &swizzle_mask32_alpha_to_n32; | 293 case kUnpremul_SkAlphaType: |
| 294 proc = &swizzle_mask32_to_n32_unpremul; |
| 295 break; |
| 296 case kPremul_SkAlphaType: |
| 297 proc = &swizzle_mask32_to_n32_premul; |
| 298 break; |
| 299 case kOpaque_SkAlphaType: |
| 300 proc = &swizzle_mask32_to_n32_opaque; |
| 301 break; |
| 302 default: |
| 303 break; |
| 304 } |
| 305 break; |
| 306 case kRGB_565_SkColorType: |
| 307 switch (info.alphaType()) { |
| 308 case kOpaque_SkAlphaType: |
| 309 proc = &swizzle_mask32_to_565; |
| 310 break; |
| 311 default: |
| 312 break; |
| 313 } |
| 314 break; |
| 315 default: |
| 316 break; |
176 } | 317 } |
177 break; | 318 break; |
178 default: | 319 default: |
179 SkASSERT(false); | 320 SkASSERT(false); |
180 return NULL; | 321 return NULL; |
181 } | 322 } |
182 return SkNEW_ARGS(SkMaskSwizzler, (imageInfo, masks, proc)); | 323 return SkNEW_ARGS(SkMaskSwizzler, (info, masks, proc)); |
183 } | 324 } |
184 | 325 |
185 /* | 326 /* |
186 * | 327 * |
187 * Constructor for mask swizzler | 328 * Constructor for mask swizzler |
188 * | 329 * |
189 */ | 330 */ |
190 SkMaskSwizzler::SkMaskSwizzler(const SkImageInfo& imageInfo, | 331 SkMaskSwizzler::SkMaskSwizzler(const SkImageInfo& imageInfo, |
191 SkMasks* masks, RowProc proc) | 332 SkMasks* masks, RowProc proc) |
192 : fImageInfo(imageInfo) | 333 : fImageInfo(imageInfo) |
193 , fMasks(masks) | 334 , fMasks(masks) |
194 , fRowProc(proc) | 335 , fRowProc(proc) |
195 {} | 336 {} |
196 | 337 |
197 /* | 338 /* |
198 * | 339 * |
199 * Swizzle the next row | 340 * Swizzle the next row |
200 * | 341 * |
201 */ | 342 */ |
202 SkSwizzler::ResultAlpha SkMaskSwizzler::next(void* dst, | 343 SkSwizzler::ResultAlpha SkMaskSwizzler::next(void* dst, |
203 const uint8_t* src) { | 344 const uint8_t* src) { |
204 return fRowProc(dst, src, fImageInfo.width(), fMasks); | 345 return fRowProc(dst, src, fImageInfo.width(), fMasks); |
205 } | 346 } |
OLD | NEW |