OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
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 #ifndef SkPathRef_DEFINED | 9 #ifndef SkPathRef_DEFINED |
10 #define SkPathRef_DEFINED | 10 #define SkPathRef_DEFINED |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 | 173 |
174 static SkPathRef* CreateFromBuffer(SkRBuffer* buffer); | 174 static SkPathRef* CreateFromBuffer(SkRBuffer* buffer); |
175 | 175 |
176 /** | 176 /** |
177 * Rollsback a path ref to zero verbs and points with the assumption that th
e path ref will be | 177 * Rollsback a path ref to zero verbs and points with the assumption that th
e path ref will be |
178 * repopulated with approximately the same number of verbs and points. A new
path ref is created | 178 * repopulated with approximately the same number of verbs and points. A new
path ref is created |
179 * only if necessary. | 179 * only if necessary. |
180 */ | 180 */ |
181 static void Rewind(SkAutoTUnref<SkPathRef>* pathRef); | 181 static void Rewind(SkAutoTUnref<SkPathRef>* pathRef); |
182 | 182 |
183 virtual ~SkPathRef(); | 183 virtual ~SkPathRef() { |
| 184 SkDEBUGCODE(this->validate();) |
| 185 sk_free(fPoints); |
| 186 |
| 187 SkDEBUGCODE(fPoints = NULL;) |
| 188 SkDEBUGCODE(fVerbs = NULL;) |
| 189 SkDEBUGCODE(fVerbCnt = 0x9999999;) |
| 190 SkDEBUGCODE(fPointCnt = 0xAAAAAAA;) |
| 191 SkDEBUGCODE(fPointCnt = 0xBBBBBBB;) |
| 192 SkDEBUGCODE(fGenerationID = 0xEEEEEEEE;) |
| 193 SkDEBUGCODE(fEditorsAttached = 0x7777777;) |
| 194 } |
| 195 |
184 int countPoints() const { SkDEBUGCODE(this->validate();) return fPointCnt; } | 196 int countPoints() const { SkDEBUGCODE(this->validate();) return fPointCnt; } |
185 int countVerbs() const { SkDEBUGCODE(this->validate();) return fVerbCnt; } | 197 int countVerbs() const { SkDEBUGCODE(this->validate();) return fVerbCnt; } |
186 int countWeights() const { SkDEBUGCODE(this->validate();) return fConicWeigh
ts.count(); } | 198 int countWeights() const { SkDEBUGCODE(this->validate();) return fConicWeigh
ts.count(); } |
187 | 199 |
188 /** | 200 /** |
189 * Returns a pointer one beyond the first logical verb (last verb in memory
order). | 201 * Returns a pointer one beyond the first logical verb (last verb in memory
order). |
190 */ | 202 */ |
191 const uint8_t* verbs() const { SkDEBUGCODE(this->validate();) return fVerbs;
} | 203 const uint8_t* verbs() const { SkDEBUGCODE(this->validate();) return fVerbs;
} |
192 | 204 |
193 /** | 205 /** |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 */ | 244 */ |
233 uint32_t writeSize() const; | 245 uint32_t writeSize() const; |
234 | 246 |
235 /** | 247 /** |
236 * Gets an ID that uniquely identifies the contents of the path ref. If two
path refs have the | 248 * Gets an ID that uniquely identifies the contents of the path ref. If two
path refs have the |
237 * same ID then they have the same verbs and points. However, two path refs
may have the same | 249 * same ID then they have the same verbs and points. However, two path refs
may have the same |
238 * contents but different genIDs. | 250 * contents but different genIDs. |
239 */ | 251 */ |
240 uint32_t genID() const; | 252 uint32_t genID() const; |
241 | 253 |
242 struct GenIDChangeListener { | |
243 virtual ~GenIDChangeListener() {} | |
244 virtual void onChange() = 0; | |
245 }; | |
246 | |
247 void addGenIDChangeListener(GenIDChangeListener* listener); | |
248 | |
249 SkDEBUGCODE(void validate() const;) | 254 SkDEBUGCODE(void validate() const;) |
250 | 255 |
251 private: | 256 private: |
252 enum SerializationOffsets { | 257 enum SerializationOffsets { |
253 kIsFinite_SerializationShift = 25, // requires 1 bit | 258 kIsFinite_SerializationShift = 25, // requires 1 bit |
254 kIsOval_SerializationShift = 24, // requires 1 bit | 259 kIsOval_SerializationShift = 24, // requires 1 bit |
255 kSegmentMask_SerializationShift = 0 // requires 4 bits | 260 kSegmentMask_SerializationShift = 0 // requires 4 bits |
256 }; | 261 }; |
257 | 262 |
258 SkPathRef() { | 263 SkPathRef() { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 friend SkPathRef* sk_create_empty_pathref(); | 415 friend SkPathRef* sk_create_empty_pathref(); |
411 | 416 |
412 void setIsOval(bool isOval) { fIsOval = isOval; } | 417 void setIsOval(bool isOval) { fIsOval = isOval; } |
413 | 418 |
414 SkPoint* getPoints() { | 419 SkPoint* getPoints() { |
415 SkDEBUGCODE(this->validate();) | 420 SkDEBUGCODE(this->validate();) |
416 fIsOval = false; | 421 fIsOval = false; |
417 return fPoints; | 422 return fPoints; |
418 } | 423 } |
419 | 424 |
420 void callGenIDChangeListeners(); | |
421 | |
422 enum { | 425 enum { |
423 kMinSize = 256, | 426 kMinSize = 256, |
424 }; | 427 }; |
425 | 428 |
426 mutable SkRect fBounds; | 429 mutable SkRect fBounds; |
427 mutable uint8_t fBoundsIsDirty; | 430 mutable uint8_t fBoundsIsDirty; |
428 mutable SkBool8 fIsFinite; // only meaningful if bounds are valid | 431 mutable SkBool8 fIsFinite; // only meaningful if bounds are valid |
429 | 432 |
430 SkBool8 fIsOval; | 433 SkBool8 fIsOval; |
431 uint8_t fSegmentMask; | 434 uint8_t fSegmentMask; |
432 | 435 |
433 SkPoint* fPoints; // points to begining of the allocation | 436 SkPoint* fPoints; // points to begining of the allocation |
434 uint8_t* fVerbs; // points just past the end of the allocation (v
erbs grow backwards) | 437 uint8_t* fVerbs; // points just past the end of the allocation (v
erbs grow backwards) |
435 int fVerbCnt; | 438 int fVerbCnt; |
436 int fPointCnt; | 439 int fPointCnt; |
437 size_t fFreeSpace; // redundant but saves computation | 440 size_t fFreeSpace; // redundant but saves computation |
438 SkTDArray<SkScalar> fConicWeights; | 441 SkTDArray<SkScalar> fConicWeights; |
439 | 442 |
440 enum { | 443 enum { |
441 kEmptyGenID = 1, // GenID reserved for path ref with zero points and zer
o verbs. | 444 kEmptyGenID = 1, // GenID reserved for path ref with zero points and zer
o verbs. |
442 }; | 445 }; |
443 mutable uint32_t fGenerationID; | 446 mutable uint32_t fGenerationID; |
444 SkDEBUGCODE(int32_t fEditorsAttached;) // assert that only one editor in use
at any time. | 447 SkDEBUGCODE(int32_t fEditorsAttached;) // assert that only one editor in use
at any time. |
445 | 448 |
446 SkTDArray<GenIDChangeListener*> fGenIDChangeListeners; // pointers are owne
d | |
447 | |
448 friend class PathRefTest_Private; | 449 friend class PathRefTest_Private; |
449 typedef SkRefCnt INHERITED; | 450 typedef SkRefCnt INHERITED; |
450 }; | 451 }; |
451 | 452 |
452 #endif | 453 #endif |
OLD | NEW |