| Index: src/core/SkXfermode.cpp
|
| diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
|
| index 18ab9b6a0a6347a45771673fddd32121a19ca0c6..8548fe8aaca251fcac622864270496a92516039d 100644
|
| --- a/src/core/SkXfermode.cpp
|
| +++ b/src/core/SkXfermode.cpp
|
| @@ -9,8 +9,8 @@
|
| #include "SkXfermode.h"
|
| #include "SkXfermode_proccoeff.h"
|
| #include "SkColorPriv.h"
|
| -#include "SkLazyPtr.h"
|
| #include "SkMathPriv.h"
|
| +#include "SkOncePtr.h"
|
| #include "SkOpts.h"
|
| #include "SkReadBuffer.h"
|
| #include "SkString.h"
|
| @@ -996,20 +996,7 @@ void SkProcCoeffXfermode::toString(SkString* str) const {
|
| #endif
|
|
|
|
|
| -// 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];
|
| - if (auto xfermode = SkOpts::create_xfermode(rec, mode)) {
|
| - return xfermode;
|
| - }
|
| - return new SkProcCoeffXfermode(rec, mode);
|
| -}
|
| -} // namespace
|
| -
|
| -SK_DECLARE_STATIC_LAZY_PTR_ARRAY(SkXfermode, cached, SkXfermode::kLastMode + 1, create_mode);
|
| +SK_DECLARE_STATIC_ONCE_PTR(SkXfermode, cached[SkXfermode::kLastMode + 1]);
|
|
|
| SkXfermode* SkXfermode::Create(Mode mode) {
|
| SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
|
| @@ -1025,7 +1012,13 @@ SkXfermode* SkXfermode::Create(Mode mode) {
|
| return nullptr;
|
| }
|
|
|
| - return SkSafeRef(cached[mode]);
|
| + return SkSafeRef(cached[mode].get([=]{
|
| + ProcCoeff rec = gProcCoeffs[mode];
|
| + if (auto xfermode = SkOpts::create_xfermode(rec, mode)) {
|
| + return xfermode;
|
| + }
|
| + return (SkXfermode*) new SkProcCoeffXfermode(rec, mode);
|
| + }));
|
| }
|
|
|
| SkXfermodeProc SkXfermode::GetProc(Mode mode) {
|
|
|