/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKDRAWCOMMAND_H_ #define SKDRAWCOMMAND_H_ #include "SkBitmap.h" #include "SkCanvas.h" #include "SkDrawShadowInfo.h" #include "SkFlattenable.h" #include "SkTLazy.h" #include "SkPath.h" #include "SkRegion.h" #include "SkRRect.h" #include "SkRSXform.h" #include "SkString.h" #include "SkTDArray.h" #include "SkVertices.h" #include "SkJSONCPP.h" #include "UrlDataManager.h" class SkDrawCommand { public: enum OpType { kBeginDrawPicture_OpType, kClear_OpType, kClipPath_OpType, kClipRegion_OpType, kClipRect_OpType, kClipRRect_OpType, kConcat_OpType, kDrawAnnotation_OpType, kDrawBitmap_OpType, kDrawBitmapLattice_OpType, kDrawBitmapNine_OpType, kDrawBitmapRect_OpType, kDrawDRRect_OpType, kDrawImage_OpType, kDrawImageLattice_OpType, kDrawImageNine_OpType, kDrawImageRect_OpType, kDrawOval_OpType, kDrawArc_OpType, kDrawPaint_OpType, kDrawPatch_OpType, kDrawPath_OpType, kDrawPoints_OpType, kDrawPosText_OpType, kDrawPosTextH_OpType, kDrawRect_OpType, kDrawRRect_OpType, kDrawRegion_OpType, kDrawShadow_OpType, kDrawText_OpType, kDrawTextBlob_OpType, kDrawTextOnPath_OpType, kDrawTextRSXform_OpType, kDrawVertices_OpType, kEndDrawPicture_OpType, kRestore_OpType, kSave_OpType, kSaveLayer_OpType, kSetMatrix_OpType, kLast_OpType = kSetMatrix_OpType }; static const int kOpTypeCount = kLast_OpType + 1; static void WritePNG(const uint8_t* rgba, unsigned width, unsigned height, SkWStream& out, bool isOpaque); SkDrawCommand(OpType opType); virtual ~SkDrawCommand() {} bool isVisible() const { return fVisible; } void setVisible(bool toggle) { fVisible = toggle; } virtual void execute(SkCanvas*) const = 0; virtual bool render(SkCanvas* canvas) const { return false; } virtual Json::Value toJSON(UrlDataManager& urlDataManager) 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, UrlDataManager& urlDataManager); static const char* GetCommandString(OpType type); // Helper methods for converting things to JSON static Json::Value MakeJsonColor(const SkColor color); static Json::Value MakeJsonColor4f(const SkColor4f& color); static Json::Value MakeJsonPoint(const SkPoint& point); static Json::Value MakeJsonPoint(SkScalar x, SkScalar y); static Json::Value MakeJsonPoint3(const SkPoint3& point); static Json::Value MakeJsonRect(const SkRect& rect); static Json::Value MakeJsonIRect(const SkIRect&); static Json::Value MakeJsonMatrix(const SkMatrix&); static Json::Value MakeJsonScalar(SkScalar); static Json::Value MakeJsonPath(const SkPath& path); static Json::Value MakeJsonRegion(const SkRegion& region); static Json::Value MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager); static Json::Value MakeJsonLattice(const SkCanvas::Lattice& lattice); static void flatten(const SkFlattenable* flattenable, Json::Value* target, UrlDataManager& urlDataManager); static bool flatten(const SkImage& image, Json::Value* target, UrlDataManager& urlDataManager); static bool flatten(const SkBitmap& bitmap, Json::Value* target, UrlDataManager& urlDataManager); private: OpType fOpType; bool fVisible; }; class SkRestoreCommand : public SkDrawCommand { public: SkRestoreCommand(); void execute(SkCanvas* canvas) const override; static SkRestoreCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: typedef SkDrawCommand INHERITED; }; class SkClearCommand : public SkDrawCommand { public: SkClearCommand(SkColor color); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkClearCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkColor fColor; typedef SkDrawCommand INHERITED; }; class SkClipPathCommand : public SkDrawCommand { public: SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkClipPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPath fPath; SkClipOp fOp; bool fDoAA; typedef SkDrawCommand INHERITED; }; class SkClipRegionCommand : public SkDrawCommand { public: SkClipRegionCommand(const SkRegion& region, SkClipOp op); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkClipRegionCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRegion fRegion; SkClipOp fOp; typedef SkDrawCommand INHERITED; }; class SkClipRectCommand : public SkDrawCommand { public: SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkClipRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); const SkRect& rect() const { return fRect; } SkClipOp op() const { return fOp; } bool doAA() const { return fDoAA; } private: SkRect fRect; SkClipOp fOp; bool fDoAA; typedef SkDrawCommand INHERITED; }; class SkClipRRectCommand : public SkDrawCommand { public: SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkClipRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); const SkRRect& rrect() const { return fRRect; } SkClipOp op() const { return fOp; } bool doAA() const { return fDoAA; } private: SkRRect fRRect; SkClipOp fOp; bool fDoAA; typedef SkDrawCommand INHERITED; }; class SkConcatCommand : public SkDrawCommand { public: SkConcatCommand(const SkMatrix& matrix); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkConcatCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkMatrix fMatrix; typedef SkDrawCommand INHERITED; }; class SkDrawAnnotationCommand : public SkDrawCommand { public: SkDrawAnnotationCommand(const SkRect&, const char key[], sk_sp value); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawAnnotationCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRect fRect; SkString fKey; sk_sp fValue; typedef SkDrawCommand INHERITED; }; class SkDrawBitmapCommand : public SkDrawCommand { public: SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawBitmapCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkBitmap fBitmap; SkScalar fLeft; SkScalar fTop; SkPaint fPaint; SkPaint* fPaintPtr; typedef SkDrawCommand INHERITED; }; class SkDrawBitmapLatticeCommand : public SkDrawCommand { public: SkDrawBitmapLatticeCommand(const SkBitmap& bitmap, const SkCanvas::Lattice& lattice, const SkRect& dst, const SkPaint* paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawBitmapLatticeCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkBitmap fBitmap; SkCanvas::Lattice fLattice; SkRect fDst; SkTLazy fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawBitmapNineCommand : public SkDrawCommand { public: SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint* paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawBitmapNineCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkBitmap fBitmap; SkIRect fCenter; SkRect fDst; SkPaint fPaint; SkPaint* fPaintPtr; typedef SkDrawCommand INHERITED; }; class SkDrawBitmapRectCommand : public SkDrawCommand { public: SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst, const SkPaint* paint, SkCanvas::SrcRectConstraint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawBitmapRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); const SkBitmap& bitmap() const { return fBitmap; } // The non-const 'paint' method allows modification of this object's // SkPaint. For this reason the ctor and setPaint method make a local copy. // The 'fPaintPtr' member acts a signal that the local SkPaint is valid // (since only an SkPaint* is passed into the ctor). const SkPaint* paint() const { return fPaintPtr; } SkPaint* paint() { return fPaintPtr; } void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; } const SkRect* srcRect() const { return fSrc.isEmpty() ? nullptr : &fSrc; } void setSrcRect(const SkRect& src) { fSrc = src; } const SkRect& dstRect() const { return fDst; } void setDstRect(const SkRect& dst) { fDst = dst; } SkCanvas::SrcRectConstraint constraint() const { return fConstraint; } void setConstraint(SkCanvas::SrcRectConstraint constraint) { fConstraint = constraint; } private: SkBitmap fBitmap; SkRect fSrc; SkRect fDst; SkPaint fPaint; SkPaint* fPaintPtr; SkCanvas::SrcRectConstraint fConstraint; typedef SkDrawCommand INHERITED; }; class SkDrawImageCommand : public SkDrawCommand { public: 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(UrlDataManager& urlDataManager) const override; static SkDrawImageCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp fImage; SkScalar fLeft; SkScalar fTop; SkTLazy fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawImageLatticeCommand : public SkDrawCommand { public: SkDrawImageLatticeCommand(const SkImage* image, const SkCanvas::Lattice& lattice, const SkRect& dst, const SkPaint* paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawImageLatticeCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp fImage; SkCanvas::Lattice fLattice; SkRect fDst; SkTLazy fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawImageNineCommand : public SkDrawCommand { public: SkDrawImageNineCommand(const SkImage* image, const SkIRect& center, const SkRect& dst, const SkPaint* paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawImageNineCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp fImage; SkIRect fCenter; SkRect fDst; SkPaint fPaint; SkPaint* fPaintPtr; typedef SkDrawCommand INHERITED; }; class SkDrawImageRectCommand : public SkDrawCommand { public: SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint, SkCanvas::SrcRectConstraint constraint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawImageRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp fImage; SkTLazy fSrc; SkRect fDst; SkTLazy fPaint; SkCanvas::SrcRectConstraint fConstraint; typedef SkDrawCommand INHERITED; }; class SkDrawOvalCommand : public SkDrawCommand { public: SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawOvalCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRect fOval; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawArcCommand : public SkDrawCommand { public: SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawArcCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRect fOval; SkScalar fStartAngle; SkScalar fSweepAngle; bool fUseCenter; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawPaintCommand : public SkDrawCommand { public: SkDrawPaintCommand(const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawPaintCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawPathCommand : public SkDrawCommand { public: SkDrawPathCommand(const SkPath& path, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPath fPath; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkBeginDrawPictureCommand : public SkDrawCommand { public: SkBeginDrawPictureCommand(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; private: sk_sp fPicture; SkTLazy fMatrix; SkTLazy fPaint; typedef SkDrawCommand INHERITED; }; class SkEndDrawPictureCommand : public SkDrawCommand { public: SkEndDrawPictureCommand(bool restore); void execute(SkCanvas* canvas) const override; private: bool fRestore; typedef SkDrawCommand INHERITED; }; class SkDrawPointsCommand : public SkDrawCommand { public: SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint); ~SkDrawPointsCommand() override { delete [] fPts; } void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawPointsCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkCanvas::PointMode fMode; size_t fCount; SkPoint* fPts; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawRegionCommand : public SkDrawCommand { public: SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawRegionCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRegion fRegion; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawTextCommand : public SkDrawCommand { public: SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint); ~SkDrawTextCommand() override { delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: char* fText; size_t fByteLength; SkScalar fX; SkScalar fY; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawPosTextCommand : public SkDrawCommand { public: SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint); ~SkDrawPosTextCommand() override { delete [] fPos; delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawPosTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: char* fText; size_t fByteLength; SkPoint* fPos; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawTextOnPathCommand : public SkDrawCommand { public: SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path, const SkMatrix* matrix, const SkPaint& paint); ~SkDrawTextOnPathCommand() override { delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawTextOnPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: char* fText; size_t fByteLength; SkPath fPath; SkMatrix fMatrix; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawTextRSXformCommand : public SkDrawCommand { public: SkDrawTextRSXformCommand(const void* text, size_t byteLength, const SkRSXform[], const SkRect*, const SkPaint& paint); ~SkDrawTextRSXformCommand() override { delete[] fText; delete[] fXform; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawTextRSXformCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: char* fText; size_t fByteLength; SkRSXform* fXform; SkRect* fCull; SkRect fCullStorage; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawPosTextHCommand : public SkDrawCommand { public: SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint); ~SkDrawPosTextHCommand() override { delete [] fXpos; delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawPosTextHCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkScalar* fXpos; char* fText; size_t fByteLength; SkScalar fConstY; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawTextBlobCommand : public SkDrawCommand { public: SkDrawTextBlobCommand(sk_sp blob, SkScalar x, SkScalar y, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawTextBlobCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp fBlob; SkScalar fXPos; SkScalar fYPos; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawPatchCommand : public SkDrawCommand { public: SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode bmode, const SkPaint& paint); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawPatchCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPoint fCubics[12]; SkColor* fColorsPtr; SkColor fColors[4]; SkPoint* fTexCoordsPtr; SkPoint fTexCoords[4]; SkBlendMode fBlendMode; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawRectCommand : public SkDrawCommand { public: SkDrawRectCommand(const SkRect& rect, const SkPaint& paint); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); const SkRect& rect() const { return fRect; } const SkPaint& paint() const { return fPaint; } private: SkRect fRect; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawRRectCommand : public SkDrawCommand { public: SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRRect fRRect; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawDRRectCommand : public SkDrawCommand { public: SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawDRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRRect fOuter; SkRRect fInner; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkDrawVerticesCommand : public SkDrawCommand { public: SkDrawVerticesCommand(sk_sp, SkBlendMode, const SkPaint&); void execute(SkCanvas* canvas) const override; private: sk_sp fVertices; SkBlendMode fBlendMode; SkPaint fPaint; typedef SkDrawCommand INHERITED; }; class SkSaveCommand : public SkDrawCommand { public: SkSaveCommand(); void execute(SkCanvas* canvas) const override; static SkSaveCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: typedef SkDrawCommand INHERITED; }; class SkSaveLayerCommand : public SkDrawCommand { public: SkSaveLayerCommand(const SkCanvas::SaveLayerRec&); ~SkSaveLayerCommand() override; void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkSaveLayerCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); const SkPaint* paint() const { return fPaintPtr; } private: SkRect fBounds; SkPaint fPaint; SkPaint* fPaintPtr; const SkImageFilter* fBackdrop; uint32_t fSaveLayerFlags; typedef SkDrawCommand INHERITED; }; class SkSetMatrixCommand : public SkDrawCommand { public: SkSetMatrixCommand(const SkMatrix& matrix); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkSetMatrixCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkMatrix fMatrix; typedef SkDrawCommand INHERITED; }; class SkDrawShadowCommand : public SkDrawCommand { public: SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec); void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; static SkDrawShadowCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPath fPath; SkDrawShadowRec fShadowRec; typedef SkDrawCommand INHERITED; }; #endif