Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: src/core/SkXfermode.cpp

Issue 23021015: Initial error handling code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: New serialization method Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698