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

Unified Diff: src/pdf/SkPDFGraphicState.h

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.h
diff --git a/src/pdf/SkPDFGraphicState.h b/src/pdf/SkPDFGraphicState.h
index 9182efeffb02080285518b579d2b7d685f13aceb..8761f99c781e95dd6273b0157655a75e9f332faf 100644
--- a/src/pdf/SkPDFGraphicState.h
+++ b/src/pdf/SkPDFGraphicState.h
@@ -73,30 +73,14 @@ public:
*/
static SkPDFGraphicState* GetNoSMaskGraphicState();
+ bool equals(const SkPaint&) const;
mtklein 2015/01/20 21:59:52 If you're going to inline this, do it here? bool
hal.canary 2015/01/21 17:07:51 Done.
+
private:
const SkPaint fPaint;
SkTDArray<SkPDFObject*> fResources;
bool fPopulated;
bool fSMask;
- class GSCanonicalEntry {
- public:
- SkPDFGraphicState* fGraphicState;
- const SkPaint* fPaint;
-
- bool operator==(const GSCanonicalEntry& b) const;
- explicit GSCanonicalEntry(SkPDFGraphicState* gs)
- : fGraphicState(gs),
- fPaint(&gs->fPaint) {}
- explicit GSCanonicalEntry(const SkPaint* paint)
- : fGraphicState(NULL),
- fPaint(paint) {}
- };
-
- // This should be made a hash table if performance is a problem.
- static SkTDArray<GSCanonicalEntry>& CanonicalPaints();
- static SkBaseMutex& CanonicalPaintsMutex();
-
SkPDFGraphicState();
explicit SkPDFGraphicState(const SkPaint& paint);
@@ -104,8 +88,111 @@ private:
static SkPDFObject* GetInvertFunction();
- static int Find(const SkPaint& paint);
+ static bool PDFPaintEquality(const SkPaint&, const SkPaint&);
+ static const char* PDFBlendModeFromXfermode(SkXfermode::Mode);
+
typedef SkPDFDict INHERITED;
};
+inline const char* SkPDFGraphicState::PDFBlendModeFromXfermode(
mtklein 2015/01/20 21:59:51 Same deal. Seems like these two giant methods don
hal.canary 2015/01/21 17:07:51 Done.
+ 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;
+}
+
+inline bool SkPDFGraphicState::equals(const SkPaint& paint) const {
+ return SkPDFGraphicState::PDFPaintEquality(paint, fPaint);
+}
+
+inline bool SkPDFGraphicState::PDFPaintEquality(const SkPaint& a,
mtklein 2015/01/20 21:59:52 I keep glazing over reading these names.. consider
hal.canary 2015/01/21 17:07:51 Done.
+ const SkPaint& b) {
+ // We're only interested in some fields of the SkPaint, so we have
+ // a custom equality function.
+ 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 ||
+ PDFBlendModeFromXfermode(aXfermodeName) == NULL) {
+ aXfermodeName = SkXfermode::kSrcOver_Mode;
+ }
+ const char* aXfermodeString = PDFBlendModeFromXfermode(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 ||
+ PDFBlendModeFromXfermode(bXfermodeName) == NULL) {
+ bXfermodeName = SkXfermode::kSrcOver_Mode;
+ }
+ const char* bXfermodeString = PDFBlendModeFromXfermode(bXfermodeName);
+ SkASSERT(bXfermodeString != NULL);
+
+ return strcmp(aXfermodeString, bXfermodeString) == 0;
+}
+
#endif

Powered by Google App Engine
This is Rietveld 408576698