OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 "SkXfermode.h" | 8 #include "SkXfermode.h" |
9 #include "SkXfermode_proccoeff.h" | 9 #include "SkXfermode_proccoeff.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 29 matching lines...) Expand all Loading... | |
40 if (prod <= 0) { | 40 if (prod <= 0) { |
41 return 0; | 41 return 0; |
42 } else if (prod >= 255*255) { | 42 } else if (prod >= 255*255) { |
43 return 255; | 43 return 255; |
44 } else { | 44 } else { |
45 return SkDiv255Round(prod); | 45 return SkDiv255Round(prod); |
46 } | 46 } |
47 } | 47 } |
48 | 48 |
49 /////////////////////////////////////////////////////////////////////////////// | 49 /////////////////////////////////////////////////////////////////////////////// |
50 #include "SkNx.h" | |
51 | |
52 static SkPM4f as_pm4f(const Sk4f& x) { | |
53 SkPM4f pm4; | |
54 x.store(pm4.fVec); | |
55 return pm4; | |
56 } | |
57 | |
58 static Sk4f as_4f(const SkPM4f& pm4) { | |
59 return Sk4f::Load(pm4.fVec); | |
60 } | |
61 | |
62 static SkPM4f not_implemented_yet_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
63 return {{ 0.5f, 1.0f, 0.25f, 0.5f }}; | |
64 } | |
50 | 65 |
51 // kClear_Mode, //!< [0, 0] | 66 // kClear_Mode, //!< [0, 0] |
52 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { | 67 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { |
53 return 0; | 68 return 0; |
54 } | 69 } |
70 static SkPM4f clear_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
71 return{{ 0, 0, 0, 0 }}; | |
72 } | |
55 | 73 |
56 // kSrc_Mode, //!< [Sa, Sc] | 74 // kSrc_Mode, //!< [Sa, Sc] |
57 static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) { | 75 static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) { |
58 return src; | 76 return src; |
59 } | 77 } |
78 static SkPM4f src_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
79 return src; | |
80 } | |
60 | 81 |
61 // kDst_Mode, //!< [Da, Dc] | 82 // kDst_Mode, //!< [Da, Dc] |
62 static SkPMColor dst_modeproc(SkPMColor src, SkPMColor dst) { | 83 static SkPMColor dst_modeproc(SkPMColor src, SkPMColor dst) { |
63 return dst; | 84 return dst; |
64 } | 85 } |
86 static SkPM4f dst_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
87 return dst; | |
88 } | |
65 | 89 |
66 // kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc] | 90 // kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc] |
67 static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) { | 91 static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) { |
68 #if 0 | 92 #if 0 |
69 // this is the old, more-correct way, but it doesn't guarantee that dst==255 | 93 // this is the old, more-correct way, but it doesn't guarantee that dst==255 |
70 // will always stay opaque | 94 // will always stay opaque |
71 return src + SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); | 95 return src + SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); |
72 #else | 96 #else |
73 // this is slightly faster, but more importantly guarantees that dst==255 | 97 // this is slightly faster, but more importantly guarantees that dst==255 |
74 // will always stay opaque | 98 // will always stay opaque |
75 return src + SkAlphaMulQ(dst, 256 - SkGetPackedA32(src)); | 99 return src + SkAlphaMulQ(dst, 256 - SkGetPackedA32(src)); |
76 #endif | 100 #endif |
77 } | 101 } |
102 static SkPM4f srcover_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
mtklein
2016/02/08 18:27:22
Maybe we can make these easier to read with some l
reed1
2016/02/08 19:52:49
Done.
| |
103 return as_pm4f(as_4f(src) + as_4f(dst) * Sk4f(1 - src.a())); | |
104 } | |
78 | 105 |
79 // kDstOver_Mode, //!< [Sa + Da - Sa*Da, Dc + (1 - Da)*Sc] | 106 // kDstOver_Mode, //!< [Sa + Da - Sa*Da, Dc + (1 - Da)*Sc] |
80 static SkPMColor dstover_modeproc(SkPMColor src, SkPMColor dst) { | 107 static SkPMColor dstover_modeproc(SkPMColor src, SkPMColor dst) { |
81 // this is the reverse of srcover, just flipping src and dst | 108 // this is the reverse of srcover, just flipping src and dst |
82 // see srcover's comment about the 256 for opaqueness guarantees | 109 // see srcover's comment about the 256 for opaqueness guarantees |
83 return dst + SkAlphaMulQ(src, 256 - SkGetPackedA32(dst)); | 110 return dst + SkAlphaMulQ(src, 256 - SkGetPackedA32(dst)); |
84 } | 111 } |
112 static SkPM4f dstover_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
113 return as_pm4f(as_4f(dst) + as_4f(src) * Sk4f(1 - dst.a())); | |
mtklein
2016/02/08 18:27:22
return srcover_proc4f(dst, src); etc ?
| |
114 } | |
85 | 115 |
86 // kSrcIn_Mode, //!< [Sa * Da, Sc * Da] | 116 // kSrcIn_Mode, //!< [Sa * Da, Sc * Da] |
87 static SkPMColor srcin_modeproc(SkPMColor src, SkPMColor dst) { | 117 static SkPMColor srcin_modeproc(SkPMColor src, SkPMColor dst) { |
88 return SkAlphaMulQ(src, SkAlpha255To256(SkGetPackedA32(dst))); | 118 return SkAlphaMulQ(src, SkAlpha255To256(SkGetPackedA32(dst))); |
89 } | 119 } |
120 static SkPM4f srcin_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
121 return as_pm4f(as_4f(src) * Sk4f(dst.a())); | |
122 } | |
90 | 123 |
91 // kDstIn_Mode, //!< [Sa * Da, Sa * Dc] | 124 // kDstIn_Mode, //!< [Sa * Da, Sa * Dc] |
92 static SkPMColor dstin_modeproc(SkPMColor src, SkPMColor dst) { | 125 static SkPMColor dstin_modeproc(SkPMColor src, SkPMColor dst) { |
93 return SkAlphaMulQ(dst, SkAlpha255To256(SkGetPackedA32(src))); | 126 return SkAlphaMulQ(dst, SkAlpha255To256(SkGetPackedA32(src))); |
94 } | 127 } |
128 static SkPM4f dstin_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
129 return as_pm4f(as_4f(dst) * Sk4f(src.a())); | |
130 } | |
95 | 131 |
96 // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] | 132 // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] |
97 static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) { | 133 static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) { |
98 return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst))); | 134 return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst))); |
99 } | 135 } |
136 static SkPM4f srcout_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
137 return as_pm4f(as_4f(src) * Sk4f(1 - dst.a())); | |
138 } | |
100 | 139 |
101 // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] | 140 // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] |
102 static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) { | 141 static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) { |
103 return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); | 142 return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); |
104 } | 143 } |
144 static SkPM4f dstout_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
145 return as_pm4f(as_4f(dst) * Sk4f(1 - src.a())); | |
146 } | |
105 | 147 |
106 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] | 148 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] |
107 static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { | 149 static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { |
108 unsigned sa = SkGetPackedA32(src); | 150 unsigned sa = SkGetPackedA32(src); |
109 unsigned da = SkGetPackedA32(dst); | 151 unsigned da = SkGetPackedA32(dst); |
110 unsigned isa = 255 - sa; | 152 unsigned isa = 255 - sa; |
111 | 153 |
112 return SkPackARGB32(da, | 154 return SkPackARGB32(da, |
113 SkAlphaMulAlpha(da, SkGetPackedR32(src)) + | 155 SkAlphaMulAlpha(da, SkGetPackedR32(src)) + |
114 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), | 156 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), |
115 SkAlphaMulAlpha(da, SkGetPackedG32(src)) + | 157 SkAlphaMulAlpha(da, SkGetPackedG32(src)) + |
116 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)), | 158 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)), |
117 SkAlphaMulAlpha(da, SkGetPackedB32(src)) + | 159 SkAlphaMulAlpha(da, SkGetPackedB32(src)) + |
118 SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); | 160 SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); |
119 } | 161 } |
162 static SkPM4f srcatop_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
163 return as_pm4f(as_4f(src) * Sk4f(dst.a()) + as_4f(dst) * Sk4f(1 - src.a())); | |
164 } | |
120 | 165 |
121 // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] | 166 // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] |
122 static SkPMColor dstatop_modeproc(SkPMColor src, SkPMColor dst) { | 167 static SkPMColor dstatop_modeproc(SkPMColor src, SkPMColor dst) { |
123 unsigned sa = SkGetPackedA32(src); | 168 unsigned sa = SkGetPackedA32(src); |
124 unsigned da = SkGetPackedA32(dst); | 169 unsigned da = SkGetPackedA32(dst); |
125 unsigned ida = 255 - da; | 170 unsigned ida = 255 - da; |
126 | 171 |
127 return SkPackARGB32(sa, | 172 return SkPackARGB32(sa, |
128 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) + | 173 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) + |
129 SkAlphaMulAlpha(sa, SkGetPackedR32(dst)), | 174 SkAlphaMulAlpha(sa, SkGetPackedR32(dst)), |
130 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) + | 175 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) + |
131 SkAlphaMulAlpha(sa, SkGetPackedG32(dst)), | 176 SkAlphaMulAlpha(sa, SkGetPackedG32(dst)), |
132 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + | 177 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + |
133 SkAlphaMulAlpha(sa, SkGetPackedB32(dst))); | 178 SkAlphaMulAlpha(sa, SkGetPackedB32(dst))); |
134 } | 179 } |
180 static SkPM4f dstatop_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
181 return as_pm4f(as_4f(dst) * Sk4f(src.a()) + as_4f(src) * Sk4f(1 - dst.a())); | |
182 } | |
135 | 183 |
136 // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] | 184 // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] |
137 static SkPMColor xor_modeproc(SkPMColor src, SkPMColor dst) { | 185 static SkPMColor xor_modeproc(SkPMColor src, SkPMColor dst) { |
138 unsigned sa = SkGetPackedA32(src); | 186 unsigned sa = SkGetPackedA32(src); |
139 unsigned da = SkGetPackedA32(dst); | 187 unsigned da = SkGetPackedA32(dst); |
140 unsigned isa = 255 - sa; | 188 unsigned isa = 255 - sa; |
141 unsigned ida = 255 - da; | 189 unsigned ida = 255 - da; |
142 | 190 |
143 return SkPackARGB32(sa + da - (SkAlphaMulAlpha(sa, da) << 1), | 191 return SkPackARGB32(sa + da - (SkAlphaMulAlpha(sa, da) << 1), |
144 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) + | 192 SkAlphaMulAlpha(ida, SkGetPackedR32(src)) + |
145 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), | 193 SkAlphaMulAlpha(isa, SkGetPackedR32(dst)), |
146 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) + | 194 SkAlphaMulAlpha(ida, SkGetPackedG32(src)) + |
147 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)), | 195 SkAlphaMulAlpha(isa, SkGetPackedG32(dst)), |
148 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + | 196 SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + |
149 SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); | 197 SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); |
150 } | 198 } |
199 static SkPM4f xor_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
200 return as_pm4f(as_4f(src) * Sk4f(1 - dst.a()) + as_4f(dst) * Sk4f(1 - src.a( ))); | |
201 } | |
151 | 202 |
152 /////////////////////////////////////////////////////////////////////////////// | 203 /////////////////////////////////////////////////////////////////////////////// |
153 | 204 |
154 // kPlus_Mode | 205 // kPlus_Mode |
155 static SkPMColor plus_modeproc(SkPMColor src, SkPMColor dst) { | 206 static SkPMColor plus_modeproc(SkPMColor src, SkPMColor dst) { |
156 unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst)); | 207 unsigned b = saturated_add(SkGetPackedB32(src), SkGetPackedB32(dst)); |
157 unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst)); | 208 unsigned g = saturated_add(SkGetPackedG32(src), SkGetPackedG32(dst)); |
158 unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst)); | 209 unsigned r = saturated_add(SkGetPackedR32(src), SkGetPackedR32(dst)); |
159 unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst)); | 210 unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst)); |
160 return SkPackARGB32(a, r, g, b); | 211 return SkPackARGB32(a, r, g, b); |
161 } | 212 } |
213 static SkPM4f plus_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
214 return as_pm4f(Sk4f::Min(as_4f(src) + as_4f(dst), Sk4f(1))); | |
215 } | |
162 | 216 |
163 // kModulate_Mode | 217 // kModulate_Mode |
164 static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { | 218 static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { |
165 int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst)); | 219 int a = SkAlphaMulAlpha(SkGetPackedA32(src), SkGetPackedA32(dst)); |
166 int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst)); | 220 int r = SkAlphaMulAlpha(SkGetPackedR32(src), SkGetPackedR32(dst)); |
167 int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst)); | 221 int g = SkAlphaMulAlpha(SkGetPackedG32(src), SkGetPackedG32(dst)); |
168 int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst)); | 222 int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst)); |
169 return SkPackARGB32(a, r, g, b); | 223 return SkPackARGB32(a, r, g, b); |
170 } | 224 } |
225 static SkPM4f modulate_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
226 return as_pm4f(as_4f(src) * as_4f(dst)); | |
227 } | |
171 | 228 |
172 static inline int srcover_byte(int a, int b) { | 229 static inline int srcover_byte(int a, int b) { |
173 return a + b - SkAlphaMulAlpha(a, b); | 230 return a + b - SkAlphaMulAlpha(a, b); |
174 } | 231 } |
175 | 232 |
176 // kMultiply_Mode | 233 // kMultiply_Mode |
177 // B(Cb, Cs) = Cb x Cs | 234 // B(Cb, Cs) = Cb x Cs |
178 // multiply uses its own version of blendfunc_byte because sa and da are not nee ded | 235 // multiply uses its own version of blendfunc_byte because sa and da are not nee ded |
179 static int blendfunc_multiply_byte(int sc, int dc, int sa, int da) { | 236 static int blendfunc_multiply_byte(int sc, int dc, int sa, int da) { |
180 return clamp_div255round(sc * (255 - da) + dc * (255 - sa) + sc * dc); | 237 return clamp_div255round(sc * (255 - da) + dc * (255 - sa) + sc * dc); |
181 } | 238 } |
182 | 239 |
183 static SkPMColor multiply_modeproc(SkPMColor src, SkPMColor dst) { | 240 static SkPMColor multiply_modeproc(SkPMColor src, SkPMColor dst) { |
184 int sa = SkGetPackedA32(src); | 241 int sa = SkGetPackedA32(src); |
185 int da = SkGetPackedA32(dst); | 242 int da = SkGetPackedA32(dst); |
186 int a = srcover_byte(sa, da); | 243 int a = srcover_byte(sa, da); |
187 int r = blendfunc_multiply_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa , da); | 244 int r = blendfunc_multiply_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa , da); |
188 int g = blendfunc_multiply_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa , da); | 245 int g = blendfunc_multiply_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa , da); |
189 int b = blendfunc_multiply_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa , da); | 246 int b = blendfunc_multiply_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa , da); |
190 return SkPackARGB32(a, r, g, b); | 247 return SkPackARGB32(a, r, g, b); |
191 } | 248 } |
249 static SkPM4f multiply_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
250 const Sk4f s4 = as_4f(src); | |
251 const Sk4f d4 = as_4f(dst); | |
252 const Sk4f r4 = s4 * Sk4f(1 - dst.a()) + d4 * Sk4f(1 - src.a()) + s4 * d4; | |
253 return as_pm4f(Sk4f::Min(r4, Sk4f(1))); | |
254 } | |
192 | 255 |
193 // kScreen_Mode | 256 // kScreen_Mode |
194 static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { | 257 static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { |
195 int a = srcover_byte(SkGetPackedA32(src), SkGetPackedA32(dst)); | 258 int a = srcover_byte(SkGetPackedA32(src), SkGetPackedA32(dst)); |
196 int r = srcover_byte(SkGetPackedR32(src), SkGetPackedR32(dst)); | 259 int r = srcover_byte(SkGetPackedR32(src), SkGetPackedR32(dst)); |
197 int g = srcover_byte(SkGetPackedG32(src), SkGetPackedG32(dst)); | 260 int g = srcover_byte(SkGetPackedG32(src), SkGetPackedG32(dst)); |
198 int b = srcover_byte(SkGetPackedB32(src), SkGetPackedB32(dst)); | 261 int b = srcover_byte(SkGetPackedB32(src), SkGetPackedB32(dst)); |
199 return SkPackARGB32(a, r, g, b); | 262 return SkPackARGB32(a, r, g, b); |
200 } | 263 } |
264 static SkPM4f screen_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
265 const Sk4f s4 = as_4f(src); | |
266 const Sk4f d4 = as_4f(dst); | |
267 return as_pm4f(s4 + d4 - s4 * d4); | |
268 } | |
201 | 269 |
202 // kOverlay_Mode | 270 // kOverlay_Mode |
203 static inline int overlay_byte(int sc, int dc, int sa, int da) { | 271 static inline int overlay_byte(int sc, int dc, int sa, int da) { |
204 int tmp = sc * (255 - da) + dc * (255 - sa); | 272 int tmp = sc * (255 - da) + dc * (255 - sa); |
205 int rc; | 273 int rc; |
206 if (2 * dc <= da) { | 274 if (2 * dc <= da) { |
207 rc = 2 * sc * dc; | 275 rc = 2 * sc * dc; |
208 } else { | 276 } else { |
209 rc = sa * da - 2 * (da - dc) * (sa - sc); | 277 rc = sa * da - 2 * (da - dc) * (sa - sc); |
210 } | 278 } |
211 return clamp_div255round(rc + tmp); | 279 return clamp_div255round(rc + tmp); |
212 } | 280 } |
213 static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) { | 281 static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) { |
214 int sa = SkGetPackedA32(src); | 282 int sa = SkGetPackedA32(src); |
215 int da = SkGetPackedA32(dst); | 283 int da = SkGetPackedA32(dst); |
216 int a = srcover_byte(sa, da); | 284 int a = srcover_byte(sa, da); |
217 int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 285 int r = overlay_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
218 int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 286 int g = overlay_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
219 int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 287 int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
220 return SkPackARGB32(a, r, g, b); | 288 return SkPackARGB32(a, r, g, b); |
221 } | 289 } |
290 static SkPM4f overlay_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
291 return not_implemented_yet_proc4f(src, dst); | |
292 } | |
222 | 293 |
223 // kDarken_Mode | 294 // kDarken_Mode |
224 static inline int darken_byte(int sc, int dc, int sa, int da) { | 295 static inline int darken_byte(int sc, int dc, int sa, int da) { |
225 int sd = sc * da; | 296 int sd = sc * da; |
226 int ds = dc * sa; | 297 int ds = dc * sa; |
227 if (sd < ds) { | 298 if (sd < ds) { |
228 // srcover | 299 // srcover |
229 return sc + dc - SkDiv255Round(ds); | 300 return sc + dc - SkDiv255Round(ds); |
230 } else { | 301 } else { |
231 // dstover | 302 // dstover |
232 return dc + sc - SkDiv255Round(sd); | 303 return dc + sc - SkDiv255Round(sd); |
233 } | 304 } |
234 } | 305 } |
235 static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) { | 306 static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) { |
236 int sa = SkGetPackedA32(src); | 307 int sa = SkGetPackedA32(src); |
237 int da = SkGetPackedA32(dst); | 308 int da = SkGetPackedA32(dst); |
238 int a = srcover_byte(sa, da); | 309 int a = srcover_byte(sa, da); |
239 int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 310 int r = darken_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
240 int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 311 int g = darken_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
241 int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 312 int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
242 return SkPackARGB32(a, r, g, b); | 313 return SkPackARGB32(a, r, g, b); |
243 } | 314 } |
315 static SkPM4f darken_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
316 return not_implemented_yet_proc4f(src, dst); | |
317 } | |
244 | 318 |
245 // kLighten_Mode | 319 // kLighten_Mode |
246 static inline int lighten_byte(int sc, int dc, int sa, int da) { | 320 static inline int lighten_byte(int sc, int dc, int sa, int da) { |
247 int sd = sc * da; | 321 int sd = sc * da; |
248 int ds = dc * sa; | 322 int ds = dc * sa; |
249 if (sd > ds) { | 323 if (sd > ds) { |
250 // srcover | 324 // srcover |
251 return sc + dc - SkDiv255Round(ds); | 325 return sc + dc - SkDiv255Round(ds); |
252 } else { | 326 } else { |
253 // dstover | 327 // dstover |
254 return dc + sc - SkDiv255Round(sd); | 328 return dc + sc - SkDiv255Round(sd); |
255 } | 329 } |
256 } | 330 } |
257 static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) { | 331 static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) { |
258 int sa = SkGetPackedA32(src); | 332 int sa = SkGetPackedA32(src); |
259 int da = SkGetPackedA32(dst); | 333 int da = SkGetPackedA32(dst); |
260 int a = srcover_byte(sa, da); | 334 int a = srcover_byte(sa, da); |
261 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 335 int r = lighten_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
262 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 336 int g = lighten_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
263 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 337 int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
264 return SkPackARGB32(a, r, g, b); | 338 return SkPackARGB32(a, r, g, b); |
265 } | 339 } |
340 static SkPM4f lighten_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
341 return not_implemented_yet_proc4f(src, dst); | |
342 } | |
266 | 343 |
267 // kColorDodge_Mode | 344 // kColorDodge_Mode |
268 static inline int colordodge_byte(int sc, int dc, int sa, int da) { | 345 static inline int colordodge_byte(int sc, int dc, int sa, int da) { |
269 int diff = sa - sc; | 346 int diff = sa - sc; |
270 int rc; | 347 int rc; |
271 if (0 == dc) { | 348 if (0 == dc) { |
272 return SkAlphaMulAlpha(sc, 255 - da); | 349 return SkAlphaMulAlpha(sc, 255 - da); |
273 } else if (0 == diff) { | 350 } else if (0 == diff) { |
274 rc = sa * da + sc * (255 - da) + dc * (255 - sa); | 351 rc = sa * da + sc * (255 - da) + dc * (255 - sa); |
275 } else { | 352 } else { |
276 diff = dc * sa / diff; | 353 diff = dc * sa / diff; |
277 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa); | 354 rc = sa * ((da < diff) ? da : diff) + sc * (255 - da) + dc * (255 - sa); |
278 } | 355 } |
279 return clamp_div255round(rc); | 356 return clamp_div255round(rc); |
280 } | 357 } |
281 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) { | 358 static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) { |
282 int sa = SkGetPackedA32(src); | 359 int sa = SkGetPackedA32(src); |
283 int da = SkGetPackedA32(dst); | 360 int da = SkGetPackedA32(dst); |
284 int a = srcover_byte(sa, da); | 361 int a = srcover_byte(sa, da); |
285 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 362 int r = colordodge_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
286 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 363 int g = colordodge_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
287 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 364 int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
288 return SkPackARGB32(a, r, g, b); | 365 return SkPackARGB32(a, r, g, b); |
289 } | 366 } |
367 static SkPM4f colordodge_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
368 return not_implemented_yet_proc4f(src, dst); | |
369 } | |
290 | 370 |
291 // kColorBurn_Mode | 371 // kColorBurn_Mode |
292 static inline int colorburn_byte(int sc, int dc, int sa, int da) { | 372 static inline int colorburn_byte(int sc, int dc, int sa, int da) { |
293 int rc; | 373 int rc; |
294 if (dc == da) { | 374 if (dc == da) { |
295 rc = sa * da + sc * (255 - da) + dc * (255 - sa); | 375 rc = sa * da + sc * (255 - da) + dc * (255 - sa); |
296 } else if (0 == sc) { | 376 } else if (0 == sc) { |
297 return SkAlphaMulAlpha(dc, 255 - sa); | 377 return SkAlphaMulAlpha(dc, 255 - sa); |
298 } else { | 378 } else { |
299 int tmp = (da - dc) * sa / sc; | 379 int tmp = (da - dc) * sa / sc; |
300 rc = sa * (da - ((da < tmp) ? da : tmp)) | 380 rc = sa * (da - ((da < tmp) ? da : tmp)) |
301 + sc * (255 - da) + dc * (255 - sa); | 381 + sc * (255 - da) + dc * (255 - sa); |
302 } | 382 } |
303 return clamp_div255round(rc); | 383 return clamp_div255round(rc); |
304 } | 384 } |
305 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) { | 385 static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) { |
306 int sa = SkGetPackedA32(src); | 386 int sa = SkGetPackedA32(src); |
307 int da = SkGetPackedA32(dst); | 387 int da = SkGetPackedA32(dst); |
308 int a = srcover_byte(sa, da); | 388 int a = srcover_byte(sa, da); |
309 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 389 int r = colorburn_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
310 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 390 int g = colorburn_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
311 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 391 int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
312 return SkPackARGB32(a, r, g, b); | 392 return SkPackARGB32(a, r, g, b); |
313 } | 393 } |
394 static SkPM4f colorburn_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
395 return not_implemented_yet_proc4f(src, dst); | |
396 } | |
314 | 397 |
315 // kHardLight_Mode | 398 // kHardLight_Mode |
316 static inline int hardlight_byte(int sc, int dc, int sa, int da) { | 399 static inline int hardlight_byte(int sc, int dc, int sa, int da) { |
317 int rc; | 400 int rc; |
318 if (2 * sc <= sa) { | 401 if (2 * sc <= sa) { |
319 rc = 2 * sc * dc; | 402 rc = 2 * sc * dc; |
320 } else { | 403 } else { |
321 rc = sa * da - 2 * (da - dc) * (sa - sc); | 404 rc = sa * da - 2 * (da - dc) * (sa - sc); |
322 } | 405 } |
323 return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa)); | 406 return clamp_div255round(rc + sc * (255 - da) + dc * (255 - sa)); |
324 } | 407 } |
325 static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) { | 408 static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) { |
326 int sa = SkGetPackedA32(src); | 409 int sa = SkGetPackedA32(src); |
327 int da = SkGetPackedA32(dst); | 410 int da = SkGetPackedA32(dst); |
328 int a = srcover_byte(sa, da); | 411 int a = srcover_byte(sa, da); |
329 int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 412 int r = hardlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
330 int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 413 int g = hardlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
331 int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 414 int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
332 return SkPackARGB32(a, r, g, b); | 415 return SkPackARGB32(a, r, g, b); |
333 } | 416 } |
417 static SkPM4f hardlight_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
418 return not_implemented_yet_proc4f(src, dst); | |
419 } | |
334 | 420 |
335 // returns 255 * sqrt(n/255) | 421 // returns 255 * sqrt(n/255) |
336 static U8CPU sqrt_unit_byte(U8CPU n) { | 422 static U8CPU sqrt_unit_byte(U8CPU n) { |
337 return SkSqrtBits(n, 15+4); | 423 return SkSqrtBits(n, 15+4); |
338 } | 424 } |
339 | 425 |
340 // kSoftLight_Mode | 426 // kSoftLight_Mode |
341 static inline int softlight_byte(int sc, int dc, int sa, int da) { | 427 static inline int softlight_byte(int sc, int dc, int sa, int da) { |
342 int m = da ? dc * 256 / da : 0; | 428 int m = da ? dc * 256 / da : 0; |
343 int rc; | 429 int rc; |
(...skipping 10 matching lines...) Expand all Loading... | |
354 } | 440 } |
355 static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) { | 441 static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) { |
356 int sa = SkGetPackedA32(src); | 442 int sa = SkGetPackedA32(src); |
357 int da = SkGetPackedA32(dst); | 443 int da = SkGetPackedA32(dst); |
358 int a = srcover_byte(sa, da); | 444 int a = srcover_byte(sa, da); |
359 int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 445 int r = softlight_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
360 int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 446 int g = softlight_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
361 int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 447 int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
362 return SkPackARGB32(a, r, g, b); | 448 return SkPackARGB32(a, r, g, b); |
363 } | 449 } |
450 static SkPM4f softlight_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
451 return not_implemented_yet_proc4f(src, dst); | |
452 } | |
364 | 453 |
365 // kDifference_Mode | 454 // kDifference_Mode |
366 static inline int difference_byte(int sc, int dc, int sa, int da) { | 455 static inline int difference_byte(int sc, int dc, int sa, int da) { |
367 int tmp = SkMin32(sc * da, dc * sa); | 456 int tmp = SkMin32(sc * da, dc * sa); |
368 return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp)); | 457 return clamp_signed_byte(sc + dc - 2 * SkDiv255Round(tmp)); |
369 } | 458 } |
370 static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) { | 459 static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) { |
371 int sa = SkGetPackedA32(src); | 460 int sa = SkGetPackedA32(src); |
372 int da = SkGetPackedA32(dst); | 461 int da = SkGetPackedA32(dst); |
373 int a = srcover_byte(sa, da); | 462 int a = srcover_byte(sa, da); |
374 int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 463 int r = difference_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
375 int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 464 int g = difference_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
376 int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 465 int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
377 return SkPackARGB32(a, r, g, b); | 466 return SkPackARGB32(a, r, g, b); |
378 } | 467 } |
468 static SkPM4f difference_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
469 return not_implemented_yet_proc4f(src, dst); | |
470 } | |
379 | 471 |
380 // kExclusion_Mode | 472 // kExclusion_Mode |
381 static inline int exclusion_byte(int sc, int dc, int, int) { | 473 static inline int exclusion_byte(int sc, int dc, int, int) { |
382 // this equations is wacky, wait for SVG to confirm it | 474 // this equations is wacky, wait for SVG to confirm it |
383 //int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa ); | 475 //int r = sc * da + dc * sa - 2 * sc * dc + sc * (255 - da) + dc * (255 - sa ); |
384 | 476 |
385 // The above equation can be simplified as follows | 477 // The above equation can be simplified as follows |
386 int r = 255*(sc + dc) - 2 * sc * dc; | 478 int r = 255*(sc + dc) - 2 * sc * dc; |
387 return clamp_div255round(r); | 479 return clamp_div255round(r); |
388 } | 480 } |
389 static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) { | 481 static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) { |
390 int sa = SkGetPackedA32(src); | 482 int sa = SkGetPackedA32(src); |
391 int da = SkGetPackedA32(dst); | 483 int da = SkGetPackedA32(dst); |
392 int a = srcover_byte(sa, da); | 484 int a = srcover_byte(sa, da); |
393 int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); | 485 int r = exclusion_byte(SkGetPackedR32(src), SkGetPackedR32(dst), sa, da); |
394 int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); | 486 int g = exclusion_byte(SkGetPackedG32(src), SkGetPackedG32(dst), sa, da); |
395 int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); | 487 int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
396 return SkPackARGB32(a, r, g, b); | 488 return SkPackARGB32(a, r, g, b); |
397 } | 489 } |
490 static SkPM4f exclusion_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
491 return not_implemented_yet_proc4f(src, dst); | |
492 } | |
398 | 493 |
399 // The CSS compositing spec introduces the following formulas: | 494 // The CSS compositing spec introduces the following formulas: |
400 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable) | 495 // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingn onseparable) |
401 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709 | 496 // SkComputeLuminance is similar to this formula but it uses the new definition from Rec. 709 |
402 // while PDF and CG uses the one from Rec. Rec. 601 | 497 // while PDF and CG uses the one from Rec. Rec. 601 |
403 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm | 498 // See http://www.glennchan.info/articles/technical/hd-versus-sd-color-space/hd- versus-sd-color-space.htm |
404 static inline int Lum(int r, int g, int b) | 499 static inline int Lum(int r, int g, int b) |
405 { | 500 { |
406 return SkDiv255Round(r * 77 + g * 150 + b * 28); | 501 return SkDiv255Round(r * 77 + g * 150 + b * 28); |
407 } | 502 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
503 Sg = 0; | 598 Sg = 0; |
504 Sb = 0; | 599 Sb = 0; |
505 } | 600 } |
506 | 601 |
507 int a = srcover_byte(sa, da); | 602 int a = srcover_byte(sa, da); |
508 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); | 603 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); |
509 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); | 604 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); |
510 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); | 605 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); |
511 return SkPackARGB32(a, r, g, b); | 606 return SkPackARGB32(a, r, g, b); |
512 } | 607 } |
608 static SkPM4f hue_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
609 return not_implemented_yet_proc4f(src, dst); | |
610 } | |
513 | 611 |
514 // kSaturation_Mode | 612 // kSaturation_Mode |
515 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb)) | 613 // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb)) |
516 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color. | 614 // Create a color with the saturation of the source color and the hue and lumino sity of the backdrop color. |
517 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) { | 615 static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) { |
518 int sr = SkGetPackedR32(src); | 616 int sr = SkGetPackedR32(src); |
519 int sg = SkGetPackedG32(src); | 617 int sg = SkGetPackedG32(src); |
520 int sb = SkGetPackedB32(src); | 618 int sb = SkGetPackedB32(src); |
521 int sa = SkGetPackedA32(src); | 619 int sa = SkGetPackedA32(src); |
522 | 620 |
(...skipping 14 matching lines...) Expand all Loading... | |
537 Dg = 0; | 635 Dg = 0; |
538 Db = 0; | 636 Db = 0; |
539 } | 637 } |
540 | 638 |
541 int a = srcover_byte(sa, da); | 639 int a = srcover_byte(sa, da); |
542 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); | 640 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); |
543 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); | 641 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); |
544 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); | 642 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); |
545 return SkPackARGB32(a, r, g, b); | 643 return SkPackARGB32(a, r, g, b); |
546 } | 644 } |
645 static SkPM4f saturation_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
646 return not_implemented_yet_proc4f(src, dst); | |
647 } | |
547 | 648 |
548 // kColor_Mode | 649 // kColor_Mode |
549 // B(Cb, Cs) = SetLum(Cs, Lum(Cb)) | 650 // B(Cb, Cs) = SetLum(Cs, Lum(Cb)) |
550 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color. | 651 // Create a color with the hue and saturation of the source color and the lumino sity of the backdrop color. |
551 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) { | 652 static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) { |
552 int sr = SkGetPackedR32(src); | 653 int sr = SkGetPackedR32(src); |
553 int sg = SkGetPackedG32(src); | 654 int sg = SkGetPackedG32(src); |
554 int sb = SkGetPackedB32(src); | 655 int sb = SkGetPackedB32(src); |
555 int sa = SkGetPackedA32(src); | 656 int sa = SkGetPackedA32(src); |
556 | 657 |
(...skipping 13 matching lines...) Expand all Loading... | |
570 Sg = 0; | 671 Sg = 0; |
571 Sb = 0; | 672 Sb = 0; |
572 } | 673 } |
573 | 674 |
574 int a = srcover_byte(sa, da); | 675 int a = srcover_byte(sa, da); |
575 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); | 676 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Sr); |
576 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); | 677 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Sg); |
577 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); | 678 int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); |
578 return SkPackARGB32(a, r, g, b); | 679 return SkPackARGB32(a, r, g, b); |
579 } | 680 } |
681 static SkPM4f color_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
682 return not_implemented_yet_proc4f(src, dst); | |
683 } | |
580 | 684 |
581 // kLuminosity_Mode | 685 // kLuminosity_Mode |
582 // B(Cb, Cs) = SetLum(Cb, Lum(Cs)) | 686 // B(Cb, Cs) = SetLum(Cb, Lum(Cs)) |
583 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color. | 687 // Create a color with the luminosity of the source color and the hue and satura tion of the backdrop color. |
584 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) { | 688 static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) { |
585 int sr = SkGetPackedR32(src); | 689 int sr = SkGetPackedR32(src); |
586 int sg = SkGetPackedG32(src); | 690 int sg = SkGetPackedG32(src); |
587 int sb = SkGetPackedB32(src); | 691 int sb = SkGetPackedB32(src); |
588 int sa = SkGetPackedA32(src); | 692 int sa = SkGetPackedA32(src); |
589 | 693 |
(...skipping 13 matching lines...) Expand all Loading... | |
603 Dg = 0; | 707 Dg = 0; |
604 Db = 0; | 708 Db = 0; |
605 } | 709 } |
606 | 710 |
607 int a = srcover_byte(sa, da); | 711 int a = srcover_byte(sa, da); |
608 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); | 712 int r = blendfunc_nonsep_byte(sr, dr, sa, da, Dr); |
609 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); | 713 int g = blendfunc_nonsep_byte(sg, dg, sa, da, Dg); |
610 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); | 714 int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); |
611 return SkPackARGB32(a, r, g, b); | 715 return SkPackARGB32(a, r, g, b); |
612 } | 716 } |
717 static SkPM4f luminosity_proc4f(const SkPM4f& src, const SkPM4f& dst) { | |
718 return not_implemented_yet_proc4f(src, dst); | |
719 } | |
613 | 720 |
614 const ProcCoeff gProcCoeffs[] = { | 721 const ProcCoeff gProcCoeffs[] = { |
615 { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, | 722 { clear_modeproc, clear_proc4f, SkXfermode::kZero_Coeff, SkXfermo de::kZero_Coeff }, |
616 { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, | 723 { src_modeproc, src_proc4f, SkXfermode::kOne_Coeff, SkXfermode ::kZero_Coeff }, |
617 { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, | 724 { dst_modeproc, dst_proc4f, SkXfermode::kZero_Coeff, SkXfermode ::kOne_Coeff }, |
618 { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, | 725 { srcover_modeproc, srcover_proc4f, SkXfermode::kOne_Coeff, SkXfer mode::kISA_Coeff }, |
619 { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, | 726 { dstover_modeproc, dstover_proc4f, SkXfermode::kIDA_Coeff, SkXfer mode::kOne_Coeff }, |
620 { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, | 727 { srcin_modeproc, srcin_proc4f, SkXfermode::kDA_Coeff, SkXfermo de::kZero_Coeff }, |
621 { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, | 728 { dstin_modeproc, dstin_proc4f, SkXfermode::kZero_Coeff, SkXfermo de::kSA_Coeff }, |
622 { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, | 729 { srcout_modeproc, srcout_proc4f, SkXfermode::kIDA_Coeff, SkXferm ode::kZero_Coeff }, |
623 { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, | 730 { dstout_modeproc, dstout_proc4f, SkXfermode::kZero_Coeff, SkXferm ode::kISA_Coeff }, |
624 { srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, | 731 { srcatop_modeproc, srcatop_proc4f, SkXfermode::kDA_Coeff, SkXfer mode::kISA_Coeff }, |
625 { dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, | 732 { dstatop_modeproc, dstatop_proc4f, SkXfermode::kIDA_Coeff, SkXfer mode::kSA_Coeff }, |
626 { xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, | 733 { xor_modeproc, xor_proc4f, SkXfermode::kIDA_Coeff, SkXfermode ::kISA_Coeff }, |
627 | 734 |
628 { plus_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff }, | 735 { plus_modeproc, plus_proc4f, SkXfermode::kOne_Coeff, SkXfermod e::kOne_Coeff }, |
629 { modulate_modeproc,SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, | 736 { modulate_modeproc, modulate_proc4f, SkXfermode::kZero_Coeff, SkXfe rmode::kSC_Coeff }, |
630 { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, | 737 { screen_modeproc, screen_proc4f, SkXfermode::kOne_Coeff, SkXferm ode::kISC_Coeff }, |
631 { overlay_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 738 { overlay_modeproc, overlay_proc4f, CANNOT_USE_COEFF, CANNOT_USE _COEFF }, |
632 { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 739 { darken_modeproc, darken_proc4f, CANNOT_USE_COEFF, CANNOT_USE_ COEFF }, |
633 { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 740 { lighten_modeproc, lighten_proc4f, CANNOT_USE_COEFF, CANNOT_USE _COEFF }, |
634 { colordodge_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 741 { colordodge_modeproc, colordodge_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, |
635 { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 742 { colorburn_modeproc, colorburn_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
636 { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 743 { hardlight_modeproc, hardlight_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
637 { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 744 { softlight_modeproc, softlight_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
638 { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 745 { difference_modeproc, difference_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, |
639 { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 746 { exclusion_modeproc, exclusion_proc4f, CANNOT_USE_COEFF, CANNOT_U SE_COEFF }, |
640 { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 747 { multiply_modeproc, multiply_proc4f, CANNOT_USE_COEFF, CANNOT_US E_COEFF }, |
641 { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 748 { hue_modeproc, hue_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COE FF }, |
642 { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 749 { saturation_modeproc, saturation_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, |
643 { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 750 { color_modeproc, color_proc4f, CANNOT_USE_COEFF, CANNOT_USE_C OEFF }, |
644 { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, | 751 { luminosity_modeproc, luminosity_proc4f, CANNOT_USE_COEFF, CANNOT_ USE_COEFF }, |
645 }; | 752 }; |
646 | 753 |
647 /////////////////////////////////////////////////////////////////////////////// | 754 /////////////////////////////////////////////////////////////////////////////// |
648 | 755 |
649 bool SkXfermode::asMode(Mode* mode) const { | 756 bool SkXfermode::asMode(Mode* mode) const { |
650 return false; | 757 return false; |
651 } | 758 } |
652 | 759 |
653 bool SkXfermode::asFragmentProcessor(const GrFragmentProcessor**, | 760 bool SkXfermode::asFragmentProcessor(const GrFragmentProcessor**, |
654 const GrFragmentProcessor*) const { | 761 const GrFragmentProcessor*) const { |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
999 } | 1106 } |
1000 | 1107 |
1001 SkXfermodeProc SkXfermode::GetProc(Mode mode) { | 1108 SkXfermodeProc SkXfermode::GetProc(Mode mode) { |
1002 SkXfermodeProc proc = nullptr; | 1109 SkXfermodeProc proc = nullptr; |
1003 if ((unsigned)mode < kModeCount) { | 1110 if ((unsigned)mode < kModeCount) { |
1004 proc = gProcCoeffs[mode].fProc; | 1111 proc = gProcCoeffs[mode].fProc; |
1005 } | 1112 } |
1006 return proc; | 1113 return proc; |
1007 } | 1114 } |
1008 | 1115 |
1116 SkXfermodeProc4f SkXfermode::GetProc4f(Mode mode) { | |
1117 SkXfermodeProc4f proc = nullptr; | |
1118 if ((unsigned)mode < kModeCount) { | |
1119 proc = gProcCoeffs[mode].fProc4f; | |
1120 } | |
1121 return proc; | |
1122 } | |
1123 | |
1009 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { | 1124 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { |
1010 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); | 1125 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
1011 | 1126 |
1012 if ((unsigned)mode >= (unsigned)kModeCount) { | 1127 if ((unsigned)mode >= (unsigned)kModeCount) { |
1013 // illegal mode parameter | 1128 // illegal mode parameter |
1014 return false; | 1129 return false; |
1015 } | 1130 } |
1016 | 1131 |
1017 const ProcCoeff& rec = gProcCoeffs[mode]; | 1132 const ProcCoeff& rec = gProcCoeffs[mode]; |
1018 | 1133 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1063 if (!xfer) { | 1178 if (!xfer) { |
1064 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 1179 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
1065 } | 1180 } |
1066 | 1181 |
1067 return xfer->isOpaque(opacityType); | 1182 return xfer->isOpaque(opacityType); |
1068 } | 1183 } |
1069 | 1184 |
1070 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1185 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1071 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1186 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1072 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1187 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |