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 static SkMutex gCachedXfermodesMutex; |
djsollen
2013/10/04 14:48:28
use SK_DECLARE_STATIC_MUTEX
| |
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() { |
1696 | 1695 SkAutoMutexAcquire ac(gCachedXfermodesMutex); |
1697 switch (mode) { | 1696 |
1698 case kClear_Mode: | 1697 for (size_t i = 0; i < SK_ARRAY_COUNT(gCachedXfermodes); ++i) { |
1699 return SkNEW_ARGS(SkClearXfermode, (rec)); | 1698 SkSafeUnref(gCachedXfermodes[i]); |
1700 case kSrc_Mode: | 1699 gCachedXfermodes[i] = NULL; |
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 if (kSrcOver_Mode == mode) { | |
1713 return NULL; | |
1714 } | |
1715 | |
1716 // guard our access to gCachedXfermodes, since we may write into it | |
1717 SkAutoMutexAcquire ac(gCachedXfermodesMutex); | |
1718 | |
1719 SkXfermode* xfer = gCachedXfermodes[mode]; | |
1720 if (NULL == xfer) { | |
1721 const ProcCoeff& rec = gProcCoeffs[mode]; | |
1722 switch (mode) { | |
mtklein
2013/10/04 15:07:01
As someone who's not too familiar with this code,
| |
1723 case kClear_Mode: | |
1724 xfer = SkNEW_ARGS(SkClearXfermode, (rec)); | |
1725 break; | |
1726 case kSrc_Mode: | |
1727 xfer = SkNEW_ARGS(SkSrcXfermode, (rec)); | |
1728 break; | |
1729 case kSrcOver_Mode: | |
1730 SkASSERT(false); // should not land here | |
1731 break; | |
1732 case kDstIn_Mode: | |
1733 xfer = SkNEW_ARGS(SkDstInXfermode, (rec)); | |
1734 break; | |
1735 case kDstOut_Mode: | |
1736 xfer = SkNEW_ARGS(SkDstOutXfermode, (rec)); | |
1737 break; | |
1738 default: | |
1739 xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); | |
1740 break; | |
1741 } | |
1742 gCachedXfermodes[mode] = xfer; | |
1743 } | |
1744 return SkSafeRef(xfer); | |
1745 } | |
1746 | |
1713 SkXfermodeProc SkXfermode::GetProc(Mode mode) { | 1747 SkXfermodeProc SkXfermode::GetProc(Mode mode) { |
1714 SkXfermodeProc proc = NULL; | 1748 SkXfermodeProc proc = NULL; |
1715 if ((unsigned)mode < kModeCount) { | 1749 if ((unsigned)mode < kModeCount) { |
1716 proc = gProcCoeffs[mode].fProc; | 1750 proc = gProcCoeffs[mode].fProc; |
1717 } | 1751 } |
1718 return proc; | 1752 return proc; |
1719 } | 1753 } |
1720 | 1754 |
1721 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { | 1755 bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { |
1722 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); | 1756 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1941 return proc16; | 1975 return proc16; |
1942 } | 1976 } |
1943 | 1977 |
1944 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1978 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1945 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1979 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1946 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1980 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1947 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1981 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1982 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1949 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1983 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1950 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1984 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |