Index: src/core/SkXfermode.cpp |
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp |
index 182d3b7197ce20b168275fdd10f73bb25b53f830..b5f95dad51bc9fca81073e6e4908c0a3243f97d2 100644 |
--- a/src/core/SkXfermode.cpp |
+++ b/src/core/SkXfermode.cpp |
@@ -11,8 +11,8 @@ |
#include "SkXfermode_opts_SSE2.h" |
#include "SkXfermode_proccoeff.h" |
#include "SkColorPriv.h" |
+#include "SkLazyPtr.h" |
#include "SkMathPriv.h" |
-#include "SkOnce.h" |
#include "SkReadBuffer.h" |
#include "SkString.h" |
#include "SkUtilsArm.h" |
@@ -1651,26 +1651,13 @@ void SkDstOutXfermode::toString(SkString* str) const { |
/////////////////////////////////////////////////////////////////////////////// |
-SK_DECLARE_STATIC_MUTEX(gCachedXfermodesMutex); |
-static SkXfermode* gCachedXfermodes[SkXfermode::kLastMode + 1]; // All NULL to start. |
-static bool gXfermodeCached[SK_ARRAY_COUNT(gCachedXfermodes)]; // All false to start. |
- |
-void SkXfermode::Term() { |
- SkAutoMutexAcquire ac(gCachedXfermodesMutex); |
- |
- for (size_t i = 0; i < SK_ARRAY_COUNT(gCachedXfermodes); ++i) { |
- SkSafeUnref(gCachedXfermodes[i]); |
- gCachedXfermodes[i] = NULL; |
- } |
-} |
- |
-extern SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec, |
- SkXfermode::Mode mode); |
+extern SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec, SkXfermode::Mode mode); |
extern SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode); |
- |
-static void create_mode(SkXfermode::Mode mode) { |
- SkASSERT(NULL == gCachedXfermodes[mode]); |
+// Technically, can't be static and passed as a template parameter. So we use anonymous namespace. |
+namespace { |
+SkXfermode* create_mode(int iMode) { |
+ SkXfermode::Mode mode = (SkXfermode::Mode)iMode; |
ProcCoeff rec = gProcCoeffs[mode]; |
SkXfermodeProc pp = SkPlatformXfermodeProcFactory(mode); |
@@ -1709,28 +1696,27 @@ static void create_mode(SkXfermode::Mode mode) { |
break; |
} |
} |
- gCachedXfermodes[mode] = xfer; |
+ return xfer; |
} |
+} // namespace |
+ |
SkXfermode* SkXfermode::Create(Mode mode) { |
SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |
- SkASSERT(SK_ARRAY_COUNT(gCachedXfermodes) == kModeCount); |
if ((unsigned)mode >= kModeCount) { |
// report error |
return NULL; |
} |
- // Skia's "defaut" mode is srcover. NULL in SkPaint is interpreted as srcover |
+ // Skia's "default" mode is srcover. NULL in SkPaint is interpreted as srcover |
// so we can just return NULL from the factory. |
if (kSrcOver_Mode == mode) { |
return NULL; |
} |
- SkOnce(&gXfermodeCached[mode], &gCachedXfermodesMutex, create_mode, mode); |
- SkXfermode* xfer = gCachedXfermodes[mode]; |
- SkASSERT(xfer != NULL); |
- return SkSafeRef(xfer); |
+ SK_DECLARE_STATIC_LAZY_PTR_ARRAY(SkXfermode, cached, kModeCount, create_mode); |
+ return SkSafeRef(cached[mode]); |
} |
SkXfermodeProc SkXfermode::GetProc(Mode mode) { |