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 |