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

Side by Side 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 unified diff | Download patch
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2010 The Android Open Source Project 3 * Copyright 2010 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #ifndef SkPDFGraphicState_DEFINED 10 #ifndef SkPDFGraphicState_DEFINED
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 SkPDFSMaskMode sMaskMode); 66 SkPDFSMaskMode sMaskMode);
67 67
68 /** Get a graphic state that only unsets the soft mask. The reference 68 /** Get a graphic state that only unsets the soft mask. The reference
69 * count of the object is incremented and it is the caller's responsibility 69 * count of the object is incremented and it is the caller's responsibility
70 * to unreference it when done. This is needed to accommodate the weak 70 * to unreference it when done. This is needed to accommodate the weak
71 * reference pattern used when the returned object is new and has no 71 * reference pattern used when the returned object is new and has no
72 * other references. 72 * other references.
73 */ 73 */
74 static SkPDFGraphicState* GetNoSMaskGraphicState(); 74 static SkPDFGraphicState* GetNoSMaskGraphicState();
75 75
76 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.
77
76 private: 78 private:
77 const SkPaint fPaint; 79 const SkPaint fPaint;
78 SkTDArray<SkPDFObject*> fResources; 80 SkTDArray<SkPDFObject*> fResources;
79 bool fPopulated; 81 bool fPopulated;
80 bool fSMask; 82 bool fSMask;
81 83
82 class GSCanonicalEntry {
83 public:
84 SkPDFGraphicState* fGraphicState;
85 const SkPaint* fPaint;
86
87 bool operator==(const GSCanonicalEntry& b) const;
88 explicit GSCanonicalEntry(SkPDFGraphicState* gs)
89 : fGraphicState(gs),
90 fPaint(&gs->fPaint) {}
91 explicit GSCanonicalEntry(const SkPaint* paint)
92 : fGraphicState(NULL),
93 fPaint(paint) {}
94 };
95
96 // This should be made a hash table if performance is a problem.
97 static SkTDArray<GSCanonicalEntry>& CanonicalPaints();
98 static SkBaseMutex& CanonicalPaintsMutex();
99
100 SkPDFGraphicState(); 84 SkPDFGraphicState();
101 explicit SkPDFGraphicState(const SkPaint& paint); 85 explicit SkPDFGraphicState(const SkPaint& paint);
102 86
103 void populateDict(); 87 void populateDict();
104 88
105 static SkPDFObject* GetInvertFunction(); 89 static SkPDFObject* GetInvertFunction();
106 90
107 static int Find(const SkPaint& paint); 91 static bool PDFPaintEquality(const SkPaint&, const SkPaint&);
92 static const char* PDFBlendModeFromXfermode(SkXfermode::Mode);
93
108 typedef SkPDFDict INHERITED; 94 typedef SkPDFDict INHERITED;
109 }; 95 };
110 96
97 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.
98 SkXfermode::Mode mode) {
99 switch (mode) {
100 case SkXfermode::kSrcOver_Mode:
101 return "Normal";
102 case SkXfermode::kMultiply_Mode:
103 return "Multiply";
104 case SkXfermode::kScreen_Mode:
105 return "Screen";
106 case SkXfermode::kOverlay_Mode:
107 return "Overlay";
108 case SkXfermode::kDarken_Mode:
109 return "Darken";
110 case SkXfermode::kLighten_Mode:
111 return "Lighten";
112 case SkXfermode::kColorDodge_Mode:
113 return "ColorDodge";
114 case SkXfermode::kColorBurn_Mode:
115 return "ColorBurn";
116 case SkXfermode::kHardLight_Mode:
117 return "HardLight";
118 case SkXfermode::kSoftLight_Mode:
119 return "SoftLight";
120 case SkXfermode::kDifference_Mode:
121 return "Difference";
122 case SkXfermode::kExclusion_Mode:
123 return "Exclusion";
124 case SkXfermode::kHue_Mode:
125 return "Hue";
126 case SkXfermode::kSaturation_Mode:
127 return "Saturation";
128 case SkXfermode::kColor_Mode:
129 return "Color";
130 case SkXfermode::kLuminosity_Mode:
131 return "Luminosity";
132
133 // These are handled in SkPDFDevice::setUpContentEntry.
134 case SkXfermode::kClear_Mode:
135 case SkXfermode::kSrc_Mode:
136 case SkXfermode::kDst_Mode:
137 case SkXfermode::kDstOver_Mode:
138 case SkXfermode::kSrcIn_Mode:
139 case SkXfermode::kDstIn_Mode:
140 case SkXfermode::kSrcOut_Mode:
141 case SkXfermode::kDstOut_Mode:
142 case SkXfermode::kSrcATop_Mode:
143 case SkXfermode::kDstATop_Mode:
144 case SkXfermode::kModulate_Mode:
145 return "Normal";
146
147 // TODO(vandebo): Figure out if we can support more of these modes.
148 case SkXfermode::kXor_Mode:
149 case SkXfermode::kPlus_Mode:
150 return NULL;
151 }
152 return NULL;
153 }
154
155 inline bool SkPDFGraphicState::equals(const SkPaint& paint) const {
156 return SkPDFGraphicState::PDFPaintEquality(paint, fPaint);
157 }
158
159 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.
160 const SkPaint& b) {
161 // We're only interested in some fields of the SkPaint, so we have
162 // a custom equality function.
163 if (SkColorGetA(a.getColor()) != SkColorGetA(b.getColor()) ||
164 a.getStrokeCap() != b.getStrokeCap() ||
165 a.getStrokeJoin() != b.getStrokeJoin() ||
166 a.getStrokeWidth() != b.getStrokeWidth() ||
167 a.getStrokeMiter() != b.getStrokeMiter()) {
168 return false;
169 }
170
171 SkXfermode::Mode aXfermodeName = SkXfermode::kSrcOver_Mode;
172 SkXfermode* aXfermode = a.getXfermode();
173 if (aXfermode) {
174 aXfermode->asMode(&aXfermodeName);
175 }
176 if (aXfermodeName < 0 || aXfermodeName > SkXfermode::kLastMode ||
177 PDFBlendModeFromXfermode(aXfermodeName) == NULL) {
178 aXfermodeName = SkXfermode::kSrcOver_Mode;
179 }
180 const char* aXfermodeString = PDFBlendModeFromXfermode(aXfermodeName);
181 SkASSERT(aXfermodeString != NULL);
182
183 SkXfermode::Mode bXfermodeName = SkXfermode::kSrcOver_Mode;
184 SkXfermode* bXfermode = b.getXfermode();
185 if (bXfermode) {
186 bXfermode->asMode(&bXfermodeName);
187 }
188 if (bXfermodeName < 0 || bXfermodeName > SkXfermode::kLastMode ||
189 PDFBlendModeFromXfermode(bXfermodeName) == NULL) {
190 bXfermodeName = SkXfermode::kSrcOver_Mode;
191 }
192 const char* bXfermodeString = PDFBlendModeFromXfermode(bXfermodeName);
193 SkASSERT(bXfermodeString != NULL);
194
195 return strcmp(aXfermodeString, bXfermodeString) == 0;
196 }
197
111 #endif 198 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698