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