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