Index: include/core/SkPathRef.h |
=================================================================== |
--- include/core/SkPathRef.h (revision 12596) |
+++ include/core/SkPathRef.h (working copy) |
@@ -62,30 +62,24 @@ |
/** |
* Adds the verb and allocates space for the number of points indicated by the verb. The |
* return value is a pointer to where the points for the verb should be written. |
+ * 'weight' is only used if 'verb' is kConic_Verb |
*/ |
- SkPoint* growForVerb(int /*SkPath::Verb*/ verb) { |
+ SkPoint* growForVerb(int /*SkPath::Verb*/ verb, SkScalar weight = 0) { |
SkDEBUGCODE(fPathRef->validate();) |
- return fPathRef->growForVerb(verb); |
+ return fPathRef->growForVerb(verb, weight); |
} |
- SkPoint* growForConic(SkScalar w); |
- |
/** |
- * Allocates space for additional verbs and points and returns pointers to the new verbs and |
- * points. verbs will point one beyond the first new verb (index it using [~<i>]). pts points |
- * at the first new point (indexed normally [<i>]). |
+ * Allocates space for multiple instances of a particular verb and the |
+ * requisite points & weights. |
+ * The return pointer points at the first new point (indexed normally [<i>]). |
+ * If 'verb' is kConic_Verb, 'weights' will return a pointer to the |
+ * space for the conic weights (indexed normally). |
*/ |
- void grow(int newVerbs, int newPts, uint8_t** verbs, SkPoint** pts) { |
- SkASSERT(NULL != verbs); |
- SkASSERT(NULL != pts); |
- SkDEBUGCODE(fPathRef->validate();) |
- int oldVerbCnt = fPathRef->fVerbCnt; |
- int oldPointCnt = fPathRef->fPointCnt; |
- SkASSERT(verbs && pts); |
- fPathRef->grow(newVerbs, newPts); |
- *verbs = fPathRef->fVerbs - oldVerbCnt; |
- *pts = fPathRef->fPoints + oldPointCnt; |
- SkDEBUGCODE(fPathRef->validate();) |
+ SkPoint* growForRepeatedVerb(int /*SkPath::Verb*/ verb, |
+ int numVbs, |
+ SkScalar** weights = NULL) { |
+ return fPathRef->growForRepeatedVerb(verb, numVbs, weights); |
} |
/** |
@@ -123,6 +117,13 @@ |
return SkToBool(fIsFinite); |
} |
+ /** |
+ * Returns a mask, where each bit corresponding to a SegmentMask is |
+ * set if the path contains 1 or more segments of that type. |
+ * Returns 0 for an empty path (no segments). |
+ */ |
+ uint32_t getSegmentMasks() const { return fSegmentMask; } |
+ |
/** Returns true if the path is an oval. |
* |
* @param rect returns the bounding rect of this oval. It's a circle |
@@ -199,6 +200,7 @@ |
int countPoints() const { SkDEBUGCODE(this->validate();) return fPointCnt; } |
int countVerbs() const { SkDEBUGCODE(this->validate();) return fVerbCnt; } |
+ int countWeights() const { SkDEBUGCODE(this->validate();) return fConicWeights.count(); } |
/** |
* Returns a pointer one beyond the first logical verb (last verb in memory order). |
@@ -226,7 +228,7 @@ |
/** |
* Convenience methods for getting to a verb or point by index. |
*/ |
- uint8_t atVerb(int index) { |
+ uint8_t atVerb(int index) const { |
SkASSERT((unsigned) index < (unsigned) fVerbCnt); |
return this->verbs()[~index]; |
} |
@@ -240,12 +242,12 @@ |
/** |
* Writes the path points and verbs to a buffer. |
*/ |
- void writeToBuffer(SkWBuffer* buffer); |
+ void writeToBuffer(SkWBuffer* buffer) const; |
/** |
* Gets the number of bytes that would be written in writeBuffer() |
*/ |
- uint32_t writeSize(); |
+ uint32_t writeSize() const; |
/** |
* Gets an ID that uniquely identifies the contents of the path ref. If two path refs have the |
@@ -258,6 +260,7 @@ |
enum SerializationOffsets { |
kIsFinite_SerializationShift = 25, // requires 1 bit |
kIsOval_SerializationShift = 24, // requires 1 bit |
+ kSegmentMask_SerializationShift = 0 // requires 4 bits |
}; |
SkPathRef() { |
@@ -268,6 +271,7 @@ |
fPoints = NULL; |
fFreeSpace = 0; |
fGenerationID = kEmptyGenID; |
+ fSegmentMask = 0; |
fIsOval = false; |
SkDEBUGCODE(fEditorsAttached = 0;) |
SkDEBUGCODE(this->validate();) |
@@ -311,6 +315,7 @@ |
fBoundsIsDirty = true; // this also invalidates fIsFinite |
fGenerationID = 0; |
+ fSegmentMask = 0; |
fIsOval = false; |
size_t newSize = sizeof(uint8_t) * verbCount + sizeof(SkPoint) * pointCount; |
@@ -340,26 +345,19 @@ |
} |
/** |
- * Increases the verb count by newVerbs and the point count be newPoints. New verbs and points |
- * are uninitialized. |
+ * Increases the verb count by numVbs and point count by the required amount. |
+ * The new points are uninitialized. All the new verbs are set to the specified |
+ * verb. If 'verb' is kConic_Verb, 'weights' will return a pointer to the |
+ * uninitialized conic weights. |
*/ |
- void grow(int newVerbs, int newPoints) { |
- SkDEBUGCODE(this->validate();) |
- size_t space = newVerbs * sizeof(uint8_t) + newPoints * sizeof (SkPoint); |
- this->makeSpace(space); |
- fVerbCnt += newVerbs; |
- fPointCnt += newPoints; |
- fFreeSpace -= space; |
- fBoundsIsDirty = true; // this also invalidates fIsFinite |
- SkDEBUGCODE(this->validate();) |
- } |
+ SkPoint* growForRepeatedVerb(int /*SkPath::Verb*/ verb, int numVbs, SkScalar** weights); |
/** |
* Increases the verb count 1, records the new verb, and creates room for the requisite number |
* of additional points. A pointer to the first point is returned. Any new points are |
* uninitialized. |
*/ |
- SkPoint* growForVerb(int /*SkPath::Verb*/ verb); |
+ SkPoint* growForVerb(int /*SkPath::Verb*/ verb, SkScalar weight); |
/** |
* Ensures that the free space available in the path ref is >= size. The verb and point counts |
@@ -425,6 +423,7 @@ |
}; |
mutable SkRect fBounds; |
+ uint8_t fSegmentMask; |
mutable uint8_t fBoundsIsDirty; |
mutable SkBool8 fIsFinite; // only meaningful if bounds are valid |
mutable SkBool8 fIsOval; |