OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |