Chromium Code Reviews| 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 |