| 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 "SkColorSpaceXform.h" | 10 #include "SkColorSpaceXform.h" |
| (...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 626 const SkMatrix44& srcToDst, | 626 const SkMatrix44& srcToDst, |
| 627 const sk_sp<SkColorSpace>& d
stSpace) | 627 const sk_sp<SkColorSpace>& d
stSpace) |
| 628 : fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) | 628 : fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) |
| 629 { | 629 { |
| 630 srcToDst.asRowMajorf(fSrcToDst); | 630 srcToDst.asRowMajorf(fSrcToDst); |
| 631 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT
oLinear); | 631 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT
oLinear); |
| 632 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSiz
e, | 632 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSiz
e, |
| 633 dstSpace, kFromLinear); | 633 dstSpace, kFromLinear); |
| 634 } | 634 } |
| 635 | 635 |
| 636 template <> | 636 template <SkColorSpace::GammaNamed kDst> |
| 637 void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> | 637 void SkColorSpaceXform_Base<kDst> |
| 638 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const | 638 ::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlp
haType dstAlphaType) |
| 639 const |
| 639 { | 640 { |
| 640 if (fColorLUT) { | 641 if (fColorLUT) { |
| 641 handle_color_lut(dst, src, len, fColorLUT.get()); | 642 size_t storageBytes = len * sizeof(uint32_t); |
| 642 src = dst; | 643 #if defined(GOOGLE3) |
| 644 // Stack frame size is limited in GOOGLE3. |
| 645 SkAutoSMalloc<256 * sizeof(uint32_t)> storage(storageBytes); |
| 646 #else |
| 647 SkAutoSMalloc<1024 * sizeof(uint32_t)> storage(storageBytes); |
| 648 #endif |
| 649 |
| 650 handle_color_lut((uint32_t*) storage.get(), src, len, fColorLUT.get()); |
| 651 src = (const uint32_t*) storage.get(); |
| 643 } | 652 } |
| 644 | 653 |
| 645 color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, false> | 654 switch (dstAlphaType) { |
| 646 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | 655 case kPremul_SkAlphaType: |
| 656 switch (dstColorType) { |
| 657 case kRGBA_8888_SkColorType: |
| 658 return color_xform_RGBA<kDst, kPremul_SkAlphaType, kNo_SwapR
B> |
| 659 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 660 case kBGRA_8888_SkColorType: |
| 661 return color_xform_RGBA<kDst, kPremul_SkAlphaType, kYes_Swap
RB> |
| 662 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 663 case kRGBA_F16_SkColorType: |
| 664 return color_xform_RGBA |
| 665 <SkColorSpace::kLinear_GammaNamed, kPremul_SkAlphaTy
pe, kNo_SwapRB> |
| 666 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 667 default: |
| 668 SkASSERT(false); |
| 669 return; |
| 670 } |
| 671 break; |
| 672 case kUnpremul_SkAlphaType: |
| 673 switch (dstColorType) { |
| 674 case kRGBA_8888_SkColorType: |
| 675 return color_xform_RGBA<kDst, kUnpremul_SkAlphaType, kNo_Swa
pRB> |
| 676 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 677 case kBGRA_8888_SkColorType: |
| 678 return color_xform_RGBA<kDst, kUnpremul_SkAlphaType, kYes_Sw
apRB> |
| 679 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 680 case kRGBA_F16_SkColorType: |
| 681 return color_xform_RGBA |
| 682 <SkColorSpace::kLinear_GammaNamed, kUnpremul_SkAlpha
Type, kNo_SwapRB> |
| 683 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 684 default: |
| 685 SkASSERT(false); |
| 686 return; |
| 687 } |
| 688 case kOpaque_SkAlphaType: |
| 689 switch (dstColorType) { |
| 690 case kRGBA_8888_SkColorType: |
| 691 return color_xform_RGBA<kDst, kOpaque_SkAlphaType, kNo_SwapR
B> |
| 692 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 693 case kBGRA_8888_SkColorType: |
| 694 return color_xform_RGBA<kDst, kOpaque_SkAlphaType, kYes_Swap
RB> |
| 695 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 696 case kRGBA_F16_SkColorType: |
| 697 return color_xform_RGBA |
| 698 <SkColorSpace::kLinear_GammaNamed, kOpaque_SkAlphaTy
pe, kNo_SwapRB> |
| 699 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
| 700 default: |
| 701 SkASSERT(false); |
| 702 return; |
| 703 } |
| 704 default: |
| 705 SkASSERT(false); |
| 706 return; |
| 707 } |
| 647 } | 708 } |
| 648 | |
| 649 template <> | |
| 650 void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> | |
| 651 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const | |
| 652 { | |
| 653 if (fColorLUT) { | |
| 654 handle_color_lut(dst, src, len, fColorLUT.get()); | |
| 655 src = dst; | |
| 656 } | |
| 657 | |
| 658 color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, false> | |
| 659 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | |
| 660 } | |
| 661 | |
| 662 template <> | |
| 663 void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> | |
| 664 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const | |
| 665 { | |
| 666 if (fColorLUT) { | |
| 667 handle_color_lut(dst, src, len, fColorLUT.get()); | |
| 668 src = dst; | |
| 669 } | |
| 670 | |
| 671 color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, false> | |
| 672 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | |
| 673 } | |
| 674 | |
| 675 template <> | |
| 676 void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> | |
| 677 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const | |
| 678 { | |
| 679 if (fColorLUT) { | |
| 680 handle_color_lut(dst, src, len, fColorLUT.get()); | |
| 681 src = dst; | |
| 682 } | |
| 683 | |
| 684 color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, true> | |
| 685 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | |
| 686 } | |
| 687 | |
| 688 template <> | |
| 689 void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> | |
| 690 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const | |
| 691 { | |
| 692 if (fColorLUT) { | |
| 693 handle_color_lut(dst, src, len, fColorLUT.get()); | |
| 694 src = dst; | |
| 695 } | |
| 696 | |
| 697 color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, true> | |
| 698 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | |
| 699 } | |
| 700 | |
| 701 template <> | |
| 702 void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> | |
| 703 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const | |
| 704 { | |
| 705 if (fColorLUT) { | |
| 706 handle_color_lut(dst, src, len, fColorLUT.get()); | |
| 707 src = dst; | |
| 708 } | |
| 709 | |
| 710 color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, true> | |
| 711 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | |
| 712 } | |
| 713 | |
| 714 template <SkColorSpace::GammaNamed T> | |
| 715 void SkColorSpaceXform_Base<T> | |
| 716 ::applyToF16(RGBAF16* dst, const RGBA32* src, int len) const | |
| 717 { | |
| 718 if (fColorLUT) { | |
| 719 size_t storageBytes = len * sizeof(RGBA32); | |
| 720 #if defined(GOOGLE3) | |
| 721 // Stack frame size is limited in GOOGLE3. | |
| 722 SkAutoSMalloc<256 * sizeof(RGBA32)> storage(storageBytes); | |
| 723 #else | |
| 724 SkAutoSMalloc<1024 * sizeof(RGBA32)> storage(storageBytes); | |
| 725 #endif | |
| 726 | |
| 727 handle_color_lut((RGBA32*) storage.get(), src, len, fColorLUT.get()); | |
| 728 src = (const RGBA32*) storage.get(); | |
| 729 } | |
| 730 | |
| 731 color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, false, false> | |
| 732 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); | |
| 733 } | |
| OLD | NEW |