OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 #ifndef Sk4pxXfermode_DEFINED | 8 #ifndef Sk4pxXfermode_DEFINED |
9 #define Sk4pxXfermode_DEFINED | 9 #define Sk4pxXfermode_DEFINED |
10 | 10 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 return fProc4(src4, dst4); | 215 return fProc4(src4, dst4); |
216 }); | 216 }); |
217 } else { | 217 } else { |
218 Sk4px::MapDstSrcAlpha(n, dst, src, aa, | 218 Sk4px::MapDstSrcAlpha(n, dst, src, aa, |
219 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha
) { | 219 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha
) { |
220 return fAAProc4(src4, dst4, alpha); | 220 return fAAProc4(src4, dst4, alpha); |
221 }); | 221 }); |
222 } | 222 } |
223 } | 223 } |
224 | 224 |
225 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[]
) const override { | |
226 if (NULL == aa) { | |
227 Sk4px::MapDstSrc(n, dst, src, [&](const Sk4px& dst4, const Sk4px& sr
c4) { | |
228 return fProc4(src4, dst4); | |
229 }); | |
230 } else { | |
231 Sk4px::MapDstSrcAlpha(n, dst, src, aa, | |
232 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha
) { | |
233 return fAAProc4(src4, dst4, alpha); | |
234 }); | |
235 } | |
236 } | |
237 | |
238 private: | 225 private: |
239 Proc4 fProc4; | 226 Proc4 fProc4; |
240 AAProc4 fAAProc4; | 227 AAProc4 fAAProc4; |
241 typedef SkProcCoeffXfermode INHERITED; | 228 typedef SkProcCoeffXfermode INHERITED; |
242 }; | 229 }; |
243 | 230 |
244 class SkPMFloatXfermode : public SkProcCoeffXfermode { | 231 class SkPMFloatXfermode : public SkProcCoeffXfermode { |
245 public: | 232 public: |
246 typedef SkPMFloat (SK_VECTORCALL *ProcF)(SkPMFloat, SkPMFloat); | 233 typedef SkPMFloat (SK_VECTORCALL *ProcF)(SkPMFloat, SkPMFloat); |
247 SkPMFloatXfermode(const ProcCoeff& rec, SkXfermode::Mode mode, ProcF procf) | 234 SkPMFloatXfermode(const ProcCoeff& rec, SkXfermode::Mode mode, ProcF procf) |
248 : INHERITED(rec, mode) | 235 : INHERITED(rec, mode) |
249 , fProcF(procf) {} | 236 , fProcF(procf) {} |
250 | 237 |
251 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[
]) const override { | 238 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[
]) const override { |
252 for (int i = 0; i < n; i++) { | 239 for (int i = 0; i < n; i++) { |
253 dst[i] = aa ? this->xfer32(dst[i], src[i], aa[i]) | 240 SkPMFloat s(src[i]), |
254 : this->xfer32(dst[i], src[i]); | 241 d(dst[i]), |
255 } | 242 b(fProcF(s,d)); |
256 } | 243 if (aa) { |
257 | 244 // We do aa in full float precision before going back down to by
tes, because we can! |
258 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[]
) const override { | 245 SkPMFloat a = Sk4f(aa[i]) * Sk4f(1.0f/255); |
259 for (int i = 0; i < n; i++) { | 246 b = b*a + d*(Sk4f(1)-a); |
260 SkPMColor dst32 = SkPixel16ToPixel32(dst[i]); | 247 } |
261 dst32 = aa ? this->xfer32(dst32, src[i], aa[i]) | 248 dst[i] = b.round(); |
262 : this->xfer32(dst32, src[i]); | |
263 dst[i] = SkPixel32ToPixel16(dst32); | |
264 } | 249 } |
265 } | 250 } |
266 | 251 |
267 private: | 252 private: |
268 inline SkPMColor xfer32(SkPMColor dst, SkPMColor src) const { | |
269 return fProcF(SkPMFloat(src), SkPMFloat(dst)).round(); | |
270 } | |
271 | |
272 inline SkPMColor xfer32(SkPMColor dst, SkPMColor src, SkAlpha aa) const { | |
273 SkPMFloat s(src), | |
274 d(dst), | |
275 b(fProcF(s,d)); | |
276 // We do aa in full float precision before going back down to bytes, bec
ause we can! | |
277 SkPMFloat a = Sk4f(aa) * Sk4f(1.0f/255); | |
278 b = b*a + d*(Sk4f(1)-a); | |
279 return b.round(); | |
280 } | |
281 | |
282 ProcF fProcF; | 253 ProcF fProcF; |
283 typedef SkProcCoeffXfermode INHERITED; | 254 typedef SkProcCoeffXfermode INHERITED; |
284 }; | 255 }; |
285 | 256 |
286 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode
::Mode mode) { | 257 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode
::Mode mode) { |
287 switch (mode) { | 258 switch (mode) { |
288 #define CASE(Mode) case SkXfermode::k##Mode##_Mode: \ | 259 #define CASE(Mode) case SkXfermode::k##Mode##_Mode: \ |
289 return SkNEW_ARGS(Sk4pxXfermode, (rec, mode, &Mode, &xfer_aa<Mode>)) | 260 return SkNEW_ARGS(Sk4pxXfermode, (rec, mode, &Mode, &xfer_aa<Mode>)) |
290 CASE(Clear); | 261 CASE(Clear); |
291 CASE(Src); | 262 CASE(Src); |
(...skipping 29 matching lines...) Expand all Loading... |
321 default: break; | 292 default: break; |
322 } | 293 } |
323 return nullptr; | 294 return nullptr; |
324 } | 295 } |
325 | 296 |
326 #endif | 297 #endif |
327 | 298 |
328 } // namespace | 299 } // namespace |
329 | 300 |
330 #endif//Sk4pxXfermode_DEFINED | 301 #endif//Sk4pxXfermode_DEFINED |
OLD | NEW |