| 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 "SkOpts.h" | 10 #include "SkOpts.h" |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 296 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 297 | 297 |
| 298 src += offset; | 298 src += offset; |
| 299 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 299 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 300 for (int x = 0; x < dstWidth; x++) { | 300 for (int x = 0; x < dstWidth; x++) { |
| 301 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); | 301 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); |
| 302 src += deltaSrc; | 302 src += deltaSrc; |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 | 305 |
| 306 static void fast_swizzle_bgrx_to_32( |
| 307 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off
set, |
| 308 const SkPMColor ctable[]) { |
| 309 |
| 310 // This function must not be called if we are sampling. If we are not |
| 311 // sampling, deltaSrc should equal bpp. |
| 312 SkASSERT(deltaSrc == bpp); |
| 313 |
| 314 // The default swizzle supports BGR->N32 and BGRX->N32. This only |
| 315 // supports BGRX->N32. |
| 316 SkASSERT(4 == bpp); |
| 317 |
| 318 // These swizzles trust that the alpha value is already 0xFF. |
| 319 #ifdef SK_PMCOLOR_IS_RGBA |
| 320 SkOpts::swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width
); |
| 321 #else |
| 322 memcpy(dst, src + offset, width * bpp); |
| 323 #endif |
| 324 } |
| 325 |
| 306 static void swizzle_bgrx_to_565( | 326 static void swizzle_bgrx_to_565( |
| 307 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 327 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 308 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 328 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 309 | 329 |
| 310 src += offset; | 330 src += offset; |
| 311 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 331 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 312 for (int x = 0; x < dstWidth; x++) { | 332 for (int x = 0; x < dstWidth; x++) { |
| 313 dst[x] = SkPack888ToRGB16(src[2], src[1], src[0]); | 333 dst[x] = SkPack888ToRGB16(src[2], src[1], src[0]); |
| 314 src += deltaSrc; | 334 src += deltaSrc; |
| 315 } | 335 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 336 | 356 |
| 337 src += offset; | 357 src += offset; |
| 338 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 358 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 339 for (int x = 0; x < dstWidth; x++) { | 359 for (int x = 0; x < dstWidth; x++) { |
| 340 uint8_t alpha = src[3]; | 360 uint8_t alpha = src[3]; |
| 341 dst[x] = SkPremultiplyARGBInline(alpha, src[2], src[1], src[0]); | 361 dst[x] = SkPremultiplyARGBInline(alpha, src[2], src[1], src[0]); |
| 342 src += deltaSrc; | 362 src += deltaSrc; |
| 343 } | 363 } |
| 344 } | 364 } |
| 345 | 365 |
| 366 static void fast_swizzle_bgra_to_n32_premul( |
| 367 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off
set, |
| 368 const SkPMColor ctable[]) { |
| 369 |
| 370 // This function must not be called if we are sampling. If we are not |
| 371 // sampling, deltaSrc should equal bpp. |
| 372 SkASSERT(deltaSrc == bpp); |
| 373 |
| 374 #ifdef SK_PMCOLOR_IS_RGBA |
| 375 SkOpts::premul_swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset)
, width); |
| 376 #else |
| 377 SkOpts::premul_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width
); |
| 378 #endif |
| 379 } |
| 380 |
| 346 // kRGBX | 381 // kRGBX |
| 382 |
| 347 static void swizzle_rgbx_to_n32( | 383 static void swizzle_rgbx_to_n32( |
| 348 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 384 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 349 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 385 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 350 | 386 |
| 351 src += offset; | 387 src += offset; |
| 352 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 388 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 353 for (int x = 0; x < dstWidth; x++) { | 389 for (int x = 0; x < dstWidth; x++) { |
| 354 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); | 390 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); |
| 355 src += deltaSrc; | 391 src += deltaSrc; |
| 356 } | 392 } |
| 357 } | 393 } |
| 358 | 394 |
| 395 static void fast_swizzle_rgbx_to_32( |
| 396 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off
set, |
| 397 const SkPMColor ctable[]) { |
| 398 |
| 399 // This function must not be called if we are sampling. If we are not |
| 400 // sampling, deltaSrc should equal bpp. |
| 401 SkASSERT(deltaSrc == bpp); |
| 402 |
| 403 // The default swizzle supports RGB->N32 and RGBX->N32. This only |
| 404 // supports RGBX->N32. |
| 405 SkASSERT(4 == bpp); |
| 406 |
| 407 // These swizzles trust that the alpha value is already 0xFF. |
| 408 #ifdef SK_PMCOLOR_IS_RGBA |
| 409 memcpy(dst, src + offset, width * bpp); |
| 410 #else |
| 411 SkOpts::swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width
); |
| 412 #endif |
| 413 } |
| 414 |
| 359 static void swizzle_rgbx_to_565( | 415 static void swizzle_rgbx_to_565( |
| 360 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 416 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 361 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { | 417 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 362 | 418 |
| 363 src += offset; | 419 src += offset; |
| 364 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 420 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 365 for (int x = 0; x < dstWidth; x++) { | 421 for (int x = 0; x < dstWidth; x++) { |
| 366 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); | 422 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); |
| 367 src += deltaSrc; | 423 src += deltaSrc; |
| 368 } | 424 } |
| 369 } | 425 } |
| 370 | 426 |
| 371 // kRGBA | 427 // kRGBA |
| 428 |
| 372 static void swizzle_rgba_to_n32_premul( | 429 static void swizzle_rgba_to_n32_premul( |
| 373 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 430 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 374 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 431 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 375 | 432 |
| 376 src += offset; | 433 src += offset; |
| 377 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 434 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 378 for (int x = 0; x < dstWidth; x++) { | 435 for (int x = 0; x < dstWidth; x++) { |
| 379 unsigned alpha = src[3]; | 436 unsigned alpha = src[3]; |
| 380 dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]); | 437 dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]); |
| 381 src += deltaSrc; | 438 src += deltaSrc; |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 case kRGB_565_SkColorType: | 660 case kRGB_565_SkColorType: |
| 604 proc = &swizzle_bgrx_to_565; | 661 proc = &swizzle_bgrx_to_565; |
| 605 break; | 662 break; |
| 606 default: | 663 default: |
| 607 break; | 664 break; |
| 608 } | 665 } |
| 609 break; | 666 break; |
| 610 case kBGRA: | 667 case kBGRA: |
| 611 switch (dstInfo.colorType()) { | 668 switch (dstInfo.colorType()) { |
| 612 case kN32_SkColorType: | 669 case kN32_SkColorType: |
| 613 switch (dstInfo.alphaType()) { | 670 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| 614 case kUnpremul_SkAlphaType: | 671 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| 672 proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32
_unpremul>; |
| 673 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bg
rx_to_32>; |
| 674 } else { |
| 615 proc = &swizzle_bgra_to_n32_unpremul; | 675 proc = &swizzle_bgra_to_n32_unpremul; |
| 616 break; | 676 fastProc = &fast_swizzle_bgrx_to_32; |
| 617 case kPremul_SkAlphaType: | 677 } |
| 678 } else { |
| 679 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| 680 proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32
_premul>; |
| 681 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bg
ra_to_n32_premul>; |
| 682 } else { |
| 618 proc = &swizzle_bgra_to_n32_premul; | 683 proc = &swizzle_bgra_to_n32_premul; |
| 619 break; | 684 fastProc = &fast_swizzle_bgra_to_n32_premul; |
| 620 default: | 685 } |
| 621 break; | |
| 622 } | 686 } |
| 623 break; | 687 break; |
| 624 default: | 688 default: |
| 625 break; | 689 break; |
| 626 } | 690 } |
| 627 break; | 691 break; |
| 628 case kRGBX: | 692 case kRGBX: |
| 629 switch (dstInfo.colorType()) { | 693 switch (dstInfo.colorType()) { |
| 630 case kN32_SkColorType: | 694 case kN32_SkColorType: |
| 631 proc = &swizzle_rgbx_to_n32; | 695 proc = &swizzle_rgbx_to_n32; |
| 696 fastProc = &fast_swizzle_rgbx_to_32; |
| 632 break; | 697 break; |
| 633 case kRGB_565_SkColorType: | 698 case kRGB_565_SkColorType: |
| 634 proc = &swizzle_rgbx_to_565; | 699 proc = &swizzle_rgbx_to_565; |
| 635 default: | 700 default: |
| 636 break; | 701 break; |
| 637 } | 702 } |
| 638 break; | 703 break; |
| 639 case kRGBA: | 704 case kRGBA: |
| 640 switch (dstInfo.colorType()) { | 705 switch (dstInfo.colorType()) { |
| 641 case kN32_SkColorType: | 706 case kN32_SkColorType: |
| 642 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { | 707 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| 643 if (SkCodec::kYes_ZeroInitialized == zeroInit) { | 708 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| 644 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32
_unpremul>; | 709 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32
_unpremul>; |
| 710 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rg
bx_to_32>; |
| 645 } else { | 711 } else { |
| 646 proc = &swizzle_rgba_to_n32_unpremul; | 712 proc = &swizzle_rgba_to_n32_unpremul; |
| 713 fastProc = &fast_swizzle_rgbx_to_32; |
| 647 } | 714 } |
| 648 } else { | 715 } else { |
| 649 if (SkCodec::kYes_ZeroInitialized == zeroInit) { | 716 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| 650 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32
_premul>; | 717 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32
_premul>; |
| 651 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rg
ba_to_n32_premul>; | 718 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rg
ba_to_n32_premul>; |
| 652 } else { | 719 } else { |
| 653 proc = &swizzle_rgba_to_n32_premul; | 720 proc = &swizzle_rgba_to_n32_premul; |
| 654 fastProc = &fast_swizzle_rgba_to_n32_premul; | 721 fastProc = &fast_swizzle_rgba_to_n32_premul; |
| 655 } | 722 } |
| 656 } | 723 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 749 | 816 |
| 750 return fAllocatedWidth; | 817 return fAllocatedWidth; |
| 751 } | 818 } |
| 752 | 819 |
| 753 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { | 820 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { |
| 754 SkASSERT(nullptr != dst && nullptr != src); | 821 SkASSERT(nullptr != dst && nullptr != src); |
| 755 RowProc proc = fFastProc ? fFastProc : fProc; | 822 RowProc proc = fFastProc ? fFastProc : fProc; |
| 756 proc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fSrcBPP, | 823 proc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fSrcBPP, |
| 757 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); | 824 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); |
| 758 } | 825 } |
| OLD | NEW |