Use SkLazyPtr in SkPDFGraphicState.cpp
Motivation: currently we rely on mutexes for guarding static initialization. These mutexes will go away. Review URL: https://codereview.chromium.org/815223005
This commit is contained in:
parent
28b44e8f27
commit
e6ea244717
@ -6,6 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "SkData.h"
|
#include "SkData.h"
|
||||||
|
#include "SkLazyPtr.h"
|
||||||
#include "SkPDFCanon.h"
|
#include "SkPDFCanon.h"
|
||||||
#include "SkPDFFormXObject.h"
|
#include "SkPDFFormXObject.h"
|
||||||
#include "SkPDFGraphicState.h"
|
#include "SkPDFGraphicState.h"
|
||||||
@ -144,30 +145,37 @@ SkPDFGraphicState* SkPDFGraphicState::GetGraphicStateForPaint(
|
|||||||
return pdfGraphicState;
|
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
|
// static
|
||||||
SkPDFObject* SkPDFGraphicState::GetInvertFunction() {
|
SkPDFObject* SkPDFGraphicState::GetInvertFunction() {
|
||||||
// This assumes that canonicalPaintsMutex is held.
|
return invertFunction.get();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -175,7 +183,6 @@ SkPDFGraphicState* SkPDFGraphicState::GetSMaskGraphicState(
|
|||||||
SkPDFFormXObject* sMask, bool invert, SkPDFSMaskMode sMaskMode) {
|
SkPDFFormXObject* sMask, bool invert, SkPDFSMaskMode sMaskMode) {
|
||||||
// The practical chances of using the same mask more than once are unlikely
|
// The practical chances of using the same mask more than once are unlikely
|
||||||
// enough that it's not worth canonicalizing.
|
// enough that it's not worth canonicalizing.
|
||||||
SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex());
|
|
||||||
SkAutoTUnref<SkPDFDict> sMaskDict(new SkPDFDict("Mask"));
|
SkAutoTUnref<SkPDFDict> sMaskDict(new SkPDFDict("Mask"));
|
||||||
if (sMaskMode == kAlpha_SMaskMode) {
|
if (sMaskMode == kAlpha_SMaskMode) {
|
||||||
sMaskDict->insertName("S", "Alpha");
|
sMaskDict->insertName("S", "Alpha");
|
||||||
@ -202,19 +209,22 @@ SkPDFGraphicState* SkPDFGraphicState::GetSMaskGraphicState(
|
|||||||
return result;
|
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
|
// static
|
||||||
SkPDFGraphicState* SkPDFGraphicState::GetNoSMaskGraphicState() {
|
SkPDFGraphicState* SkPDFGraphicState::GetNoSMaskGraphicState() {
|
||||||
SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex());
|
return SkRef(noSMaskGraphicState.get());
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SkPDFGraphicState::SkPDFGraphicState()
|
SkPDFGraphicState::SkPDFGraphicState()
|
||||||
@ -270,4 +280,3 @@ void SkPDFGraphicState::populateDict() {
|
|||||||
insertName("BM", as_blend_mode(xfermode));
|
insertName("BM", as_blend_mode(xfermode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,9 @@ public:
|
|||||||
|
|
||||||
bool equals(const SkPaint&) const;
|
bool equals(const SkPaint&) const;
|
||||||
|
|
||||||
|
// Only public for SK_DECLARE_STATIC_LAZY_PTR
|
||||||
|
static SkPDFGraphicState* CreateNoSMaskGraphicState();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const SkPaint fPaint;
|
const SkPaint fPaint;
|
||||||
SkTDArray<SkPDFObject*> fResources;
|
SkTDArray<SkPDFObject*> fResources;
|
||||||
|
Loading…
Reference in New Issue
Block a user