Use SkPathRef gen id for SkPath::getGenerationID

R=mtklein@google.com, robertphillips@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/49693002

git-svn-id: http://skia.googlecode.com/svn/trunk/include@12029 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/core/SkPath.h b/core/SkPath.h
index a6674d9..9b5dc4b 100644
--- a/core/SkPath.h
+++ b/core/SkPath.h
@@ -16,14 +16,6 @@
 #include "SkTDArray.h"
 #include "SkRefCnt.h"
 
-#ifdef SK_BUILD_FOR_ANDROID
-#define GEN_ID_INC              fGenerationID++
-#define GEN_ID_PTR_INC(ptr)     (ptr)->fGenerationID++
-#else
-#define GEN_ID_INC
-#define GEN_ID_PTR_INC(ptr)
-#endif
-
 class SkReader32;
 class SkWriter32;
 class SkAutoPathBoundsUpdate;
@@ -40,10 +32,10 @@
     SK_DECLARE_INST_COUNT_ROOT(SkPath);
 
     SkPath();
-    SkPath(const SkPath&);  // Copies fGenerationID on Android.
+    SkPath(const SkPath&);
     ~SkPath();
 
-    SkPath& operator=(const SkPath&);  // Increments fGenerationID on Android.
+    SkPath& operator=(const SkPath&);
     friend  SK_API bool operator==(const SkPath&, const SkPath&);
     friend bool operator!=(const SkPath& a, const SkPath& b) {
         return !(a == b);
@@ -80,7 +72,6 @@
     */
     void setFillType(FillType ft) {
         fFillType = SkToU8(ft);
-        GEN_ID_INC;
     }
 
     /** Returns true if the filltype is one of the Inverse variants */
@@ -92,7 +83,6 @@
      */
     void toggleInverseFillType() {
         fFillType ^= 2;
-        GEN_ID_INC;
      }
 
     enum Convexity {
@@ -914,16 +904,25 @@
      *  If buffer is NULL, it still returns the number of bytes.
      */
     uint32_t writeToMemory(void* buffer) const;
+
     /**
      *  Initialized the region from the buffer, returning the number
      *  of bytes actually read.
      */
     uint32_t readFromMemory(const void* buffer);
 
-#ifdef SK_BUILD_FOR_ANDROID
+    /** Returns a non-zero, globally unique value corresponding to the set of verbs
+        and points in the path (but not the fill type [except on Android skbug.com/1762]).
+        Each time the path is modified, a different generation ID will be returned. 
+    */
     uint32_t getGenerationID() const;
+
+#ifdef SK_BUILD_FOR_ANDROID
+    static const int kPathRefGenIDBitCnt = 30; // leave room for the fill type (skbug.com/1762)
     const SkPath* getSourcePath() const;
     void setSourcePath(const SkPath* path);
+#else
+    static const int kPathRefGenIDBitCnt = 32;
 #endif
 
     SkDEBUGCODE(void validate() const;)
@@ -953,7 +952,6 @@
     mutable uint8_t     fDirection;
     mutable SkBool8     fIsOval;
 #ifdef SK_BUILD_FOR_ANDROID
-    uint32_t            fGenerationID;
     const SkPath*       fSourcePath;
 #endif
 
diff --git a/core/SkPathRef.h b/core/SkPathRef.h
index d832944..aea0a91 100644
--- a/core/SkPathRef.h
+++ b/core/SkPathRef.h
@@ -227,6 +227,13 @@
      */
     uint32_t writeSize();
 
+    /**
+     * Gets an ID that uniquely identifies the contents of the path ref. If two path refs have the
+     * same ID then they have the same verbs and points. However, two path refs may have the same
+     * contents but different genIDs.
+     */
+    uint32_t genID() const;
+
 private:
     enum SerializationOffsets {
         kIsFinite_SerializationShift = 25,  // requires 1 bit
@@ -380,14 +387,6 @@
         return reinterpret_cast<intptr_t>(fVerbs) - reinterpret_cast<intptr_t>(fPoints);
     }
 
-    /**
-     * Gets an ID that uniquely identifies the contents of the path ref. If two path refs have the
-     * same ID then they have the same verbs and points. However, two path refs may have the same
-     * contents but different genIDs. Zero is reserved and means an ID has not yet been determined
-     * for the path ref.
-     */
-    int32_t genID() const;
-
     SkDEBUGCODE(void validate() const;)
 
     /**
@@ -413,7 +412,7 @@
     enum {
         kEmptyGenID = 1, // GenID reserved for path ref with zero points and zero verbs.
     };
-    mutable int32_t     fGenerationID;
+    mutable uint32_t    fGenerationID;
     SkDEBUGCODE(int32_t fEditorsAttached;) // assert that only one editor in use at any time.
 
     typedef SkRefCnt INHERITED;