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 "SkOpts.h" | 10 #include "SkOpts.h" |
| 11 #include "SkSwizzler.h" | 11 #include "SkSwizzler.h" |
| 12 #include "SkTemplates.h" | 12 #include "SkTemplates.h" |
| 13 | 13 |
| 14 static void copy(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc , int offset, | 14 static void noop(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc , int offset, |
|
msarett
2016/02/05 20:48:18
This is broken as is.
It works for PNG, but I woul
| |
| 15 const SkPMColor ctable[]) { | 15 const SkPMColor ctable[]) { |
| 16 // This function must not be called if we are sampling. If we are not | 16 // This function must not be called if we are sampling. If we are not |
| 17 // sampling, deltaSrc should equal bpp. | 17 // sampling, deltaSrc should equal bpp. |
| 18 SkASSERT(deltaSrc == bpp); | 18 SkASSERT(deltaSrc == bpp); |
| 19 | |
| 20 memcpy(dst, src + offset, width * bpp); | |
| 21 } | 19 } |
| 22 | 20 |
| 23 static void sample1(void* dst, const uint8_t* src, int width, int bpp, int delta Src, int offset, | 21 static void sample1(void* dst, const uint8_t* src, int width, int bpp, int delta Src, int offset, |
| 24 const SkPMColor ctable[]) { | 22 const SkPMColor ctable[]) { |
| 25 src += offset; | 23 src += offset; |
| 26 uint8_t* dst8 = (uint8_t*) dst; | 24 uint8_t* dst8 = (uint8_t*) dst; |
| 27 for (int x = 0; x < width; x++) { | 25 for (int x = 0; x < width; x++) { |
| 28 dst8[x] = *src; | 26 dst8[x] = *src; |
| 29 src += deltaSrc; | 27 src += deltaSrc; |
| 30 } | 28 } |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set, | 391 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set, |
| 394 const SkPMColor ctable[]) { | 392 const SkPMColor ctable[]) { |
| 395 | 393 |
| 396 // This function must not be called if we are sampling. If we are not | 394 // This function must not be called if we are sampling. If we are not |
| 397 // sampling, deltaSrc should equal bpp. | 395 // sampling, deltaSrc should equal bpp. |
| 398 SkASSERT(deltaSrc == bpp); | 396 SkASSERT(deltaSrc == bpp); |
| 399 | 397 |
| 400 #ifdef SK_PMCOLOR_IS_RGBA | 398 #ifdef SK_PMCOLOR_IS_RGBA |
| 401 SkOpts::RGBA_to_BGRA((uint32_t*) dst, src + offset, width); | 399 SkOpts::RGBA_to_BGRA((uint32_t*) dst, src + offset, width); |
| 402 #else | 400 #else |
| 403 memcpy(dst, src + offset, width * bpp); | 401 // Nothing needs to be done here. |
| 404 #endif | 402 #endif |
| 405 } | 403 } |
| 406 | 404 |
| 407 static void swizzle_bgra_to_n32_premul( | 405 static void swizzle_bgra_to_n32_premul( |
| 408 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 406 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 409 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 407 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 410 | 408 |
| 411 src += offset; | 409 src += offset; |
| 412 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 410 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 413 for (int x = 0; x < dstWidth; x++) { | 411 for (int x = 0; x < dstWidth; x++) { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 518 | 516 |
| 519 static void fast_swizzle_rgba_to_n32_unpremul( | 517 static void fast_swizzle_rgba_to_n32_unpremul( |
| 520 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set, | 518 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set, |
| 521 const SkPMColor ctable[]) { | 519 const SkPMColor ctable[]) { |
| 522 | 520 |
| 523 // This function must not be called if we are sampling. If we are not | 521 // This function must not be called if we are sampling. If we are not |
| 524 // sampling, deltaSrc should equal bpp. | 522 // sampling, deltaSrc should equal bpp. |
| 525 SkASSERT(deltaSrc == bpp); | 523 SkASSERT(deltaSrc == bpp); |
| 526 | 524 |
| 527 #ifdef SK_PMCOLOR_IS_RGBA | 525 #ifdef SK_PMCOLOR_IS_RGBA |
| 528 memcpy(dst, src + offset, width * bpp); | 526 // Nothing needs to be done here. |
| 529 #else | 527 #else |
| 530 SkOpts::RGBA_to_BGRA((uint32_t*) dst, src + offset, width); | 528 SkOpts::RGBA_to_BGRA((uint32_t*) dst, src + offset, width); |
| 531 #endif | 529 #endif |
| 532 } | 530 } |
| 533 | 531 |
| 534 // kCMYK | 532 // kCMYK |
| 535 // | 533 // |
| 536 // CMYK is stored as four bytes per pixel. | 534 // CMYK is stored as four bytes per pixel. |
| 537 // | 535 // |
| 538 // We will implement a crude conversion from CMYK -> RGB using formulas | 536 // We will implement a crude conversion from CMYK -> RGB using formulas |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 707 } else { | 705 } else { |
| 708 proc = &swizzle_index_to_n32; | 706 proc = &swizzle_index_to_n32; |
| 709 break; | 707 break; |
| 710 } | 708 } |
| 711 break; | 709 break; |
| 712 case kRGB_565_SkColorType: | 710 case kRGB_565_SkColorType: |
| 713 proc = &swizzle_index_to_565; | 711 proc = &swizzle_index_to_565; |
| 714 break; | 712 break; |
| 715 case kIndex_8_SkColorType: | 713 case kIndex_8_SkColorType: |
| 716 proc = &sample1; | 714 proc = &sample1; |
| 717 fastProc = © | 715 fastProc = &noop; |
| 718 break; | 716 break; |
| 719 default: | 717 default: |
| 720 break; | 718 break; |
| 721 } | 719 } |
| 722 break; | 720 break; |
| 723 case kGray: | 721 case kGray: |
| 724 switch (dstInfo.colorType()) { | 722 switch (dstInfo.colorType()) { |
| 725 case kN32_SkColorType: | 723 case kN32_SkColorType: |
| 726 proc = &swizzle_gray_to_n32; | 724 proc = &swizzle_gray_to_n32; |
| 727 fastProc = &fast_swizzle_gray_to_n32; | 725 fastProc = &fast_swizzle_gray_to_n32; |
| 728 break; | 726 break; |
| 729 case kGray_8_SkColorType: | 727 case kGray_8_SkColorType: |
| 730 proc = &sample1; | 728 proc = &sample1; |
| 731 fastProc = © | 729 fastProc = &noop; |
| 732 break; | 730 break; |
| 733 case kRGB_565_SkColorType: | 731 case kRGB_565_SkColorType: |
| 734 proc = &swizzle_gray_to_565; | 732 proc = &swizzle_gray_to_565; |
| 735 break; | 733 break; |
| 736 default: | 734 default: |
| 737 break; | 735 break; |
| 738 } | 736 } |
| 739 break; | 737 break; |
| 740 case kGrayAlpha: | 738 case kGrayAlpha: |
| 741 switch (dstInfo.colorType()) { | 739 switch (dstInfo.colorType()) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 847 break; | 845 break; |
| 848 case kRGB_565_SkColorType: | 846 case kRGB_565_SkColorType: |
| 849 proc = &swizzle_cmyk_to_565; | 847 proc = &swizzle_cmyk_to_565; |
| 850 break; | 848 break; |
| 851 default: | 849 default: |
| 852 break; | 850 break; |
| 853 } | 851 } |
| 854 break; | 852 break; |
| 855 case kNoOp8: | 853 case kNoOp8: |
| 856 proc = &sample1; | 854 proc = &sample1; |
| 857 fastProc = © | 855 fastProc = &noop; |
| 858 break; | 856 break; |
| 859 case kNoOp16: | 857 case kNoOp16: |
| 860 proc = sample2; | 858 proc = sample2; |
| 861 fastProc = © | 859 fastProc = &noop; |
| 862 break; | 860 break; |
| 863 case kNoOp32: | 861 case kNoOp32: |
| 864 proc = &sample4; | 862 proc = &sample4; |
| 865 fastProc = © | 863 fastProc = &noop; |
| 866 break; | 864 break; |
| 867 default: | 865 default: |
| 868 break; | 866 break; |
| 869 } | 867 } |
| 870 | 868 |
| 871 // Store bpp in bytes if it is an even multiple, otherwise use bits | 869 // Store bpp in bytes if it is an even multiple, otherwise use bits |
| 872 int srcBPP = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPixel (sc); | 870 int srcBPP = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPixel (sc); |
| 873 int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType()); | 871 int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType()); |
| 874 | 872 |
| 875 int srcOffset = 0; | 873 int srcOffset = 0; |
| 876 int srcWidth = dstInfo.width(); | 874 int srcWidth = dstInfo.width(); |
| 877 int dstOffset = 0; | 875 int dstOffset = 0; |
| 878 int dstWidth = srcWidth; | 876 int dstWidth = srcWidth; |
| 879 if (options.fSubset) { | 877 if (options.fSubset) { |
| 880 // We do not currently support subset decodes for image types that may h ave | 878 // We do not currently support subset decodes for image types that may h ave |
| 881 // frames (gif). | 879 // frames (gif). |
| 882 SkASSERT(!frame); | 880 SkASSERT(!frame); |
| 883 srcOffset = options.fSubset->left(); | 881 srcOffset = options.fSubset->left(); |
| 884 srcWidth = options.fSubset->width(); | 882 srcWidth = options.fSubset->width(); |
| 885 dstWidth = srcWidth; | 883 dstWidth = srcWidth; |
| 884 fastProc = nullptr; | |
|
msarett
2016/02/05 20:48:18
Problem:
We need the swizzler to do a copy for us
| |
| 886 } else if (frame) { | 885 } else if (frame) { |
| 887 dstOffset = frame->left(); | 886 dstOffset = frame->left(); |
| 888 srcWidth = frame->width(); | 887 srcWidth = frame->width(); |
| 889 } | 888 } |
| 890 | 889 |
| 891 return new SkSwizzler(fastProc, proc, ctable, srcOffset, srcWidth, dstOffset , dstWidth, | 890 return new SkSwizzler(fastProc, proc, ctable, srcOffset, srcWidth, dstOffset , dstWidth, |
| 892 srcBPP, dstBPP); | 891 srcBPP, dstBPP); |
| 893 } | 892 } |
| 894 | 893 |
| 895 SkSwizzler::SkSwizzler(RowProc fastProc, RowProc proc, const SkPMColor* ctable, int srcOffset, | 894 SkSwizzler::SkSwizzler(RowProc fastProc, RowProc proc, const SkPMColor* ctable, int srcOffset, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 928 } | 927 } |
| 929 | 928 |
| 930 return fAllocatedWidth; | 929 return fAllocatedWidth; |
| 931 } | 930 } |
| 932 | 931 |
| 933 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { | 932 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { |
| 934 SkASSERT(nullptr != dst && nullptr != src); | 933 SkASSERT(nullptr != dst && nullptr != src); |
| 935 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS rcBPP, | 934 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS rcBPP, |
| 936 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); | 935 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); |
| 937 } | 936 } |
| OLD | NEW |