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

Unified Diff: src/pdf/SkPDFGraphicState.cpp

Issue 842253003: SkPDFCanon (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 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
Index: src/pdf/SkPDFGraphicState.cpp
diff --git a/src/pdf/SkPDFGraphicState.cpp b/src/pdf/SkPDFGraphicState.cpp
index 7664ed699b24f89a2385f3438610e9d9d6f1599a..a93ebff95c81dd1a74f39094efdd1aaf9bc59b5b 100644
--- a/src/pdf/SkPDFGraphicState.cpp
+++ b/src/pdf/SkPDFGraphicState.cpp
@@ -6,59 +6,16 @@
*/
#include "SkData.h"
+#include "SkPDFCanon.h"
#include "SkPDFFormXObject.h"
#include "SkPDFGraphicState.h"
#include "SkPDFUtils.h"
#include "SkTypes.h"
-static const char* blend_mode_from_xfermode(SkXfermode::Mode mode) {
- switch (mode) {
- case SkXfermode::kSrcOver_Mode: return "Normal";
- case SkXfermode::kMultiply_Mode: return "Multiply";
- case SkXfermode::kScreen_Mode: return "Screen";
- case SkXfermode::kOverlay_Mode: return "Overlay";
- case SkXfermode::kDarken_Mode: return "Darken";
- case SkXfermode::kLighten_Mode: return "Lighten";
- case SkXfermode::kColorDodge_Mode: return "ColorDodge";
- case SkXfermode::kColorBurn_Mode: return "ColorBurn";
- case SkXfermode::kHardLight_Mode: return "HardLight";
- case SkXfermode::kSoftLight_Mode: return "SoftLight";
- case SkXfermode::kDifference_Mode: return "Difference";
- case SkXfermode::kExclusion_Mode: return "Exclusion";
- case SkXfermode::kHue_Mode: return "Hue";
- case SkXfermode::kSaturation_Mode: return "Saturation";
- case SkXfermode::kColor_Mode: return "Color";
- case SkXfermode::kLuminosity_Mode: return "Luminosity";
-
- // These are handled in SkPDFDevice::setUpContentEntry.
- case SkXfermode::kClear_Mode:
- case SkXfermode::kSrc_Mode:
- case SkXfermode::kDst_Mode:
- case SkXfermode::kDstOver_Mode:
- case SkXfermode::kSrcIn_Mode:
- case SkXfermode::kDstIn_Mode:
- case SkXfermode::kSrcOut_Mode:
- case SkXfermode::kDstOut_Mode:
- case SkXfermode::kSrcATop_Mode:
- case SkXfermode::kDstATop_Mode:
- case SkXfermode::kModulate_Mode:
- return "Normal";
-
- // TODO(vandebo): Figure out if we can support more of these modes.
- case SkXfermode::kXor_Mode:
- case SkXfermode::kPlus_Mode:
- return NULL;
- }
- return NULL;
-}
-
SkPDFGraphicState::~SkPDFGraphicState() {
- SkAutoMutexAcquire lock(CanonicalPaintsMutex());
+ SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex());
if (!fSMask) {
- int index = Find(fPaint);
- SkASSERT(index >= 0);
- SkASSERT(CanonicalPaints()[index].fGraphicState == this);
- CanonicalPaints().removeShuffle(index);
+ SkPDFCanon::GetCanon().removeGraphicState(this);
}
fResources.unrefAll();
}
@@ -82,35 +39,22 @@ size_t SkPDFGraphicState::getOutputSize(SkPDFCatalog* catalog, bool indirect) {
}
// static
-SkTDArray<SkPDFGraphicState::GSCanonicalEntry>& SkPDFGraphicState::CanonicalPaints() {
- CanonicalPaintsMutex().assertHeld();
- static SkTDArray<SkPDFGraphicState::GSCanonicalEntry> gCanonicalPaints;
- return gCanonicalPaints;
-}
-
-SK_DECLARE_STATIC_MUTEX(gCanonicalPaintsMutex);
-// static
-SkBaseMutex& SkPDFGraphicState::CanonicalPaintsMutex() {
- return gCanonicalPaintsMutex;
-}
-
-// static
SkPDFGraphicState* SkPDFGraphicState::GetGraphicStateForPaint(const SkPaint& paint) {
- SkAutoMutexAcquire lock(CanonicalPaintsMutex());
- int index = Find(paint);
- if (index >= 0) {
- CanonicalPaints()[index].fGraphicState->ref();
- return CanonicalPaints()[index].fGraphicState;
+ SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex());
+ SkPDFGraphicState* pdfGraphicState =
+ SkPDFCanon::GetCanon().findGraphicState(paint);
+ if (pdfGraphicState) {
+ return SkRef(pdfGraphicState);
}
- GSCanonicalEntry newEntry(new SkPDFGraphicState(paint));
- CanonicalPaints().push(newEntry);
- return newEntry.fGraphicState;
+ pdfGraphicState = new SkPDFGraphicState(paint);
+ SkPDFCanon::GetCanon().addGraphicState(pdfGraphicState);
+ return pdfGraphicState;
}
// static
SkPDFObject* SkPDFGraphicState::GetInvertFunction() {
// This assumes that canonicalPaintsMutex is held.
- CanonicalPaintsMutex().assertHeld();
+ SkPDFCanon::GetPaintMutex().assertHeld();
static SkPDFStream* invertFunction = NULL;
if (!invertFunction) {
// Acrobat crashes if we use a type 0 function, kpdf crashes if we use
@@ -138,8 +82,7 @@ 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(CanonicalPaintsMutex());
-
+ SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex());
SkAutoTUnref<SkPDFDict> sMaskDict(new SkPDFDict("Mask"));
if (sMaskMode == kAlpha_SMaskMode) {
sMaskDict->insertName("S", "Alpha");
@@ -168,7 +111,7 @@ SkPDFGraphicState* SkPDFGraphicState::GetSMaskGraphicState(
// static
SkPDFGraphicState* SkPDFGraphicState::GetNoSMaskGraphicState() {
- SkAutoMutexAcquire lock(CanonicalPaintsMutex());
+ SkAutoMutexAcquire lock(SkPDFCanon::GetPaintMutex());
static SkPDFGraphicState* noSMaskGS = NULL;
if (!noSMaskGS) {
noSMaskGS = new SkPDFGraphicState;
@@ -181,13 +124,6 @@ SkPDFGraphicState* SkPDFGraphicState::GetNoSMaskGraphicState() {
return noSMaskGS;
}
-// static
-int SkPDFGraphicState::Find(const SkPaint& paint) {
- CanonicalPaintsMutex().assertHeld();
- GSCanonicalEntry search(&paint);
- return CanonicalPaints().find(search);
-}
-
SkPDFGraphicState::SkPDFGraphicState()
: fPopulated(false),
fSMask(false) {
@@ -234,54 +170,11 @@ void SkPDFGraphicState::populateDict() {
fPaint.getXfermode()->asMode(&xfermode);
// If we don't support the mode, just use kSrcOver_Mode.
if (xfermode < 0 || xfermode > SkXfermode::kLastMode ||
- blend_mode_from_xfermode(xfermode) == NULL) {
+ PDFBlendModeFromXfermode(xfermode) == NULL) {
xfermode = SkXfermode::kSrcOver_Mode;
NOT_IMPLEMENTED("unsupported xfermode", false);
}
- insertName("BM", blend_mode_from_xfermode(xfermode));
+ insertName("BM", PDFBlendModeFromXfermode(xfermode));
}
}
-// We're only interested in some fields of the SkPaint, so we have a custom
-// operator== function.
-bool SkPDFGraphicState::GSCanonicalEntry::operator==(
- const SkPDFGraphicState::GSCanonicalEntry& gs) const {
- const SkPaint* a = fPaint;
- const SkPaint* b = gs.fPaint;
- SkASSERT(a != NULL);
- SkASSERT(b != NULL);
-
- if (SkColorGetA(a->getColor()) != SkColorGetA(b->getColor()) ||
- a->getStrokeCap() != b->getStrokeCap() ||
- a->getStrokeJoin() != b->getStrokeJoin() ||
- a->getStrokeWidth() != b->getStrokeWidth() ||
- a->getStrokeMiter() != b->getStrokeMiter()) {
- return false;
- }
-
- SkXfermode::Mode aXfermodeName = SkXfermode::kSrcOver_Mode;
- SkXfermode* aXfermode = a->getXfermode();
- if (aXfermode) {
- aXfermode->asMode(&aXfermodeName);
- }
- if (aXfermodeName < 0 || aXfermodeName > SkXfermode::kLastMode ||
- blend_mode_from_xfermode(aXfermodeName) == NULL) {
- aXfermodeName = SkXfermode::kSrcOver_Mode;
- }
- const char* aXfermodeString = blend_mode_from_xfermode(aXfermodeName);
- SkASSERT(aXfermodeString != NULL);
-
- SkXfermode::Mode bXfermodeName = SkXfermode::kSrcOver_Mode;
- SkXfermode* bXfermode = b->getXfermode();
- if (bXfermode) {
- bXfermode->asMode(&bXfermodeName);
- }
- if (bXfermodeName < 0 || bXfermodeName > SkXfermode::kLastMode ||
- blend_mode_from_xfermode(bXfermodeName) == NULL) {
- bXfermodeName = SkXfermode::kSrcOver_Mode;
- }
- const char* bXfermodeString = blend_mode_from_xfermode(bXfermodeName);
- SkASSERT(bXfermodeString != NULL);
-
- return strcmp(aXfermodeString, bXfermodeString) == 0;
-}

Powered by Google App Engine
This is Rietveld 408576698