| 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" |
| (...skipping 1670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1681 } | 1681 } |
| 1682 | 1682 |
| 1683 #ifdef SK_DEVELOPER | 1683 #ifdef SK_DEVELOPER |
| 1684 void SkDstOutXfermode::toString(SkString* str) const { | 1684 void SkDstOutXfermode::toString(SkString* str) const { |
| 1685 this->INHERITED::toString(str); | 1685 this->INHERITED::toString(str); |
| 1686 } | 1686 } |
| 1687 #endif | 1687 #endif |
| 1688 | 1688 |
| 1689 /////////////////////////////////////////////////////////////////////////////// | 1689 /////////////////////////////////////////////////////////////////////////////// |
| 1690 | 1690 |
| 1691 SkXfermode* SkXfermode::Create(Mode mode) { | 1691 SK_DECLARE_STATIC_MUTEX(gCachedXfermodesMutex); |
| 1692 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); | 1692 static SkXfermode* gCachedXfermodes[SkXfermode::kLastMode + 1]; |
| 1693 SkASSERT((unsigned)mode < kModeCount); | |
| 1694 | 1693 |
| 1695 const ProcCoeff& rec = gProcCoeffs[mode]; | 1694 void SkXfermode::Term() { |
| 1695 SkAutoMutexAcquire ac(gCachedXfermodesMutex); |
| 1696 | 1696 |
| 1697 switch (mode) { | 1697 for (size_t i = 0; i < SK_ARRAY_COUNT(gCachedXfermodes); ++i) { |
| 1698 case kClear_Mode: | 1698 SkSafeUnref(gCachedXfermodes[i]); |
| 1699 return SkNEW_ARGS(SkClearXfermode, (rec)); | 1699 gCachedXfermodes[i] = NULL; |
| 1700 case kSrc_Mode: | |
| 1701 return SkNEW_ARGS(SkSrcXfermode, (rec)); | |
| 1702 case kSrcOver_Mode: | |
| 1703 return NULL; | |
| 1704 case kDstIn_Mode: | |
| 1705 return SkNEW_ARGS(SkDstInXfermode, (rec)); | |
| 1706 case kDstOut_Mode: | |
| 1707 return SkNEW_ARGS(SkDstOutXfermode, (rec)); | |
| 1708 default: | |
| 1709 return SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); | |
| 1710 } | 1700 } |
| 1711 } | 1701 } |
| 1712 | 1702 |
| 1703 SkXfermode* SkXfermode::Create(Mode mode) { |
| 1704 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
| 1705 SkASSERT(SK_ARRAY_COUNT(gCachedXfermodes) == kModeCount); |
| 1706 |
| 1707 if ((unsigned)mode >= kModeCount) { |
| 1708 // report error |
| 1709 return NULL; |
| 1710 } |
| 1711 |
| 1712 // Skia's "defaut" mode is srcover. NULL in SkPaint is interpreted as srcove
r |
| 1713 // so we can just return NULL from the factory. |
| 1714 if (kSrcOver_Mode == mode) { |
| 1715 return NULL; |
| 1716 } |
| 1717 |
| 1718 // guard our access to gCachedXfermodes, since we may write into it |
| 1719 SkAutoMutexAcquire ac(gCachedXfermodesMutex); |
| 1720 |
| 1721 SkXfermode* xfer = gCachedXfermodes[mode]; |
| 1722 if (NULL == xfer) { |
| 1723 const ProcCoeff& rec = gProcCoeffs[mode]; |
| 1724 // All modes can in theory be represented by the ProcCoeff rec, since |
| 1725 // it contains function ptrs. However, a few modes are both simple and |
| 1726 // commonly used, so we call those out for their own subclasses here. |
| 1727 switch (mode) { |
| 1728 case kClear_Mode: |
| 1729 xfer = SkNEW_ARGS(SkClearXfermode, (rec)); |
| 1730 break; |
| 1731 case kSrc_Mode: |
| 1732 xfer = SkNEW_ARGS(SkSrcXfermode, (rec)); |
| 1733 break; |
| 1734 case kSrcOver_Mode: |
| 1735 SkASSERT(false); // should not land here |
| 1736 break; |
| 1737 case kDstIn_Mode: |
| 1738 xfer = SkNEW_ARGS(SkDstInXfermode, (rec)); |
| 1739 break; |
| 1740 case kDstOut_Mode: |
| 1741 xfer = SkNEW_ARGS(SkDstOutXfermode, (rec)); |
| 1742 break; |
| 1743 default: |
| 1744 // no special-case, just rely in the rec and its function-ptrs |
| 1745 xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); |
| 1746 break; |
| 1747 } |
| 1748 gCachedXfermodes[mode] = xfer; |
| 1749 } |
| 1750 return SkSafeRef(xfer); |
| 1751 } |
| 1752 |
| 1713 SkXfermodeProc SkXfermode::GetProc(Mode mode) { | 1753 SkXfermodeProc SkXfermode::GetProc(Mode mode) { |
| 1714 SkXfermodeProc proc = NULL; | 1754 SkXfermodeProc proc = NULL; |
| 1715 if ((unsigned)mode < kModeCount) { | 1755 if ((unsigned)mode < kModeCount) { |
| 1716 proc = gProcCoeffs[mode].fProc; | 1756 proc = gProcCoeffs[mode].fProc; |
| 1717 } | 1757 } |
| 1718 return proc; | 1758 return proc; |
| 1719 } | 1759 } |
| 1720 | 1760 |
| 1721 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { | 1761 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { |
| 1722 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); | 1762 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1941 return proc16; | 1981 return proc16; |
| 1942 } | 1982 } |
| 1943 | 1983 |
| 1944 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1984 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1945 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1985 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1946 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1986 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
| 1947 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1987 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
| 1948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1988 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
| 1949 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1989 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
| 1950 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1990 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |