OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
117 // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] | 117 // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] |
118 static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) { | 118 static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) { |
119 return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst))); | 119 return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst))); |
120 } | 120 } |
121 | 121 |
122 // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] | 122 // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] |
123 static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) { | 123 static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) { |
124 return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); | 124 return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); |
125 } | 125 } |
126 | 126 |
127 #if !SK_ARM_NEON_IS_ALWAYS | |
djsollen
2013/12/05 15:11:36
I would like to remove this. I think we could do
kevin.petit.not.used.account
2013/12/05 17:02:46
Done. I've used a factory approach, like suggested
| |
127 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] | 128 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] |
128 static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { | 129 static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { |
129 unsigned sa = SkGetPackedA32(src); | 130 unsigned sa = SkGetPackedA32(src); |
130 unsigned da = SkGetPackedA32(dst); | 131 unsigned da = SkGetPackedA32(dst); |
131 unsigned isa = 255 - sa; | 132 unsigned isa = 255 - sa; |
132 | 133 |
133 return SkPackARGB32(da, | 134 return SkPackARGB32(da, |
134 SkAlphaMulAlpha(da, SkGetPackedR32(src)) + | 135 SkAlphaMulAlpha(da, SkGetPackedR32(src)) + |
135 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), | 136 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), |
136 SkAlphaMulAlpha(da, SkGetPackedG32(src)) + | 137 SkAlphaMulAlpha(da, SkGetPackedG32(src)) + |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 } | 183 } |
183 | 184 |
184 // kModulate_Mode | 185 // kModulate_Mode |
185 static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { | 186 static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { |
186 int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst)); | 187 int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst)); |
187 int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst)); | 188 int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst)); |
188 int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst)); | 189 int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst)); |
189 int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst)); | 190 int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst)); |
190 return SkPackARGB32(a, r, g, b); | 191 return SkPackARGB32(a, r, g, b); |
191 } | 192 } |
193 #endif | |
192 | 194 |
193 static inline int srcover_byte(int a, int b) { | 195 static inline int srcover_byte(int a, int b) { |
194 return a + b - SkAlphaMulAlpha(a, b); | 196 return a + b - SkAlphaMulAlpha(a, b); |
195 } | 197 } |
196 | 198 |
197 // kMultiply_Mode | 199 // kMultiply_Mode |
198 // B(Cb, Cs) = Cb x Cs | 200 // B(Cb, Cs) = Cb x Cs |
199 // multiply uses its own version of blendfunc_byte because sa and da are not nee ded | 201 // multiply uses its own version of blendfunc_byte because sa and da are not nee ded |
200 static int blendfunc_multiply_byte(int sc, int dc, int sa, int da) { | 202 static int blendfunc_multiply_byte(int sc, int dc, int sa, int da) { |
201 return clamp_div255round(sc * (255 - da) + dc * (255 - sa) + sc * dc); | 203 return clamp_div255round(sc * (255 - da) + dc * (255 - sa) + sc * dc); |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
624 } | 626 } |
625 | 627 |
626 int a = srcover_byte(sa, da); | 628 int a = srcover_byte(sa, da); |
627 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); | 629 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); |
628 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); | 630 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); |
629 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); | 631 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); |
630 return SkPackARGB32(a, r, g, b); | 632 return SkPackARGB32(a, r, g, b); |
631 } | 633 } |
632 | 634 |
633 const ProcCoeff gProcCoeffs[] = { | 635 const ProcCoeff gProcCoeffs[] = { |
634 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, | 636 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermo de::kZero_Coeff }, |
635 { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, | 637 { src_modeproc, SkXfermode::kOne_Coeff, SkXfermo de::kZero_Coeff }, |
636 { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, | 638 { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermo de::kOne_Coeff }, |
637 { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, | 639 { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermo de::kISA_Coeff }, |
638 { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, | 640 { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermo de::kOne_Coeff }, |
639 { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, | 641 { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermo de::kZero_Coeff }, |
640 { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, | 642 { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermo de::kSA_Coeff }, |
641 { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, | 643 { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermo de::kZero_Coeff }, |
642 { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, | 644 { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermo de::kISA_Coeff }, |
643 { srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, | 645 { SK_ARM_NEON_WRAP(srcatop_modeproc), SkXfermode::kDA_Coeff, SkXfermo de::kISA_Coeff }, |
djsollen
2013/12/05 14:17:05
this is going to be problematic on chrome as their
kevin.petit.not.used.account
2013/12/05 17:02:46
I thought that would be problematic in a way or an
| |
644 { dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, | 646 { SK_ARM_NEON_WRAP(dstatop_modeproc), SkXfermode::kIDA_Coeff, SkXfermo de::kSA_Coeff }, |
645 { xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, | 647 { SK_ARM_NEON_WRAP(xor_modeproc), SkXfermode::kIDA_Coeff, SkXfermo de::kISA_Coeff }, |
646 | 648 |
647 { plus_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff }, | 649 { SK_ARM_NEON_WRAP(plus_modeproc), SkXfermode::kOne_Coeff, SkXfermo de::kOne_Coeff }, |
648 { modulate_modeproc,SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, | 650 { SK_ARM_NEON_WRAP(modulate_modeproc), SkXfermode::kZero_Coeff, SkXfermo de::kSC_Coeff }, |
649 { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, | 651 { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermo de::kISC_Coeff }, |
650 { overlay_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 652 { overlay_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
651 { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 653 { darken_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
652 { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 654 { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
653 { colordodge_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 655 { colordodge_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
654 { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 656 { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
655 { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 657 { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
656 { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 658 { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
657 { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 659 { difference_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
658 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 660 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
659 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 661 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
660 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 662 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
661 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 663 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
662 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 664 { color_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
663 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 665 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
664 }; | 666 }; |
665 | 667 |
666 /////////////////////////////////////////////////////////////////////////////// | 668 /////////////////////////////////////////////////////////////////////////////// |
667 | 669 |
668 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { | 670 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { |
669 return false; | 671 return false; |
670 } | 672 } |
671 | 673 |
672 bool SkXfermode::asMode(Mode* mode) const { | 674 bool SkXfermode::asMode(Mode* mode) const { |
673 return false; | 675 return false; |
(...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1963 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1965 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1964 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1966 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1965 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1966 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1968 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1969 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1968 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1969 #if !SK_ARM_NEON_IS_NONE | 1971 #if !SK_ARM_NEON_IS_NONE |
1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) | 1972 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) |
1971 #endif | 1973 #endif |
1972 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1974 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |