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

Side by Side Diff: include/core/SkPathRef.h

Issue 115323004: Improved SkPathRef interface security (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Fix private pathref test pattern Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « include/core/SkPath.h ('k') | src/core/SkPathRef.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 public: 42 public:
43 Editor(SkAutoTUnref<SkPathRef>* pathRef, 43 Editor(SkAutoTUnref<SkPathRef>* pathRef,
44 int incReserveVerbs = 0, 44 int incReserveVerbs = 0,
45 int incReservePoints = 0); 45 int incReservePoints = 0);
46 46
47 ~Editor() { SkDEBUGCODE(sk_atomic_dec(&fPathRef->fEditorsAttached);) } 47 ~Editor() { SkDEBUGCODE(sk_atomic_dec(&fPathRef->fEditorsAttached);) }
48 48
49 /** 49 /**
50 * Returns the array of points. 50 * Returns the array of points.
51 */ 51 */
52 SkPoint* points() { return fPathRef->fPoints; } 52 SkPoint* points() { return fPathRef->getPoints(); }
53 const SkPoint* points() const { return fPathRef->points(); }
53 54
54 /** 55 /**
55 * Gets the ith point. Shortcut for this->points() + i 56 * Gets the ith point. Shortcut for this->points() + i
56 */ 57 */
57 SkPoint* atPoint(int i) { 58 SkPoint* atPoint(int i) {
58 SkASSERT((unsigned) i < (unsigned) fPathRef->fPointCnt); 59 SkASSERT((unsigned) i < (unsigned) fPathRef->fPointCnt);
59 return this->points() + i; 60 return this->points() + i;
60 }; 61 };
62 const SkPoint* atPoint(int i) const {
63 SkASSERT((unsigned) i < (unsigned) fPathRef->fPointCnt);
64 return this->points() + i;
65 };
61 66
62 /** 67 /**
63 * Adds the verb and allocates space for the number of points indicated by the verb. The 68 * Adds the verb and allocates space for the number of points indicated by the verb. The
64 * return value is a pointer to where the points for the verb should be written. 69 * return value is a pointer to where the points for the verb should be written.
65 * 'weight' is only used if 'verb' is kConic_Verb 70 * 'weight' is only used if 'verb' is kConic_Verb
66 */ 71 */
67 SkPoint* growForVerb(int /*SkPath::Verb*/ verb, SkScalar weight = 0) { 72 SkPoint* growForVerb(int /*SkPath::Verb*/ verb, SkScalar weight = 0) {
68 SkDEBUGCODE(fPathRef->validate();) 73 SkDEBUGCODE(fPathRef->validate();)
69 return fPathRef->growForVerb(verb, weight); 74 return fPathRef->growForVerb(verb, weight);
70 } 75 }
(...skipping 11 matching lines...) Expand all
82 return fPathRef->growForRepeatedVerb(verb, numVbs, weights); 87 return fPathRef->growForRepeatedVerb(verb, numVbs, weights);
83 } 88 }
84 89
85 /** 90 /**
86 * Resets the path ref to a new verb and point count. The new verbs and points are 91 * Resets the path ref to a new verb and point count. The new verbs and points are
87 * uninitialized. 92 * uninitialized.
88 */ 93 */
89 void resetToSize(int newVerbCnt, int newPointCnt, int newConicCount) { 94 void resetToSize(int newVerbCnt, int newPointCnt, int newConicCount) {
90 fPathRef->resetToSize(newVerbCnt, newPointCnt, newConicCount); 95 fPathRef->resetToSize(newVerbCnt, newPointCnt, newConicCount);
91 } 96 }
97
92 /** 98 /**
93 * Gets the path ref that is wrapped in the Editor. 99 * Gets the path ref that is wrapped in the Editor.
94 */ 100 */
95 SkPathRef* pathRef() { return fPathRef; } 101 SkPathRef* pathRef() { return fPathRef; }
96 102
97 void setIsOval(bool isOval) { fPathRef->setIsOval(isOval); } 103 void setIsOval(bool isOval) { fPathRef->setIsOval(isOval); }
98 104
105 void setBounds(const SkRect& rect) { fPathRef->setBounds(rect); }
106
99 private: 107 private:
100 SkPathRef* fPathRef; 108 SkPathRef* fPathRef;
101 }; 109 };
102 110
103 public: 111 public:
104 /** 112 /**
105 * Gets a path ref with no verbs or points. 113 * Gets a path ref with no verbs or points.
106 */ 114 */
107 static SkPathRef* CreateEmpty(); 115 static SkPathRef* CreateEmpty();
108 116
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 Note: this bounds may be larger than the actual shape, since curves 159 Note: this bounds may be larger than the actual shape, since curves
152 do not extend as far as their control points. 160 do not extend as far as their control points.
153 */ 161 */
154 const SkRect& getBounds() const { 162 const SkRect& getBounds() const {
155 if (fBoundsIsDirty) { 163 if (fBoundsIsDirty) {
156 this->computeBounds(); 164 this->computeBounds();
157 } 165 }
158 return fBounds; 166 return fBounds;
159 } 167 }
160 168
161 void setBounds(const SkRect& rect) {
162 SkASSERT(rect.fLeft <= rect.fRight && rect.fTop <= rect.fBottom);
163 fBounds = rect;
164 fBoundsIsDirty = false;
165 fIsFinite = fBounds.isFinite();
166 }
167
168 /** 169 /**
169 * Transforms a path ref by a matrix, allocating a new one only if necessary . 170 * Transforms a path ref by a matrix, allocating a new one only if necessary .
170 */ 171 */
171 static void CreateTransformedCopy(SkAutoTUnref<SkPathRef>* dst, 172 static void CreateTransformedCopy(SkAutoTUnref<SkPathRef>* dst,
172 const SkPathRef& src, 173 const SkPathRef& src,
173 const SkMatrix& matrix); 174 const SkMatrix& matrix);
174 175
175 static SkPathRef* CreateFromBuffer(SkRBuffer* buffer 176 static SkPathRef* CreateFromBuffer(SkRBuffer* buffer
176 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V16_AND_ALL_OTHER_INSTANCES_TO O 177 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V16_AND_ALL_OTHER_INSTANCES_TO O
177 , bool newFormat, int32_t oldPacked 178 , bool newFormat, int32_t oldPacked
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 293
293 // called, if dirty, by getBounds() 294 // called, if dirty, by getBounds()
294 void computeBounds() const { 295 void computeBounds() const {
295 SkDEBUGCODE(this->validate();) 296 SkDEBUGCODE(this->validate();)
296 SkASSERT(fBoundsIsDirty); 297 SkASSERT(fBoundsIsDirty);
297 298
298 fIsFinite = ComputePtBounds(&fBounds, *this); 299 fIsFinite = ComputePtBounds(&fBounds, *this);
299 fBoundsIsDirty = false; 300 fBoundsIsDirty = false;
300 } 301 }
301 302
303 void setBounds(const SkRect& rect) {
304 SkASSERT(rect.fLeft <= rect.fRight && rect.fTop <= rect.fBottom);
305 fBounds = rect;
306 fBoundsIsDirty = false;
307 fIsFinite = fBounds.isFinite();
308 }
309
302 /** Makes additional room but does not change the counts or change the genID */ 310 /** Makes additional room but does not change the counts or change the genID */
303 void incReserve(int additionalVerbs, int additionalPoints) { 311 void incReserve(int additionalVerbs, int additionalPoints) {
304 SkDEBUGCODE(this->validate();) 312 SkDEBUGCODE(this->validate();)
305 size_t space = additionalVerbs * sizeof(uint8_t) + additionalPoints * si zeof (SkPoint); 313 size_t space = additionalVerbs * sizeof(uint8_t) + additionalPoints * si zeof (SkPoint);
306 this->makeSpace(space); 314 this->makeSpace(space);
307 SkDEBUGCODE(this->validate();) 315 SkDEBUGCODE(this->validate();)
308 } 316 }
309 317
310 /** Resets the path ref with verbCount verbs and pointCount points, all unin itialized. Also 318 /** Resets the path ref with verbCount verbs and pointCount points, all unin itialized. Also
311 * allocates space for reserveVerb additional verbs and reservePoints addit ional points.*/ 319 * allocates space for reserveVerb additional verbs and reservePoints addit ional points.*/
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 419
412 SkDEBUGCODE(void validate() const;) 420 SkDEBUGCODE(void validate() const;)
413 421
414 /** 422 /**
415 * Called the first time someone calls CreateEmpty to actually create the si ngleton. 423 * Called the first time someone calls CreateEmpty to actually create the si ngleton.
416 */ 424 */
417 static void CreateEmptyImpl(SkPathRef** empty); 425 static void CreateEmptyImpl(SkPathRef** empty);
418 426
419 void setIsOval(bool isOval) { fIsOval = isOval; } 427 void setIsOval(bool isOval) { fIsOval = isOval; }
420 428
429 SkPoint* getPoints() {
430 SkDEBUGCODE(this->validate();)
431 fIsOval = false;
432 return fPoints;
433 }
434
421 enum { 435 enum {
422 kMinSize = 256, 436 kMinSize = 256,
423 }; 437 };
424 438
425 mutable SkRect fBounds; 439 mutable SkRect fBounds;
426 uint8_t fSegmentMask; 440 uint8_t fSegmentMask;
427 mutable uint8_t fBoundsIsDirty; 441 mutable uint8_t fBoundsIsDirty;
428 mutable SkBool8 fIsFinite; // only meaningful if bounds are valid 442 mutable SkBool8 fIsFinite; // only meaningful if bounds are valid
429 mutable SkBool8 fIsOval; 443 mutable SkBool8 fIsOval;
430 444
431 SkPoint* fPoints; // points to begining of the allocation 445 SkPoint* fPoints; // points to begining of the allocation
432 uint8_t* fVerbs; // points just past the end of the allocation (v erbs grow backwards) 446 uint8_t* fVerbs; // points just past the end of the allocation (v erbs grow backwards)
433 int fVerbCnt; 447 int fVerbCnt;
434 int fPointCnt; 448 int fPointCnt;
435 size_t fFreeSpace; // redundant but saves computation 449 size_t fFreeSpace; // redundant but saves computation
436 SkTDArray<SkScalar> fConicWeights; 450 SkTDArray<SkScalar> fConicWeights;
437 451
438 enum { 452 enum {
439 kEmptyGenID = 1, // GenID reserved for path ref with zero points and zer o verbs. 453 kEmptyGenID = 1, // GenID reserved for path ref with zero points and zer o verbs.
440 }; 454 };
441 mutable uint32_t fGenerationID; 455 mutable uint32_t fGenerationID;
442 SkDEBUGCODE(int32_t fEditorsAttached;) // assert that only one editor in use at any time. 456 SkDEBUGCODE(int32_t fEditorsAttached;) // assert that only one editor in use at any time.
443 457
458 friend class PathRefTest_Private;
444 typedef SkRefCnt INHERITED; 459 typedef SkRefCnt INHERITED;
445 }; 460 };
446 461
447 #endif 462 #endif
OLDNEW
« no previous file with comments | « include/core/SkPath.h ('k') | src/core/SkPathRef.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698