Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(768)

Side by Side Diff: src/core/SkXfermode.cpp

Issue 104883004: ARM Skia NEON patches - 32 - Xfermode: 1-pixel NEON modeprocs (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/opts/SkXfermode_opts_arm_neon.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/opts/SkXfermode_opts_arm_neon.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698