| 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 |