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" |
| 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 |