Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(406)

Side by Side Diff: src/codec/SkSwizzler.cpp

Issue 1911613002: Use SkEncodedInfo in place of SkSwizzler::SrcConfig (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Remove bytesPerPixel() from public API Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 22 matching lines...) Expand all
33 static void sample2(void* dst, const uint8_t* src, int width, int bpp, int delta Src, int offset, 33 static void sample2(void* dst, const uint8_t* src, int width, int bpp, int delta Src, int offset,
34 const SkPMColor ctable[]) { 34 const SkPMColor ctable[]) {
35 src += offset; 35 src += offset;
36 uint16_t* dst16 = (uint16_t*) dst; 36 uint16_t* dst16 = (uint16_t*) dst;
37 for (int x = 0; x < width; x++) { 37 for (int x = 0; x < width; x++) {
38 dst16[x] = *((const uint16_t*) src); 38 dst16[x] = *((const uint16_t*) src);
39 src += deltaSrc; 39 src += deltaSrc;
40 } 40 }
41 } 41 }
42 42
43 static void sample4(void* dst, const uint8_t* src, int width, int bpp, int delta Src, int offset,
44 const SkPMColor ctable[]) {
45 src += offset;
46 uint32_t* dst32 = (uint32_t*) dst;
47 for (int x = 0; x < width; x++) {
48 dst32[x] = *((const uint32_t*) src);
49 src += deltaSrc;
50 }
51 }
52
53 // kBit 43 // kBit
54 // These routines exclusively choose between white and black 44 // These routines exclusively choose between white and black
55 45
56 #define GRAYSCALE_BLACK 0 46 #define GRAYSCALE_BLACK 0
57 #define GRAYSCALE_WHITE 0xFF 47 #define GRAYSCALE_WHITE 0xFF
58 48
59 49
60 // same as swizzle_bit_to_index and swizzle_bit_to_n32 except for value assigned to dst[x] 50 // same as swizzle_bit_to_index and swizzle_bit_to_n32 except for value assigned to dst[x]
61 static void swizzle_bit_to_grayscale( 51 static void swizzle_bit_to_grayscale(
62 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 52 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 // This may miss opportunities to skip when the output is premultiplied, 644 // This may miss opportunities to skip when the output is premultiplied,
655 // e.g. for a src pixel 0x00FFFFFF which is not zero but becomes zero after premultiplication. 645 // e.g. for a src pixel 0x00FFFFFF which is not zero but becomes zero after premultiplication.
656 while (dstWidth > 0 && *src32 == 0x00000000) { 646 while (dstWidth > 0 && *src32 == 0x00000000) {
657 dstWidth--; 647 dstWidth--;
658 dst32++; 648 dst32++;
659 src32 += deltaSrc/4; 649 src32 += deltaSrc/4;
660 } 650 }
661 proc(dst32, (const uint8_t*)src32, dstWidth, bpp, deltaSrc, 0, ctable); 651 proc(dst32, (const uint8_t*)src32, dstWidth, bpp, deltaSrc, 0, ctable);
662 } 652 }
663 653
664 SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, 654 SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo,
665 const SkPMColor* ctable, 655 const SkPMColor* ctable,
666 const SkImageInfo& dstInfo, 656 const SkImageInfo& dstInfo,
667 const SkCodec::Options& options, 657 const SkCodec::Options& options,
668 const SkIRect* frame) { 658 const SkIRect* frame) {
669 if (dstInfo.colorType() == kUnknown_SkColorType || kUnknown == sc) { 659 if (SkEncodedInfo::kPalette_Color == encodedInfo.color() && nullptr == ctabl e) {
670 return nullptr; 660 return nullptr;
671 } 661 }
672 if ((kIndex == sc || kIndex4 == sc || kIndex2 == sc || kIndex1 == sc) 662
673 && nullptr == ctable) {
674 return nullptr;
675 }
676 RowProc fastProc = nullptr; 663 RowProc fastProc = nullptr;
677 RowProc proc = nullptr; 664 RowProc proc = nullptr;
678 SkCodec::ZeroInitialized zeroInit = options.fZeroInitialized; 665 SkCodec::ZeroInitialized zeroInit = options.fZeroInitialized;
679 switch (sc) { 666 bool premultiply = (SkEncodedInfo::kOpaque_Alpha != encodedInfo.alpha()) &&
scroggo 2016/04/21 15:09:11 nit: could be const?
msarett 2016/04/21 16:03:41 Done.
680 case kBit: 667 (kPremul_SkAlphaType == dstInfo.alphaType());
668 switch (encodedInfo.color()) {
669 case SkEncodedInfo::kGray_Color:
670 switch (encodedInfo.bitsPerComponent()) {
671 case 1:
672 switch (dstInfo.colorType()) {
673 case kN32_SkColorType:
674 proc = &swizzle_bit_to_n32;
675 break;
676 case kIndex_8_SkColorType:
677 proc = &swizzle_bit_to_index;
678 break;
679 case kRGB_565_SkColorType:
680 proc = &swizzle_bit_to_565;
681 break;
682 case kGray_8_SkColorType:
683 proc = &swizzle_bit_to_grayscale;
684 break;
685 default:
686 return nullptr;
687 }
688 break;
689 case 8:
690 switch (dstInfo.colorType()) {
691 case kN32_SkColorType:
692 proc = &swizzle_gray_to_n32;
693 fastProc = &fast_swizzle_gray_to_n32;
694 break;
695 case kGray_8_SkColorType:
696 proc = &sample1;
697 fastProc = &copy;
698 break;
699 case kRGB_565_SkColorType:
700 proc = &swizzle_gray_to_565;
701 break;
702 default:
703 return nullptr;
704 }
705 break;
706 default:
707 return nullptr;
708 }
709 break;
710 case SkEncodedInfo::kGrayAlpha_Color:
681 switch (dstInfo.colorType()) { 711 switch (dstInfo.colorType()) {
682 case kN32_SkColorType: 712 case kN32_SkColorType:
683 proc = &swizzle_bit_to_n32; 713 if (premultiply) {
684 break; 714 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
685 case kIndex_8_SkColorType: 715 proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayal pha_to_n32_premul>;
686 proc = &swizzle_bit_to_index; 716 fastProc = &SkipLeadingGrayAlphaZerosThen
687 break; 717 <fast_swizzle_grayalpha_to_n32_premul>;
688 case kRGB_565_SkColorType: 718 } else {
689 proc = &swizzle_bit_to_565; 719 proc = &swizzle_grayalpha_to_n32_premul;
690 break; 720 fastProc = &fast_swizzle_grayalpha_to_n32_premul;
691 case kGray_8_SkColorType: 721 }
692 proc = &swizzle_bit_to_grayscale;
693 break;
694 default:
695 break;
696 }
697 break;
698 case kIndex1:
699 case kIndex2:
700 case kIndex4:
701 switch (dstInfo.colorType()) {
702 case kN32_SkColorType:
703 proc = &swizzle_small_index_to_n32;
704 break;
705 case kRGB_565_SkColorType:
706 proc = &swizzle_small_index_to_565;
707 break;
708 case kIndex_8_SkColorType:
709 proc = &swizzle_small_index_to_index;
710 break;
711 default:
712 break;
713 }
714 break;
715 case kIndex:
716 switch (dstInfo.colorType()) {
717 case kN32_SkColorType:
718 // We assume the color premultiplied ctable (or not) as desi red.
719 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
720 proc = &swizzle_index_to_n32_skipZ;
721 break;
722 } else { 722 } else {
723 proc = &swizzle_index_to_n32;
724 break;
725 }
726 break;
727 case kRGB_565_SkColorType:
728 proc = &swizzle_index_to_565;
729 break;
730 case kIndex_8_SkColorType:
731 proc = &sample1;
732 fastProc = &copy;
733 break;
734 default:
735 break;
736 }
737 break;
738 case kGray:
739 switch (dstInfo.colorType()) {
740 case kN32_SkColorType:
741 proc = &swizzle_gray_to_n32;
742 fastProc = &fast_swizzle_gray_to_n32;
743 break;
744 case kGray_8_SkColorType:
745 proc = &sample1;
746 fastProc = &copy;
747 break;
748 case kRGB_565_SkColorType:
749 proc = &swizzle_gray_to_565;
750 break;
751 default:
752 break;
753 }
754 break;
755 case kGrayAlpha:
756 switch (dstInfo.colorType()) {
757 case kN32_SkColorType:
758 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) {
759 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 723 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
760 proc = &SkipLeadingGrayAlphaZerosThen 724 proc = &SkipLeadingGrayAlphaZerosThen
761 <swizzle_grayalpha_to_n32_unpremul>; 725 <swizzle_grayalpha_to_n32_unpremul>;
762 fastProc = &SkipLeadingGrayAlphaZerosThen 726 fastProc = &SkipLeadingGrayAlphaZerosThen
763 <fast_swizzle_grayalpha_to_n32_unpremul>; 727 <fast_swizzle_grayalpha_to_n32_unpremul>;
764 } else { 728 } else {
765 proc = &swizzle_grayalpha_to_n32_unpremul; 729 proc = &swizzle_grayalpha_to_n32_unpremul;
766 fastProc = &fast_swizzle_grayalpha_to_n32_unpremul; 730 fastProc = &fast_swizzle_grayalpha_to_n32_unpremul;
767 } 731 }
732 }
733 break;
734 default:
735 return nullptr;
736 }
737 break;
738 case SkEncodedInfo::kPalette_Color:
739 // We assumes that the color table is premultiplied and swizzled
scroggo 2016/04/21 15:09:11 assume*
msarett 2016/04/21 16:03:41 Done.
740 // as desired.
741 switch (encodedInfo.bitsPerComponent()) {
742 case 1:
743 case 2:
744 case 4:
745 switch (dstInfo.colorType()) {
746 case kN32_SkColorType:
747 proc = &swizzle_small_index_to_n32;
748 break;
749 case kRGB_565_SkColorType:
750 proc = &swizzle_small_index_to_565;
751 break;
752 case kIndex_8_SkColorType:
753 proc = &swizzle_small_index_to_index;
754 break;
755 default:
756 return nullptr;
757 }
758 break;
759 case 8:
760 switch (dstInfo.colorType()) {
761 case kN32_SkColorType:
762 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
763 proc = &swizzle_index_to_n32_skipZ;
764 } else {
765 proc = &swizzle_index_to_n32;
766 }
767 break;
768 case kRGB_565_SkColorType:
769 proc = &swizzle_index_to_565;
770 break;
771 case kIndex_8_SkColorType:
772 proc = &sample1;
773 fastProc = &copy;
774 break;
775 default:
776 return nullptr;
777 }
778 break;
779 default:
780 return nullptr;
781 }
782 break;
783 case SkEncodedInfo::kRGB_Color:
784 switch (dstInfo.colorType()) {
785 case kN32_SkColorType:
786 proc = &swizzle_rgb_to_n32;
787 fastProc = &fast_swizzle_rgb_to_n32;
788 break;
789 case kRGB_565_SkColorType:
790 proc = &swizzle_rgb_to_565;
791 break;
792 default:
793 return nullptr;
794 }
795 break;
796 case SkEncodedInfo::kRGBA_Color:
797 switch (dstInfo.colorType()) {
798 case kN32_SkColorType:
799 if (premultiply) {
800 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
801 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32 _premul>;
802 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rg ba_to_n32_premul>;
803 } else {
804 proc = &swizzle_rgba_to_n32_premul;
805 fastProc = &fast_swizzle_rgba_to_n32_premul;
806 }
768 } else { 807 } else {
769 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 808 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
770 proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayal pha_to_n32_premul>; 809 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32 _unpremul>;
771 fastProc = &SkipLeadingGrayAlphaZerosThen 810 fastProc = &SkipLeading8888ZerosThen
772 <fast_swizzle_grayalpha_to_n32_premul>; 811 <fast_swizzle_rgba_to_n32_unpremul>;
773 } else { 812 } else {
774 proc = &swizzle_grayalpha_to_n32_premul; 813 proc = &swizzle_rgba_to_n32_unpremul;
775 fastProc = &fast_swizzle_grayalpha_to_n32_premul; 814 fastProc = &fast_swizzle_rgba_to_n32_unpremul;
776 } 815 }
777 } 816 }
778 break; 817 break;
779 default: 818 default:
780 break; 819 return nullptr;
781 } 820 }
782 break; 821 break;
783 case kBGR: 822 case SkEncodedInfo::kBGR_Color:
784 case kBGRX:
785 switch (dstInfo.colorType()) { 823 switch (dstInfo.colorType()) {
786 case kN32_SkColorType: 824 case kN32_SkColorType:
787 proc = &swizzle_bgrx_to_n32; 825 proc = &swizzle_bgrx_to_n32;
788 break; 826 break;
789 case kRGB_565_SkColorType: 827 case kRGB_565_SkColorType:
790 proc = &swizzle_bgrx_to_565; 828 proc = &swizzle_bgrx_to_565;
791 break; 829 break;
792 default: 830 default:
793 break; 831 return nullptr;
794 } 832 }
795 break; 833 break;
796 case kBGRA: 834 case SkEncodedInfo::kBGRX_Color:
797 switch (dstInfo.colorType()) { 835 switch (dstInfo.colorType()) {
798 case kN32_SkColorType: 836 case kN32_SkColorType:
799 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { 837 proc = &swizzle_bgrx_to_n32;
800 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 838 break;
801 proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32 _unpremul>; 839 case kRGB_565_SkColorType:
802 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bg ra_to_n32_unpremul>; 840 proc = &swizzle_bgrx_to_565;
803 } else { 841 break;
804 proc = &swizzle_bgra_to_n32_unpremul; 842 default:
805 fastProc = &fast_swizzle_bgra_to_n32_unpremul; 843 return nullptr;
806 } 844 }
807 } else { 845 break;
846 case SkEncodedInfo::kBGRA_Color:
847 switch (dstInfo.colorType()) {
848 case kN32_SkColorType:
849 if (premultiply) {
808 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 850 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
809 proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32 _premul>; 851 proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32 _premul>;
810 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bg ra_to_n32_premul>; 852 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bg ra_to_n32_premul>;
811 } else { 853 } else {
812 proc = &swizzle_bgra_to_n32_premul; 854 proc = &swizzle_bgra_to_n32_premul;
813 fastProc = &fast_swizzle_bgra_to_n32_premul; 855 fastProc = &fast_swizzle_bgra_to_n32_premul;
814 } 856 }
815 } 857 } else {
816 break;
817 default:
818 break;
819 }
820 break;
821 case kRGB:
822 switch (dstInfo.colorType()) {
823 case kN32_SkColorType:
824 proc = &swizzle_rgb_to_n32;
825 fastProc = &fast_swizzle_rgb_to_n32;
826 break;
827 case kRGB_565_SkColorType:
828 proc = &swizzle_rgb_to_565;
829 break;
830 default:
831 break;
832 }
833 break;
834 case kRGBA:
835 switch (dstInfo.colorType()) {
836 case kN32_SkColorType:
837 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) {
838 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 858 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
839 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32 _unpremul>; 859 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32 _unpremul>;
840 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rg ba_to_n32_unpremul>; 860 fastProc = &SkipLeading8888ZerosThen
861 <fast_swizzle_bgra_to_n32_unpremul>;
841 } else { 862 } else {
842 proc = &swizzle_rgba_to_n32_unpremul; 863 proc = &swizzle_bgra_to_n32_unpremul;
843 fastProc = &fast_swizzle_rgba_to_n32_unpremul; 864 fastProc = &fast_swizzle_bgra_to_n32_unpremul;
844 }
845 } else {
846 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
847 proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32 _premul>;
848 fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rg ba_to_n32_premul>;
849 } else {
850 proc = &swizzle_rgba_to_n32_premul;
851 fastProc = &fast_swizzle_rgba_to_n32_premul;
852 } 865 }
853 } 866 }
854 break; 867 break;
855 default: 868 default:
856 break; 869 return nullptr;
857 } 870 }
858 break; 871 break;
859 case kCMYK: 872 case SkEncodedInfo::kInvertedCMYK_Color:
860 switch (dstInfo.colorType()) { 873 switch (dstInfo.colorType()) {
861 case kN32_SkColorType: 874 case kN32_SkColorType:
862 proc = &swizzle_cmyk_to_n32; 875 proc = &swizzle_cmyk_to_n32;
863 fastProc = &fast_swizzle_cmyk_to_n32; 876 fastProc = &fast_swizzle_cmyk_to_n32;
864 break; 877 break;
865 case kRGB_565_SkColorType: 878 case kRGB_565_SkColorType:
866 proc = &swizzle_cmyk_to_565; 879 proc = &swizzle_cmyk_to_565;
867 break; 880 break;
868 default: 881 default:
869 break; 882 return nullptr;
870 } 883 }
871 break; 884 break;
872 case kNoOp8: 885 case SkEncodedInfo::kUnknown_Color:
873 proc = &sample1; 886 // Use kUnknown to indicate that we don't need to swizzle. The
874 fastProc = &copy; 887 // encoded format already matches the output format.
875 break; 888 switch (dstInfo.colorType()) {
876 case kNoOp16: 889 case kRGB_565_SkColorType:
877 proc = sample2; 890 proc = &sample2;
878 fastProc = &copy; 891 fastProc = &copy;
879 break; 892 break;
880 case kNoOp32: 893 default:
881 proc = &sample4; 894 return nullptr;
882 fastProc = &copy; 895 }
883 break; 896 break;
884 default: 897 default:
885 break; 898 return nullptr;
886 } 899 }
887 900
888 // Store bpp in bytes if it is an even multiple, otherwise use bits 901 // Store bpp in bytes if it is an even multiple, otherwise use bits
889 int srcBPP = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPixel (sc); 902 uint8_t bitsPerPixel = encodedInfo.bitsPerPixel();
903 int srcBPP = SkIsAlign8(bitsPerPixel) ? bitsPerPixel / 8 : bitsPerPixel;
890 int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType()); 904 int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType());
891 905
892 int srcOffset = 0; 906 int srcOffset = 0;
893 int srcWidth = dstInfo.width(); 907 int srcWidth = dstInfo.width();
894 int dstOffset = 0; 908 int dstOffset = 0;
895 int dstWidth = srcWidth; 909 int dstWidth = srcWidth;
896 if (options.fSubset) { 910 if (options.fSubset) {
897 // We do not currently support subset decodes for image types that may h ave 911 // We do not currently support subset decodes for image types that may h ave
898 // frames (gif). 912 // frames (gif).
899 SkASSERT(!frame); 913 SkASSERT(!frame);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
947 } 961 }
948 962
949 return fAllocatedWidth; 963 return fAllocatedWidth;
950 } 964 }
951 965
952 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { 966 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) {
953 SkASSERT(nullptr != dst && nullptr != src); 967 SkASSERT(nullptr != dst && nullptr != src);
954 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS rcBPP, 968 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS rcBPP,
955 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); 969 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable);
956 } 970 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698