Chromium Code Reviews| 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" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 uint8_t red = masks->getRed(p); | 56 uint8_t red = masks->getRed(p); |
| 57 uint8_t green = masks->getGreen(p); | 57 uint8_t green = masks->getGreen(p); |
| 58 uint8_t blue = masks->getBlue(p); | 58 uint8_t blue = masks->getBlue(p); |
| 59 uint8_t alpha = masks->getAlpha(p); | 59 uint8_t alpha = masks->getAlpha(p); |
| 60 UPDATE_RESULT_ALPHA(alpha); | 60 UPDATE_RESULT_ALPHA(alpha); |
| 61 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 61 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
| 62 } | 62 } |
| 63 return COMPUTE_RESULT_ALPHA; | 63 return COMPUTE_RESULT_ALPHA; |
| 64 } | 64 } |
| 65 | 65 |
| 66 static SkSwizzler::ResultAlpha swizzle_mask16_to_565( | |
|
msarett
2015/08/10 17:44:24
Would you mind adding a TODO (msarett) here to imp
scroggo
2015/08/10 17:50:45
Done.
| |
| 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 | |
| 66 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque( | 82 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque( |
| 67 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 83 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 68 | 84 |
| 69 // Use the masks to decode to the destination | 85 // Use the masks to decode to the destination |
| 70 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 86 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 71 for (int i = 0; i < 3*width; i += 3) { | 87 for (int i = 0; i < 3*width; i += 3) { |
| 72 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; |
| 73 uint8_t red = masks->getRed(p); | 89 uint8_t red = masks->getRed(p); |
| 74 uint8_t green = masks->getGreen(p); | 90 uint8_t green = masks->getGreen(p); |
| 75 uint8_t blue = masks->getBlue(p); | 91 uint8_t blue = masks->getBlue(p); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 107 uint8_t red = masks->getRed(p); | 123 uint8_t red = masks->getRed(p); |
| 108 uint8_t green = masks->getGreen(p); | 124 uint8_t green = masks->getGreen(p); |
| 109 uint8_t blue = masks->getBlue(p); | 125 uint8_t blue = masks->getBlue(p); |
| 110 uint8_t alpha = masks->getAlpha(p); | 126 uint8_t alpha = masks->getAlpha(p); |
| 111 UPDATE_RESULT_ALPHA(alpha); | 127 UPDATE_RESULT_ALPHA(alpha); |
| 112 dstPtr[i/3] = SkPreMultiplyARGB(alpha, red, green, blue); | 128 dstPtr[i/3] = SkPreMultiplyARGB(alpha, red, green, blue); |
| 113 } | 129 } |
| 114 return COMPUTE_RESULT_ALPHA; | 130 return COMPUTE_RESULT_ALPHA; |
| 115 } | 131 } |
| 116 | 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 | |
| 117 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( | 148 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( |
| 118 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 149 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
| 119 | 150 |
| 120 // Use the masks to decode to the destination | 151 // Use the masks to decode to the destination |
| 121 uint32_t* srcPtr = (uint32_t*) srcRow; | 152 uint32_t* srcPtr = (uint32_t*) srcRow; |
| 122 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 153 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
| 123 for (int i = 0; i < width; i++) { | 154 for (int i = 0; i < width; i++) { |
| 124 uint32_t p = srcPtr[i]; | 155 uint32_t p = srcPtr[i]; |
| 125 uint8_t red = masks->getRed(p); | 156 uint8_t red = masks->getRed(p); |
| 126 uint8_t green = masks->getGreen(p); | 157 uint8_t green = masks->getGreen(p); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 uint8_t red = masks->getRed(p); | 192 uint8_t red = masks->getRed(p); |
| 162 uint8_t green = masks->getGreen(p); | 193 uint8_t green = masks->getGreen(p); |
| 163 uint8_t blue = masks->getBlue(p); | 194 uint8_t blue = masks->getBlue(p); |
| 164 uint8_t alpha = masks->getAlpha(p); | 195 uint8_t alpha = masks->getAlpha(p); |
| 165 UPDATE_RESULT_ALPHA(alpha); | 196 UPDATE_RESULT_ALPHA(alpha); |
| 166 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 197 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
| 167 } | 198 } |
| 168 return COMPUTE_RESULT_ALPHA; | 199 return COMPUTE_RESULT_ALPHA; |
| 169 } | 200 } |
| 170 | 201 |
| 202 static SkSwizzler::ResultAlpha swizzle_mask32_to_565( | |
| 203 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
| 204 // Use the masks to decode to the destination | |
| 205 uint32_t* srcPtr = (uint32_t*) srcRow; | |
| 206 uint16_t* dstPtr = (uint16_t*) dstRow; | |
| 207 for (int i = 0; i < width; i++) { | |
| 208 uint32_t p = srcPtr[i]; | |
| 209 uint8_t red = masks->getRed(p); | |
| 210 uint8_t green = masks->getGreen(p); | |
| 211 uint8_t blue = masks->getBlue(p); | |
| 212 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | |
| 213 } | |
| 214 return SkSwizzler::kOpaque_ResultAlpha; | |
| 215 } | |
| 216 | |
| 171 /* | 217 /* |
| 172 * | 218 * |
| 173 * Create a new mask swizzler | 219 * Create a new mask swizzler |
| 174 * | 220 * |
| 175 */ | 221 */ |
| 176 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( | 222 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
| 177 const SkImageInfo& info, SkMasks* masks, uint32_t bitsPerPixel) { | 223 const SkImageInfo& info, SkMasks* masks, uint32_t bitsPerPixel) { |
| 178 | 224 |
| 179 // Choose the appropriate row procedure | 225 // Choose the appropriate row procedure |
| 180 RowProc proc = NULL; | 226 RowProc proc = NULL; |
| 181 switch (bitsPerPixel) { | 227 switch (bitsPerPixel) { |
| 182 case 16: | 228 case 16: |
| 183 switch (info.colorType()) { | 229 switch (info.colorType()) { |
| 184 case kN32_SkColorType: | 230 case kN32_SkColorType: |
| 185 switch (info.alphaType()) { | 231 switch (info.alphaType()) { |
| 186 case kUnpremul_SkAlphaType: | 232 case kUnpremul_SkAlphaType: |
| 187 proc = &swizzle_mask16_to_n32_unpremul; | 233 proc = &swizzle_mask16_to_n32_unpremul; |
| 188 break; | 234 break; |
| 189 case kPremul_SkAlphaType: | 235 case kPremul_SkAlphaType: |
| 190 proc = &swizzle_mask16_to_n32_premul; | 236 proc = &swizzle_mask16_to_n32_premul; |
| 191 break; | 237 break; |
| 192 case kOpaque_SkAlphaType: | 238 case kOpaque_SkAlphaType: |
| 193 proc = &swizzle_mask16_to_n32_opaque; | 239 proc = &swizzle_mask16_to_n32_opaque; |
| 194 break; | 240 break; |
| 195 default: | 241 default: |
| 196 break; | 242 break; |
| 197 } | 243 } |
| 198 break; | 244 break; |
| 245 case kRGB_565_SkColorType: | |
| 246 switch (info.alphaType()) { | |
| 247 case kOpaque_SkAlphaType: | |
| 248 proc = &swizzle_mask16_to_565; | |
| 249 break; | |
| 250 default: | |
| 251 break; | |
| 252 } | |
| 253 break; | |
| 199 default: | 254 default: |
| 200 break; | 255 break; |
| 201 } | 256 } |
| 202 break; | 257 break; |
| 203 case 24: | 258 case 24: |
| 204 switch (info.colorType()) { | 259 switch (info.colorType()) { |
| 205 case kN32_SkColorType: | 260 case kN32_SkColorType: |
| 206 switch (info.alphaType()) { | 261 switch (info.alphaType()) { |
| 207 case kUnpremul_SkAlphaType: | 262 case kUnpremul_SkAlphaType: |
| 208 proc = &swizzle_mask24_to_n32_unpremul; | 263 proc = &swizzle_mask24_to_n32_unpremul; |
| 209 break; | 264 break; |
| 210 case kPremul_SkAlphaType: | 265 case kPremul_SkAlphaType: |
| 211 proc = &swizzle_mask24_to_n32_premul; | 266 proc = &swizzle_mask24_to_n32_premul; |
| 212 break; | 267 break; |
| 213 case kOpaque_SkAlphaType: | 268 case kOpaque_SkAlphaType: |
| 214 proc = &swizzle_mask24_to_n32_opaque; | 269 proc = &swizzle_mask24_to_n32_opaque; |
| 215 break; | 270 break; |
| 216 default: | 271 default: |
| 217 break; | 272 break; |
| 218 } | 273 } |
| 219 break; | 274 break; |
| 275 case kRGB_565_SkColorType: | |
| 276 switch (info.alphaType()) { | |
| 277 case kOpaque_SkAlphaType: | |
| 278 proc = &swizzle_mask24_to_565; | |
| 279 break; | |
| 280 default: | |
| 281 break; | |
| 282 } | |
| 283 break; | |
| 220 default: | 284 default: |
| 221 break; | 285 break; |
| 222 } | 286 } |
| 223 break; | 287 break; |
| 224 case 32: | 288 case 32: |
| 225 switch (info.colorType()) { | 289 switch (info.colorType()) { |
| 226 case kN32_SkColorType: | 290 case kN32_SkColorType: |
| 227 switch (info.alphaType()) { | 291 switch (info.alphaType()) { |
| 228 case kUnpremul_SkAlphaType: | 292 case kUnpremul_SkAlphaType: |
| 229 proc = &swizzle_mask32_to_n32_unpremul; | 293 proc = &swizzle_mask32_to_n32_unpremul; |
| 230 break; | 294 break; |
| 231 case kPremul_SkAlphaType: | 295 case kPremul_SkAlphaType: |
| 232 proc = &swizzle_mask32_to_n32_premul; | 296 proc = &swizzle_mask32_to_n32_premul; |
| 233 break; | 297 break; |
| 234 case kOpaque_SkAlphaType: | 298 case kOpaque_SkAlphaType: |
| 235 proc = &swizzle_mask32_to_n32_opaque; | 299 proc = &swizzle_mask32_to_n32_opaque; |
| 236 break; | 300 break; |
| 237 default: | 301 default: |
| 238 break; | 302 break; |
| 239 } | 303 } |
| 240 break; | 304 break; |
| 305 case kRGB_565_SkColorType: | |
| 306 switch (info.alphaType()) { | |
| 307 case kOpaque_SkAlphaType: | |
| 308 proc = &swizzle_mask32_to_565; | |
| 309 break; | |
| 310 default: | |
| 311 break; | |
| 312 } | |
| 313 break; | |
| 241 default: | 314 default: |
| 242 break; | 315 break; |
| 243 } | 316 } |
| 244 break; | 317 break; |
| 245 default: | 318 default: |
| 246 SkASSERT(false); | 319 SkASSERT(false); |
| 247 return NULL; | 320 return NULL; |
| 248 } | 321 } |
| 249 return SkNEW_ARGS(SkMaskSwizzler, (info, masks, proc)); | 322 return SkNEW_ARGS(SkMaskSwizzler, (info, masks, proc)); |
| 250 } | 323 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 263 | 336 |
| 264 /* | 337 /* |
| 265 * | 338 * |
| 266 * Swizzle the specified row | 339 * Swizzle the specified row |
| 267 * | 340 * |
| 268 */ | 341 */ |
| 269 SkSwizzler::ResultAlpha SkMaskSwizzler::swizzle(void* dst, const uint8_t* SK_RES TRICT src) { | 342 SkSwizzler::ResultAlpha SkMaskSwizzler::swizzle(void* dst, const uint8_t* SK_RES TRICT src) { |
| 270 SkASSERT(NULL != dst && NULL != src); | 343 SkASSERT(NULL != dst && NULL != src); |
| 271 return fRowProc(dst, src, fDstInfo.width(), fMasks); | 344 return fRowProc(dst, src, fDstInfo.width(), fMasks); |
| 272 } | 345 } |
| OLD | NEW |