Index: include/core/SkPath.h |
=================================================================== |
--- include/core/SkPath.h (revision 11466) |
+++ include/core/SkPath.h (working copy) |
@@ -12,6 +12,7 @@ |
#include "SkInstCnt.h" |
#include "SkMatrix.h" |
+#include "SkPathRef.h" |
#include "SkTDArray.h" |
#include "SkRefCnt.h" |
@@ -27,7 +28,6 @@ |
class SkWriter32; |
class SkAutoPathBoundsUpdate; |
class SkString; |
-class SkPathRef; |
class SkRRect; |
/** \class SkPath |
@@ -181,17 +181,18 @@ |
@return true if the path is empty (contains no lines or curves) |
*/ |
- bool isEmpty() const; |
+ bool isEmpty() const { |
+ SkDEBUGCODE(this->validate();) |
+ return 0 == fPathRef->countVerbs(); |
+ } |
/** |
* Returns true if all of the points in this path are finite, meaning there |
* are no infinities and no NaNs. |
*/ |
bool isFinite() const { |
- if (fBoundsIsDirty) { |
- this->computeBounds(); |
- } |
- return SkToBool(fIsFinite); |
+ SkDEBUGCODE(this->validate();) |
+ return fPathRef->isFinite(); |
} |
/** Test a line for zero length |
@@ -281,10 +282,7 @@ |
do not extend as far as their control points. |
*/ |
const SkRect& getBounds() const { |
- if (fBoundsIsDirty) { |
- this->computeBounds(); |
- } |
- return fBounds; |
+ return fPathRef->getBounds(); |
} |
/** Calling this will, if the internal cache of the bounds is out of date, |
@@ -598,7 +596,7 @@ |
* @param dir The direction to wind the rectangle's contour. Cannot be |
* kUnknown_Direction. |
*/ |
- void addRect(const SkRect& rect, Direction dir = kCW_Direction); |
+ void addRect(const SkRect& rect, Direction dir = kCW_Direction); |
/** |
* Add a closed rectangle contour to the path |
@@ -657,8 +655,8 @@ |
* @param dir The direction to wind the rectangle's contour. Cannot be |
* kUnknown_Direction. |
*/ |
- void addRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry, |
- Direction dir = kCW_Direction); |
+ void addRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry, |
+ Direction dir = kCW_Direction); |
/** |
* Add a closed round-rectangle contour to the path. Each corner receives |
@@ -932,24 +930,27 @@ |
private: |
enum SerializationOffsets { |
+#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
+ kNewFormat_SerializationShift = 28, // requires 1 bit |
+#endif |
kDirection_SerializationShift = 26, // requires 2 bits |
- kIsFinite_SerializationShift = 25, // requires 1 bit |
+#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
+ // rename to kUnused_SerializationShift |
+ kOldIsFinite_SerializationShift = 25, // 1 bit |
+#endif |
kIsOval_SerializationShift = 24, // requires 1 bit |
- kConvexity_SerializationShift = 16, // requires 2 bits |
- kFillType_SerializationShift = 8, // requires 2 bits |
+ kConvexity_SerializationShift = 16, // requires 8 bits |
+ kFillType_SerializationShift = 8, // requires 8 bits |
kSegmentMask_SerializationShift = 0 // requires 4 bits |
}; |
SkAutoTUnref<SkPathRef> fPathRef; |
- mutable SkRect fBounds; |
int fLastMoveToIndex; |
uint8_t fFillType; |
uint8_t fSegmentMask; |
- mutable uint8_t fBoundsIsDirty; |
mutable uint8_t fConvexity; |
mutable uint8_t fDirection; |
- mutable SkBool8 fIsFinite; // only meaningful if bounds are valid |
mutable SkBool8 fIsOval; |
#ifdef SK_BUILD_FOR_ANDROID |
uint32_t fGenerationID; |
@@ -968,9 +969,6 @@ |
*/ |
void copyFields(const SkPath& that); |
- // called, if dirty, by getBounds() |
- void computeBounds() const; |
- |
friend class Iter; |
friend class SkPathStroker; |
@@ -1001,6 +999,23 @@ |
bool isRectContour(bool allowPartial, int* currVerb, const SkPoint** pts, |
bool* isClosed, Direction* direction) const; |
+ /** Returns if the path can return a bound at no cost (true) or will have to |
+ perform some computation (false). |
+ */ |
+ bool hasComputedBounds() const { |
+ SkDEBUGCODE(this->validate();) |
+ return fPathRef->hasComputedBounds(); |
+ } |
+ |
+ |
+ // 'rect' needs to be sorted |
+ void setBounds(const SkRect& rect) { |
+ fPathRef->setBounds(rect); |
+ } |
+ |
+#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO |
+ friend class SkPathRef; // just for SerializationOffsets |
+#endif |
friend class SkAutoPathBoundsUpdate; |
friend class SkAutoDisableOvalCheck; |
friend class SkAutoDisableDirectionCheck; |