| 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 | 9 |
| 10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
| 11 #include "SkXfermode_proccoeff.h" | 11 #include "SkXfermode_proccoeff.h" |
| 12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
| 13 #include "SkFlattenableBuffers.h" | 13 #include "SkReadBuffer.h" |
| 14 #include "SkWriteBuffer.h" |
| 14 #include "SkMathPriv.h" | 15 #include "SkMathPriv.h" |
| 15 #include "SkString.h" | 16 #include "SkString.h" |
| 16 #include "SkUtilsArm.h" | 17 #include "SkUtilsArm.h" |
| 17 | 18 |
| 18 #if !SK_ARM_NEON_IS_NONE | 19 #if !SK_ARM_NEON_IS_NONE |
| 19 #include "SkXfermode_opts_arm_neon.h" | 20 #include "SkXfermode_opts_arm_neon.h" |
| 20 #endif | 21 #endif |
| 21 | 22 |
| 22 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) | 23 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) |
| 23 | 24 |
| (...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 if (0xFF != a) { | 854 if (0xFF != a) { |
| 854 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); | 855 A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); |
| 855 } | 856 } |
| 856 dst[i] = SkToU8(A); | 857 dst[i] = SkToU8(A); |
| 857 } | 858 } |
| 858 } | 859 } |
| 859 } | 860 } |
| 860 } | 861 } |
| 861 } | 862 } |
| 862 | 863 |
| 863 SkProcXfermode::SkProcXfermode(SkFlattenableReadBuffer& buffer) | 864 SkProcXfermode::SkProcXfermode(SkReadBuffer& buffer) |
| 864 : SkXfermode(buffer) { | 865 : SkXfermode(buffer) { |
| 865 fProc = NULL; | 866 fProc = NULL; |
| 866 if (!buffer.isCrossProcess()) { | 867 if (!buffer.isCrossProcess()) { |
| 867 fProc = (SkXfermodeProc)buffer.readFunctionPtr(); | 868 fProc = (SkXfermodeProc)buffer.readFunctionPtr(); |
| 868 } | 869 } |
| 869 } | 870 } |
| 870 | 871 |
| 871 void SkProcXfermode::flatten(SkFlattenableWriteBuffer& buffer) const { | 872 void SkProcXfermode::flatten(SkWriteBuffer& buffer) const { |
| 872 this->INHERITED::flatten(buffer); | 873 this->INHERITED::flatten(buffer); |
| 873 if (!buffer.isCrossProcess()) { | 874 if (!buffer.isCrossProcess()) { |
| 874 buffer.writeFunctionPtr((void*)fProc); | 875 buffer.writeFunctionPtr((void*)fProc); |
| 875 } | 876 } |
| 876 } | 877 } |
| 877 | 878 |
| 878 #ifdef SK_DEVELOPER | 879 #ifdef SK_DEVELOPER |
| 879 void SkProcXfermode::toString(SkString* str) const { | 880 void SkProcXfermode::toString(SkString* str) const { |
| 880 str->appendf("SkProcXfermode: %p", fProc); | 881 str->appendf("SkProcXfermode: %p", fProc); |
| 881 } | 882 } |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1336 | 1337 |
| 1337 AutoEffectUnref gEffect(SkNEW_ARGS(XferEffect, (static_cast<SkXfermode::Mode
>(mode), NULL))); | 1338 AutoEffectUnref gEffect(SkNEW_ARGS(XferEffect, (static_cast<SkXfermode::Mode
>(mode), NULL))); |
| 1338 return CreateEffectRef(gEffect); | 1339 return CreateEffectRef(gEffect); |
| 1339 } | 1340 } |
| 1340 | 1341 |
| 1341 #endif | 1342 #endif |
| 1342 | 1343 |
| 1343 /////////////////////////////////////////////////////////////////////////////// | 1344 /////////////////////////////////////////////////////////////////////////////// |
| 1344 /////////////////////////////////////////////////////////////////////////////// | 1345 /////////////////////////////////////////////////////////////////////////////// |
| 1345 | 1346 |
| 1346 SkProcCoeffXfermode::SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHE
RITED(buffer) { | 1347 SkProcCoeffXfermode::SkProcCoeffXfermode(SkReadBuffer& buffer) : INHERITED(buffe
r) { |
| 1347 uint32_t mode32 = buffer.read32() % SK_ARRAY_COUNT(gProcCoeffs); | 1348 uint32_t mode32 = buffer.read32() % SK_ARRAY_COUNT(gProcCoeffs); |
| 1348 if (mode32 >= SK_ARRAY_COUNT(gProcCoeffs)) { | 1349 if (mode32 >= SK_ARRAY_COUNT(gProcCoeffs)) { |
| 1349 // out of range, just set to something harmless | 1350 // out of range, just set to something harmless |
| 1350 mode32 = SkXfermode::kSrcOut_Mode; | 1351 mode32 = SkXfermode::kSrcOut_Mode; |
| 1351 } | 1352 } |
| 1352 fMode = (SkXfermode::Mode)mode32; | 1353 fMode = (SkXfermode::Mode)mode32; |
| 1353 | 1354 |
| 1354 const ProcCoeff& rec = gProcCoeffs[fMode]; | 1355 const ProcCoeff& rec = gProcCoeffs[fMode]; |
| 1355 // these may be valid, or may be CANNOT_USE_COEFF | 1356 // these may be valid, or may be CANNOT_USE_COEFF |
| 1356 fSrcCoeff = rec.fSC; | 1357 fSrcCoeff = rec.fSC; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1387 if (NULL != effect) { | 1388 if (NULL != effect) { |
| 1388 *effect = XferEffect::Create(fMode, background); | 1389 *effect = XferEffect::Create(fMode, background); |
| 1389 SkASSERT(NULL != *effect); | 1390 SkASSERT(NULL != *effect); |
| 1390 } | 1391 } |
| 1391 return true; | 1392 return true; |
| 1392 } | 1393 } |
| 1393 return false; | 1394 return false; |
| 1394 } | 1395 } |
| 1395 #endif | 1396 #endif |
| 1396 | 1397 |
| 1397 void SkProcCoeffXfermode::flatten(SkFlattenableWriteBuffer& buffer) const { | 1398 void SkProcCoeffXfermode::flatten(SkWriteBuffer& buffer) const { |
| 1398 this->INHERITED::flatten(buffer); | 1399 this->INHERITED::flatten(buffer); |
| 1399 buffer.write32(fMode); | 1400 buffer.write32(fMode); |
| 1400 } | 1401 } |
| 1401 | 1402 |
| 1402 const char* SkXfermode::ModeName(Mode mode) { | 1403 const char* SkXfermode::ModeName(Mode mode) { |
| 1403 SkASSERT((unsigned) mode <= (unsigned)kLastMode); | 1404 SkASSERT((unsigned) mode <= (unsigned)kLastMode); |
| 1404 const char* gModeStrings[] = { | 1405 const char* gModeStrings[] = { |
| 1405 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", | 1406 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", |
| 1406 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", | 1407 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", |
| 1407 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", | 1408 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1445 public: | 1446 public: |
| 1446 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode
) {} | 1447 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode
) {} |
| 1447 | 1448 |
| 1448 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1449 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
| 1449 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; | 1450 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; |
| 1450 | 1451 |
| 1451 SK_DEVELOPER_TO_STRING() | 1452 SK_DEVELOPER_TO_STRING() |
| 1452 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode) | 1453 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode) |
| 1453 | 1454 |
| 1454 private: | 1455 private: |
| 1455 SkClearXfermode(SkFlattenableReadBuffer& buffer) | 1456 SkClearXfermode(SkReadBuffer& buffer) |
| 1456 : SkProcCoeffXfermode(buffer) {} | 1457 : SkProcCoeffXfermode(buffer) {} |
| 1457 | 1458 |
| 1458 typedef SkProcCoeffXfermode INHERITED; | 1459 typedef SkProcCoeffXfermode INHERITED; |
| 1459 }; | 1460 }; |
| 1460 | 1461 |
| 1461 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1462 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
| 1462 const SkPMColor* SK_RESTRICT, int count, | 1463 const SkPMColor* SK_RESTRICT, int count, |
| 1463 const SkAlpha* SK_RESTRICT aa) const { | 1464 const SkAlpha* SK_RESTRICT aa) const { |
| 1464 SkASSERT(dst && count >= 0); | 1465 SkASSERT(dst && count >= 0); |
| 1465 | 1466 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1507 public: | 1508 public: |
| 1508 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} | 1509 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} |
| 1509 | 1510 |
| 1510 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1511 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
| 1511 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; | 1512 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; |
| 1512 | 1513 |
| 1513 SK_DEVELOPER_TO_STRING() | 1514 SK_DEVELOPER_TO_STRING() |
| 1514 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode) | 1515 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode) |
| 1515 | 1516 |
| 1516 private: | 1517 private: |
| 1517 SkSrcXfermode(SkFlattenableReadBuffer& buffer) | 1518 SkSrcXfermode(SkReadBuffer& buffer) |
| 1518 : SkProcCoeffXfermode(buffer) {} | 1519 : SkProcCoeffXfermode(buffer) {} |
| 1519 | 1520 |
| 1520 typedef SkProcCoeffXfermode INHERITED; | 1521 typedef SkProcCoeffXfermode INHERITED; |
| 1521 }; | 1522 }; |
| 1522 | 1523 |
| 1523 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1524 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
| 1524 const SkPMColor* SK_RESTRICT src, int count, | 1525 const SkPMColor* SK_RESTRICT src, int count, |
| 1525 const SkAlpha* SK_RESTRICT aa) const { | 1526 const SkAlpha* SK_RESTRICT aa) const { |
| 1526 SkASSERT(dst && src && count >= 0); | 1527 SkASSERT(dst && src && count >= 0); |
| 1527 | 1528 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 class SkDstInXfermode : public SkProcCoeffXfermode { | 1574 class SkDstInXfermode : public SkProcCoeffXfermode { |
| 1574 public: | 1575 public: |
| 1575 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode
) {} | 1576 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode
) {} |
| 1576 | 1577 |
| 1577 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1578 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
| 1578 | 1579 |
| 1579 SK_DEVELOPER_TO_STRING() | 1580 SK_DEVELOPER_TO_STRING() |
| 1580 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode) | 1581 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode) |
| 1581 | 1582 |
| 1582 private: | 1583 private: |
| 1583 SkDstInXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} | 1584 SkDstInXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {} |
| 1584 | 1585 |
| 1585 typedef SkProcCoeffXfermode INHERITED; | 1586 typedef SkProcCoeffXfermode INHERITED; |
| 1586 }; | 1587 }; |
| 1587 | 1588 |
| 1588 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1589 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
| 1589 const SkPMColor* SK_RESTRICT src, int count, | 1590 const SkPMColor* SK_RESTRICT src, int count, |
| 1590 const SkAlpha* SK_RESTRICT aa) const { | 1591 const SkAlpha* SK_RESTRICT aa) const { |
| 1591 SkASSERT(dst && src); | 1592 SkASSERT(dst && src); |
| 1592 | 1593 |
| 1593 if (count <= 0) { | 1594 if (count <= 0) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1616 class SkDstOutXfermode : public SkProcCoeffXfermode { | 1617 class SkDstOutXfermode : public SkProcCoeffXfermode { |
| 1617 public: | 1618 public: |
| 1618 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo
de) {} | 1619 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo
de) {} |
| 1619 | 1620 |
| 1620 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1621 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
| 1621 | 1622 |
| 1622 SK_DEVELOPER_TO_STRING() | 1623 SK_DEVELOPER_TO_STRING() |
| 1623 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode) | 1624 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode) |
| 1624 | 1625 |
| 1625 private: | 1626 private: |
| 1626 SkDstOutXfermode(SkFlattenableReadBuffer& buffer) | 1627 SkDstOutXfermode(SkReadBuffer& buffer) |
| 1627 : INHERITED(buffer) {} | 1628 : INHERITED(buffer) {} |
| 1628 | 1629 |
| 1629 typedef SkProcCoeffXfermode INHERITED; | 1630 typedef SkProcCoeffXfermode INHERITED; |
| 1630 }; | 1631 }; |
| 1631 | 1632 |
| 1632 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1633 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
| 1633 const SkPMColor* SK_RESTRICT src, int count, | 1634 const SkPMColor* SK_RESTRICT src, int count, |
| 1634 const SkAlpha* SK_RESTRICT aa) const { | 1635 const SkAlpha* SK_RESTRICT aa) const { |
| 1635 SkASSERT(dst && src); | 1636 SkASSERT(dst && src); |
| 1636 | 1637 |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1970 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1971 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1971 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1972 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1972 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1973 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
| 1973 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1974 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
| 1974 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1975 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
| 1975 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1976 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
| 1976 #if !SK_ARM_NEON_IS_NONE | 1977 #if !SK_ARM_NEON_IS_NONE |
| 1977 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) | 1978 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) |
| 1978 #endif | 1979 #endif |
| 1979 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1980 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |