// Copyright 2017 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_MOCK_PAINT_CANVAS_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_MOCK_PAINT_CANVAS_H_

#include "cc/paint/paint_canvas.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_flags.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_image.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_text_blob.h"
#include "third_party/skia/include/core/SkMetaData.h"

namespace blink {

class MockPaintCanvas : public cc::PaintCanvas {
 public:
  MOCK_METHOD0(getMetaData, SkMetaData&());
  MOCK_CONST_METHOD0(imageInfo, SkImageInfo());
  MOCK_METHOD0(flush, void());
  MOCK_METHOD0(save, int());
  MOCK_METHOD2(saveLayer, int(const SkRect* bounds, const PaintFlags* flags));
  MOCK_METHOD3(saveLayerAlpha,
               int(const SkRect* bounds,
                   uint8_t alpha,
                   bool preserve_lcd_text_requests));
  MOCK_METHOD0(restore, void());
  MOCK_CONST_METHOD0(getSaveCount, int());
  MOCK_METHOD1(restoreToCount, void(int save_count));
  MOCK_METHOD2(translate, void(SkScalar dx, SkScalar dy));
  MOCK_METHOD2(scale, void(SkScalar sx, SkScalar sy));
  MOCK_METHOD1(rotate, void(SkScalar degrees));
  MOCK_METHOD1(concat, void(const SkMatrix& matrix));
  MOCK_METHOD1(setMatrix, void(const SkMatrix& matrix));
  MOCK_METHOD3(clipRect,
               void(const SkRect& rect, SkClipOp op, bool do_anti_alias));
  MOCK_METHOD3(clipRRect,
               void(const SkRRect& rrect, SkClipOp op, bool do_anti_alias));
  MOCK_METHOD3(clipPath,
               void(const SkPath& path, SkClipOp op, bool do_anti_alias));
  MOCK_CONST_METHOD0(getLocalClipBounds, SkRect());
  MOCK_CONST_METHOD1(getLocalClipBounds, bool(SkRect* bounds));
  MOCK_CONST_METHOD0(getDeviceClipBounds, SkIRect());
  MOCK_CONST_METHOD1(getDeviceClipBounds, bool(SkIRect* bounds));
  MOCK_METHOD2(drawColor, void(SkColor color, SkBlendMode mode));
  MOCK_METHOD1(clear, void(SkColor color));
  MOCK_METHOD5(drawLine,
               void(SkScalar x0,
                    SkScalar y0,
                    SkScalar x1,
                    SkScalar y1,
                    const PaintFlags& flags));
  MOCK_METHOD2(drawRect, void(const SkRect& rect, const PaintFlags& flags));
  MOCK_METHOD2(drawIRect, void(const SkIRect& rect, const PaintFlags& flags));
  MOCK_METHOD2(drawOval, void(const SkRect& oval, const PaintFlags& flags));
  MOCK_METHOD2(drawRRect, void(const SkRRect& rrect, const PaintFlags& flags));
  MOCK_METHOD3(drawDRRect,
               void(const SkRRect& outer,
                    const SkRRect& inner,
                    const PaintFlags& flags));
  MOCK_METHOD4(drawRoundRect,
               void(const SkRect& rect,
                    SkScalar rx,
                    SkScalar ry,
                    const PaintFlags& flags));
  MOCK_METHOD2(drawPath, void(const SkPath& path, const PaintFlags& flags));
  MOCK_METHOD4(drawImage,
               void(const PaintImage& image,
                    SkScalar left,
                    SkScalar top,
                    const PaintFlags* flags));
  MOCK_METHOD5(drawImageRect,
               void(const PaintImage& image,
                    const SkRect& src,
                    const SkRect& dst,
                    const PaintFlags* flags,
                    SrcRectConstraint constraint));
  MOCK_METHOD4(drawBitmap,
               void(const SkBitmap& bitmap,
                    SkScalar left,
                    SkScalar top,
                    const PaintFlags* flags));
  MOCK_METHOD4(drawTextBlob,
               void(scoped_refptr<PaintTextBlob>,
                    SkScalar x,
                    SkScalar y,
                    const PaintFlags& flags));
  MOCK_METHOD1(drawPicture, void(sk_sp<const PaintRecord> record));
  MOCK_CONST_METHOD0(isClipEmpty, bool());
  MOCK_CONST_METHOD0(isClipRect, bool());
  MOCK_CONST_METHOD0(getTotalMatrix, const SkMatrix&());

  MOCK_METHOD3(Annotate,
               void(AnnotationType type,
                    const SkRect& rect,
                    sk_sp<SkData> data));
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_TEST_MOCK_PAINT_CANVAS_H_
