| Index: include/core/SkPathRef.h
 | 
| diff --git a/include/core/SkPathRef.h b/include/core/SkPathRef.h
 | 
| index c09f6e87e471c1d8320a11156ef9dc64d0dbb92a..86f55c9bcae2aec63bcc5e6c529bca2969496d52 100644
 | 
| --- a/include/core/SkPathRef.h
 | 
| +++ b/include/core/SkPathRef.h
 | 
| @@ -11,6 +11,7 @@
 | 
|  
 | 
|  #include "SkMatrix.h"
 | 
|  #include "SkPoint.h"
 | 
| +#include "SkRRect.h"
 | 
|  #include "SkRect.h"
 | 
|  #include "SkRefCnt.h"
 | 
|  #include "SkTDArray.h"
 | 
| @@ -100,12 +101,39 @@ public:
 | 
|  
 | 
|          void setIsOval(bool isOval) { fPathRef->setIsOval(isOval); }
 | 
|  
 | 
| +        void setIsRRect(bool isRRect) { fPathRef->setIsRRect(isRRect); }
 | 
| +
 | 
|          void setBounds(const SkRect& rect) { fPathRef->setBounds(rect); }
 | 
|  
 | 
|      private:
 | 
|          SkPathRef* fPathRef;
 | 
|      };
 | 
|  
 | 
| +    class SK_API Iter {
 | 
| +    public:
 | 
| +        Iter();
 | 
| +        Iter(const SkPathRef&);
 | 
| +
 | 
| +        void setPathRef(const SkPathRef&);
 | 
| +
 | 
| +        /** Return the next verb in this iteration of the path. When all
 | 
| +            segments have been visited, return kDone_Verb.
 | 
| +
 | 
| +            @param  pts The points representing the current verb and/or segment
 | 
| +                        This must not be NULL.
 | 
| +            @return The verb for the current segment
 | 
| +        */
 | 
| +        uint8_t next(SkPoint pts[4]);
 | 
| +
 | 
| +        SkScalar conicWeight() const { return *fConicWeights; }
 | 
| +
 | 
| +    private:
 | 
| +        const SkPoint*  fPts;
 | 
| +        const uint8_t*  fVerbs;
 | 
| +        const uint8_t*  fVerbStop;
 | 
| +        const SkScalar* fConicWeights;
 | 
| +    };
 | 
| +
 | 
|  public:
 | 
|      /**
 | 
|       * Gets a path ref with no verbs or points.
 | 
| @@ -142,12 +170,20 @@ public:
 | 
|       */
 | 
|      bool isOval(SkRect* rect) const {
 | 
|          if (fIsOval && rect) {
 | 
| -            *rect = getBounds();
 | 
| +            *rect = this->getBounds();
 | 
|          }
 | 
|  
 | 
|          return SkToBool(fIsOval);
 | 
|      }
 | 
|  
 | 
| +    bool isRRect(SkRRect* rrect) const {
 | 
| +        if (fIsRRect && rrect) {
 | 
| +            *rrect = this->getRRect();
 | 
| +        }
 | 
| +        return SkToBool(fIsRRect);
 | 
| +    }
 | 
| +
 | 
| +
 | 
|      bool hasComputedBounds() const {
 | 
|          return !fBoundsIsDirty;
 | 
|      }
 | 
| @@ -164,6 +200,8 @@ public:
 | 
|          return fBounds;
 | 
|      }
 | 
|  
 | 
| +    SkRRect getRRect() const;
 | 
| +
 | 
|      /**
 | 
|       * Transforms a path ref by a matrix, allocating a new one only if necessary.
 | 
|       */
 | 
| @@ -250,6 +288,7 @@ public:
 | 
|  
 | 
|  private:
 | 
|      enum SerializationOffsets {
 | 
| +        kIsRRect_SerializationShift = 26,   // requires 1 bit
 | 
|          kIsFinite_SerializationShift = 25,  // requires 1 bit
 | 
|          kIsOval_SerializationShift = 24,    // requires 1 bit
 | 
|          kSegmentMask_SerializationShift = 0 // requires 4 bits
 | 
| @@ -265,6 +304,7 @@ private:
 | 
|          fGenerationID = kEmptyGenID;
 | 
|          fSegmentMask = 0;
 | 
|          fIsOval = false;
 | 
| +        fIsRRect = false;
 | 
|          SkDEBUGCODE(fEditorsAttached = 0;)
 | 
|          SkDEBUGCODE(this->validate();)
 | 
|      }
 | 
| @@ -312,6 +352,7 @@ private:
 | 
|  
 | 
|          fSegmentMask = 0;
 | 
|          fIsOval = false;
 | 
| +        fIsRRect = false;
 | 
|  
 | 
|          size_t newSize = sizeof(uint8_t) * verbCount + sizeof(SkPoint) * pointCount;
 | 
|          size_t newReserve = sizeof(uint8_t) * reserveVerbs + sizeof(SkPoint) * reservePoints;
 | 
| @@ -411,9 +452,18 @@ private:
 | 
|  
 | 
|      void setIsOval(bool isOval) { fIsOval = isOval; }
 | 
|  
 | 
| +    void setIsRRect(bool isRRect) { fIsRRect = isRRect; }
 | 
| +
 | 
| +    // called only by the editor. Note that this is not a const function.
 | 
|      SkPoint* getPoints() {
 | 
|          SkDEBUGCODE(this->validate();)
 | 
|          fIsOval = false;
 | 
| +        fIsRRect = false;
 | 
| +        return fPoints;
 | 
| +    }
 | 
| +
 | 
| +    const SkPoint* getPoints() const {
 | 
| +        SkDEBUGCODE(this->validate();)
 | 
|          return fPoints;
 | 
|      }
 | 
|  
 | 
| @@ -424,11 +474,6 @@ private:
 | 
|      };
 | 
|  
 | 
|      mutable SkRect   fBounds;
 | 
| -    mutable uint8_t  fBoundsIsDirty;
 | 
| -    mutable SkBool8  fIsFinite;    // only meaningful if bounds are valid
 | 
| -
 | 
| -    SkBool8  fIsOval;
 | 
| -    uint8_t  fSegmentMask;
 | 
|  
 | 
|      SkPoint*            fPoints; // points to begining of the allocation
 | 
|      uint8_t*            fVerbs; // points just past the end of the allocation (verbs grow backwards)
 | 
| @@ -445,7 +490,15 @@ private:
 | 
|  
 | 
|      SkTDArray<GenIDChangeListener*> fGenIDChangeListeners;  // pointers are owned
 | 
|  
 | 
| +    mutable uint8_t  fBoundsIsDirty;
 | 
| +    mutable SkBool8  fIsFinite;    // only meaningful if bounds are valid
 | 
| +
 | 
| +    SkBool8  fIsOval;
 | 
| +    SkBool8  fIsRRect;
 | 
| +    uint8_t  fSegmentMask;
 | 
| +
 | 
|      friend class PathRefTest_Private;
 | 
| +    friend class ForceIsRRect_Private; // unit test isRRect
 | 
|      typedef SkRefCnt INHERITED;
 | 
|  };
 | 
|  
 | 
| 
 |