| 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 | 
|---|