1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkJSONCanvas_DEFINED 9 #define SkJSONCanvas_DEFINED 10 11 #include "SkCanvas.h" 12 #include "SkStream.h" 13 #include "SkJSONCPP.h" 14 15 #define SKJSONCANVAS_VERSION "version" 16 #define SKJSONCANVAS_COMMANDS "commands" 17 #define SKJSONCANVAS_COMMAND "command" 18 19 #define SKJSONCANVAS_COMMAND_TRANSLATE "Translate" 20 #define SKJSONCANVAS_COMMAND_SCALE "Scale" 21 #define SKJSONCANVAS_COMMAND_MATRIX "Matrix" 22 #define SKJSONCANVAS_COMMAND_PAINT "Paint" 23 #define SKJSONCANVAS_COMMAND_RECT "Rect" 24 #define SKJSONCANVAS_COMMAND_OVAL "Oval" 25 #define SKJSONCANVAS_COMMAND_RRECT "RRect" 26 #define SKJSONCANVAS_COMMAND_DRRECT "DRRect" 27 #define SKJSONCANVAS_COMMAND_POINTS "Points" 28 #define SKJSONCANVAS_COMMAND_VERTICES "Vertices" 29 #define SKJSONCANVAS_COMMAND_ATLAS "Atlas" 30 #define SKJSONCANVAS_COMMAND_PATH "Path" 31 #define SKJSONCANVAS_COMMAND_IMAGE "Image" 32 #define SKJSONCANVAS_COMMAND_IMAGERECT "ImageRect" 33 #define SKJSONCANVAS_COMMAND_IMAGENINE "ImageNine" 34 #define SKJSONCANVAS_COMMAND_BITMAP "Bitmap" 35 #define SKJSONCANVAS_COMMAND_BITMAPRECT "BitmapRect" 36 #define SKJSONCANVAS_COMMAND_BITMAPNINE "BitmapNine" 37 #define SKJSONCANVAS_COMMAND_TEXT "Text" 38 #define SKJSONCANVAS_COMMAND_POSTEXT "PosText" 39 #define SKJSONCANVAS_COMMAND_POSTEXTH "PosTextH" 40 #define SKJSONCANVAS_COMMAND_TEXTONPATH "TextOnPath" 41 #define SKJSONCANVAS_COMMAND_TEXTBLOB "TextBlob" 42 #define SKJSONCANVAS_COMMAND_PATCH "Patch" 43 #define SKJSONCANVAS_COMMAND_DRAWABLE "Drawable" 44 #define SKJSONCANVAS_COMMAND_CLIPRECT "ClipRect" 45 #define SKJSONCANVAS_COMMAND_CLIPRRECT "ClipRRect" 46 #define SKJSONCANVAS_COMMAND_CLIPPATH "ClipPath" 47 #define SKJSONCANVAS_COMMAND_CLIPREGION "ClipRegion" 48 #define SKJSONCANVAS_COMMAND_SAVE "Save" 49 #define SKJSONCANVAS_COMMAND_RESTORE "Restore" 50 #define SKJSONCANVAS_COMMAND_SAVELAYER "SaveLayer" 51 52 #define SKJSONCANVAS_ATTRIBUTE_MATRIX "matrix" 53 #define SKJSONCANVAS_ATTRIBUTE_COORDS "coords" 54 #define SKJSONCANVAS_ATTRIBUTE_BOUNDS "bounds" 55 #define SKJSONCANVAS_ATTRIBUTE_PAINT "paint" 56 #define SKJSONCANVAS_ATTRIBUTE_OUTER "outer" 57 #define SKJSONCANVAS_ATTRIBUTE_INNER "inner" 58 #define SKJSONCANVAS_ATTRIBUTE_MODE "mode" 59 #define SKJSONCANVAS_ATTRIBUTE_POINTS "points" 60 #define SKJSONCANVAS_ATTRIBUTE_PATH "path" 61 #define SKJSONCANVAS_ATTRIBUTE_TEXT "text" 62 #define SKJSONCANVAS_ATTRIBUTE_COLOR "color" 63 #define SKJSONCANVAS_ATTRIBUTE_ALPHA "alpha" 64 #define SKJSONCANVAS_ATTRIBUTE_STYLE "style" 65 #define SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth" 66 #define SKJSONCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter" 67 #define SKJSONCANVAS_ATTRIBUTE_CAP "cap" 68 #define SKJSONCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias" 69 #define SKJSONCANVAS_ATTRIBUTE_REGION "region" 70 #define SKJSONCANVAS_ATTRIBUTE_REGIONOP "op" 71 #define SKJSONCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle" 72 #define SKJSONCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion" 73 #define SKJSONCANVAS_ATTRIBUTE_BLUR "blur" 74 #define SKJSONCANVAS_ATTRIBUTE_SIGMA "sigma" 75 #define SKJSONCANVAS_ATTRIBUTE_QUALITY "quality" 76 #define SKJSONCANVAS_ATTRIBUTE_TEXTALIGN "textAlign" 77 #define SKJSONCANVAS_ATTRIBUTE_TEXTSIZE "textSize" 78 #define SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX" 79 #define SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX" 80 #define SKJSONCANVAS_ATTRIBUTE_DASHING "dashing" 81 #define SKJSONCANVAS_ATTRIBUTE_INTERVALS "intervals" 82 #define SKJSONCANVAS_ATTRIBUTE_PHASE "phase" 83 #define SKJSONCANVAS_ATTRIBUTE_FILLTYPE "fillType" 84 #define SKJSONCANVAS_ATTRIBUTE_VERBS "verbs" 85 #define SKJSONCANVAS_ATTRIBUTE_NAME "name" 86 #define SKJSONCANVAS_ATTRIBUTE_BYTES "bytes" 87 #define SKJSONCANVAS_ATTRIBUTE_SHADER "shader" 88 #define SKJSONCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect" 89 #define SKJSONCANVAS_ATTRIBUTE_MASKFILTER "maskFilter" 90 #define SKJSONCANVAS_ATTRIBUTE_XFERMODE "xfermode" 91 #define SKJSONCANVAS_ATTRIBUTE_BACKDROP "backdrop" 92 #define SKJSONCANVAS_ATTRIBUTE_COLORFILTER "colorfilter" 93 #define SKJSONCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter" 94 #define SKJSONCANVAS_ATTRIBUTE_IMAGE "image" 95 #define SKJSONCANVAS_ATTRIBUTE_BITMAP "bitmap" 96 #define SKJSONCANVAS_ATTRIBUTE_SRC "src" 97 #define SKJSONCANVAS_ATTRIBUTE_DST "dst" 98 #define SKJSONCANVAS_ATTRIBUTE_STRICT "strict" 99 #define SKJSONCANVAS_ATTRIBUTE_DESCRIPTION "description" 100 #define SKJSONCANVAS_ATTRIBUTE_X "x" 101 #define SKJSONCANVAS_ATTRIBUTE_Y "y" 102 #define SKJSONCANVAS_ATTRIBUTE_RUNS "runs" 103 #define SKJSONCANVAS_ATTRIBUTE_POSITIONS "positions" 104 #define SKJSONCANVAS_ATTRIBUTE_GLYPHS "glyphs" 105 #define SKJSONCANVAS_ATTRIBUTE_FONT "font" 106 #define SKJSONCANVAS_ATTRIBUTE_TYPEFACE "typeface" 107 108 #define SKJSONCANVAS_VERB_MOVE "move" 109 #define SKJSONCANVAS_VERB_LINE "line" 110 #define SKJSONCANVAS_VERB_QUAD "quad" 111 #define SKJSONCANVAS_VERB_CUBIC "cubic" 112 #define SKJSONCANVAS_VERB_CONIC "conic" 113 #define SKJSONCANVAS_VERB_CLOSE "close" 114 115 #define SKJSONCANVAS_STYLE_FILL "fill" 116 #define SKJSONCANVAS_STYLE_STROKE "stroke" 117 #define SKJSONCANVAS_STYLE_STROKEANDFILL "strokeAndFill" 118 119 #define SKJSONCANVAS_POINTMODE_POINTS "points" 120 #define SKJSONCANVAS_POINTMODE_LINES "lines" 121 #define SKJSONCANVAS_POINTMODE_POLYGON "polygon" 122 123 #define SKJSONCANVAS_REGIONOP_DIFFERENCE "difference" 124 #define SKJSONCANVAS_REGIONOP_INTERSECT "intersect" 125 #define SKJSONCANVAS_REGIONOP_UNION "union" 126 #define SKJSONCANVAS_REGIONOP_XOR "xor" 127 #define SKJSONCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference" 128 #define SKJSONCANVAS_REGIONOP_REPLACE "replace" 129 130 #define SKJSONCANVAS_BLURSTYLE_NORMAL "normal" 131 #define SKJSONCANVAS_BLURSTYLE_SOLID "solid" 132 #define SKJSONCANVAS_BLURSTYLE_OUTER "outer" 133 #define SKJSONCANVAS_BLURSTYLE_INNER "inner" 134 135 #define SKJSONCANVAS_BLURQUALITY_LOW "low" 136 #define SKJSONCANVAS_BLURQUALITY_HIGH "high" 137 138 #define SKJSONCANVAS_ALIGN_LEFT "left" 139 #define SKJSONCANVAS_ALIGN_CENTER "center" 140 #define SKJSONCANVAS_ALIGN_RIGHT "right" 141 142 #define SKJSONCANVAS_FILLTYPE_WINDING "winding" 143 #define SKJSONCANVAS_FILLTYPE_EVENODD "evenOdd" 144 #define SKJSONCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding" 145 #define SKJSONCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd" 146 147 #define SKJSONCANVAS_CAP_BUTT "butt" 148 #define SKJSONCANVAS_CAP_ROUND "round" 149 #define SKJSONCANVAS_CAP_SQUARE "square" 150 151 #define SKJSONCANVAS_COLORTYPE_ARGB4444 "ARGB4444" 152 #define SKJSONCANVAS_COLORTYPE_RGBA8888 "RGBA8888" 153 #define SKJSONCANVAS_COLORTYPE_BGRA8888 "BGRA8888" 154 #define SKJSONCANVAS_COLORTYPE_565 "565" 155 #define SKJSONCANVAS_COLORTYPE_GRAY8 "Gray8" 156 #define SKJSONCANVAS_COLORTYPE_INDEX8 "Index8" 157 #define SKJSONCANVAS_COLORTYPE_ALPHA8 "Alpha8" 158 159 #define SKJSONCANVAS_ALPHATYPE_OPAQUE "opaque" 160 #define SKJSONCANVAS_ALPHATYPE_PREMUL "premul" 161 #define SKJSONCANVAS_ALPHATYPE_UNPREMUL "unpremul" 162 163 /* 164 * Implementation of SkCanvas which writes JSON when drawn to. The JSON describes all of the draw 165 * commands issued to the canvas, and can later be turned back into draw commands using 166 * SkJSONRenderer. Be sure to call finish() when you are done drawing. 167 */ 168 class SkJSONCanvas : public SkCanvas { 169 public: 170 /* Create a canvas which writes to the specified output stream. */ 171 SkJSONCanvas(int width, int height, SkWStream& out, bool sendBinaries = false); 172 173 /* Complete the JSON document. */ 174 void finish(); 175 176 static Json::Value MakeMatrix(const SkMatrix& matrix); 177 178 static Json::Value MakeIRect(const SkIRect& irect); 179 180 // overridden SkCanvas API 181 182 void didConcat(const SkMatrix&) override; 183 184 void didSetMatrix(const SkMatrix&) override; 185 186 void onDrawPaint(const SkPaint&) override; 187 188 void onDrawRect(const SkRect&, const SkPaint&) override; 189 190 void onDrawOval(const SkRect&, const SkPaint&) override; 191 192 void onDrawRRect(const SkRRect&, const SkPaint&) override; 193 194 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 195 196 void onDrawPoints(SkCanvas::PointMode, size_t count, const SkPoint pts[], 197 const SkPaint&) override; 198 199 void onDrawVertices(SkCanvas::VertexMode, int vertexCount, const SkPoint vertices[], 200 const SkPoint texs[], const SkColor colors[], SkXfermode*, 201 const uint16_t indices[], int indexCount, const SkPaint&) override; 202 203 void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], 204 int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*) override; 205 206 void onDrawPath(const SkPath&, const SkPaint&) override; 207 208 void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*) override; 209 210 void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*, 211 SrcRectConstraint) override; 212 213 void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, 214 const SkPaint*) override; 215 216 void onDrawBitmap(const SkBitmap&, SkScalar dx, SkScalar dy, const SkPaint*) override; 217 218 void onDrawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint*, 219 SkCanvas::SrcRectConstraint) override; 220 221 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 222 const SkPaint*) override; 223 224 void onDrawText(const void* text, size_t byteLength, SkScalar x, 225 SkScalar y, const SkPaint& paint) override; 226 227 void onDrawPosText(const void* text, size_t byteLength, 228 const SkPoint pos[], const SkPaint& paint) override; 229 230 void onDrawPosTextH(const void* text, size_t byteLength, 231 const SkScalar xpos[], SkScalar constY, 232 const SkPaint& paint) override; 233 234 void onDrawTextOnPath(const void* text, size_t byteLength, 235 const SkPath& path, const SkMatrix* matrix, 236 const SkPaint& paint) override; 237 238 void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 239 const SkPaint& paint) override; 240 241 void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 242 const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) override; 243 244 void onDrawDrawable(SkDrawable*, const SkMatrix*) override; 245 246 void onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) override; 247 248 void onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) override; 249 250 void onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) override; 251 252 void onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) override; 253 254 void willSave() override; 255 256 void willRestore() override; 257 258 SkCanvas::SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override; 259 260 private: 261 // Helpers to turn values into JSON, these could probably be static 262 Json::Value makePoint(const SkPoint& point); 263 264 Json::Value makePoint(SkScalar x, SkScalar y); 265 266 Json::Value makeRect(const SkRect& rect); 267 268 Json::Value makeRRect(const SkRRect& rrect); 269 270 Json::Value makePath(const SkPath& path); 271 272 Json::Value makeRegion(const SkRegion& region); 273 274 Json::Value makePaint(const SkPaint& paint); 275 276 Json::Value makeRegionOp(SkRegion::Op op); 277 278 Json::Value makeEdgeStyle(SkCanvas::ClipEdgeStyle edgeStyle); 279 280 Json::Value makePointMode(SkCanvas::PointMode mode); 281 282 void updateMatrix(); 283 284 SkWStream& fOut; 285 Json::Value fRoot; 286 Json::Value fCommands; 287 bool fSendBinaries; 288 289 typedef SkCanvas INHERITED; 290 }; 291 292 #endif 293