Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include "SkXfermode.h" | 9 #include "SkXfermode.h" |
| 10 #include "SkXfermode_opts_SSE2.h" | 10 #include "SkXfermode_opts_SSE2.h" |
| (...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1194 } | 1194 } |
| 1195 | 1195 |
| 1196 static Sk4f clamp_255(const Sk4f& value) { | 1196 static Sk4f clamp_255(const Sk4f& value) { |
| 1197 return Sk4f::Min(Sk4f(255), value); | 1197 return Sk4f::Min(Sk4f(255), value); |
| 1198 } | 1198 } |
| 1199 | 1199 |
| 1200 static Sk4f clamp_0_255(const Sk4f& value) { | 1200 static Sk4f clamp_0_255(const Sk4f& value) { |
| 1201 return Sk4f::Max(Sk4f(0), Sk4f::Min(Sk4f(255), value)); | 1201 return Sk4f::Max(Sk4f(0), Sk4f::Min(Sk4f(255), value)); |
| 1202 } | 1202 } |
| 1203 | 1203 |
| 1204 // return a swizzle of a | rgb | |
| 1205 static Sk4f set_a_rgb(const Sk4f& a, const Sk4f& rgb) { | |
| 1206 SkPMFloat pma = a; | |
| 1207 SkPMFloat pmc = rgb; | |
| 1208 return SkPMFloat(pma.a(), pmc.r(), pmc.g(), pmc.b()); | |
|
mtklein
2015/04/03 13:23:58
Boy, this is annoying. We can make this operation
mtklein
2015/04/03 13:35:47
Well, maybe it's not so annoying. On x86 this can
| |
| 1209 } | |
| 1210 | |
| 1204 /** | 1211 /** |
| 1205 * Some modes can, due to very slight numerical error, generate "invalid" pmcol ors... | 1212 * Some modes can, due to very slight numerical error, generate "invalid" pmcol ors... |
| 1206 * | 1213 * |
| 1207 * e.g. | 1214 * e.g. |
| 1208 * alpha = 100.9999 | 1215 * alpha = 100.9999 |
| 1209 * red = 101 | 1216 * red = 101 |
| 1210 * | 1217 * |
| 1211 * or | 1218 * or |
| 1212 * alpha = 255.0001 | 1219 * alpha = 255.0001 |
| 1213 * | 1220 * |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1304 Sk4f sc = src; | 1311 Sk4f sc = src; |
| 1305 Sk4f dc = dst; | 1312 Sk4f dc = dst; |
| 1306 Sk4f rc = sc + dc + (sc * (dc - da) - dc * sa) * inv255; | 1313 Sk4f rc = sc + dc + (sc * (dc - da) - dc * sa) * inv255; |
| 1307 // ra = srcover(sa, da), but the calc for rc happens to accomplish this for us | 1314 // ra = srcover(sa, da), but the calc for rc happens to accomplish this for us |
| 1308 return check_as_pmfloat(clamp_0_255(rc)); | 1315 return check_as_pmfloat(clamp_0_255(rc)); |
| 1309 } | 1316 } |
| 1310 static const bool kFoldCoverageIntoSrcAlpha = false; | 1317 static const bool kFoldCoverageIntoSrcAlpha = false; |
| 1311 static const SkXfermode::Mode kMode = SkXfermode::kMultiply_Mode; | 1318 static const SkXfermode::Mode kMode = SkXfermode::kMultiply_Mode; |
| 1312 }; | 1319 }; |
| 1313 | 1320 |
| 1321 struct Difference4f { | |
| 1322 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | |
| 1323 const Sk4f inv255(gInv255); | |
| 1324 Sk4f sa = Sk4f(src.a()); | |
| 1325 Sk4f da = Sk4f(dst.a()); | |
| 1326 Sk4f sc = src; | |
| 1327 Sk4f dc = dst; | |
| 1328 Sk4f min = Sk4f::Min(sc * da, dc * sa) * inv255; | |
| 1329 Sk4f ra = sc + dc - min; | |
| 1330 return check_as_pmfloat(set_a_rgb(ra, ra - min)); | |
| 1331 } | |
| 1332 static const bool kFoldCoverageIntoSrcAlpha = false; | |
| 1333 static const SkXfermode::Mode kMode = SkXfermode::kDifference_Mode; | |
| 1334 }; | |
| 1335 | |
| 1336 struct Exclusion4f { | |
| 1337 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | |
| 1338 const Sk4f inv255(gInv255); | |
| 1339 Sk4f sc = src; | |
| 1340 Sk4f dc = dst; | |
| 1341 Sk4f prod = sc * dc * inv255; | |
| 1342 Sk4f ra = sc + dc - prod; | |
| 1343 return check_as_pmfloat(set_a_rgb(ra, ra - prod)); | |
| 1344 } | |
| 1345 static const bool kFoldCoverageIntoSrcAlpha = false; | |
| 1346 static const SkXfermode::Mode kMode = SkXfermode::kExclusion_Mode; | |
| 1347 }; | |
| 1348 | |
| 1314 template <typename ProcType> | 1349 template <typename ProcType> |
| 1315 class SkT4fXfermode : public SkProcCoeffXfermode { | 1350 class SkT4fXfermode : public SkProcCoeffXfermode { |
| 1316 public: | 1351 public: |
| 1317 static SkXfermode* Create(const ProcCoeff& rec) { | 1352 static SkXfermode* Create(const ProcCoeff& rec) { |
| 1318 return SkNEW_ARGS(SkT4fXfermode, (rec)); | 1353 return SkNEW_ARGS(SkT4fXfermode, (rec)); |
| 1319 } | 1354 } |
| 1320 | 1355 |
| 1321 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { | 1356 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { |
| 1322 if (NULL == aa) { | 1357 if (NULL == aa) { |
| 1323 while (n & 3) { | 1358 while (n & 3) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1438 break; | 1473 break; |
| 1439 case SkXfermode::kModulate_Mode: | 1474 case SkXfermode::kModulate_Mode: |
| 1440 xfer = SkT4fXfermode<Modulate4f>::Create(rec); | 1475 xfer = SkT4fXfermode<Modulate4f>::Create(rec); |
| 1441 break; | 1476 break; |
| 1442 case SkXfermode::kScreen_Mode: | 1477 case SkXfermode::kScreen_Mode: |
| 1443 xfer = SkT4fXfermode<Screen4f>::Create(rec); | 1478 xfer = SkT4fXfermode<Screen4f>::Create(rec); |
| 1444 break; | 1479 break; |
| 1445 case SkXfermode::kMultiply_Mode: | 1480 case SkXfermode::kMultiply_Mode: |
| 1446 xfer = SkT4fXfermode<Multiply4f>::Create(rec); | 1481 xfer = SkT4fXfermode<Multiply4f>::Create(rec); |
| 1447 break; | 1482 break; |
| 1483 case SkXfermode::kDifference_Mode: | |
| 1484 xfer = SkT4fXfermode<Difference4f>::Create(rec); | |
| 1485 break; | |
| 1486 case SkXfermode::kExclusion_Mode: | |
| 1487 xfer = SkT4fXfermode<Exclusion4f>::Create(rec); | |
| 1488 break; | |
| 1448 default: | 1489 default: |
| 1449 break; | 1490 break; |
| 1450 } | 1491 } |
| 1451 if (xfer) { | 1492 if (xfer) { |
| 1452 return xfer; | 1493 return xfer; |
| 1453 } | 1494 } |
| 1454 #endif | 1495 #endif |
| 1455 | 1496 |
| 1456 // check if we have a platform optim for that | 1497 // check if we have a platform optim for that |
| 1457 SkProcCoeffXfermode* xfm = SkPlatformXfermodeFactory(rec, mode); | 1498 SkProcCoeffXfermode* xfm = SkPlatformXfermodeFactory(rec, mode); |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1744 } else { | 1785 } else { |
| 1745 proc16 = rec.fProc16_General; | 1786 proc16 = rec.fProc16_General; |
| 1746 } | 1787 } |
| 1747 } | 1788 } |
| 1748 return proc16; | 1789 return proc16; |
| 1749 } | 1790 } |
| 1750 | 1791 |
| 1751 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1792 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1752 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1793 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1753 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1794 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |