| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2007 The Android Open Source Project | 2 * Copyright 2007 The Android Open Source Project |
| 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 | 8 |
| 9 #include "SkScaledBitmapSampler.h" | 9 #include "SkScaledBitmapSampler.h" |
| 10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
| 11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
| 12 #include "SkDither.h" | 12 #include "SkDither.h" |
| 13 #include "SkTypes.h" | 13 #include "SkTypes.h" |
| 14 | 14 |
| 15 // 8888 | 15 // 8888 |
| 16 | 16 |
| 17 static bool Sample_Gray_D8888(void* SK_RESTRICT dstRow, | 17 static bool Sample_Gray_D8888(void* SK_RESTRICT dstRow, |
| 18 const uint8_t* SK_RESTRICT src, | 18 const uint8_t* SK_RESTRICT src, |
| 19 int width, int deltaSrc, int, const SkPMColor[]) { | 19 int width, int deltaSrc, int, const SkPMColor[]) { |
| 20 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 20 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 21 for (int x = 0; x < width; x++) { | 21 for (int x = 0; x < width; x++) { |
| 22 dst[x] = SkPackARGB32(0xFF, src[0], src[0], src[0]); | 22 dst[x] = SkPackARGB32(0xFF, src[0], src[0], src[0]); |
| 23 src += deltaSrc; | 23 src += deltaSrc; |
| 24 } | 24 } |
| 25 return false; | 25 return false; |
| 26 } | 26 } |
| 27 | 27 |
| 28 static SkScaledBitmapSampler::RowProc get_gray_to_8888_proc(const SkImageDecoder
& decoder) { | 28 static SkScaledBitmapSampler::RowProc |
| 29 get_gray_to_8888_proc(const SkScaledBitmapSampler::Options& opts) { |
| 29 // Dither, unpremul, and skipZeroes have no effect | 30 // Dither, unpremul, and skipZeroes have no effect |
| 30 return Sample_Gray_D8888; | 31 return Sample_Gray_D8888; |
| 31 } | 32 } |
| 32 | 33 |
| 33 static bool Sample_RGBx_D8888(void* SK_RESTRICT dstRow, | 34 static bool Sample_RGBx_D8888(void* SK_RESTRICT dstRow, |
| 34 const uint8_t* SK_RESTRICT src, | 35 const uint8_t* SK_RESTRICT src, |
| 35 int width, int deltaSrc, int, const SkPMColor[]) { | 36 int width, int deltaSrc, int, const SkPMColor[]) { |
| 36 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 37 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 37 for (int x = 0; x < width; x++) { | 38 for (int x = 0; x < width; x++) { |
| 38 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); | 39 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); |
| 39 src += deltaSrc; | 40 src += deltaSrc; |
| 40 } | 41 } |
| 41 return false; | 42 return false; |
| 42 } | 43 } |
| 43 | 44 |
| 44 static SkScaledBitmapSampler::RowProc get_RGBx_to_8888_proc(const SkImageDecoder
& decoder) { | 45 static SkScaledBitmapSampler::RowProc |
| 46 get_RGBx_to_8888_proc(const SkScaledBitmapSampler::Options& opts) { |
| 45 // Dither, unpremul, and skipZeroes have no effect | 47 // Dither, unpremul, and skipZeroes have no effect |
| 46 return Sample_RGBx_D8888; | 48 return Sample_RGBx_D8888; |
| 47 } | 49 } |
| 48 | 50 |
| 49 static bool Sample_RGBA_D8888(void* SK_RESTRICT dstRow, | 51 static bool Sample_RGBA_D8888(void* SK_RESTRICT dstRow, |
| 50 const uint8_t* SK_RESTRICT src, | 52 const uint8_t* SK_RESTRICT src, |
| 51 int width, int deltaSrc, int, const SkPMColor[]) { | 53 int width, int deltaSrc, int, const SkPMColor[]) { |
| 52 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 54 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 53 unsigned alphaMask = 0xFF; | 55 unsigned alphaMask = 0xFF; |
| 54 for (int x = 0; x < width; x++) { | 56 for (int x = 0; x < width; x++) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 85 unsigned alpha = src[3]; | 87 unsigned alpha = src[3]; |
| 86 if (0 != alpha) { | 88 if (0 != alpha) { |
| 87 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); | 89 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); |
| 88 } | 90 } |
| 89 src += deltaSrc; | 91 src += deltaSrc; |
| 90 alphaMask &= alpha; | 92 alphaMask &= alpha; |
| 91 } | 93 } |
| 92 return alphaMask != 0xFF; | 94 return alphaMask != 0xFF; |
| 93 } | 95 } |
| 94 | 96 |
| 95 static SkScaledBitmapSampler::RowProc get_RGBA_to_8888_proc(const SkImageDecoder
& decoder) { | 97 static SkScaledBitmapSampler::RowProc |
| 98 get_RGBA_to_8888_proc(const SkScaledBitmapSampler::Options& opts) { |
| 96 // Dither has no effect. | 99 // Dither has no effect. |
| 97 if (decoder.getRequireUnpremultipliedColors()) { | 100 if (!opts.fPremultiplyAlpha) { |
| 98 // We could check each component for a zero, at the expense of extra che
cks. | 101 // We could check each component for a zero, at the expense of extra che
cks. |
| 99 // For now, just return unpremul. | 102 // For now, just return unpremul. |
| 100 return Sample_RGBA_D8888_Unpremul; | 103 return Sample_RGBA_D8888_Unpremul; |
| 101 } | 104 } |
| 102 // Supply the versions that premultiply the colors | 105 // Supply the versions that premultiply the colors |
| 103 if (decoder.getSkipWritingZeroes()) { | 106 if (opts.fSkipZeros) { |
| 104 return Sample_RGBA_D8888_SkipZ; | 107 return Sample_RGBA_D8888_SkipZ; |
| 105 } | 108 } |
| 106 return Sample_RGBA_D8888; | 109 return Sample_RGBA_D8888; |
| 107 } | 110 } |
| 108 | 111 |
| 109 // 565 | 112 // 565 |
| 110 | 113 |
| 111 static bool Sample_Gray_D565(void* SK_RESTRICT dstRow, | 114 static bool Sample_Gray_D565(void* SK_RESTRICT dstRow, |
| 112 const uint8_t* SK_RESTRICT src, | 115 const uint8_t* SK_RESTRICT src, |
| 113 int width, int deltaSrc, int, const SkPMColor[]) { | 116 int width, int deltaSrc, int, const SkPMColor[]) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 124 int width, int deltaSrc, int y, const SkPMColor[]) { | 127 int width, int deltaSrc, int y, const SkPMColor[]) { |
| 125 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 128 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 126 DITHER_565_SCAN(y); | 129 DITHER_565_SCAN(y); |
| 127 for (int x = 0; x < width; x++) { | 130 for (int x = 0; x < width; x++) { |
| 128 dst[x] = SkDitherRGBTo565(src[0], src[0], src[0], DITHER_VALUE(x)); | 131 dst[x] = SkDitherRGBTo565(src[0], src[0], src[0], DITHER_VALUE(x)); |
| 129 src += deltaSrc; | 132 src += deltaSrc; |
| 130 } | 133 } |
| 131 return false; | 134 return false; |
| 132 } | 135 } |
| 133 | 136 |
| 134 static SkScaledBitmapSampler::RowProc get_gray_to_565_proc(const SkImageDecoder&
decoder) { | 137 static SkScaledBitmapSampler::RowProc |
| 138 get_gray_to_565_proc(const SkScaledBitmapSampler::Options& opts) { |
| 135 // Unpremul and skip zeroes make no difference | 139 // Unpremul and skip zeroes make no difference |
| 136 if (decoder.getDitherImage()) { | 140 if (opts.fDither) { |
| 137 return Sample_Gray_D565_D; | 141 return Sample_Gray_D565_D; |
| 138 } | 142 } |
| 139 return Sample_Gray_D565; | 143 return Sample_Gray_D565; |
| 140 } | 144 } |
| 141 | 145 |
| 142 static bool Sample_RGBx_D565(void* SK_RESTRICT dstRow, | 146 static bool Sample_RGBx_D565(void* SK_RESTRICT dstRow, |
| 143 const uint8_t* SK_RESTRICT src, | 147 const uint8_t* SK_RESTRICT src, |
| 144 int width, int deltaSrc, int, const SkPMColor[]) { | 148 int width, int deltaSrc, int, const SkPMColor[]) { |
| 145 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 149 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 146 for (int x = 0; x < width; x++) { | 150 for (int x = 0; x < width; x++) { |
| 147 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); | 151 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); |
| 148 src += deltaSrc; | 152 src += deltaSrc; |
| 149 } | 153 } |
| 150 return false; | 154 return false; |
| 151 } | 155 } |
| 152 | 156 |
| 153 static bool Sample_RGBx_D565_D(void* SK_RESTRICT dstRow, | 157 static bool Sample_RGBx_D565_D(void* SK_RESTRICT dstRow, |
| 154 const uint8_t* SK_RESTRICT src, | 158 const uint8_t* SK_RESTRICT src, |
| 155 int width, int deltaSrc, int y, | 159 int width, int deltaSrc, int y, |
| 156 const SkPMColor[]) { | 160 const SkPMColor[]) { |
| 157 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 161 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 158 DITHER_565_SCAN(y); | 162 DITHER_565_SCAN(y); |
| 159 for (int x = 0; x < width; x++) { | 163 for (int x = 0; x < width; x++) { |
| 160 dst[x] = SkDitherRGBTo565(src[0], src[1], src[2], DITHER_VALUE(x)); | 164 dst[x] = SkDitherRGBTo565(src[0], src[1], src[2], DITHER_VALUE(x)); |
| 161 src += deltaSrc; | 165 src += deltaSrc; |
| 162 } | 166 } |
| 163 return false; | 167 return false; |
| 164 } | 168 } |
| 165 | 169 |
| 166 static SkScaledBitmapSampler::RowProc get_RGBx_to_565_proc(const SkImageDecoder&
decoder) { | 170 static SkScaledBitmapSampler::RowProc |
| 171 get_RGBx_to_565_proc(const SkScaledBitmapSampler::Options& opts) { |
| 167 // Unpremul and skip zeroes make no difference | 172 // Unpremul and skip zeroes make no difference |
| 168 if (decoder.getDitherImage()) { | 173 if (opts.fDither) { |
| 169 return Sample_RGBx_D565_D; | 174 return Sample_RGBx_D565_D; |
| 170 } | 175 } |
| 171 return Sample_RGBx_D565; | 176 return Sample_RGBx_D565; |
| 172 } | 177 } |
| 173 | 178 |
| 174 | 179 |
| 175 static bool Sample_D565_D565(void* SK_RESTRICT dstRow, | 180 static bool Sample_D565_D565(void* SK_RESTRICT dstRow, |
| 176 const uint8_t* SK_RESTRICT src, | 181 const uint8_t* SK_RESTRICT src, |
| 177 int width, int deltaSrc, int, const SkPMColor[]) { | 182 int width, int deltaSrc, int, const SkPMColor[]) { |
| 178 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 183 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 179 uint16_t* SK_RESTRICT castedSrc = (uint16_t*) src; | 184 uint16_t* SK_RESTRICT castedSrc = (uint16_t*) src; |
| 180 for (int x = 0; x < width; x++) { | 185 for (int x = 0; x < width; x++) { |
| 181 dst[x] = castedSrc[0]; | 186 dst[x] = castedSrc[0]; |
| 182 castedSrc += deltaSrc >> 1; | 187 castedSrc += deltaSrc >> 1; |
| 183 } | 188 } |
| 184 return false; | 189 return false; |
| 185 } | 190 } |
| 186 | 191 |
| 187 static SkScaledBitmapSampler::RowProc get_565_to_565_proc(const SkImageDecoder&
decoder) { | 192 static SkScaledBitmapSampler::RowProc |
| 193 get_565_to_565_proc(const SkScaledBitmapSampler::Options& opts) { |
| 188 // Unpremul, dither, and skip zeroes have no effect | 194 // Unpremul, dither, and skip zeroes have no effect |
| 189 return Sample_D565_D565; | 195 return Sample_D565_D565; |
| 190 } | 196 } |
| 191 | 197 |
| 192 // 4444 | 198 // 4444 |
| 193 | 199 |
| 194 static bool Sample_Gray_D4444(void* SK_RESTRICT dstRow, | 200 static bool Sample_Gray_D4444(void* SK_RESTRICT dstRow, |
| 195 const uint8_t* SK_RESTRICT src, | 201 const uint8_t* SK_RESTRICT src, |
| 196 int width, int deltaSrc, int, const SkPMColor[]) { | 202 int width, int deltaSrc, int, const SkPMColor[]) { |
| 197 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; | 203 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 209 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; | 215 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; |
| 210 DITHER_4444_SCAN(y); | 216 DITHER_4444_SCAN(y); |
| 211 for (int x = 0; x < width; x++) { | 217 for (int x = 0; x < width; x++) { |
| 212 dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[0], src[0], | 218 dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[0], src[0], |
| 213 DITHER_VALUE(x)); | 219 DITHER_VALUE(x)); |
| 214 src += deltaSrc; | 220 src += deltaSrc; |
| 215 } | 221 } |
| 216 return false; | 222 return false; |
| 217 } | 223 } |
| 218 | 224 |
| 219 static SkScaledBitmapSampler::RowProc get_gray_to_4444_proc(const SkImageDecoder
& decoder) { | 225 static SkScaledBitmapSampler::RowProc |
| 226 get_gray_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { |
| 220 // Skip zeroes and unpremul make no difference | 227 // Skip zeroes and unpremul make no difference |
| 221 if (decoder.getDitherImage()) { | 228 if (opts.fDither) { |
| 222 return Sample_Gray_D4444_D; | 229 return Sample_Gray_D4444_D; |
| 223 } | 230 } |
| 224 return Sample_Gray_D4444; | 231 return Sample_Gray_D4444; |
| 225 } | 232 } |
| 226 | 233 |
| 227 static bool Sample_RGBx_D4444(void* SK_RESTRICT dstRow, | 234 static bool Sample_RGBx_D4444(void* SK_RESTRICT dstRow, |
| 228 const uint8_t* SK_RESTRICT src, | 235 const uint8_t* SK_RESTRICT src, |
| 229 int width, int deltaSrc, int, const SkPMColor[]) { | 236 int width, int deltaSrc, int, const SkPMColor[]) { |
| 230 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; | 237 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; |
| 231 for (int x = 0; x < width; x++) { | 238 for (int x = 0; x < width; x++) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 242 DITHER_4444_SCAN(y); | 249 DITHER_4444_SCAN(y); |
| 243 | 250 |
| 244 for (int x = 0; x < width; x++) { | 251 for (int x = 0; x < width; x++) { |
| 245 dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[1], src[2], | 252 dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[1], src[2], |
| 246 DITHER_VALUE(x)); | 253 DITHER_VALUE(x)); |
| 247 src += deltaSrc; | 254 src += deltaSrc; |
| 248 } | 255 } |
| 249 return false; | 256 return false; |
| 250 } | 257 } |
| 251 | 258 |
| 252 static SkScaledBitmapSampler::RowProc get_RGBx_to_4444_proc(const SkImageDecoder
& decoder) { | 259 static SkScaledBitmapSampler::RowProc |
| 260 get_RGBx_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { |
| 253 // Skip zeroes and unpremul make no difference | 261 // Skip zeroes and unpremul make no difference |
| 254 if (decoder.getDitherImage()) { | 262 if (opts.fDither) { |
| 255 return Sample_RGBx_D4444_D; | 263 return Sample_RGBx_D4444_D; |
| 256 } | 264 } |
| 257 return Sample_RGBx_D4444; | 265 return Sample_RGBx_D4444; |
| 258 } | 266 } |
| 259 | 267 |
| 260 static bool Sample_RGBA_D4444(void* SK_RESTRICT dstRow, | 268 static bool Sample_RGBA_D4444(void* SK_RESTRICT dstRow, |
| 261 const uint8_t* SK_RESTRICT src, | 269 const uint8_t* SK_RESTRICT src, |
| 262 int width, int deltaSrc, int, const SkPMColor[]) { | 270 int width, int deltaSrc, int, const SkPMColor[]) { |
| 263 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; | 271 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; |
| 264 unsigned alphaMask = 0xFF; | 272 unsigned alphaMask = 0xFF; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 if (alpha != 0) { | 332 if (alpha != 0) { |
| 325 SkPMColor c = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); | 333 SkPMColor c = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); |
| 326 dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x)); | 334 dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x)); |
| 327 } | 335 } |
| 328 src += deltaSrc; | 336 src += deltaSrc; |
| 329 alphaMask &= alpha; | 337 alphaMask &= alpha; |
| 330 } | 338 } |
| 331 return alphaMask != 0xFF; | 339 return alphaMask != 0xFF; |
| 332 } | 340 } |
| 333 | 341 |
| 334 static SkScaledBitmapSampler::RowProc get_RGBA_to_4444_proc(const SkImageDecoder
& decoder) { | 342 static SkScaledBitmapSampler::RowProc |
| 335 if (decoder.getRequireUnpremultipliedColors()) { | 343 get_RGBA_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { |
| 344 if (!opts.fPremultiplyAlpha) { |
| 336 // Unpremultiplied is not supported for 4444 | 345 // Unpremultiplied is not supported for 4444 |
| 337 return NULL; | 346 return NULL; |
| 338 } | 347 } |
| 339 const bool dither = decoder.getDitherImage(); | 348 if (opts.fSkipZeros) { |
| 340 if (decoder.getSkipWritingZeroes()) { | 349 if (opts.fDither) { |
| 341 if (dither) { | |
| 342 return Sample_RGBA_D4444_D_SkipZ; | 350 return Sample_RGBA_D4444_D_SkipZ; |
| 343 } | 351 } |
| 344 return Sample_RGBA_D4444_SkipZ; | 352 return Sample_RGBA_D4444_SkipZ; |
| 345 } | 353 } |
| 346 if (dither) { | 354 if (opts.fDither) { |
| 347 return Sample_RGBA_D4444_D; | 355 return Sample_RGBA_D4444_D; |
| 348 } | 356 } |
| 349 return Sample_RGBA_D4444; | 357 return Sample_RGBA_D4444; |
| 350 } | 358 } |
| 351 | 359 |
| 352 // Index | 360 // Index |
| 353 | 361 |
| 354 #define A32_MASK_IN_PLACE (SkPMColor)(SK_A32_MASK << SK_A32_SHIFT) | 362 #define A32_MASK_IN_PLACE (SkPMColor)(SK_A32_MASK << SK_A32_SHIFT) |
| 355 | 363 |
| 356 static bool Sample_Index_D8888(void* SK_RESTRICT dstRow, | 364 static bool Sample_Index_D8888(void* SK_RESTRICT dstRow, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 379 SkPMColor c = ctable[*src]; | 387 SkPMColor c = ctable[*src]; |
| 380 cc &= c; | 388 cc &= c; |
| 381 if (c != 0) { | 389 if (c != 0) { |
| 382 dst[x] = c; | 390 dst[x] = c; |
| 383 } | 391 } |
| 384 src += deltaSrc; | 392 src += deltaSrc; |
| 385 } | 393 } |
| 386 return cc != A32_MASK_IN_PLACE; | 394 return cc != A32_MASK_IN_PLACE; |
| 387 } | 395 } |
| 388 | 396 |
| 389 static SkScaledBitmapSampler::RowProc get_index_to_8888_proc(const SkImageDecode
r& decoder) { | 397 static SkScaledBitmapSampler::RowProc |
| 390 if (decoder.getRequireUnpremultipliedColors()) { | 398 get_index_to_8888_proc(const SkScaledBitmapSampler::Options& opts) { |
| 399 if (!opts.fPremultiplyAlpha) { |
| 391 // Unpremultiplied is not supported for an index source. | 400 // Unpremultiplied is not supported for an index source. |
| 392 return NULL; | 401 return NULL; |
| 393 } | 402 } |
| 394 // Dither makes no difference | 403 // Dither makes no difference |
| 395 if (decoder.getSkipWritingZeroes()) { | 404 if (opts.fSkipZeros) { |
| 396 return Sample_Index_D8888_SkipZ; | 405 return Sample_Index_D8888_SkipZ; |
| 397 } | 406 } |
| 398 return Sample_Index_D8888; | 407 return Sample_Index_D8888; |
| 399 } | 408 } |
| 400 | 409 |
| 401 static bool Sample_Index_D565(void* SK_RESTRICT dstRow, | 410 static bool Sample_Index_D565(void* SK_RESTRICT dstRow, |
| 402 const uint8_t* SK_RESTRICT src, | 411 const uint8_t* SK_RESTRICT src, |
| 403 int width, int deltaSrc, int, const SkPMColor ctable[]) { | 412 int width, int deltaSrc, int, const SkPMColor ctable[]) { |
| 404 | 413 |
| 405 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 414 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 419 | 428 |
| 420 for (int x = 0; x < width; x++) { | 429 for (int x = 0; x < width; x++) { |
| 421 SkPMColor c = ctable[*src]; | 430 SkPMColor c = ctable[*src]; |
| 422 dst[x] = SkDitherRGBTo565(SkGetPackedR32(c), SkGetPackedG32(c), | 431 dst[x] = SkDitherRGBTo565(SkGetPackedR32(c), SkGetPackedG32(c), |
| 423 SkGetPackedB32(c), DITHER_VALUE(x)); | 432 SkGetPackedB32(c), DITHER_VALUE(x)); |
| 424 src += deltaSrc; | 433 src += deltaSrc; |
| 425 } | 434 } |
| 426 return false; | 435 return false; |
| 427 } | 436 } |
| 428 | 437 |
| 429 static SkScaledBitmapSampler::RowProc get_index_to_565_proc(const SkImageDecoder
& decoder) { | 438 static SkScaledBitmapSampler::RowProc |
| 439 get_index_to_565_proc(const SkScaledBitmapSampler::Options& opts) { |
| 430 // Unpremultiplied and skip zeroes make no difference | 440 // Unpremultiplied and skip zeroes make no difference |
| 431 if (decoder.getDitherImage()) { | 441 if (opts.fDither) { |
| 432 return Sample_Index_D565_D; | 442 return Sample_Index_D565_D; |
| 433 } | 443 } |
| 434 return Sample_Index_D565; | 444 return Sample_Index_D565; |
| 435 } | 445 } |
| 436 | 446 |
| 437 static bool Sample_Index_D4444(void* SK_RESTRICT dstRow, | 447 static bool Sample_Index_D4444(void* SK_RESTRICT dstRow, |
| 438 const uint8_t* SK_RESTRICT src, int width, | 448 const uint8_t* SK_RESTRICT src, int width, |
| 439 int deltaSrc, int y, const SkPMColor ctable[]) { | 449 int deltaSrc, int y, const SkPMColor ctable[]) { |
| 440 | 450 |
| 441 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; | 451 SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 SkPMColor c = ctable[*src]; | 505 SkPMColor c = ctable[*src]; |
| 496 cc &= c; | 506 cc &= c; |
| 497 if (c != 0) { | 507 if (c != 0) { |
| 498 dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x)); | 508 dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x)); |
| 499 } | 509 } |
| 500 src += deltaSrc; | 510 src += deltaSrc; |
| 501 } | 511 } |
| 502 return cc != A32_MASK_IN_PLACE; | 512 return cc != A32_MASK_IN_PLACE; |
| 503 } | 513 } |
| 504 | 514 |
| 505 static SkScaledBitmapSampler::RowProc get_index_to_4444_proc(const SkImageDecode
r& decoder) { | 515 static SkScaledBitmapSampler::RowProc |
| 516 get_index_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { |
| 506 // Unpremul not allowed | 517 // Unpremul not allowed |
| 507 if (decoder.getRequireUnpremultipliedColors()) { | 518 if (!opts.fPremultiplyAlpha) { |
| 508 return NULL; | 519 return NULL; |
| 509 } | 520 } |
| 510 const bool dither = decoder.getDitherImage(); | 521 if (opts.fSkipZeros) { |
| 511 if (decoder.getSkipWritingZeroes()) { | 522 if (opts.fDither) { |
| 512 if (dither) { | |
| 513 return Sample_Index_D4444_D_SkipZ; | 523 return Sample_Index_D4444_D_SkipZ; |
| 514 } | 524 } |
| 515 return Sample_Index_D4444_SkipZ; | 525 return Sample_Index_D4444_SkipZ; |
| 516 } | 526 } |
| 517 if (dither) { | 527 if (opts.fDither) { |
| 518 return Sample_Index_D4444_D; | 528 return Sample_Index_D4444_D; |
| 519 } | 529 } |
| 520 return Sample_Index_D4444; | 530 return Sample_Index_D4444; |
| 521 } | 531 } |
| 522 | 532 |
| 523 static bool Sample_Index_DI(void* SK_RESTRICT dstRow, | 533 static bool Sample_Index_DI(void* SK_RESTRICT dstRow, |
| 524 const uint8_t* SK_RESTRICT src, | 534 const uint8_t* SK_RESTRICT src, |
| 525 int width, int deltaSrc, int, const SkPMColor[]) { | 535 int width, int deltaSrc, int, const SkPMColor[]) { |
| 526 if (1 == deltaSrc) { | 536 if (1 == deltaSrc) { |
| 527 memcpy(dstRow, src, width); | 537 memcpy(dstRow, src, width); |
| 528 } else { | 538 } else { |
| 529 uint8_t* SK_RESTRICT dst = (uint8_t*)dstRow; | 539 uint8_t* SK_RESTRICT dst = (uint8_t*)dstRow; |
| 530 for (int x = 0; x < width; x++) { | 540 for (int x = 0; x < width; x++) { |
| 531 dst[x] = src[0]; | 541 dst[x] = src[0]; |
| 532 src += deltaSrc; | 542 src += deltaSrc; |
| 533 } | 543 } |
| 534 } | 544 } |
| 535 return false; | 545 return false; |
| 536 } | 546 } |
| 537 | 547 |
| 538 static SkScaledBitmapSampler::RowProc get_index_to_index_proc(const SkImageDecod
er& decoder) { | 548 static SkScaledBitmapSampler::RowProc |
| 549 get_index_to_index_proc(const SkScaledBitmapSampler::Options& opts) { |
| 539 // Unpremul not allowed | 550 // Unpremul not allowed |
| 540 if (decoder.getRequireUnpremultipliedColors()) { | 551 if (!opts.fPremultiplyAlpha) { |
| 541 return NULL; | 552 return NULL; |
| 542 } | 553 } |
| 543 // Ignore dither and skip zeroes | 554 // Ignore dither and skip zeroes |
| 544 return Sample_Index_DI; | 555 return Sample_Index_DI; |
| 545 } | 556 } |
| 546 | 557 |
| 547 // A8 | 558 // A8 |
| 548 static bool Sample_Gray_DA8(void* SK_RESTRICT dstRow, | 559 static bool Sample_Gray_DA8(void* SK_RESTRICT dstRow, |
| 549 const uint8_t* SK_RESTRICT src, | 560 const uint8_t* SK_RESTRICT src, |
| 550 int width, int deltaSrc, int, | 561 int width, int deltaSrc, int, |
| 551 const SkPMColor[]) { | 562 const SkPMColor[]) { |
| 552 // Sampling Gray to A8 uses the same function as Index to Index8, | 563 // Sampling Gray to A8 uses the same function as Index to Index8, |
| 553 // except we assume that there is alpha for speed, since an A8 | 564 // except we assume that there is alpha for speed, since an A8 |
| 554 // bitmap with no alpha is not interesting. | 565 // bitmap with no alpha is not interesting. |
| 555 (void) Sample_Index_DI(dstRow, src, width, deltaSrc, /* y unused */ 0, | 566 (void) Sample_Index_DI(dstRow, src, width, deltaSrc, /* y unused */ 0, |
| 556 /* ctable unused */ NULL); | 567 /* ctable unused */ NULL); |
| 557 return true; | 568 return true; |
| 558 } | 569 } |
| 559 | 570 |
| 560 static SkScaledBitmapSampler::RowProc get_gray_to_A8_proc(const SkImageDecoder&
decoder) { | 571 static SkScaledBitmapSampler::RowProc |
| 561 if (decoder.getRequireUnpremultipliedColors()) { | 572 get_gray_to_A8_proc(const SkScaledBitmapSampler::Options& opts) { |
| 573 if (!opts.fPremultiplyAlpha) { |
| 562 return NULL; | 574 return NULL; |
| 563 } | 575 } |
| 564 // Ignore skip and dither. | 576 // Ignore skip and dither. |
| 565 return Sample_Gray_DA8; | 577 return Sample_Gray_DA8; |
| 566 } | 578 } |
| 567 | 579 |
| 568 typedef SkScaledBitmapSampler::RowProc (*RowProcChooser)(const SkImageDecoder& d
ecoder); | 580 typedef SkScaledBitmapSampler::RowProc (*RowProcChooser)(const SkScaledBitmapSam
pler::Options&); |
| 569 /////////////////////////////////////////////////////////////////////////////// | 581 /////////////////////////////////////////////////////////////////////////////// |
| 570 | 582 |
| 571 #include "SkScaledBitmapSampler.h" | 583 #include "SkScaledBitmapSampler.h" |
| 572 | 584 |
| 573 SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, | 585 SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, |
| 574 int sampleSize) { | 586 int sampleSize) { |
| 575 fCTable = NULL; | 587 fCTable = NULL; |
| 576 fDstRow = NULL; | 588 fDstRow = NULL; |
| 577 fRowProc = NULL; | 589 fRowProc = NULL; |
| 578 | 590 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 606 SkASSERT(fY0 >= 0 && fY0 < height); | 618 SkASSERT(fY0 >= 0 && fY0 < height); |
| 607 | 619 |
| 608 fDX = dx; | 620 fDX = dx; |
| 609 fDY = dy; | 621 fDY = dy; |
| 610 | 622 |
| 611 SkASSERT(fDX > 0 && (fX0 + fDX * (fScaledWidth - 1)) < width); | 623 SkASSERT(fDX > 0 && (fX0 + fDX * (fScaledWidth - 1)) < width); |
| 612 SkASSERT(fDY > 0 && (fY0 + fDY * (fScaledHeight - 1)) < height); | 624 SkASSERT(fDY > 0 && (fY0 + fDY * (fScaledHeight - 1)) < height); |
| 613 } | 625 } |
| 614 | 626 |
| 615 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, | 627 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, |
| 616 const SkImageDecoder& decoder, | 628 const Options& opts, |
| 617 const SkPMColor ctable[]) { | 629 const SkPMColor ctable[]) { |
| 618 static const RowProcChooser gProcChoosers[] = { | 630 static const RowProcChooser gProcChoosers[] = { |
| 619 get_gray_to_8888_proc, | 631 get_gray_to_8888_proc, |
| 620 get_RGBx_to_8888_proc, | 632 get_RGBx_to_8888_proc, |
| 621 get_RGBA_to_8888_proc, | 633 get_RGBA_to_8888_proc, |
| 622 get_index_to_8888_proc, | 634 get_index_to_8888_proc, |
| 623 NULL, // 565 to 8888 | 635 NULL, // 565 to 8888 |
| 624 | 636 |
| 625 get_gray_to_565_proc, | 637 get_gray_to_565_proc, |
| 626 get_RGBx_to_565_proc, | 638 get_RGBx_to_565_proc, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 index += 4 * gProcDstConfigSpan; | 713 index += 4 * gProcDstConfigSpan; |
| 702 break; | 714 break; |
| 703 default: | 715 default: |
| 704 return false; | 716 return false; |
| 705 } | 717 } |
| 706 | 718 |
| 707 RowProcChooser chooser = gProcChoosers[index]; | 719 RowProcChooser chooser = gProcChoosers[index]; |
| 708 if (NULL == chooser) { | 720 if (NULL == chooser) { |
| 709 fRowProc = NULL; | 721 fRowProc = NULL; |
| 710 } else { | 722 } else { |
| 711 fRowProc = chooser(decoder); | 723 fRowProc = chooser(opts); |
| 712 } | 724 } |
| 713 fDstRow = (char*)dst->getPixels(); | 725 fDstRow = (char*)dst->getPixels(); |
| 714 fDstRowBytes = dst->rowBytes(); | 726 fDstRowBytes = dst->rowBytes(); |
| 715 fCurrY = 0; | 727 fCurrY = 0; |
| 716 return fRowProc != NULL; | 728 return fRowProc != NULL; |
| 717 } | 729 } |
| 718 | 730 |
| 731 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, |
| 732 const SkImageDecoder& decoder, |
| 733 const SkPMColor ctable[]) { |
| 734 return this->begin(dst, sc, Options(decoder), ctable); |
| 735 } |
| 736 |
| 719 bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { | 737 bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { |
| 720 SkASSERT(kInterlaced_SampleMode != fSampleMode); | 738 SkASSERT(kInterlaced_SampleMode != fSampleMode); |
| 721 SkDEBUGCODE(fSampleMode = kConsecutive_SampleMode); | 739 SkDEBUGCODE(fSampleMode = kConsecutive_SampleMode); |
| 722 SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight); | 740 SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight); |
| 723 | 741 |
| 724 bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth, | 742 bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth, |
| 725 fDX * fSrcPixelSize, fCurrY, fCTable); | 743 fDX * fSrcPixelSize, fCurrY, fCTable); |
| 726 fDstRow += fDstRowBytes; | 744 fDstRow += fDstRowBytes; |
| 727 fCurrY += 1; | 745 fCurrY += 1; |
| 728 return hadAlpha; | 746 return hadAlpha; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 SkScaledBitmapSampler::RowProc actual = RowProcTester::getRo
wProc(sampler); | 861 SkScaledBitmapSampler::RowProc actual = RowProcTester::getRo
wProc(sampler); |
| 844 SkASSERT(expected == actual); | 862 SkASSERT(expected == actual); |
| 845 procCounter++; | 863 procCounter++; |
| 846 } | 864 } |
| 847 } | 865 } |
| 848 } | 866 } |
| 849 } | 867 } |
| 850 SkASSERT(SK_ARRAY_COUNT(gTestProcs) == procCounter); | 868 SkASSERT(SK_ARRAY_COUNT(gTestProcs) == procCounter); |
| 851 } | 869 } |
| 852 #endif // SK_DEBUG | 870 #endif // SK_DEBUG |
| OLD | NEW |