// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SKIA_EXT_BENCHMARKING_CANVAS_H_
#define SKIA_EXT_BENCHMARKING_CANVAS_H_

#include "base/values.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/utils/SkNWayCanvas.h"

class SkXfermode;

namespace skia {

class SK_API BenchmarkingCanvas : public SkNWayCanvas {
public:
  BenchmarkingCanvas(SkCanvas* canvas, unsigned flags = 0);
  ~BenchmarkingCanvas() override;

  enum Flags {
      kOverdrawVisualization_Flag = 0x01,
  };

  // Returns the number of draw commands executed on this canvas.
  size_t CommandCount() const;

  // Returns the list of executed draw commands.
  const base::ListValue& Commands() const;

  // Return the recorded render time (milliseconds) for a draw command index.
  double GetTime(size_t index);

protected:
  // SkCanvas overrides
  void willSave() override;
  SaveLayerStrategy willSaveLayer(const SkRect*,
                                  const SkPaint*,
                                  SaveFlags) override;
  void willRestore() override;

  void didConcat(const SkMatrix&) override;
  void didSetMatrix(const SkMatrix&) override;

  void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override;
  void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override;
  void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override;
  void onClipRegion(const SkRegion&, SkRegion::Op) override;

  void onDrawPaint(const SkPaint&) override;
  void onDrawPoints(PointMode, size_t count, const SkPoint pts[],
                    const SkPaint&) override;
  void onDrawRect(const SkRect&, const SkPaint&) override;
  void onDrawOval(const SkRect&, const SkPaint&) override;
  void onDrawRRect(const SkRRect&, const SkPaint&) override;
  void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
  void onDrawPath(const SkPath&, const SkPaint&) override;

  void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;

  void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
  void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
                        const SkPaint*, SrcRectConstraint) override;
  void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
  void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
                       const SkPaint*, SrcRectConstraint) override;
  void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
                        const SkPaint*) override;
  void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override;

  void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
                  const SkPaint&) override;
  void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
                     const SkPaint&) override;
  void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
                      SkScalar constY, const SkPaint&) override;
  void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
                        const SkMatrix* matrix, const SkPaint&) override;
  void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
                      const SkPaint& paint) override;

private:
  typedef SkNWayCanvas INHERITED;

  class AutoOp;

  base::ListValue op_records_;
  unsigned flags_;
  RefPtr<SkXfermode> overdraw_xfermode_;
};

}
#endif // SKIA_EXT_BENCHMARKING_CANVAS_H
