| OLD | NEW |
| 1 | |
| 2 /* | 1 /* |
| 3 * Copyright 2007 The Android Open Source Project | 2 * Copyright 2007 The Android Open Source Project |
| 4 * | 3 * |
| 5 * 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 |
| 6 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 7 */ | 6 */ |
| 8 | 7 |
| 9 | 8 |
| 10 #include "SkScaledBitmapSampler.h" | 9 #include "SkScaledBitmapSampler.h" |
| 11 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
| 12 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
| 13 #include "SkDither.h" | 12 #include "SkDither.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; |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 } else { | 282 } else { |
| 283 uint8_t* SK_RESTRICT dst = (uint8_t*)dstRow; | 283 uint8_t* SK_RESTRICT dst = (uint8_t*)dstRow; |
| 284 for (int x = 0; x < width; x++) { | 284 for (int x = 0; x < width; x++) { |
| 285 dst[x] = src[0]; | 285 dst[x] = src[0]; |
| 286 src += deltaSrc; | 286 src += deltaSrc; |
| 287 } | 287 } |
| 288 } | 288 } |
| 289 return false; | 289 return false; |
| 290 } | 290 } |
| 291 | 291 |
| 292 // 8888 Unpremul |
| 293 |
| 294 static bool Sample_Gray_D8888_Unpremul(void* SK_RESTRICT dstRow, |
| 295 const uint8_t* SK_RESTRICT src, |
| 296 int width, int deltaSrc, int, |
| 297 const SkPMColor[]) { |
| 298 uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow); |
| 299 for (int x = 0; x < width; x++) { |
| 300 dst[x] = SkPackARGB32NoCheck(0xFF, src[0], src[0], src[0]); |
| 301 src += deltaSrc; |
| 302 } |
| 303 return false; |
| 304 } |
| 305 |
| 306 // Sample_RGBx_D8888_Unpremul is no different from Sample_RGBx_D8888, since alph
a |
| 307 // is 0xFF |
| 308 |
| 309 static bool Sample_RGBA_D8888_Unpremul(void* SK_RESTRICT dstRow, |
| 310 const uint8_t* SK_RESTRICT src, |
| 311 int width, int deltaSrc, int, |
| 312 const SkPMColor[]) { |
| 313 uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow); |
| 314 unsigned alphaMask = 0xFF; |
| 315 for (int x = 0; x < width; x++) { |
| 316 unsigned alpha = src[3]; |
| 317 dst[x] = SkPackARGB32NoCheck(alpha, src[0], src[1], src[2]); |
| 318 src += deltaSrc; |
| 319 alphaMask &= alpha; |
| 320 } |
| 321 return alphaMask != 0xFF; |
| 322 } |
| 323 |
| 324 // Sample_Index_D8888_Unpremul is the same as Sample_Index_D8888, since the |
| 325 // color table has its colors inserted unpremultiplied. |
| 326 |
| 292 /////////////////////////////////////////////////////////////////////////////// | 327 /////////////////////////////////////////////////////////////////////////////// |
| 293 | 328 |
| 294 #include "SkScaledBitmapSampler.h" | 329 #include "SkScaledBitmapSampler.h" |
| 295 | 330 |
| 296 SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, | 331 SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, |
| 297 int sampleSize) { | 332 int sampleSize) { |
| 298 fCTable = NULL; | 333 fCTable = NULL; |
| 299 fDstRow = NULL; | 334 fDstRow = NULL; |
| 300 fRowProc = NULL; | 335 fRowProc = NULL; |
| 301 | 336 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 327 SkASSERT(fY0 >= 0 && fY0 < height); | 362 SkASSERT(fY0 >= 0 && fY0 < height); |
| 328 | 363 |
| 329 fDX = dx; | 364 fDX = dx; |
| 330 fDY = dy; | 365 fDY = dy; |
| 331 | 366 |
| 332 SkASSERT(fDX > 0 && (fX0 + fDX * (fScaledWidth - 1)) < width); | 367 SkASSERT(fDX > 0 && (fX0 + fDX * (fScaledWidth - 1)) < width); |
| 333 SkASSERT(fDY > 0 && (fY0 + fDY * (fScaledHeight - 1)) < height); | 368 SkASSERT(fDY > 0 && (fY0 + fDY * (fScaledHeight - 1)) < height); |
| 334 } | 369 } |
| 335 | 370 |
| 336 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, bool dither, | 371 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, bool dither, |
| 337 const SkPMColor ctable[]) { | 372 const SkPMColor ctable[], |
| 373 bool requireUnpremul) { |
| 338 static const RowProc gProcs[] = { | 374 static const RowProc gProcs[] = { |
| 339 // 8888 (no dither distinction) | 375 // 8888 (no dither distinction) |
| 340 Sample_Gray_D8888, Sample_Gray_D8888, | 376 Sample_Gray_D8888, Sample_Gray_D8888, |
| 341 Sample_RGBx_D8888, Sample_RGBx_D8888, | 377 Sample_RGBx_D8888, Sample_RGBx_D8888, |
| 342 Sample_RGBA_D8888, Sample_RGBA_D8888, | 378 Sample_RGBA_D8888, Sample_RGBA_D8888, |
| 343 Sample_Index_D8888, Sample_Index_D8888, | 379 Sample_Index_D8888, Sample_Index_D8888, |
| 344 NULL, NULL, | 380 NULL, NULL, |
| 345 // 565 (no alpha distinction) | 381 // 565 (no alpha distinction) |
| 346 Sample_Gray_D565, Sample_Gray_D565_D, | 382 Sample_Gray_D565, Sample_Gray_D565_D, |
| 347 Sample_RGBx_D565, Sample_RGBx_D565_D, | 383 Sample_RGBx_D565, Sample_RGBx_D565_D, |
| 348 Sample_RGBx_D565, Sample_RGBx_D565_D, | 384 Sample_RGBx_D565, Sample_RGBx_D565_D, |
| 349 Sample_Index_D565, Sample_Index_D565_D, | 385 Sample_Index_D565, Sample_Index_D565_D, |
| 350 Sample_D565_D565, Sample_D565_D565, | 386 Sample_D565_D565, Sample_D565_D565, |
| 351 // 4444 | 387 // 4444 |
| 352 Sample_Gray_D4444, Sample_Gray_D4444_D, | 388 Sample_Gray_D4444, Sample_Gray_D4444_D, |
| 353 Sample_RGBx_D4444, Sample_RGBx_D4444_D, | 389 Sample_RGBx_D4444, Sample_RGBx_D4444_D, |
| 354 Sample_RGBA_D4444, Sample_RGBA_D4444_D, | 390 Sample_RGBA_D4444, Sample_RGBA_D4444_D, |
| 355 Sample_Index_D4444, Sample_Index_D4444_D, | 391 Sample_Index_D4444, Sample_Index_D4444_D, |
| 356 NULL, NULL, | 392 NULL, NULL, |
| 357 // Index8 | 393 // Index8 |
| 358 NULL, NULL, | 394 NULL, NULL, |
| 359 NULL, NULL, | 395 NULL, NULL, |
| 360 NULL, NULL, | 396 NULL, NULL, |
| 361 Sample_Index_DI, Sample_Index_DI, | 397 Sample_Index_DI, Sample_Index_DI, |
| 362 NULL, NULL, | 398 NULL, NULL, |
| 399 // 8888 Unpremul (no dither distinction) |
| 400 Sample_Gray_D8888_Unpremul, Sample_Gray_D8888_Unpremul, |
| 401 Sample_RGBx_D8888, Sample_RGBx_D8888, |
| 402 Sample_RGBA_D8888_Unpremul, Sample_RGBA_D8888_Unpremul, |
| 403 Sample_Index_D8888, Sample_Index_D8888, |
| 404 NULL, NULL, |
| 363 }; | 405 }; |
| 406 // The jump between dst configs in the table |
| 407 static const int gProcDstConfigSpan = 10; |
| 408 SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gProcs) == 5 * gProcDstConfigSpan, |
| 409 gProcs_has_the_wrong_number_of_entries); |
| 364 | 410 |
| 365 fCTable = ctable; | 411 fCTable = ctable; |
| 366 | 412 |
| 367 int index = 0; | 413 int index = 0; |
| 368 if (dither) { | 414 if (dither) { |
| 369 index += 1; | 415 index += 1; |
| 370 } | 416 } |
| 371 switch (sc) { | 417 switch (sc) { |
| 372 case SkScaledBitmapSampler::kGray: | 418 case SkScaledBitmapSampler::kGray: |
| 373 fSrcPixelSize = 1; | 419 fSrcPixelSize = 1; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 392 case SkScaledBitmapSampler::kRGB_565: | 438 case SkScaledBitmapSampler::kRGB_565: |
| 393 fSrcPixelSize = 2; | 439 fSrcPixelSize = 2; |
| 394 index += 8; | 440 index += 8; |
| 395 break; | 441 break; |
| 396 default: | 442 default: |
| 397 return false; | 443 return false; |
| 398 } | 444 } |
| 399 | 445 |
| 400 switch (dst->config()) { | 446 switch (dst->config()) { |
| 401 case SkBitmap::kARGB_8888_Config: | 447 case SkBitmap::kARGB_8888_Config: |
| 402 index += 0; | 448 index += 0 * gProcDstConfigSpan; |
| 403 break; | 449 break; |
| 404 case SkBitmap::kRGB_565_Config: | 450 case SkBitmap::kRGB_565_Config: |
| 405 index += 10; | 451 index += 1 * gProcDstConfigSpan; |
| 406 break; | 452 break; |
| 407 case SkBitmap::kARGB_4444_Config: | 453 case SkBitmap::kARGB_4444_Config: |
| 408 index += 20; | 454 index += 2 * gProcDstConfigSpan; |
| 409 break; | 455 break; |
| 410 case SkBitmap::kIndex8_Config: | 456 case SkBitmap::kIndex8_Config: |
| 411 index += 30; | 457 index += 3 * gProcDstConfigSpan; |
| 412 break; | 458 break; |
| 413 default: | 459 default: |
| 414 return false; | 460 return false; |
| 415 } | 461 } |
| 416 | 462 |
| 463 if (requireUnpremul) { |
| 464 if (dst->config() != SkBitmap::kARGB_8888_Config) { |
| 465 return false; |
| 466 } |
| 467 index += 4 * gProcDstConfigSpan; |
| 468 } |
| 469 |
| 417 fRowProc = gProcs[index]; | 470 fRowProc = gProcs[index]; |
| 418 fDstRow = (char*)dst->getPixels(); | 471 fDstRow = (char*)dst->getPixels(); |
| 419 fDstRowBytes = dst->rowBytes(); | 472 fDstRowBytes = dst->rowBytes(); |
| 420 fCurrY = 0; | 473 fCurrY = 0; |
| 421 return fRowProc != NULL; | 474 return fRowProc != NULL; |
| 422 } | 475 } |
| 423 | 476 |
| 424 bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { | 477 bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { |
| 425 SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight); | 478 SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight); |
| 426 | 479 |
| 427 bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth, | 480 bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth, |
| 428 fDX * fSrcPixelSize, fCurrY, fCTable); | 481 fDX * fSrcPixelSize, fCurrY, fCTable); |
| 429 fDstRow += fDstRowBytes; | 482 fDstRow += fDstRowBytes; |
| 430 fCurrY += 1; | 483 fCurrY += 1; |
| 431 return hadAlpha; | 484 return hadAlpha; |
| 432 } | 485 } |
| OLD | NEW |