Index: src/pdf/SkPDFGraphicState.cpp |
diff --git a/src/pdf/SkPDFGraphicState.cpp b/src/pdf/SkPDFGraphicState.cpp |
index c50a34994a95a6868dabe1e9d908cea747288f65..0e0873d9f0c8cc60bfb12e510f47f50559f6f411 100644 |
--- a/src/pdf/SkPDFGraphicState.cpp |
+++ b/src/pdf/SkPDFGraphicState.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "SkData.h" |
+#include "SkLazyPtr.h" |
#include "SkPDFCanon.h" |
#include "SkPDFFormXObject.h" |
#include "SkPDFGraphicState.h" |
@@ -144,30 +145,37 @@ SkPDFGraphicState* SkPDFGraphicState::GetGraphicStateForPaint( |
return pdfGraphicState; |
} |
+namespace { |
+SkPDFObject* create_invert_function() { |
+ // Acrobat crashes if we use a type 0 function, kpdf crashes if we use |
+ // a type 2 function, so we use a type 4 function. |
+ SkAutoTUnref<SkPDFArray> domainAndRange(new SkPDFArray); |
+ domainAndRange->reserve(2); |
+ domainAndRange->appendInt(0); |
+ domainAndRange->appendInt(1); |
+ |
+ static const char psInvert[] = "{1 exch sub}"; |
+ // Do not copy the trailing '\0' into the SkData. |
+ SkAutoTUnref<SkData> psInvertStream( |
+ SkData::NewWithoutCopy(psInvert, strlen(psInvert))); |
+ |
+ SkPDFStream* invertFunction = SkNEW_ARGS( |
+ SkPDFStream, (psInvertStream.get())); |
+ invertFunction->insertInt("FunctionType", 4); |
+ invertFunction->insert("Domain", domainAndRange.get()); |
+ invertFunction->insert("Range", domainAndRange.get()); |
+ return invertFunction; |
+} |
+ |
+template <typename T> void unref(T* ptr) { ptr->unref(); } |
+} // namespace |
+ |
+SK_DECLARE_STATIC_LAZY_PTR(SkPDFObject, invertFunction, |
+ create_invert_function, unref<SkPDFObject>); |
+ |
// static |
SkPDFObject* SkPDFGraphicState::GetInvertFunction() { |
- // This assumes that canonicalPaintsMutex is held. |
- SkPDFCanon::GetPaintMutex().assertHeld(); |
- static SkPDFStream* invertFunction = NULL; |
- if (!invertFunction) { |
- // Acrobat crashes if we use a type 0 function, kpdf crashes if we use |
- // a type 2 function, so we use a type 4 function. |
- SkAutoTUnref<SkPDFArray> domainAndRange(new SkPDFArray); |
- domainAndRange->reserve(2); |
- domainAndRange->appendInt(0); |
- domainAndRange->appendInt(1); |
- |
- static const char psInvert[] = "{1 exch sub}"; |
- // Do not copy the trailing '\0' into the SkData. |
- SkAutoTUnref<SkData> psInvertStream( |
- SkData::NewWithoutCopy(psInvert, strlen(psInvert))); |
- |
- invertFunction = new SkPDFStream(psInvertStream.get()); |
- invertFunction->insertInt("FunctionType", 4); |
- invertFunction->insert("Domain", domainAndRange.get()); |
- invertFunction->insert("Range", domainAndRange.get()); |
- } |
- return invertFunction; |
+ return invertFunction.get(); |
} |
// static |
@@ -175,7 +183,6 @@ SkPDFGraphicState* SkPDFGraphicState::GetSMaskGraphicState( |
SkPDFFormXObject* sMask, bool invert, SkPDFSMaskMode sMaskMode) { |
// The practical chances of using the same mask more than once are unlikely |
// enough that it's not worth canonicalizing. |
- SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex()); |
SkAutoTUnref<SkPDFDict> sMaskDict(new SkPDFDict("Mask")); |
if (sMaskMode == kAlpha_SMaskMode) { |
sMaskDict->insertName("S", "Alpha"); |
@@ -202,19 +209,22 @@ SkPDFGraphicState* SkPDFGraphicState::GetSMaskGraphicState( |
return result; |
} |
+SkPDFGraphicState* SkPDFGraphicState::CreateNoSMaskGraphicState() { |
+ SkPDFGraphicState* noSMaskGS = SkNEW(SkPDFGraphicState); |
+ noSMaskGS->fPopulated = true; |
+ noSMaskGS->fSMask = true; |
+ noSMaskGS->insertName("Type", "ExtGState"); |
+ noSMaskGS->insertName("SMask", "None"); |
+ return noSMaskGS; |
+} |
+ |
+SK_DECLARE_STATIC_LAZY_PTR( |
+ SkPDFGraphicState, noSMaskGraphicState, |
+ SkPDFGraphicState::CreateNoSMaskGraphicState, unref<SkPDFGraphicState>); |
+ |
// static |
SkPDFGraphicState* SkPDFGraphicState::GetNoSMaskGraphicState() { |
- SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex()); |
- static SkPDFGraphicState* noSMaskGS = NULL; |
- if (!noSMaskGS) { |
- noSMaskGS = new SkPDFGraphicState; |
- noSMaskGS->fPopulated = true; |
- noSMaskGS->fSMask = true; |
- noSMaskGS->insertName("Type", "ExtGState"); |
- noSMaskGS->insertName("SMask", "None"); |
- } |
- noSMaskGS->ref(); |
- return noSMaskGS; |
+ return SkRef(noSMaskGraphicState.get()); |
} |
SkPDFGraphicState::SkPDFGraphicState() |
@@ -270,4 +280,3 @@ void SkPDFGraphicState::populateDict() { |
insertName("BM", as_blend_mode(xfermode)); |
} |
} |
- |