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

Side by Side Diff: src/core/SkColorSpaceXform.cpp

Issue 2353363008: Add BGRA as input format to SkColorSpaceXform (Closed)
Patch Set: More cleanup Created 4 years, 2 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 2016 Google Inc. 2 * Copyright 2016 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 "SkColorPriv.h" 8 #include "SkColorPriv.h"
9 #include "SkColorSpace_Base.h" 9 #include "SkColorSpace_Base.h"
10 #include "SkColorSpacePriv.h" 10 #include "SkColorSpacePriv.h"
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 } 609 }
610 610
611 static inline void load_matrix(const float matrix[16], 611 static inline void load_matrix(const float matrix[16],
612 Sk4f& rXgXbX, Sk4f& rYgYbY, Sk4f& rZgZbZ, Sk4f& r TgTbT) { 612 Sk4f& rXgXbX, Sk4f& rYgYbY, Sk4f& rZgZbZ, Sk4f& r TgTbT) {
613 rXgXbX = Sk4f::Load(matrix + 0); 613 rXgXbX = Sk4f::Load(matrix + 0);
614 rYgYbY = Sk4f::Load(matrix + 4); 614 rYgYbY = Sk4f::Load(matrix + 4);
615 rZgZbZ = Sk4f::Load(matrix + 8); 615 rZgZbZ = Sk4f::Load(matrix + 8);
616 rTgTbT = Sk4f::Load(matrix + 12); 616 rTgTbT = Sk4f::Load(matrix + 12);
617 } 617 }
618 618
619 enum Order {
620 kRGBA_Order,
621 kBGRA_Order,
622 };
623
624 #define SET_SHIFTS \
mtklein 2016/09/22 13:57:00 Let's see if we can get close to what you want her
msarett 2016/09/22 17:06:54 Done.
625 int kRShift = 0; \
626 int kGShift = 8; \
627 int kBShift = 16; \
628 if (kBGRA_Order == kOrder) { \
629 kBShift = 0; \
630 kRShift = 16; \
631 }
632
633 template <Order kOrder>
619 static inline void load_rgb_from_tables(const uint32_t* src, 634 static inline void load_rgb_from_tables(const uint32_t* src,
620 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a, 635 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a,
621 const float* const srcTables[3]) { 636 const float* const srcTables[3]) {
622 r = { srcTables[0][(src[0] >> 0) & 0xFF], 637 SET_SHIFTS;
623 srcTables[0][(src[1] >> 0) & 0xFF], 638 r = { srcTables[0][(src[0] >> kRShift) & 0xFF],
624 srcTables[0][(src[2] >> 0) & 0xFF], 639 srcTables[0][(src[1] >> kRShift) & 0xFF],
625 srcTables[0][(src[3] >> 0) & 0xFF], }; 640 srcTables[0][(src[2] >> kRShift) & 0xFF],
626 g = { srcTables[1][(src[0] >> 8) & 0xFF], 641 srcTables[0][(src[3] >> kRShift) & 0xFF], };
627 srcTables[1][(src[1] >> 8) & 0xFF], 642 g = { srcTables[1][(src[0] >> kGShift) & 0xFF],
628 srcTables[1][(src[2] >> 8) & 0xFF], 643 srcTables[1][(src[1] >> kGShift) & 0xFF],
629 srcTables[1][(src[3] >> 8) & 0xFF], }; 644 srcTables[1][(src[2] >> kGShift) & 0xFF],
630 b = { srcTables[2][(src[0] >> 16) & 0xFF], 645 srcTables[1][(src[3] >> kGShift) & 0xFF], };
631 srcTables[2][(src[1] >> 16) & 0xFF], 646 b = { srcTables[2][(src[0] >> kBShift) & 0xFF],
632 srcTables[2][(src[2] >> 16) & 0xFF], 647 srcTables[2][(src[1] >> kBShift) & 0xFF],
633 srcTables[2][(src[3] >> 16) & 0xFF], }; 648 srcTables[2][(src[2] >> kBShift) & 0xFF],
649 srcTables[2][(src[3] >> kBShift) & 0xFF], };
634 a = 0.0f; // Don't let the compiler complain that |a| is uninitialized. 650 a = 0.0f; // Don't let the compiler complain that |a| is uninitialized.
635 } 651 }
636 652
653 template <Order kOrder>
637 static inline void load_rgba_from_tables(const uint32_t* src, 654 static inline void load_rgba_from_tables(const uint32_t* src,
638 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a, 655 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a,
639 const float* const srcTables[3]) { 656 const float* const srcTables[3]) {
640 r = { srcTables[0][(src[0] >> 0) & 0xFF], 657 SET_SHIFTS;
641 srcTables[0][(src[1] >> 0) & 0xFF], 658 r = { srcTables[0][(src[0] >> kRShift) & 0xFF],
642 srcTables[0][(src[2] >> 0) & 0xFF], 659 srcTables[0][(src[1] >> kRShift) & 0xFF],
643 srcTables[0][(src[3] >> 0) & 0xFF], }; 660 srcTables[0][(src[2] >> kRShift) & 0xFF],
644 g = { srcTables[1][(src[0] >> 8) & 0xFF], 661 srcTables[0][(src[3] >> kRShift) & 0xFF], };
645 srcTables[1][(src[1] >> 8) & 0xFF], 662 g = { srcTables[1][(src[0] >> kRShift) & 0xFF],
646 srcTables[1][(src[2] >> 8) & 0xFF], 663 srcTables[1][(src[1] >> kGShift) & 0xFF],
647 srcTables[1][(src[3] >> 8) & 0xFF], }; 664 srcTables[1][(src[2] >> kGShift) & 0xFF],
648 b = { srcTables[2][(src[0] >> 16) & 0xFF], 665 srcTables[1][(src[3] >> kGShift) & 0xFF], };
649 srcTables[2][(src[1] >> 16) & 0xFF], 666 b = { srcTables[2][(src[0] >> kBShift) & 0xFF],
650 srcTables[2][(src[2] >> 16) & 0xFF], 667 srcTables[2][(src[1] >> kBShift) & 0xFF],
651 srcTables[2][(src[3] >> 16) & 0xFF], }; 668 srcTables[2][(src[2] >> kBShift) & 0xFF],
669 srcTables[2][(src[3] >> kBShift) & 0xFF], };
652 a = (1.0f / 255.0f) * SkNx_cast<float>(Sk4u::Load(src) >> 24); 670 a = (1.0f / 255.0f) * SkNx_cast<float>(Sk4u::Load(src) >> 24);
653 } 671 }
654 672
673 template <Order kOrder>
655 static inline void load_rgb_linear(const uint32_t* src, 674 static inline void load_rgb_linear(const uint32_t* src,
656 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a, 675 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a,
657 const float* const[3]) { 676 const float* const[3]) {
658 r = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) ) & 0xFF); 677 SET_SHIFTS;
659 g = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> 8) & 0xFF); 678 r = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> kRShift) & 0xFF);
660 b = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> 16) & 0xFF); 679 g = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> kGShift) & 0xFF);
680 b = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> kBShift) & 0xFF);
661 a = 0.0f; // Don't let the compiler complain that |a| is uninitialized. 681 a = 0.0f; // Don't let the compiler complain that |a| is uninitialized.
662 } 682 }
663 683
684 template <Order kOrder>
664 static inline void load_rgba_linear(const uint32_t* src, 685 static inline void load_rgba_linear(const uint32_t* src,
665 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a, 686 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a,
666 const float* const[3]) { 687 const float* const[3]) {
667 r = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) ) & 0xFF); 688 SET_SHIFTS;
668 g = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> 8) & 0xFF); 689 r = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> kRShift) & 0xFF);
669 b = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> 16) & 0xFF); 690 g = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> kGShift) & 0xFF);
670 a = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> 24) ); 691 b = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> kBShift) & 0xFF);
692 a = (1.0f / 255.0f) * SkNx_cast<float>((Sk4u::Load(src) >> 24));
671 } 693 }
672 694
695 template <Order kOrder>
673 static inline void load_rgb_from_tables_1(const uint32_t* src, 696 static inline void load_rgb_from_tables_1(const uint32_t* src,
674 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f&, 697 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f&,
675 const float* const srcTables[3]) { 698 const float* const srcTables[3]) {
676 // Splat r,g,b across a register each. 699 SET_SHIFTS;
677 r = Sk4f(srcTables[0][(*src >> 0) & 0xFF]); 700 r = Sk4f(srcTables[0][(*src >> kRShift) & 0xFF]);
678 g = Sk4f(srcTables[1][(*src >> 8) & 0xFF]); 701 g = Sk4f(srcTables[1][(*src >> kGShift) & 0xFF]);
679 b = Sk4f(srcTables[2][(*src >> 16) & 0xFF]); 702 b = Sk4f(srcTables[2][(*src >> kBShift) & 0xFF]);
680 } 703 }
681 704
705 template <Order kOrder>
682 static inline void load_rgba_from_tables_1(const uint32_t* src, 706 static inline void load_rgba_from_tables_1(const uint32_t* src,
683 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a, 707 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a,
684 const float* const srcTables[3]) { 708 const float* const srcTables[3]) {
685 // Splat r,g,b across a register each. 709 SET_SHIFTS;
686 r = Sk4f(srcTables[0][(*src >> 0) & 0xFF]); 710 r = Sk4f(srcTables[0][(*src >> kRShift) & 0xFF]);
687 g = Sk4f(srcTables[1][(*src >> 8) & 0xFF]); 711 g = Sk4f(srcTables[1][(*src >> kGShift) & 0xFF]);
688 b = Sk4f(srcTables[2][(*src >> 16) & 0xFF]); 712 b = Sk4f(srcTables[2][(*src >> kBShift) & 0xFF]);
689 a = (1.0f / 255.0f) * Sk4f(*src >> 24); 713 a = (1.0f / 255.0f) * Sk4f(*src >> 24);
690 } 714 }
691 715
716 template <Order kOrder>
692 static inline void load_rgb_linear_1(const uint32_t* src, 717 static inline void load_rgb_linear_1(const uint32_t* src,
693 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f&, 718 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f&,
694 const float* const srcTables[3]) { 719 const float* const srcTables[3]) {
695 // Splat r,g,b across a register each. 720 SET_SHIFTS;
696 r = Sk4f((1.0f / 255.0f) * ((*src ) & 0xFF)); 721 r = Sk4f((1.0f / 255.0f) * ((*src >> kRShift) & 0xFF));
697 g = Sk4f((1.0f / 255.0f) * ((*src >> 8) & 0xFF)); 722 g = Sk4f((1.0f / 255.0f) * ((*src >> kGShift) & 0xFF));
698 b = Sk4f((1.0f / 255.0f) * ((*src >> 16) & 0xFF)); 723 b = Sk4f((1.0f / 255.0f) * ((*src >> kBShift) & 0xFF));
699 } 724 }
700 725
726 template <Order kOrder>
701 static inline void load_rgba_linear_1(const uint32_t* src, 727 static inline void load_rgba_linear_1(const uint32_t* src,
702 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a, 728 Sk4f& r, Sk4f& g, Sk4f& b, Sk4f& a,
703 const float* const srcTables[3]) { 729 const float* const srcTables[3]) {
704 // Splat r,g,b,a across a register each. 730 SET_SHIFTS;
705 r = Sk4f((1.0f / 255.0f) * ((*src ) & 0xFF)); 731 r = Sk4f((1.0f / 255.0f) * ((*src >> kRShift) & 0xFF));
706 g = Sk4f((1.0f / 255.0f) * ((*src >> 8) & 0xFF)); 732 g = Sk4f((1.0f / 255.0f) * ((*src >> kGShift) & 0xFF));
707 b = Sk4f((1.0f / 255.0f) * ((*src >> 16) & 0xFF)); 733 b = Sk4f((1.0f / 255.0f) * ((*src >> kBShift) & 0xFF));
708 a = Sk4f((1.0f / 255.0f) * ((*src >> 24) )); 734 a = Sk4f((1.0f / 255.0f) * ((*src >> 24)));
709 } 735 }
710 736
711 static inline void transform_gamut(const Sk4f& r, const Sk4f& g, const Sk4f& b, const Sk4f& a, 737 static inline void transform_gamut(const Sk4f& r, const Sk4f& g, const Sk4f& b, const Sk4f& a,
712 const Sk4f& rXgXbX, const Sk4f& rYgYbY, const Sk4f& rZgZbZ, 738 const Sk4f& rXgXbX, const Sk4f& rYgYbY, const Sk4f& rZgZbZ,
713 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da) { 739 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da) {
714 dr = rXgXbX[0]*r + rYgYbY[0]*g + rZgZbZ[0]*b; 740 dr = rXgXbX[0]*r + rYgYbY[0]*g + rZgZbZ[0]*b;
715 dg = rXgXbX[1]*r + rYgYbY[1]*g + rZgZbZ[1]*b; 741 dg = rXgXbX[1]*r + rYgYbY[1]*g + rZgZbZ[1]*b;
716 db = rXgXbX[2]*r + rYgYbY[2]*g + rZgZbZ[2]*b; 742 db = rXgXbX[2]*r + rYgYbY[2]*g + rZgZbZ[2]*b;
717 da = a; 743 da = a;
718 } 744 }
(...skipping 17 matching lines...) Expand all
736 static inline void premultiply(Sk4f& dr, Sk4f& dg, Sk4f& db, const Sk4f& da) { 762 static inline void premultiply(Sk4f& dr, Sk4f& dg, Sk4f& db, const Sk4f& da) {
737 dr = da * dr; 763 dr = da * dr;
738 dg = da * dg; 764 dg = da * dg;
739 db = da * db; 765 db = da * db;
740 } 766 }
741 767
742 static inline void premultiply_1(const Sk4f& a, Sk4f& rgba) { 768 static inline void premultiply_1(const Sk4f& a, Sk4f& rgba) {
743 rgba = a * rgba; 769 rgba = a * rgba;
744 } 770 }
745 771
746 enum SwapRB { 772 template <Order kOrder>
747 kNo_SwapRB,
748 kYes_SwapRB,
749 };
750
751 template <SwapRB kSwapRB>
752 static inline void store_srgb(void* dst, const uint32_t* src, 773 static inline void store_srgb(void* dst, const uint32_t* src,
753 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, 774 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
754 const uint8_t* const[3]) { 775 const uint8_t* const[3]) {
755 int kRShift = 0; 776 SET_SHIFTS;
756 int kGShift = 8;
757 int kBShift = 16;
758 if (kYes_SwapRB == kSwapRB) {
759 kBShift = 0;
760 kRShift = 16;
761 }
762
763 dr = sk_linear_to_srgb_needs_trunc(dr); 777 dr = sk_linear_to_srgb_needs_trunc(dr);
764 dg = sk_linear_to_srgb_needs_trunc(dg); 778 dg = sk_linear_to_srgb_needs_trunc(dg);
765 db = sk_linear_to_srgb_needs_trunc(db); 779 db = sk_linear_to_srgb_needs_trunc(db);
766 780
767 dr = sk_clamp_0_255(dr); 781 dr = sk_clamp_0_255(dr);
768 dg = sk_clamp_0_255(dg); 782 dg = sk_clamp_0_255(dg);
769 db = sk_clamp_0_255(db); 783 db = sk_clamp_0_255(db);
770 784
771 Sk4i da = Sk4i::Load(src) & 0xFF000000; 785 Sk4i da = Sk4i::Load(src) & 0xFF000000;
772 786
773 Sk4i rgba = (SkNx_cast<int>(dr) << kRShift) 787 Sk4i rgba = (SkNx_cast<int>(dr) << kRShift)
774 | (SkNx_cast<int>(dg) << kGShift) 788 | (SkNx_cast<int>(dg) << kGShift)
775 | (SkNx_cast<int>(db) << kBShift) 789 | (SkNx_cast<int>(db) << kBShift)
776 | (da ); 790 | (da );
777 rgba.store(dst); 791 rgba.store(dst);
778 } 792 }
779 793
780 template <SwapRB kSwapRB> 794 template <Order kOrder>
781 static inline void store_srgb_1(void* dst, const uint32_t* src, 795 static inline void store_srgb_1(void* dst, const uint32_t* src,
782 Sk4f& rgba, const Sk4f&, 796 Sk4f& rgba, const Sk4f&,
783 const uint8_t* const[3]) { 797 const uint8_t* const[3]) {
784 rgba = sk_clamp_0_255(sk_linear_to_srgb_needs_trunc(rgba)); 798 rgba = sk_clamp_0_255(sk_linear_to_srgb_needs_trunc(rgba));
785 799
786 uint32_t tmp; 800 uint32_t tmp;
787 SkNx_cast<uint8_t>(SkNx_cast<int32_t>(rgba)).store(&tmp); 801 SkNx_cast<uint8_t>(SkNx_cast<int32_t>(rgba)).store(&tmp);
788 tmp = (*src & 0xFF000000) | (tmp & 0x00FFFFFF); 802 tmp = (*src & 0xFF000000) | (tmp & 0x00FFFFFF);
789 if (kYes_SwapRB == kSwapRB) { 803 if (kBGRA_Order == kOrder) {
790 tmp = SkSwizzle_RB(tmp); 804 tmp = SkSwizzle_RB(tmp);
791 } 805 }
792 806
793 *(uint32_t*)dst = tmp; 807 *(uint32_t*)dst = tmp;
794 } 808 }
795 809
796 static inline Sk4f linear_to_2dot2(const Sk4f& x) { 810 static inline Sk4f linear_to_2dot2(const Sk4f& x) {
797 // x^(29/64) is a very good approximation of the true value, x^(1/2.2). 811 // x^(29/64) is a very good approximation of the true value, x^(1/2.2).
798 auto x2 = x.rsqrt(), // x^(-1/2) 812 auto x2 = x.rsqrt(), // x^(-1/2)
799 x32 = x2.rsqrt().rsqrt().rsqrt().rsqrt(), // x^(-1/32) 813 x32 = x2.rsqrt().rsqrt().rsqrt().rsqrt(), // x^(-1/32)
800 x64 = x32.rsqrt(); // x^(+1/64) 814 x64 = x32.rsqrt(); // x^(+1/64)
801 815
802 // 29 = 32 - 2 - 1 816 // 29 = 32 - 2 - 1
803 return 255.0f * x2.invert() * x32 * x64.invert(); 817 return 255.0f * x2.invert() * x32 * x64.invert();
804 } 818 }
805 819
806 template <SwapRB kSwapRB> 820 template <Order kOrder>
807 static inline void store_2dot2(void* dst, const uint32_t* src, 821 static inline void store_2dot2(void* dst, const uint32_t* src,
808 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, 822 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
809 const uint8_t* const[3]) { 823 const uint8_t* const[3]) {
810 int kRShift = 0; 824 SET_SHIFTS;
811 int kGShift = 8;
812 int kBShift = 16;
813 if (kYes_SwapRB == kSwapRB) {
814 kBShift = 0;
815 kRShift = 16;
816 }
817
818 dr = linear_to_2dot2(dr); 825 dr = linear_to_2dot2(dr);
819 dg = linear_to_2dot2(dg); 826 dg = linear_to_2dot2(dg);
820 db = linear_to_2dot2(db); 827 db = linear_to_2dot2(db);
821 828
822 dr = sk_clamp_0_255(dr); 829 dr = sk_clamp_0_255(dr);
823 dg = sk_clamp_0_255(dg); 830 dg = sk_clamp_0_255(dg);
824 db = sk_clamp_0_255(db); 831 db = sk_clamp_0_255(db);
825 832
826 Sk4i da = Sk4i::Load(src) & 0xFF000000; 833 Sk4i da = Sk4i::Load(src) & 0xFF000000;
827 834
828 Sk4i rgba = (Sk4f_round(dr) << kRShift) 835 Sk4i rgba = (Sk4f_round(dr) << kRShift)
829 | (Sk4f_round(dg) << kGShift) 836 | (Sk4f_round(dg) << kGShift)
830 | (Sk4f_round(db) << kBShift) 837 | (Sk4f_round(db) << kBShift)
831 | (da ); 838 | (da );
832 rgba.store(dst); 839 rgba.store(dst);
833 } 840 }
834 841
835 template <SwapRB kSwapRB> 842 template <Order kOrder>
836 static inline void store_2dot2_1(void* dst, const uint32_t* src, 843 static inline void store_2dot2_1(void* dst, const uint32_t* src,
837 Sk4f& rgba, const Sk4f&, 844 Sk4f& rgba, const Sk4f&,
838 const uint8_t* const[3]) { 845 const uint8_t* const[3]) {
839 rgba = sk_clamp_0_255(linear_to_2dot2(rgba)); 846 rgba = sk_clamp_0_255(linear_to_2dot2(rgba));
840 847
841 uint32_t tmp; 848 uint32_t tmp;
842 SkNx_cast<uint8_t>(Sk4f_round(rgba)).store(&tmp); 849 SkNx_cast<uint8_t>(Sk4f_round(rgba)).store(&tmp);
843 tmp = (*src & 0xFF000000) | (tmp & 0x00FFFFFF); 850 tmp = (*src & 0xFF000000) | (tmp & 0x00FFFFFF);
844 if (kYes_SwapRB == kSwapRB) { 851 if (kBGRA_Order == kOrder) {
845 tmp = SkSwizzle_RB(tmp); 852 tmp = SkSwizzle_RB(tmp);
846 } 853 }
847 854
848 *(uint32_t*)dst = tmp; 855 *(uint32_t*)dst = tmp;
849 } 856 }
850 857
851 template <SwapRB kSwapRB> 858 template <Order kOrder>
852 static inline void store_linear(void* dst, const uint32_t* src, 859 static inline void store_linear(void* dst, const uint32_t* src,
853 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, 860 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
854 const uint8_t* const[3]) { 861 const uint8_t* const[3]) {
855 int kRShift = 0; 862 SET_SHIFTS;
856 int kGShift = 8;
857 int kBShift = 16;
858 if (kYes_SwapRB == kSwapRB) {
859 kBShift = 0;
860 kRShift = 16;
861 }
862
863 dr = sk_clamp_0_255(255.0f * dr); 863 dr = sk_clamp_0_255(255.0f * dr);
864 dg = sk_clamp_0_255(255.0f * dg); 864 dg = sk_clamp_0_255(255.0f * dg);
865 db = sk_clamp_0_255(255.0f * db); 865 db = sk_clamp_0_255(255.0f * db);
866 866
867 Sk4i da = Sk4i::Load(src) & 0xFF000000; 867 Sk4i da = Sk4i::Load(src) & 0xFF000000;
868 868
869 Sk4i rgba = (Sk4f_round(dr) << kRShift) 869 Sk4i rgba = (Sk4f_round(dr) << kRShift)
870 | (Sk4f_round(dg) << kGShift) 870 | (Sk4f_round(dg) << kGShift)
871 | (Sk4f_round(db) << kBShift) 871 | (Sk4f_round(db) << kBShift)
872 | (da ); 872 | (da );
873 rgba.store(dst); 873 rgba.store(dst);
874 } 874 }
875 875
876 template <SwapRB kSwapRB> 876 template <Order kOrder>
877 static inline void store_linear_1(void* dst, const uint32_t* src, 877 static inline void store_linear_1(void* dst, const uint32_t* src,
878 Sk4f& rgba, const Sk4f&, 878 Sk4f& rgba, const Sk4f&,
879 const uint8_t* const[3]) { 879 const uint8_t* const[3]) {
880 rgba = sk_clamp_0_255(255.0f * rgba); 880 rgba = sk_clamp_0_255(255.0f * rgba);
881 881
882 uint32_t tmp; 882 uint32_t tmp;
883 SkNx_cast<uint8_t>(Sk4f_round(rgba)).store(&tmp); 883 SkNx_cast<uint8_t>(Sk4f_round(rgba)).store(&tmp);
884 tmp = (*src & 0xFF000000) | (tmp & 0x00FFFFFF); 884 tmp = (*src & 0xFF000000) | (tmp & 0x00FFFFFF);
885 if (kYes_SwapRB == kSwapRB) { 885 if (kBGRA_Order == kOrder) {
886 tmp = SkSwizzle_RB(tmp); 886 tmp = SkSwizzle_RB(tmp);
887 } 887 }
888 888
889 *(uint32_t*)dst = tmp; 889 *(uint32_t*)dst = tmp;
890 } 890 }
891 891
892 template <SwapRB kSwapRB> 892 template <Order kOrder>
893 static inline void store_f16(void* dst, const uint32_t* src, 893 static inline void store_f16(void* dst, const uint32_t* src,
894 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, 894 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da,
895 const uint8_t* const[3]) { 895 const uint8_t* const[3]) {
896 Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), 896 Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr),
897 SkFloatToHalf_finite_ftz(dg), 897 SkFloatToHalf_finite_ftz(dg),
898 SkFloatToHalf_finite_ftz(db), 898 SkFloatToHalf_finite_ftz(db),
899 SkFloatToHalf_finite_ftz(da)); 899 SkFloatToHalf_finite_ftz(da));
900 } 900 }
901 901
902 template <SwapRB kSwapRB> 902 template <Order kOrder>
903 static inline void store_f16_1(void* dst, const uint32_t* src, 903 static inline void store_f16_1(void* dst, const uint32_t* src,
904 Sk4f& rgba, const Sk4f& a, 904 Sk4f& rgba, const Sk4f& a,
905 const uint8_t* const[3]) { 905 const uint8_t* const[3]) {
906 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); 906 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]);
907 SkFloatToHalf_finite_ftz(rgba).store((uint64_t*) dst); 907 SkFloatToHalf_finite_ftz(rgba).store((uint64_t*) dst);
908 } 908 }
909 909
910 template <SwapRB kSwapRB> 910 template <Order kOrder>
911 static inline void store_f32(void* dst, const uint32_t* src, 911 static inline void store_f32(void* dst, const uint32_t* src,
912 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, 912 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da,
913 const uint8_t* const[3]) { 913 const uint8_t* const[3]) {
914 Sk4f_store4(dst, dr, dg, db, da); 914 Sk4f_store4(dst, dr, dg, db, da);
915 } 915 }
916 916
917 template <SwapRB kSwapRB> 917 template <Order kOrder>
918 static inline void store_f32_1(void* dst, const uint32_t* src, 918 static inline void store_f32_1(void* dst, const uint32_t* src,
919 Sk4f& rgba, const Sk4f& a, 919 Sk4f& rgba, const Sk4f& a,
920 const uint8_t* const[3]) { 920 const uint8_t* const[3]) {
921 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); 921 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]);
922 rgba.store((float*) dst); 922 rgba.store((float*) dst);
923 } 923 }
924 924
925 template <SwapRB kSwapRB> 925 template <Order kOrder>
926 static inline void store_f16_opaque(void* dst, const uint32_t* src, 926 static inline void store_f16_opaque(void* dst, const uint32_t* src,
927 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, 927 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
928 const uint8_t* const[3]) { 928 const uint8_t* const[3]) {
929 Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), 929 Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr),
930 SkFloatToHalf_finite_ftz(dg), 930 SkFloatToHalf_finite_ftz(dg),
931 SkFloatToHalf_finite_ftz(db), 931 SkFloatToHalf_finite_ftz(db),
932 SK_Half1); 932 SK_Half1);
933 } 933 }
934 934
935 template <SwapRB kSwapRB> 935 template <Order kOrder>
936 static inline void store_f16_1_opaque(void* dst, const uint32_t* src, 936 static inline void store_f16_1_opaque(void* dst, const uint32_t* src,
937 Sk4f& rgba, const Sk4f&, 937 Sk4f& rgba, const Sk4f&,
938 const uint8_t* const[3]) { 938 const uint8_t* const[3]) {
939 uint64_t tmp; 939 uint64_t tmp;
940 SkFloatToHalf_finite_ftz(rgba).store(&tmp); 940 SkFloatToHalf_finite_ftz(rgba).store(&tmp);
941 tmp |= static_cast<uint64_t>(SK_Half1) << 48; 941 tmp |= static_cast<uint64_t>(SK_Half1) << 48;
942 *((uint64_t*) dst) = tmp; 942 *((uint64_t*) dst) = tmp;
943 } 943 }
944 944
945 template <SwapRB kSwapRB> 945 template <Order kOrder>
946 static inline void store_generic(void* dst, const uint32_t* src, 946 static inline void store_generic(void* dst, const uint32_t* src,
947 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, 947 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
948 const uint8_t* const dstTables[3]) { 948 const uint8_t* const dstTables[3]) {
949 int kRShift = 0; 949 SET_SHIFTS;
950 int kGShift = 8;
951 int kBShift = 16;
952 if (kYes_SwapRB == kSwapRB) {
953 kBShift = 0;
954 kRShift = 16;
955 }
956
957 dr = Sk4f::Min(Sk4f::Max(1023.0f * dr, 0.0f), 1023.0f); 950 dr = Sk4f::Min(Sk4f::Max(1023.0f * dr, 0.0f), 1023.0f);
958 dg = Sk4f::Min(Sk4f::Max(1023.0f * dg, 0.0f), 1023.0f); 951 dg = Sk4f::Min(Sk4f::Max(1023.0f * dg, 0.0f), 1023.0f);
959 db = Sk4f::Min(Sk4f::Max(1023.0f * db, 0.0f), 1023.0f); 952 db = Sk4f::Min(Sk4f::Max(1023.0f * db, 0.0f), 1023.0f);
960 953
961 Sk4i ir = Sk4f_round(dr); 954 Sk4i ir = Sk4f_round(dr);
962 Sk4i ig = Sk4f_round(dg); 955 Sk4i ig = Sk4f_round(dg);
963 Sk4i ib = Sk4f_round(db); 956 Sk4i ib = Sk4f_round(db);
964 957
965 Sk4i da = Sk4i::Load(src) & 0xFF000000; 958 Sk4i da = Sk4i::Load(src) & 0xFF000000;
966 959
967 uint32_t* dst32 = (uint32_t*) dst; 960 uint32_t* dst32 = (uint32_t*) dst;
968 dst32[0] = dstTables[0][ir[0]] << kRShift 961 dst32[0] = dstTables[0][ir[0]] << kRShift
969 | dstTables[1][ig[0]] << kGShift 962 | dstTables[1][ig[0]] << kGShift
970 | dstTables[2][ib[0]] << kBShift 963 | dstTables[2][ib[0]] << kBShift
971 | da[0]; 964 | da[0];
972 dst32[1] = dstTables[0][ir[1]] << kRShift 965 dst32[1] = dstTables[0][ir[1]] << kRShift
973 | dstTables[1][ig[1]] << kGShift 966 | dstTables[1][ig[1]] << kGShift
974 | dstTables[2][ib[1]] << kBShift 967 | dstTables[2][ib[1]] << kBShift
975 | da[1]; 968 | da[1];
976 dst32[2] = dstTables[0][ir[2]] << kRShift 969 dst32[2] = dstTables[0][ir[2]] << kRShift
977 | dstTables[1][ig[2]] << kGShift 970 | dstTables[1][ig[2]] << kGShift
978 | dstTables[2][ib[2]] << kBShift 971 | dstTables[2][ib[2]] << kBShift
979 | da[2]; 972 | da[2];
980 dst32[3] = dstTables[0][ir[3]] << kRShift 973 dst32[3] = dstTables[0][ir[3]] << kRShift
981 | dstTables[1][ig[3]] << kGShift 974 | dstTables[1][ig[3]] << kGShift
982 | dstTables[2][ib[3]] << kBShift 975 | dstTables[2][ib[3]] << kBShift
983 | da[3]; 976 | da[3];
984 } 977 }
985 978
986 template <SwapRB kSwapRB> 979 template <Order kOrder>
987 static inline void store_generic_1(void* dst, const uint32_t* src, 980 static inline void store_generic_1(void* dst, const uint32_t* src,
988 Sk4f& rgba, const Sk4f&, 981 Sk4f& rgba, const Sk4f&,
989 const uint8_t* const dstTables[3]) { 982 const uint8_t* const dstTables[3]) {
990 int kRShift = 0; 983 SET_SHIFTS;
991 int kGShift = 8;
992 int kBShift = 16;
993 if (kYes_SwapRB == kSwapRB) {
994 kBShift = 0;
995 kRShift = 16;
996 }
997
998 rgba = Sk4f::Min(Sk4f::Max(1023.0f * rgba, 0.0f), 1023.0f); 984 rgba = Sk4f::Min(Sk4f::Max(1023.0f * rgba, 0.0f), 1023.0f);
999 985
1000 Sk4i indices = Sk4f_round(rgba); 986 Sk4i indices = Sk4f_round(rgba);
1001 987
1002 *((uint32_t*) dst) = dstTables[0][indices[0]] << kRShift 988 *((uint32_t*) dst) = dstTables[0][indices[0]] << kRShift
1003 | dstTables[1][indices[1]] << kGShift 989 | dstTables[1][indices[1]] << kGShift
1004 | dstTables[2][indices[2]] << kBShift 990 | dstTables[2][indices[2]] << kBShift
1005 | (*src & 0xFF000000); 991 | (*src & 0xFF000000);
1006 } 992 }
1007 993
1008 typedef decltype(load_rgb_from_tables )* LoadFn; 994 #undef SET_SHIFTS
1009 typedef decltype(load_rgb_from_tables_1 )* Load1Fn; 995
1010 typedef decltype(store_generic<kNo_SwapRB> )* StoreFn; 996 typedef decltype(load_rgb_from_tables<kRGBA_Order> )* LoadFn;
1011 typedef decltype(store_generic_1<kNo_SwapRB>)* Store1Fn; 997 typedef decltype(load_rgb_from_tables_1<kRGBA_Order>)* Load1Fn;
998 typedef decltype(store_generic<kRGBA_Order> )* StoreFn;
999 typedef decltype(store_generic_1<kRGBA_Order> )* Store1Fn;
1012 1000
1013 template <SkAlphaType kAlphaType, 1001 template <SkAlphaType kAlphaType,
1014 ColorSpaceMatch kCSM> 1002 ColorSpaceMatch kCSM>
1015 static inline void do_color_xform(void* dst, const uint32_t* src, int len, 1003 static inline void do_color_xform(void* dst, const uint32_t* src, int len,
1016 const float* const srcTables[3], const float m atrix[16], 1004 const float* const srcTables[3], const float m atrix[16],
1017 const uint8_t* const dstTables[3], LoadFn load , Load1Fn load_1, 1005 const uint8_t* const dstTables[3], LoadFn load , Load1Fn load_1,
1018 StoreFn store, Store1Fn store_1, size_t sizeOf DstPixel) { 1006 StoreFn store, Store1Fn store_1, size_t sizeOf DstPixel) {
1019 Sk4f rXgXbX, rYgYbY, rZgZbZ, rTgTbT; 1007 Sk4f rXgXbX, rYgYbY, rZgZbZ, rTgTbT;
1020 load_matrix(matrix, rXgXbX, rYgYbY, rZgZbZ, rTgTbT); 1008 load_matrix(matrix, rXgXbX, rYgYbY, rZgZbZ, rTgTbT);
1021 1009
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 1077
1090 src += 1; 1078 src += 1;
1091 len -= 1; 1079 len -= 1;
1092 dst = SkTAddOffset<void>(dst, sizeOfDstPixel); 1080 dst = SkTAddOffset<void>(dst, sizeOfDstPixel);
1093 } 1081 }
1094 } 1082 }
1095 1083
1096 enum SrcFormat { 1084 enum SrcFormat {
1097 kRGBA_8888_Linear_SrcFormat, 1085 kRGBA_8888_Linear_SrcFormat,
1098 kRGBA_8888_Table_SrcFormat, 1086 kRGBA_8888_Table_SrcFormat,
1087 kBGRA_8888_Linear_SrcFormat,
1088 kBGRA_8888_Table_SrcFormat,
1099 }; 1089 };
1100 1090
1101 enum DstFormat { 1091 enum DstFormat {
1102 k8888_Linear_DstFormat, 1092 kRGBA_8888_Linear_DstFormat,
1103 k8888_SRGB_DstFormat, 1093 kRGBA_8888_SRGB_DstFormat,
1104 k8888_2Dot2_DstFormat, 1094 kRGBA_8888_2Dot2_DstFormat,
1105 k8888_Table_DstFormat, 1095 kRGBA_8888_Table_DstFormat,
1096 kBGRA_8888_Linear_DstFormat,
1097 kBGRA_8888_SRGB_DstFormat,
1098 kBGRA_8888_2Dot2_DstFormat,
1099 kBGRA_8888_Table_DstFormat,
1106 kF16_Linear_DstFormat, 1100 kF16_Linear_DstFormat,
1107 kF32_Linear_DstFormat, 1101 kF32_Linear_DstFormat,
1108 }; 1102 };
1109 1103
1110 template <SrcFormat kSrc, 1104 template <SrcFormat kSrc,
1111 DstFormat kDst, 1105 DstFormat kDst,
1112 SkAlphaType kAlphaType, 1106 SkAlphaType kAlphaType,
1113 ColorSpaceMatch kCSM, 1107 ColorSpaceMatch kCSM>
1114 SwapRB kSwapRB>
1115 static void color_xform_RGBA(void* dst, const uint32_t* src, int len, 1108 static void color_xform_RGBA(void* dst, const uint32_t* src, int len,
1116 const float* const srcTables[3], const float matrix [16], 1109 const float* const srcTables[3], const float matrix [16],
1117 const uint8_t* const dstTables[3]) { 1110 const uint8_t* const dstTables[3]) {
1118 LoadFn load; 1111 LoadFn load;
1119 Load1Fn load_1; 1112 Load1Fn load_1;
1120 static constexpr bool loadAlpha = (kPremul_SkAlphaType == kAlphaType) || 1113 static constexpr bool loadAlpha = (kPremul_SkAlphaType == kAlphaType) ||
1121 (kF16_Linear_DstFormat == kDst) || 1114 (kF16_Linear_DstFormat == kDst) ||
1122 (kF32_Linear_DstFormat == kDst); 1115 (kF32_Linear_DstFormat == kDst);
1123 switch (kSrc) { 1116 switch (kSrc) {
1124 case kRGBA_8888_Linear_SrcFormat: 1117 case kRGBA_8888_Linear_SrcFormat:
1125 if (loadAlpha) { 1118 if (loadAlpha) {
1126 load = load_rgba_linear; 1119 load = load_rgba_linear<kRGBA_Order>;
1127 load_1 = load_rgba_linear_1; 1120 load_1 = load_rgba_linear_1<kRGBA_Order>;
1128 } else { 1121 } else {
1129 load = load_rgb_linear; 1122 load = load_rgb_linear<kRGBA_Order>;
1130 load_1 = load_rgb_linear_1; 1123 load_1 = load_rgb_linear_1<kRGBA_Order>;
1131 } 1124 }
1132 break; 1125 break;
1133 case kRGBA_8888_Table_SrcFormat: 1126 case kRGBA_8888_Table_SrcFormat:
1134 if (loadAlpha) { 1127 if (loadAlpha) {
1135 load = load_rgba_from_tables; 1128 load = load_rgba_from_tables<kRGBA_Order>;
1136 load_1 = load_rgba_from_tables_1; 1129 load_1 = load_rgba_from_tables_1<kRGBA_Order>;
1137 } else { 1130 } else {
1138 load = load_rgb_from_tables; 1131 load = load_rgb_from_tables<kRGBA_Order>;
1139 load_1 = load_rgb_from_tables_1; 1132 load_1 = load_rgb_from_tables_1<kRGBA_Order>;
1133 }
1134 break;
1135 case kBGRA_8888_Linear_SrcFormat:
1136 if (loadAlpha) {
1137 load = load_rgba_linear<kBGRA_Order>;
1138 load_1 = load_rgba_linear_1<kBGRA_Order>;
1139 } else {
1140 load = load_rgb_linear<kBGRA_Order>;
1141 load_1 = load_rgb_linear_1<kBGRA_Order>;
1142 }
1143 break;
1144 case kBGRA_8888_Table_SrcFormat:
1145 if (loadAlpha) {
1146 load = load_rgba_from_tables<kBGRA_Order>;
1147 load_1 = load_rgba_from_tables_1<kBGRA_Order>;
1148 } else {
1149 load = load_rgb_from_tables<kBGRA_Order>;
1150 load_1 = load_rgb_from_tables_1<kBGRA_Order>;
1140 } 1151 }
1141 break; 1152 break;
1142 } 1153 }
1143 1154
1144 StoreFn store; 1155 StoreFn store;
1145 Store1Fn store_1; 1156 Store1Fn store_1;
1146 size_t sizeOfDstPixel; 1157 size_t sizeOfDstPixel;
1147 switch (kDst) { 1158 switch (kDst) {
1148 case k8888_Linear_DstFormat: 1159 case kRGBA_8888_Linear_DstFormat:
1149 store = store_linear<kSwapRB>; 1160 store = store_linear<kRGBA_Order>;
1150 store_1 = store_linear_1<kSwapRB>; 1161 store_1 = store_linear_1<kRGBA_Order>;
1151 sizeOfDstPixel = 4; 1162 sizeOfDstPixel = 4;
1152 break; 1163 break;
1153 case k8888_SRGB_DstFormat: 1164 case kRGBA_8888_SRGB_DstFormat:
1154 store = store_srgb<kSwapRB>; 1165 store = store_srgb<kRGBA_Order>;
1155 store_1 = store_srgb_1<kSwapRB>; 1166 store_1 = store_srgb_1<kRGBA_Order>;
1156 sizeOfDstPixel = 4; 1167 sizeOfDstPixel = 4;
1157 break; 1168 break;
1158 case k8888_2Dot2_DstFormat: 1169 case kRGBA_8888_2Dot2_DstFormat:
1159 store = store_2dot2<kSwapRB>; 1170 store = store_2dot2<kRGBA_Order>;
1160 store_1 = store_2dot2_1<kSwapRB>; 1171 store_1 = store_2dot2_1<kRGBA_Order>;
1161 sizeOfDstPixel = 4; 1172 sizeOfDstPixel = 4;
1162 break; 1173 break;
1163 case k8888_Table_DstFormat: 1174 case kRGBA_8888_Table_DstFormat:
1164 store = store_generic<kSwapRB>; 1175 store = store_generic<kRGBA_Order>;
1165 store_1 = store_generic_1<kSwapRB>; 1176 store_1 = store_generic_1<kRGBA_Order>;
1177 sizeOfDstPixel = 4;
1178 break;
1179 case kBGRA_8888_Linear_DstFormat:
1180 store = store_linear<kBGRA_Order>;
1181 store_1 = store_linear_1<kBGRA_Order>;
1182 sizeOfDstPixel = 4;
1183 break;
1184 case kBGRA_8888_SRGB_DstFormat:
1185 store = store_srgb<kBGRA_Order>;
1186 store_1 = store_srgb_1<kBGRA_Order>;
1187 sizeOfDstPixel = 4;
1188 break;
1189 case kBGRA_8888_2Dot2_DstFormat:
1190 store = store_2dot2<kBGRA_Order>;
1191 store_1 = store_2dot2_1<kBGRA_Order>;
1192 sizeOfDstPixel = 4;
1193 break;
1194 case kBGRA_8888_Table_DstFormat:
1195 store = store_generic<kBGRA_Order>;
1196 store_1 = store_generic_1<kBGRA_Order>;
1166 sizeOfDstPixel = 4; 1197 sizeOfDstPixel = 4;
1167 break; 1198 break;
1168 case kF16_Linear_DstFormat: 1199 case kF16_Linear_DstFormat:
1169 store = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_opaque<kSw apRB> : 1200 store = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_opaque<kRG BA_Order> :
1170 store_f16<kSwapRB>; 1201 store_f16<kRGBA_Orde r>;
1171 store_1 = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_1_opaque<k SwapRB> : 1202 store_1 = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_1_opaque<k RGBA_Order> :
1172 store_f16_1<kSwapRB> ; 1203 store_f16_1<kRGBA_Or der>;
1173 sizeOfDstPixel = 8; 1204 sizeOfDstPixel = 8;
1174 break; 1205 break;
1175 case kF32_Linear_DstFormat: 1206 case kF32_Linear_DstFormat:
1176 store = store_f32<kSwapRB>; 1207 store = store_f32<kRGBA_Order>;
1177 store_1 = store_f32_1<kSwapRB>; 1208 store_1 = store_f32_1<kRGBA_Order>;
1178 sizeOfDstPixel = 16; 1209 sizeOfDstPixel = 16;
1179 break; 1210 break;
1180 } 1211 }
1181 1212
1182 do_color_xform<kAlphaType, kCSM> 1213 do_color_xform<kAlphaType, kCSM>
1183 (dst, src, len, srcTables, matrix, dstTables, load, load_1, store, s tore_1, 1214 (dst, src, len, srcTables, matrix, dstTables, load, load_1, store, s tore_1,
1184 sizeOfDstPixel); 1215 sizeOfDstPixel);
1185 } 1216 }
1186 1217
1187 //////////////////////////////////////////////////////////////////////////////// /////////////////// 1218 //////////////////////////////////////////////////////////////////////////////// ///////////////////
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 1256
1226 const bool srcGammasAreMatching = (1 >= numSrcTables); 1257 const bool srcGammasAreMatching = (1 >= numSrcTables);
1227 const bool dstGammasAreMatching = (1 >= numDstTables); 1258 const bool dstGammasAreMatching = (1 >= numDstTables);
1228 build_gamma_tables(fSrcGammaTables, srcStorage, 256, srcSpace, kToLinear, sr cGammasAreMatching); 1259 build_gamma_tables(fSrcGammaTables, srcStorage, 256, srcSpace, kToLinear, sr cGammasAreMatching);
1229 build_gamma_tables(fDstGammaTables, dstStorage, kDstGammaTableSize, dstSpace , kFromLinear, 1260 build_gamma_tables(fDstGammaTables, dstStorage, kDstGammaTableSize, dstSpace , kFromLinear,
1230 dstGammasAreMatching); 1261 dstGammasAreMatching);
1231 } 1262 }
1232 1263
1233 //////////////////////////////////////////////////////////////////////////////// /////////////////// 1264 //////////////////////////////////////////////////////////////////////////////// ///////////////////
1234 1265
1235 template <SrcFormat kSrc, DstFormat kDst, ColorSpaceMatch kCSM, SwapRB kSwap> 1266 template <SrcFormat kSrc, DstFormat kDst, ColorSpaceMatch kCSM>
1236 static inline void apply_set_alpha(void* dst, const uint32_t* src, int len, SkAl phaType alphaType, 1267 static inline void apply_set_alpha(void* dst, const uint32_t* src, int len, SkAl phaType alphaType,
1237 const float* const srcTables[3], const float matrix[16], 1268 const float* const srcTables[3], const float matrix[16],
1238 const uint8_t* const dstTables[3]) { 1269 const uint8_t* const dstTables[3]) {
1239 switch (alphaType) { 1270 switch (alphaType) {
1240 case kOpaque_SkAlphaType: 1271 case kOpaque_SkAlphaType:
1241 return color_xform_RGBA<kSrc, kDst, kOpaque_SkAlphaType, kCSM, kSwap > 1272 return color_xform_RGBA<kSrc, kDst, kOpaque_SkAlphaType, kCSM>
1242 (dst, src, len, srcTables, matrix, dstTables); 1273 (dst, src, len, srcTables, matrix, dstTables);
1243 case kPremul_SkAlphaType: 1274 case kPremul_SkAlphaType:
1244 return color_xform_RGBA<kSrc, kDst, kPremul_SkAlphaType, kCSM, kSwap > 1275 return color_xform_RGBA<kSrc, kDst, kPremul_SkAlphaType, kCSM>
1245 (dst, src, len, srcTables, matrix, dstTables); 1276 (dst, src, len, srcTables, matrix, dstTables);
1246 case kUnpremul_SkAlphaType: 1277 case kUnpremul_SkAlphaType:
1247 return color_xform_RGBA<kSrc, kDst, kUnpremul_SkAlphaType, kCSM, kSw ap> 1278 return color_xform_RGBA<kSrc, kDst, kUnpremul_SkAlphaType, kCSM>
1248 (dst, src, len, srcTables, matrix, dstTables); 1279 (dst, src, len, srcTables, matrix, dstTables);
1249 default: 1280 default:
1250 SkASSERT(false); 1281 SkASSERT(false);
1251 return; 1282 return;
1252 } 1283 }
1253 } 1284 }
1254 1285
1255 template <SrcGamma kSrc, DstFormat kDst, ColorSpaceMatch kCSM, SwapRB kSwap> 1286 template <SrcGamma kSrc, DstFormat kDst, ColorSpaceMatch kCSM>
1256 static inline void apply_set_src(void* dst, const uint32_t* src, int len, SkAlph aType alphaType, 1287 static inline void apply_set_src(void* dst, const uint32_t* src, int len, SkAlph aType alphaType,
1257 const float* const srcTables[3], const float ma trix[16], 1288 const float* const srcTables[3], const float ma trix[16],
1258 const uint8_t* const dstTables[3]) { 1289 const uint8_t* const dstTables[3],
1259 switch (kSrc) { 1290 SkColorSpaceXform::ColorFormat srcColorFormat) {
1260 case kLinear_SrcGamma: 1291 switch (srcColorFormat) {
1261 return apply_set_alpha<kRGBA_8888_Linear_SrcFormat, kDst, kCSM, kSwa p> 1292 case SkColorSpaceXform::kRGBA_8888_ColorFormat:
1262 (dst, src, len, alphaType, nullptr, matrix, dstTables); 1293 switch (kSrc) {
1263 case kTable_SrcGamma: 1294 case kLinear_SrcGamma:
1264 return apply_set_alpha<kRGBA_8888_Table_SrcFormat, kDst, kCSM, kSwap > 1295 return apply_set_alpha<kRGBA_8888_Linear_SrcFormat, kDst, kC SM>
1265 (dst, src, len, alphaType, srcTables, matrix, dstTables); 1296 (dst, src, len, alphaType, nullptr, matrix, dstTable s);
1297 case kTable_SrcGamma:
1298 return apply_set_alpha<kRGBA_8888_Table_SrcFormat, kDst, kCS M>
1299 (dst, src, len, alphaType, srcTables, matrix, dstTab les);
1300 }
1301 case SkColorSpaceXform::kBGRA_8888_ColorFormat:
1302 switch (kSrc) {
1303 case kLinear_SrcGamma:
1304 return apply_set_alpha<kBGRA_8888_Linear_SrcFormat, kDst, kC SM>
1305 (dst, src, len, alphaType, nullptr, matrix, dstTable s);
1306 case kTable_SrcGamma:
1307 return apply_set_alpha<kBGRA_8888_Table_SrcFormat, kDst, kCS M>
1308 (dst, src, len, alphaType, srcTables, matrix, dstTab les);
1309 }
1310 default:
1311 SkASSERT(false);
1266 } 1312 }
1267 } 1313 }
1268 1314
1269 template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> 1315 template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM>
1270 void SkColorSpaceXform_Base<kSrc, kDst, kCSM> 1316 void SkColorSpaceXform_Base<kSrc, kDst, kCSM>
1271 ::apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, SkA lphaType alphaType) 1317 ::apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat,
1318 ColorFormat srcColorFormat, SkAlphaType alphaType)
1272 const 1319 const
1273 { 1320 {
1274 if (kFull_ColorSpaceMatch == kCSM) { 1321 if (kFull_ColorSpaceMatch == kCSM) {
1275 switch (alphaType) { 1322 switch (alphaType) {
1276 case kPremul_SkAlphaType: 1323 case kPremul_SkAlphaType:
1277 // We can't skip the xform since we need to perform a premultipl y in the 1324 // We can't skip the xform since we need to perform a premultipl y in the
1278 // linear space. 1325 // linear space.
1279 break; 1326 break;
1280 default: 1327 default:
1281 switch (dstColorFormat) { 1328 switch (dstColorFormat) {
(...skipping 22 matching lines...) Expand all
1304 #endif 1351 #endif
1305 1352
1306 handle_color_lut((uint32_t*) storage.get(), src, len, fColorLUT.get()); 1353 handle_color_lut((uint32_t*) storage.get(), src, len, fColorLUT.get());
1307 src = (const uint32_t*) storage.get(); 1354 src = (const uint32_t*) storage.get();
1308 } 1355 }
1309 1356
1310 switch (dstColorFormat) { 1357 switch (dstColorFormat) {
1311 case kRGBA_8888_ColorFormat: 1358 case kRGBA_8888_ColorFormat:
1312 switch (kDst) { 1359 switch (kDst) {
1313 case kLinear_DstGamma: 1360 case kLinear_DstGamma:
1314 return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kNo _SwapRB> 1361 return apply_set_src<kSrc, kRGBA_8888_Linear_DstFormat, kCSM >
1315 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1362 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1363 srcColorFormat);
1316 case kSRGB_DstGamma: 1364 case kSRGB_DstGamma:
1317 return apply_set_src<kSrc, k8888_SRGB_DstFormat, kCSM, kNo_S wapRB> 1365 return apply_set_src<kSrc, kRGBA_8888_SRGB_DstFormat, kCSM>
1318 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1366 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1367 srcColorFormat);
1319 case k2Dot2_DstGamma: 1368 case k2Dot2_DstGamma:
1320 return apply_set_src<kSrc, k8888_2Dot2_DstFormat, kCSM, kNo_ SwapRB> 1369 return apply_set_src<kSrc, kRGBA_8888_2Dot2_DstFormat, kCSM>
1321 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1370 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1371 srcColorFormat);
1322 case kTable_DstGamma: 1372 case kTable_DstGamma:
1323 return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kNo_ SwapRB> 1373 return apply_set_src<kSrc, kRGBA_8888_Table_DstFormat, kCSM>
1324 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, fDstGammaTables); 1374 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, fDstGammaTables,
1375 srcColorFormat);
1325 } 1376 }
1326 case kBGRA_8888_ColorFormat: 1377 case kBGRA_8888_ColorFormat:
1327 switch (kDst) { 1378 switch (kDst) {
1328 case kLinear_DstGamma: 1379 case kLinear_DstGamma:
1329 return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kYe s_SwapRB> 1380 return apply_set_src<kSrc, kBGRA_8888_Linear_DstFormat, kCSM >
1330 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1381 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1382 srcColorFormat);
1331 case kSRGB_DstGamma: 1383 case kSRGB_DstGamma:
1332 return apply_set_src<kSrc, k8888_SRGB_DstFormat, kCSM, kYes_ SwapRB> 1384 return apply_set_src<kSrc, kBGRA_8888_SRGB_DstFormat, kCSM>
1333 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1385 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1386 srcColorFormat);
1334 case k2Dot2_DstGamma: 1387 case k2Dot2_DstGamma:
1335 return apply_set_src<kSrc, k8888_2Dot2_DstFormat, kCSM, kYes _SwapRB> 1388 return apply_set_src<kSrc, kBGRA_8888_2Dot2_DstFormat, kCSM>
1336 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1389 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1390 srcColorFormat);
1337 case kTable_DstGamma: 1391 case kTable_DstGamma:
1338 return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kYes _SwapRB> 1392 return apply_set_src<kSrc, kBGRA_8888_Table_DstFormat, kCSM>
1339 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, fDstGammaTables); 1393 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, fDstGammaTables,
1394 srcColorFormat);
1340 } 1395 }
1341 case kRGBA_F16_ColorFormat: 1396 case kRGBA_F16_ColorFormat:
1342 switch (kDst) { 1397 switch (kDst) {
1343 case kLinear_DstGamma: 1398 case kLinear_DstGamma:
1344 return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM, kNo_ SwapRB> 1399 return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM>
1345 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1400 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1401 srcColorFormat);
1346 default: 1402 default:
1347 SkASSERT(false); 1403 SkASSERT(false);
1348 return; 1404 return;
1349 } 1405 }
1350 case kRGBA_F32_ColorFormat: 1406 case kRGBA_F32_ColorFormat:
1351 switch (kDst) { 1407 switch (kDst) {
1352 case kLinear_DstGamma: 1408 case kLinear_DstGamma:
1353 return apply_set_src<kSrc, kF32_Linear_DstFormat, kCSM, kNo_ SwapRB> 1409 return apply_set_src<kSrc, kF32_Linear_DstFormat, kCSM>
1354 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr); 1410 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs t, nullptr,
1411 srcColorFormat);
1355 default: 1412 default:
1356 SkASSERT(false); 1413 SkASSERT(false);
1357 return; 1414 return;
1358 } 1415 }
1359 default: 1416 default:
1360 SkASSERT(false); 1417 SkASSERT(false);
1361 return; 1418 return;
1362 } 1419 }
1363 } 1420 }
1364 1421
1365 //////////////////////////////////////////////////////////////////////////////// /////////////////// 1422 //////////////////////////////////////////////////////////////////////////////// ///////////////////
1366 1423
1367 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace* space) { 1424 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace* space) {
1368 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base 1425 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base
1369 <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> 1426 <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch>
1370 (space, SkMatrix::I(), space)); 1427 (space, SkMatrix::I(), space));
1371 } 1428 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698