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