OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |