Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Unified Diff: src/pdf/SkPDFGraphicState.cpp

Issue 815223005: Use SkLazyPtr in SkPDFGraphicState.cpp (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix clang compile Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pdf/SkPDFGraphicState.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
}
}
-
« no previous file with comments | « src/pdf/SkPDFGraphicState.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698