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 "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
12 #include "SkFlattenableBuffers.h" | 12 #include "SkFlattenableBuffers.h" |
13 #include "SkMathPriv.h" | 13 #include "SkMathPriv.h" |
14 #include "SkString.h" | 14 #include "SkString.h" |
| 15 #include "SkValidationUtils.h" |
15 | 16 |
16 SK_DEFINE_INST_COUNT(SkXfermode) | 17 SK_DEFINE_INST_COUNT(SkXfermode) |
17 | 18 |
18 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) | 19 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) |
19 | 20 |
20 #if 0 | 21 #if 0 |
21 // idea for higher precision blends in xfer procs (and slightly faster) | 22 // idea for higher precision blends in xfer procs (and slightly faster) |
22 // see DstATop as a probable caller | 23 // see DstATop as a probable caller |
23 static U8CPU mulmuldiv255round(U8CPU a, U8CPU b, U8CPU c, U8CPU d) { | 24 static U8CPU mulmuldiv255round(U8CPU a, U8CPU b, U8CPU c, U8CPU d) { |
24 SkASSERT(a <= 255); | 25 SkASSERT(a <= 255); |
(...skipping 1343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1368 static AutoEffectUnref gEffect(SkNEW_ARGS(XferEffect, (static_cast<SkXfermod
e::Mode>(mode), NULL))); | 1369 static AutoEffectUnref gEffect(SkNEW_ARGS(XferEffect, (static_cast<SkXfermod
e::Mode>(mode), NULL))); |
1369 return CreateEffectRef(gEffect); | 1370 return CreateEffectRef(gEffect); |
1370 } | 1371 } |
1371 | 1372 |
1372 #endif | 1373 #endif |
1373 | 1374 |
1374 /////////////////////////////////////////////////////////////////////////////// | 1375 /////////////////////////////////////////////////////////////////////////////// |
1375 /////////////////////////////////////////////////////////////////////////////// | 1376 /////////////////////////////////////////////////////////////////////////////// |
1376 | 1377 |
1377 class SkProcCoeffXfermode : public SkProcXfermode { | 1378 class SkProcCoeffXfermode : public SkProcXfermode { |
| 1379 typedef SkProcXfermode INHERITED; |
| 1380 |
1378 public: | 1381 public: |
1379 SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) | 1382 SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) |
1380 : INHERITED(rec.fProc) { | 1383 : INHERITED(rec.fProc) { |
1381 fMode = mode; | 1384 fMode = mode; |
1382 // these may be valid, or may be CANNOT_USE_COEFF | 1385 // these may be valid, or may be CANNOT_USE_COEFF |
1383 fSrcCoeff = rec.fSC; | 1386 fSrcCoeff = rec.fSC; |
1384 fDstCoeff = rec.fDC; | 1387 fDstCoeff = rec.fDC; |
1385 } | 1388 } |
1386 | 1389 |
1387 virtual bool asMode(Mode* mode) const SK_OVERRIDE { | 1390 virtual bool asMode(Mode* mode) const SK_OVERRIDE { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 protected: | 1434 protected: |
1432 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 1435 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
1433 fMode = (SkXfermode::Mode)buffer.read32(); | 1436 fMode = (SkXfermode::Mode)buffer.read32(); |
1434 | 1437 |
1435 const ProcCoeff& rec = gProcCoeffs[fMode]; | 1438 const ProcCoeff& rec = gProcCoeffs[fMode]; |
1436 // these may be valid, or may be CANNOT_USE_COEFF | 1439 // these may be valid, or may be CANNOT_USE_COEFF |
1437 fSrcCoeff = rec.fSC; | 1440 fSrcCoeff = rec.fSC; |
1438 fDstCoeff = rec.fDC; | 1441 fDstCoeff = rec.fDC; |
1439 // now update our function-ptr in the super class | 1442 // now update our function-ptr in the super class |
1440 this->INHERITED::setProc(rec.fProc); | 1443 this->INHERITED::setProc(rec.fProc); |
| 1444 |
| 1445 buffer.validate(SkIsValidMode(fMode) && |
| 1446 SkIsValidCoeff(fSrcCoeff) && |
| 1447 SkIsValidCoeff(fDstCoeff)); |
1441 } | 1448 } |
1442 | 1449 |
1443 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { | 1450 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
1444 this->INHERITED::flatten(buffer); | 1451 this->INHERITED::flatten(buffer); |
1445 buffer.write32(fMode); | 1452 buffer.write32(fMode); |
1446 } | 1453 } |
1447 | 1454 |
1448 private: | 1455 private: |
1449 Mode fMode; | 1456 Mode fMode; |
1450 Coeff fSrcCoeff, fDstCoeff; | 1457 Coeff fSrcCoeff, fDstCoeff; |
1451 | |
1452 typedef SkProcXfermode INHERITED; | |
1453 }; | 1458 }; |
1454 | 1459 |
1455 const char* SkXfermode::ModeName(Mode mode) { | 1460 const char* SkXfermode::ModeName(Mode mode) { |
1456 SkASSERT((unsigned) mode <= (unsigned)kLastMode); | 1461 SkASSERT((unsigned) mode <= (unsigned)kLastMode); |
1457 const char* gModeStrings[] = { | 1462 const char* gModeStrings[] = { |
1458 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", | 1463 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", |
1459 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", | 1464 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", |
1460 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", | 1465 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", |
1461 "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion", | 1466 "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion", |
1462 "Multiply", "Hue", "Saturation", "Color", "Luminosity" | 1467 "Multiply", "Hue", "Saturation", "Color", "Luminosity" |
(...skipping 25 matching lines...) Expand all Loading... |
1488 str->append("can't use"); | 1493 str->append("can't use"); |
1489 } else { | 1494 } else { |
1490 str->append(gCoeffStrings[fDstCoeff]); | 1495 str->append(gCoeffStrings[fDstCoeff]); |
1491 } | 1496 } |
1492 } | 1497 } |
1493 #endif | 1498 #endif |
1494 | 1499 |
1495 /////////////////////////////////////////////////////////////////////////////// | 1500 /////////////////////////////////////////////////////////////////////////////// |
1496 | 1501 |
1497 class SkClearXfermode : public SkProcCoeffXfermode { | 1502 class SkClearXfermode : public SkProcCoeffXfermode { |
| 1503 typedef SkProcCoeffXfermode INHERITED; |
| 1504 |
1498 public: | 1505 public: |
1499 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode
) {} | 1506 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode
) {} |
1500 | 1507 |
1501 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1508 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
1502 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; | 1509 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; |
1503 | 1510 |
1504 SK_DEVELOPER_TO_STRING() | 1511 SK_DEVELOPER_TO_STRING() |
1505 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode) | 1512 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode) |
1506 | 1513 |
1507 private: | 1514 private: |
1508 SkClearXfermode(SkFlattenableReadBuffer& buffer) | 1515 SkClearXfermode(SkFlattenableReadBuffer& buffer) |
1509 : SkProcCoeffXfermode(buffer) {} | 1516 : SkProcCoeffXfermode(buffer) {} |
1510 | |
1511 typedef SkProcCoeffXfermode INHERITED; | |
1512 }; | 1517 }; |
1513 | 1518 |
1514 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1519 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
1515 const SkPMColor* SK_RESTRICT, int count, | 1520 const SkPMColor* SK_RESTRICT, int count, |
1516 const SkAlpha* SK_RESTRICT aa) const { | 1521 const SkAlpha* SK_RESTRICT aa) const { |
1517 SkASSERT(dst && count >= 0); | 1522 SkASSERT(dst && count >= 0); |
1518 | 1523 |
1519 if (NULL == aa) { | 1524 if (NULL == aa) { |
1520 memset(dst, 0, count << 2); | 1525 memset(dst, 0, count << 2); |
1521 } else { | 1526 } else { |
(...skipping 28 matching lines...) Expand all Loading... |
1550 | 1555 |
1551 #ifdef SK_DEVELOPER | 1556 #ifdef SK_DEVELOPER |
1552 void SkClearXfermode::toString(SkString* str) const { | 1557 void SkClearXfermode::toString(SkString* str) const { |
1553 this->INHERITED::toString(str); | 1558 this->INHERITED::toString(str); |
1554 } | 1559 } |
1555 #endif | 1560 #endif |
1556 | 1561 |
1557 /////////////////////////////////////////////////////////////////////////////// | 1562 /////////////////////////////////////////////////////////////////////////////// |
1558 | 1563 |
1559 class SkSrcXfermode : public SkProcCoeffXfermode { | 1564 class SkSrcXfermode : public SkProcCoeffXfermode { |
| 1565 typedef SkProcCoeffXfermode INHERITED; |
| 1566 |
1560 public: | 1567 public: |
1561 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} | 1568 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} |
1562 | 1569 |
1563 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1570 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
1564 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; | 1571 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S
K_OVERRIDE; |
1565 | 1572 |
1566 SK_DEVELOPER_TO_STRING() | 1573 SK_DEVELOPER_TO_STRING() |
1567 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode) | 1574 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode) |
1568 | 1575 |
1569 private: | 1576 private: |
1570 SkSrcXfermode(SkFlattenableReadBuffer& buffer) | 1577 SkSrcXfermode(SkFlattenableReadBuffer& buffer) |
1571 : SkProcCoeffXfermode(buffer) {} | 1578 : SkProcCoeffXfermode(buffer) {} |
1572 | |
1573 typedef SkProcCoeffXfermode INHERITED; | |
1574 }; | 1579 }; |
1575 | 1580 |
1576 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1581 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
1577 const SkPMColor* SK_RESTRICT src, int count, | 1582 const SkPMColor* SK_RESTRICT src, int count, |
1578 const SkAlpha* SK_RESTRICT aa) const { | 1583 const SkAlpha* SK_RESTRICT aa) const { |
1579 SkASSERT(dst && src && count >= 0); | 1584 SkASSERT(dst && src && count >= 0); |
1580 | 1585 |
1581 if (NULL == aa) { | 1586 if (NULL == aa) { |
1582 memcpy(dst, src, count << 2); | 1587 memcpy(dst, src, count << 2); |
1583 } else { | 1588 } else { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1617 } | 1622 } |
1618 #ifdef SK_DEVELOPER | 1623 #ifdef SK_DEVELOPER |
1619 void SkSrcXfermode::toString(SkString* str) const { | 1624 void SkSrcXfermode::toString(SkString* str) const { |
1620 this->INHERITED::toString(str); | 1625 this->INHERITED::toString(str); |
1621 } | 1626 } |
1622 #endif | 1627 #endif |
1623 | 1628 |
1624 /////////////////////////////////////////////////////////////////////////////// | 1629 /////////////////////////////////////////////////////////////////////////////// |
1625 | 1630 |
1626 class SkDstInXfermode : public SkProcCoeffXfermode { | 1631 class SkDstInXfermode : public SkProcCoeffXfermode { |
| 1632 typedef SkProcCoeffXfermode INHERITED; |
| 1633 |
1627 public: | 1634 public: |
1628 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode
) {} | 1635 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode
) {} |
1629 | 1636 |
1630 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1637 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
1631 | 1638 |
1632 SK_DEVELOPER_TO_STRING() | 1639 SK_DEVELOPER_TO_STRING() |
1633 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode) | 1640 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode) |
1634 | 1641 |
1635 private: | 1642 private: |
1636 SkDstInXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} | 1643 SkDstInXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} |
1637 | |
1638 typedef SkProcCoeffXfermode INHERITED; | |
1639 }; | 1644 }; |
1640 | 1645 |
1641 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1646 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
1642 const SkPMColor* SK_RESTRICT src, int count, | 1647 const SkPMColor* SK_RESTRICT src, int count, |
1643 const SkAlpha* SK_RESTRICT aa) const { | 1648 const SkAlpha* SK_RESTRICT aa) const { |
1644 SkASSERT(dst && src); | 1649 SkASSERT(dst && src); |
1645 | 1650 |
1646 if (count <= 0) { | 1651 if (count <= 0) { |
1647 return; | 1652 return; |
1648 } | 1653 } |
(...skipping 11 matching lines...) Expand all Loading... |
1660 | 1665 |
1661 #ifdef SK_DEVELOPER | 1666 #ifdef SK_DEVELOPER |
1662 void SkDstInXfermode::toString(SkString* str) const { | 1667 void SkDstInXfermode::toString(SkString* str) const { |
1663 this->INHERITED::toString(str); | 1668 this->INHERITED::toString(str); |
1664 } | 1669 } |
1665 #endif | 1670 #endif |
1666 | 1671 |
1667 /////////////////////////////////////////////////////////////////////////////// | 1672 /////////////////////////////////////////////////////////////////////////////// |
1668 | 1673 |
1669 class SkDstOutXfermode : public SkProcCoeffXfermode { | 1674 class SkDstOutXfermode : public SkProcCoeffXfermode { |
| 1675 typedef SkProcCoeffXfermode INHERITED; |
| 1676 |
1670 public: | 1677 public: |
1671 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo
de) {} | 1678 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo
de) {} |
1672 | 1679 |
1673 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; | 1680 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const
SK_OVERRIDE; |
1674 | 1681 |
1675 SK_DEVELOPER_TO_STRING() | 1682 SK_DEVELOPER_TO_STRING() |
1676 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode) | 1683 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode) |
1677 | 1684 |
1678 private: | 1685 private: |
1679 SkDstOutXfermode(SkFlattenableReadBuffer& buffer) | 1686 SkDstOutXfermode(SkFlattenableReadBuffer& buffer) |
1680 : INHERITED(buffer) {} | 1687 : INHERITED(buffer) {} |
1681 | |
1682 typedef SkProcCoeffXfermode INHERITED; | |
1683 }; | 1688 }; |
1684 | 1689 |
1685 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 1690 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
1686 const SkPMColor* SK_RESTRICT src, int count, | 1691 const SkPMColor* SK_RESTRICT src, int count, |
1687 const SkAlpha* SK_RESTRICT aa) const { | 1692 const SkAlpha* SK_RESTRICT aa) const { |
1688 SkASSERT(dst && src); | 1693 SkASSERT(dst && src); |
1689 | 1694 |
1690 if (count <= 0) { | 1695 if (count <= 0) { |
1691 return; | 1696 return; |
1692 } | 1697 } |
(...skipping 10 matching lines...) Expand all Loading... |
1703 } | 1708 } |
1704 | 1709 |
1705 #ifdef SK_DEVELOPER | 1710 #ifdef SK_DEVELOPER |
1706 void SkDstOutXfermode::toString(SkString* str) const { | 1711 void SkDstOutXfermode::toString(SkString* str) const { |
1707 this->INHERITED::toString(str); | 1712 this->INHERITED::toString(str); |
1708 } | 1713 } |
1709 #endif | 1714 #endif |
1710 | 1715 |
1711 /////////////////////////////////////////////////////////////////////////////// | 1716 /////////////////////////////////////////////////////////////////////////////// |
1712 | 1717 |
| 1718 SkFlattenable::Factory SkProcXfermode::GetFactory(SkFlattenable::Type type) { |
| 1719 switch(type) { |
| 1720 case SkFlattenable::kSkClearXfermode: |
| 1721 return SkClearXfermode::CreateProc; |
| 1722 case SkFlattenable::kSkDstInXfermode: |
| 1723 return SkDstInXfermode::CreateProc; |
| 1724 case SkFlattenable::kSkDstOutXfermode: |
| 1725 return SkDstOutXfermode::CreateProc; |
| 1726 case SkFlattenable::kSkProcCoeffXfermode: |
| 1727 return SkProcCoeffXfermode::CreateProc; |
| 1728 case SkFlattenable::kSkSrcXfermode: |
| 1729 return SkSrcXfermode::CreateProc; |
| 1730 default: |
| 1731 break; |
| 1732 } |
| 1733 return NULL; |
| 1734 } |
| 1735 |
| 1736 SkFlattenable::TypeCheck SkProcXfermode::GetTypeCheck(SkFlattenable::Type type)
{ |
| 1737 switch(type) { |
| 1738 case SkFlattenable::kSkClearXfermode: |
| 1739 return SkClearXfermode::IsA; |
| 1740 case SkFlattenable::kSkDstInXfermode: |
| 1741 return SkDstInXfermode::IsA; |
| 1742 case SkFlattenable::kSkDstOutXfermode: |
| 1743 return SkDstOutXfermode::IsA; |
| 1744 case SkFlattenable::kSkProcCoeffXfermode: |
| 1745 return SkProcCoeffXfermode::IsA; |
| 1746 case SkFlattenable::kSkSrcXfermode: |
| 1747 return SkSrcXfermode::IsA; |
| 1748 default: |
| 1749 break; |
| 1750 } |
| 1751 return NULL; |
| 1752 } |
| 1753 |
| 1754 /////////////////////////////////////////////////////////////////////////////// |
| 1755 |
1713 SkXfermode* SkXfermode::Create(Mode mode) { | 1756 SkXfermode* SkXfermode::Create(Mode mode) { |
1714 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); | 1757 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
1715 SkASSERT((unsigned)mode < kModeCount); | 1758 SkASSERT((unsigned)mode < kModeCount); |
1716 | 1759 |
1717 const ProcCoeff& rec = gProcCoeffs[mode]; | 1760 const ProcCoeff& rec = gProcCoeffs[mode]; |
1718 | 1761 |
1719 switch (mode) { | 1762 switch (mode) { |
1720 case kClear_Mode: | 1763 case kClear_Mode: |
1721 return SkNEW_ARGS(SkClearXfermode, (rec)); | 1764 return SkNEW_ARGS(SkClearXfermode, (rec)); |
1722 case kSrc_Mode: | 1765 case kSrc_Mode: |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1963 return proc16; | 2006 return proc16; |
1964 } | 2007 } |
1965 | 2008 |
1966 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 2009 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 2010 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1968 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 2011 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1969 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 2012 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 2013 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1971 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 2014 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1972 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2015 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |