Rename GrAccelData to SkLayerInfo and move it to src/core

Review URL: https://codereview.chromium.org/719133002
diff --git a/src/core/SkLayerInfo.cpp b/src/core/SkLayerInfo.cpp
new file mode 100644
index 0000000..d427fa7
--- /dev/null
+++ b/src/core/SkLayerInfo.cpp
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkLayerInfo.h"
+
+SkPicture::AccelData::Key SkLayerInfo::ComputeKey() {
+    static const SkPicture::AccelData::Key gGPUID = SkPicture::AccelData::GenerateDomain();
+
+    return gGPUID;
+}
+
diff --git a/src/core/SkLayerInfo.h b/src/core/SkLayerInfo.h
new file mode 100644
index 0000000..dd0eaf0
--- /dev/null
+++ b/src/core/SkLayerInfo.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkLayerInfo_DEFINED
+#define SkLayerInfo_DEFINED
+
+#include "SkPicture.h"
+#include "SkTArray.h"
+
+// This class stores information about the saveLayer/restore pairs found
+// within an SkPicture. It is used by Ganesh to perform layer hoisting.
+class SkLayerInfo : public SkPicture::AccelData {
+public:
+    // Information about a given saveLayer/restore block in an SkPicture
+    class BlockInfo {
+    public:
+        BlockInfo() : fPicture(NULL), fPaint(NULL) {}
+        ~BlockInfo() { SkSafeUnref(fPicture); SkDELETE(fPaint); }
+
+        // The picture owning the layer. If the owning picture is the top-most
+        // one (i.e., the picture for which this SkLayerInfo was created) then
+        // this pointer is NULL. If it is a nested picture then the pointer
+        // is non-NULL and owns a ref on the picture.
+        const SkPicture* fPicture;
+        // The device space bounds of this layer.
+        SkRect fBounds;
+        // The pre-matrix begins as the identity and accumulates the transforms
+        // of the containing SkPictures (if any). This matrix state has to be
+        // part of the initial matrix during replay so that it will be 
+        // preserved across setMatrix calls.
+        SkMatrix fPreMat;
+        // The matrix state (in the leaf picture) in which this layer's draws 
+        // must occur. It will/can be overridden by setMatrix calls in the
+        // layer itself. It does not include the translation needed to map the 
+        // layer's top-left point to the origin (which must be part of the
+        // initial matrix).
+        SkMatrix fLocalMat;
+        // The paint to use on restore. Can be NULL since it is optional.
+        const SkPaint* fPaint;
+        // The index of this saveLayer in the picture.
+        size_t  fSaveLayerOpID;
+        // The index of the matching restore in the picture.
+        size_t  fRestoreOpID;
+        // True if this saveLayer has at least one other saveLayer nested within it.
+        // False otherwise.
+        bool    fHasNestedLayers;
+        // True if this saveLayer is nested within another. False otherwise.
+        bool    fIsNested;
+    };
+
+    SkLayerInfo(Key key) : INHERITED(key) { }
+
+    BlockInfo& addBlock() { return fBlocks.push_back(); }
+
+    int numBlocks() const { return fBlocks.count(); }
+
+    const BlockInfo& block(int index) const {
+        SkASSERT(index < fBlocks.count());
+
+        return fBlocks[index];
+    }
+
+    // We may, in the future, need to pass in the GPUDevice in order to
+    // incorporate the clip and matrix state into the key
+    static SkPicture::AccelData::Key ComputeKey();
+
+private:
+    SkTArray<BlockInfo, true> fBlocks;
+
+    typedef SkPicture::AccelData INHERITED;
+};
+
+#endif // SkLayerInfo_DEFINED
diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp
index 1604467..3441a0d 100644
--- a/src/core/SkPictureRecorder.cpp
+++ b/src/core/SkPictureRecorder.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkLayerInfo.h"
 #include "SkPictureRecorder.h"
 #include "SkRecord.h"
 #include "SkRecordDraw.h"
@@ -12,12 +13,6 @@
 #include "SkRecordOpts.h"
 #include "SkTypes.h"
 
-// Must place SK_SUPPORT_GPU after other includes so it is defined in the
-// Android framework build.
-#if SK_SUPPORT_GPU
-#include "GrPictureUtils.h"
-#endif
-
 SkPictureRecorder::SkPictureRecorder() {}
 
 SkPictureRecorder::~SkPictureRecorder() {}
@@ -47,37 +42,29 @@
     // TODO: delay as much of this work until just before first playback?
     SkRecordOptimize(fRecord);
 
-#if SK_SUPPORT_GPU
-    SkAutoTUnref<GrAccelData> saveLayerData;
+    SkAutoTUnref<SkLayerInfo> saveLayerData;
 
     if (fBBH && (fFlags & kComputeSaveLayerInfo_RecordFlag)) {
-        SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey();
+        SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
 
-        saveLayerData.reset(SkNEW_ARGS(GrAccelData, (key)));
+        saveLayerData.reset(SkNEW_ARGS(SkLayerInfo, (key)));
     }
-#endif
 
     if (fBBH.get()) {
         SkRect cullRect = SkRect::MakeWH(fCullWidth, fCullHeight);
 
-#if SK_SUPPORT_GPU
         if (saveLayerData) {
             SkRecordComputeLayers(cullRect, *fRecord, fBBH.get(), saveLayerData);
         } else {
-#endif
             SkRecordFillBounds(cullRect, *fRecord, fBBH.get());
-#if SK_SUPPORT_GPU
         }
-#endif
     }
 
     SkPicture* pict = SkNEW_ARGS(SkPicture, (fCullWidth, fCullHeight, fRecord.detach(), fBBH.get()));
 
-#if SK_SUPPORT_GPU
     if (saveLayerData) {
         pict->EXPERIMENTAL_addAccelData(saveLayerData);
     }
-#endif
 
     return pict;
 }
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp
index 9075e50..e35e5a0 100644
--- a/src/core/SkRecordDraw.cpp
+++ b/src/core/SkRecordDraw.cpp
@@ -5,13 +5,10 @@
  * found in the LICENSE file.
  */
 
+#include "SkLayerInfo.h"
 #include "SkRecordDraw.h"
 #include "SkPatchUtils.h"
 
-#if SK_SUPPORT_GPU
-#include "GrPictureUtils.h"
-#endif
-
 void SkRecordDraw(const SkRecord& record,
                   SkCanvas* canvas,
                   const SkBBoxHierarchy* bbh,
@@ -570,11 +567,10 @@
     SkTDArray<unsigned>   fControlIndices;
 };
 
-#if SK_SUPPORT_GPU
 // SkRecord visitor to gather saveLayer/restore information.
 class CollectLayers : SkNoncopyable {
 public:
-    CollectLayers(const SkRect& cullRect, const SkRecord& record, GrAccelData* accelData)
+    CollectLayers(const SkRect& cullRect, const SkRecord& record, SkLayerInfo* accelData)
         : fSaveLayersInStack(0)
         , fAccelData(accelData)
         , fFillBounds(cullRect, record) {
@@ -624,10 +620,10 @@
     void trackSaveLayers(const DrawPicture& dp) {
         // For sub-pictures, we wrap their layer information within the parent
         // picture's rendering hierarchy
-        SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey();
+        SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
 
-        const GrAccelData* childData =
-            static_cast<const GrAccelData*>(dp.picture->EXPERIMENTAL_getAccelData(key));
+        const SkLayerInfo* childData =
+            static_cast<const SkLayerInfo*>(dp.picture->EXPERIMENTAL_getAccelData(key));
         if (!childData) {
             // If the child layer hasn't been generated with saveLayer data we
             // assume the worst (i.e., that it does contain layers which nest
@@ -638,8 +634,8 @@
             return;
         }
 
-        for (int i = 0; i < childData->numSaveLayers(); ++i) {
-            const GrAccelData::SaveLayerInfo& src = childData->saveLayerInfo(i);
+        for (int i = 0; i < childData->numBlocks(); ++i) {
+            const SkLayerInfo::BlockInfo& src = childData->block(i);
 
             FillBounds::Bounds newBound = fFillBounds.adjustAndMap(src.fBounds, dp.paint);
             if (newBound.isEmpty()) {
@@ -648,7 +644,7 @@
 
             this->updateStackForSaveLayer();
 
-            GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo();
+            SkLayerInfo::BlockInfo& dst = fAccelData->addBlock();
 
             // If src.fPicture is NULL the layer is in dp.picture; otherwise
             // it belongs to a sub-picture.
@@ -706,30 +702,29 @@
 
         --fSaveLayersInStack;
 
-        GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo();
+        SkLayerInfo::BlockInfo& block = fAccelData->addBlock();
 
-        SkASSERT(NULL == slInfo.fPicture);  // This layer is in the top-most picture
+        SkASSERT(NULL == block.fPicture);  // This layer is in the top-most picture
 
-        slInfo.fBounds = fFillBounds.getBounds(sli.fStartIndex);
-        slInfo.fLocalMat = fFillBounds.ctm();
-        slInfo.fPreMat = SkMatrix::I();
+        block.fBounds = fFillBounds.getBounds(sli.fStartIndex);
+        block.fLocalMat = fFillBounds.ctm();
+        block.fPreMat = SkMatrix::I();
         if (sli.fPaint) {
-            slInfo.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint));
+            block.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint));
         }
-        slInfo.fSaveLayerOpID = sli.fStartIndex;
-        slInfo.fRestoreOpID = fFillBounds.currentOp();
-        slInfo.fHasNestedLayers = sli.fHasNestedSaveLayer;
-        slInfo.fIsNested = fSaveLayersInStack > 0;
+        block.fSaveLayerOpID = sli.fStartIndex;
+        block.fRestoreOpID = fFillBounds.currentOp();
+        block.fHasNestedLayers = sli.fHasNestedSaveLayer;
+        block.fIsNested = fSaveLayersInStack > 0;
     }
 
     // Used to collect saveLayer information for layer hoisting
     int                   fSaveLayersInStack;
     SkTDArray<SaveLayerInfo> fSaveLayerStack;
-    GrAccelData*          fAccelData;
+    SkLayerInfo*          fAccelData;
 
     SkRecords::FillBounds fFillBounds;
 };
-#endif
 
 }  // namespace SkRecords
 
@@ -744,9 +739,8 @@
     visitor.cleanUp(bbh);
 }
 
-#if SK_SUPPORT_GPU
 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
-                           SkBBoxHierarchy* bbh, GrAccelData* data) {
+                           SkBBoxHierarchy* bbh, SkLayerInfo* data) {
     SkRecords::CollectLayers visitor(cullRect, record, data);
 
     for (unsigned curOp = 0; curOp < record.count(); curOp++) {
@@ -756,5 +750,4 @@
 
     visitor.cleanUp(bbh);
 }
-#endif
 
diff --git a/src/core/SkRecordDraw.h b/src/core/SkRecordDraw.h
index 8df64cb..9b39dd6 100644
--- a/src/core/SkRecordDraw.h
+++ b/src/core/SkRecordDraw.h
@@ -14,15 +14,13 @@
 #include "SkMatrix.h"
 #include "SkRecord.h"
 
+class SkLayerInfo;
+
 // Fill a BBH to be used by SkRecordDraw to accelerate playback.
 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord&, SkBBoxHierarchy*);
 
-#if SK_SUPPORT_GPU
-class GrAccelData;
-
 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
-                           SkBBoxHierarchy* bbh, GrAccelData* data);
-#endif
+                           SkBBoxHierarchy* bbh, SkLayerInfo* data);
 
 // Draw an SkRecord into an SkCanvas.  A convenience wrapper around SkRecords::Draw.
 void SkRecordDraw(const SkRecord&, SkCanvas*, const SkBBoxHierarchy*, SkDrawPictureCallback*);