/*
 * 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 SKDEBUGCANVAS_H_
#define SKDEBUGCANVAS_H_

#include "include/core/SkCanvas.h"
#include "include/core/SkCanvasVirtualEnforcer.h"
#include "include/core/SkColor.h"
#include "include/core/SkM44.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSamplingOptions.h"
#include "include/core/SkScalar.h"
#include "include/core/SkTypes.h"
#include "include/private/base/SkTDArray.h"

#include <cstddef>
#include <map>
#include <vector>

class DebugLayerManager;
class DrawCommand;
class GrAuditTrail;
class SkData;
class SkDrawable;
class SkImage;
class SkJSONWriter;
class SkMatrix;
class SkPaint;
class SkPath;
class SkPicture;
class SkRRect;
class SkRegion;
class SkShader;
class SkTextBlob;
class SkVertices;
class UrlDataManager;
enum class SkBlendMode;
enum class SkClipOp;
struct SkDrawShadowRec;
struct SkPoint;
struct SkRSXform;

class DebugCanvas : public SkCanvasVirtualEnforcer<SkCanvas> {
public:
    DebugCanvas(int width, int height);

    DebugCanvas(SkIRect bounds);

    ~DebugCanvas() override;

    /**
     * Provide a DebugLayerManager for mskp files containing layer information
     * when set this DebugCanvas will attempt to parse layer info from annotations.
     * it will store layer pictures to the layer manager, and interpret some drawImageRects
     * as layer draws, deferring to the layer manager for images.
     * Provide a frame number that will be passed to all layer manager functions to identify this
     * DebugCanvas.
     *
     * Used only in wasm debugger animations.
     */
    void setLayerManagerAndFrame(DebugLayerManager* lm, int frame) {
        fLayerManager = lm;
        fFrame = frame;
    }

    /**
     * Enable or disable overdraw visualization
     */
    void setOverdrawViz(bool overdrawViz);

    bool getOverdrawViz() const { return fOverdrawViz; }

    /**
     * Set the color of the clip visualization. An alpha of zero renders the clip invisible.
     */
    void setClipVizColor(SkColor clipVizColor) { this->fClipVizColor = clipVizColor; }

    void setAndroidClipViz(bool enable) { this->fShowAndroidClip = enable; }

    void setOriginVisible(bool enable) { this->fShowOrigin = enable; }

    void setDrawGpuOpBounds(bool drawGpuOpBounds) { fDrawGpuOpBounds = drawGpuOpBounds; }

    bool getDrawGpuOpBounds() const { return fDrawGpuOpBounds; }

    /**
        Executes all draw calls to the canvas.
        @param canvas  The canvas being drawn to
     */
    void draw(SkCanvas* canvas);

    /**
        Executes the draw calls up to the specified index.
        Does not clear the canvas to transparent black first,
        if needed, caller should do that first.
        @param canvas  The canvas being drawn to
        @param index  The index of the final command being executed
        @param m an optional Mth gpu op to highlight, or -1
     */
    void drawTo(SkCanvas* canvas, int index, int m = -1);

    /**
        Returns the most recently calculated transformation matrix
     */
    const SkM44& getCurrentMatrix() { return fMatrix; }

    /**
        Returns the most recently calculated clip
     */
    const SkIRect& getCurrentClip() { return fClip; }

    /**
        Removes the command at the specified index
        @param index  The index of the command to delete
     */
    void deleteDrawCommandAt(int index);

    /**
        Returns the draw command at the given index.
        @param index  The index of the command
     */
    DrawCommand* getDrawCommandAt(int index) const;

    /**
        Returns length of draw command vector.
     */
    int getSize() const { return fCommandVector.size(); }

    /**
        Toggles the visibility / execution of the draw command at index i with
        the value of toggle.
     */
    void toggleCommand(int index, bool toggle);

    /**
        Returns a JSON object representing all commands in the picture.
        The encoder may use the UrlDataManager to store binary data such
        as images, referring to them via URLs embedded in the JSON.
     */
    void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager, SkCanvas*);

    void toJSONOpsTask(SkJSONWriter& writer, SkCanvas*);

    void detachCommands(SkTDArray<DrawCommand*>* dst) { fCommandVector.swap(*dst); }

    /**
        Returns a map from image IDs to command indices where they are used.
     */
    std::map<int, std::vector<int>> getImageIdToCommandMap(UrlDataManager& udm) const;

protected:
    void              willSave() override;
    SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override;
    bool              onDoSaveBehind(const SkRect*) override;
    void              willRestore() override;

    void didConcat44(const SkM44&) override;
    void didSetM44(const SkM44&) override;
    void didScale(SkScalar, SkScalar) override;
    void didTranslate(SkScalar, SkScalar) override;

    void onDrawAnnotation(const SkRect&, const char[], SkData*) override;
    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
    void onDrawTextBlob(const SkTextBlob* blob,
                        SkScalar          x,
                        SkScalar          y,
                        const SkPaint&    paint) override;

    void onDrawPatch(const SkPoint cubics[12],
                     const SkColor colors[4],
                     const SkPoint texCoords[4],
                     SkBlendMode,
                     const SkPaint& paint) override;
    void onDrawPaint(const SkPaint&) override;
    void onDrawBehind(const SkPaint&) override;

    void onDrawRect(const SkRect&, const SkPaint&) override;
    void onDrawOval(const SkRect&, const SkPaint&) override;
    void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override;
    void onDrawRRect(const SkRRect&, const SkPaint&) override;
    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
    void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override;
    void onDrawPath(const SkPath&, const SkPaint&) override;
    void onDrawRegion(const SkRegion&, const SkPaint&) override;

    void onDrawImage2(const SkImage*, SkScalar, SkScalar, const SkSamplingOptions&,
                      const SkPaint*) override;
    void onDrawImageRect2(const SkImage*, const SkRect&, const SkRect&, const SkSamplingOptions&,
                          const SkPaint*, SrcRectConstraint) override;
    void onDrawImageLattice2(const SkImage*, const Lattice&, const SkRect&, SkFilterMode,
                             const SkPaint*) override;
    void onDrawAtlas2(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
                     SkBlendMode, const SkSamplingOptions&, const SkRect*, const SkPaint*) override;

    void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
    void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
    void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
    void onClipShader(sk_sp<SkShader>, SkClipOp) override;
    void onClipRegion(const SkRegion& region, SkClipOp) override;
    void onResetClip() override;

    void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override;
    void onDrawDrawable(SkDrawable*, const SkMatrix*) override;
    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;

    void onDrawEdgeAAQuad(const SkRect&,
                          const SkPoint[4],
                          QuadAAFlags,
                          const SkColor4f&,
                          SkBlendMode) override;
    void onDrawEdgeAAImageSet2(const ImageSetEntry[],
                               int count,
                               const SkPoint[],
                               const SkMatrix[],
                               const SkSamplingOptions&,
                               const SkPaint*,
                               SrcRectConstraint) override;

private:
    SkTDArray<DrawCommand*> fCommandVector;
    SkM44                   fMatrix;
    SkIRect                 fClip;

    bool    fOverdrawViz = false;
    SkColor fClipVizColor;
    bool    fDrawGpuOpBounds = false;
    bool    fShowAndroidClip = false;
    bool    fShowOrigin = false;

    // When not negative, indicates the render node id of the layer represented by the next
    // drawPicture call.
    int         fnextDrawPictureLayerId = -1;
    int         fnextDrawImageRectLayerId = -1;
    SkIRect     fnextDrawPictureDirtyRect;
    // may be null, in which case layer annotations are ignored.
    DebugLayerManager* fLayerManager = nullptr;
    // May be set when DebugCanvas is used in playing back an animation.
    // Only used for passing to fLayerManager to identify itself.
    int fFrame = -1;
    SkRect fAndroidClip = SkRect::MakeEmpty();

    /**
        Adds the command to the class' vector of commands.
        @param command  The draw command for execution
     */
    void addDrawCommand(DrawCommand* command);

#if defined(SK_GANESH)
    GrAuditTrail* getAuditTrail(SkCanvas*);
    void drawAndCollectOps(SkCanvas*);
    void cleanupAuditTrail(GrAuditTrail*);
#endif

    using INHERITED = SkCanvasVirtualEnforcer<SkCanvas>;
};

#endif
