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 |