Moved Canvas->JSON and JSON->Canvas functionality into SkDebugCanvas.
SkJSONCanvas and SkJSONRenderer will be deleted once the debug server
has been updated.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1681643002

Committed: https://skia.googlesource.com/skia/+/32fff1ba0c759d97ab78320b7ae46dd7696a4e6e

Committed: https://skia.googlesource.com/skia/+/46cb6d6b82b0ab71033aef91419e8beae25bb8a4

Review URL: https://codereview.chromium.org/1681643002
diff --git a/tools/debugger/SkDrawCommand.h b/tools/debugger/SkDrawCommand.h
index f67df92..a93461a 100644
--- a/tools/debugger/SkDrawCommand.h
+++ b/tools/debugger/SkDrawCommand.h
@@ -15,6 +15,7 @@
 #include "SkRRect.h"
 #include "SkString.h"
 #include "SkTDArray.h"
+#include "SkJSONCPP.h"
 
 class SK_API SkDrawCommand {
 public:
@@ -99,6 +100,14 @@
 
     virtual bool render(SkCanvas* canvas) const { return false; }
 
+    virtual Json::Value toJSON() const;
+
+    /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It
+     * is the caller's responsibility to delete this object. This method may return null if an error
+     * occurs.
+     */
+    static SkDrawCommand* fromJSON(Json::Value& command);
+
     static const char* GetCommandString(OpType type);
 
 protected:
@@ -114,6 +123,7 @@
     SkRestoreCommand();
     void execute(SkCanvas* canvas) const override;
     Action action() const override { return kPopLayer_Action; }
+    static SkRestoreCommand* fromJSON(Json::Value& command);
 
 private:
     typedef SkDrawCommand INHERITED;
@@ -123,6 +133,9 @@
 public:
     SkClearCommand(SkColor color);
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkClearCommand* fromJSON(Json::Value& command);
+
 private:
     SkColor fColor;
 
@@ -134,6 +147,9 @@
     SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkClipPathCommand* fromJSON(Json::Value& command);
+
 private:
     SkPath       fPath;
     SkRegion::Op fOp;
@@ -146,6 +162,9 @@
 public:
     SkClipRegionCommand(const SkRegion& region, SkRegion::Op op);
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkClipRegionCommand* fromJSON(Json::Value& command);
+
 private:
     SkRegion     fRegion;
     SkRegion::Op fOp;
@@ -157,6 +176,8 @@
 public:
     SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA);
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkClipRectCommand* fromJSON(Json::Value& command);
 
     const SkRect& rect() const { return fRect; }
     SkRegion::Op op() const { return fOp; }
@@ -175,6 +196,8 @@
     SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkClipRRectCommand* fromJSON(Json::Value& command);
 
     const SkRRect& rrect() const { return fRRect; }
     SkRegion::Op op() const { return fOp; }
@@ -192,6 +215,9 @@
 public:
     SkConcatCommand(const SkMatrix& matrix);
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkConcatCommand* fromJSON(Json::Value& command);
+
 private:
     SkMatrix fMatrix;
 
@@ -204,6 +230,9 @@
                         const SkPaint* paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawBitmapCommand* fromJSON(Json::Value& command);
+
 private:
     SkBitmap fBitmap;
     SkScalar fLeft;
@@ -220,6 +249,9 @@
                             const SkRect& dst, const SkPaint* paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawBitmapNineCommand* fromJSON(Json::Value& command);
+
 private:
     SkBitmap fBitmap;
     SkIRect  fCenter;
@@ -237,6 +269,8 @@
                             SkCanvas::SrcRectConstraint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawBitmapRectCommand* fromJSON(Json::Value& command);
 
     const SkBitmap& bitmap() const { return fBitmap; }
 
@@ -274,6 +308,9 @@
     SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawImageCommand* fromJSON(Json::Value& command);
+
 private:
     SkAutoTUnref<const SkImage> fImage;
     SkScalar                    fLeft;
@@ -289,6 +326,9 @@
                            const SkPaint* paint, SkCanvas::SrcRectConstraint constraint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawImageRectCommand* fromJSON(Json::Value& command);
+
 private:
     SkAutoTUnref<const SkImage> fImage;
     SkTLazy<SkRect>             fSrc;
@@ -304,6 +344,9 @@
     SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawOvalCommand* fromJSON(Json::Value& command);
+
 private:
     SkRect  fOval;
     SkPaint fPaint;
@@ -316,6 +359,9 @@
     SkDrawPaintCommand(const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawPaintCommand* fromJSON(Json::Value& command);
+
 private:
     SkPaint fPaint;
 
@@ -327,6 +373,8 @@
     SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawPathCommand* fromJSON(Json::Value& command);
 
 private:
     SkPath   fPath;
@@ -371,6 +419,9 @@
     virtual ~SkDrawPointsCommand() { delete [] fPts; }
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawPointsCommand* fromJSON(Json::Value& command);
+
 private:
     SkCanvas::PointMode fMode;
     size_t              fCount;
@@ -386,6 +437,9 @@
                       const SkPaint& paint);
     virtual ~SkDrawTextCommand() { delete [] fText; }
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawTextCommand* fromJSON(Json::Value& command);
+
 private:
     char*    fText;
     size_t   fByteLength;
@@ -402,6 +456,9 @@
                          const SkPaint& paint);
     virtual ~SkDrawPosTextCommand() { delete [] fPos; delete [] fText; }
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawPosTextCommand* fromJSON(Json::Value& command);
+
 private:
     char*    fText;
     size_t   fByteLength;
@@ -417,6 +474,9 @@
                             const SkMatrix* matrix, const SkPaint& paint);
     virtual ~SkDrawTextOnPathCommand() { delete [] fText; }
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawTextOnPathCommand* fromJSON(Json::Value& command);
+
 private:
     char*    fText;
     size_t   fByteLength;
@@ -433,6 +493,7 @@
                           SkScalar constY, const SkPaint& paint);
     virtual ~SkDrawPosTextHCommand() { delete [] fXpos; delete [] fText; }
     void execute(SkCanvas* canvas) const override;
+
 private:
     SkScalar* fXpos;
     char*     fText;
@@ -449,6 +510,8 @@
 
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawTextBlobCommand* fromJSON(Json::Value& command);
 
 private:
     SkAutoTUnref<const SkTextBlob> fBlob;
@@ -481,6 +544,8 @@
 public:
     SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawRectCommand* fromJSON(Json::Value& command);
 
     const SkRect& rect() const   { return fRect; }
     const SkPaint& paint() const { return fPaint; }
@@ -496,6 +561,9 @@
     SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawRRectCommand* fromJSON(Json::Value& command);
+
 private:
     SkRRect fRRect;
     SkPaint fPaint;
@@ -509,6 +577,9 @@
                         const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
     bool render(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkDrawDRRectCommand* fromJSON(Json::Value& command);
+
 private:
     SkRRect fOuter;
     SkRRect fInner;
@@ -526,6 +597,7 @@
                           const SkPaint& paint);
     virtual ~SkDrawVerticesCommand();
     void execute(SkCanvas* canvas) const override;
+
 private:
     SkCanvas::VertexMode fVmode;
     int         fVertexCount;
@@ -545,6 +617,8 @@
     SkSaveCommand();
     void execute(SkCanvas* canvas) const override;
     Action action() const override { return kPushLayer_Action; }
+    static SkSaveCommand* fromJSON(Json::Value& command);
+
 private:
     typedef SkDrawCommand INHERITED;
 };
@@ -552,7 +626,10 @@
 class SkSaveLayerCommand : public SkDrawCommand {
 public:
     SkSaveLayerCommand(const SkCanvas::SaveLayerRec&);
+    virtual ~SkSaveLayerCommand();
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkSaveLayerCommand* fromJSON(Json::Value& command);
     void vizExecute(SkCanvas* canvas) const override;
     Action action() const override{ return kPushLayer_Action; }
     void setActive(bool active) override { fActive = active; }
@@ -561,10 +638,11 @@
     const SkPaint* paint() const { return fPaintPtr; }
 
 private:
-    SkRect      fBounds;
-    SkPaint     fPaint;
-    SkPaint*    fPaintPtr;
-    uint32_t    fSaveLayerFlags;
+    SkRect               fBounds;
+    SkPaint              fPaint;
+    SkPaint*             fPaintPtr;
+    const SkImageFilter* fBackdrop;
+    uint32_t       fSaveLayerFlags;
 
     bool        fActive;
 
@@ -576,6 +654,9 @@
     SkSetMatrixCommand(const SkMatrix& matrix);
     void setUserMatrix(const SkMatrix&) override;
     void execute(SkCanvas* canvas) const override;
+    Json::Value toJSON() const override;
+    static SkSetMatrixCommand* fromJSON(Json::Value& command);
+
 private:
     SkMatrix fUserMatrix;
     SkMatrix fMatrix;