/*
 * Copyright 2019 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef TestRectOp_DEFINED
#define TestRectOp_DEFINED

#include "include/core/SkRefCnt.h"
#include "include/gpu/GrRecordingContext.h"
#include "src/gpu/ganesh/GrRecordingContextPriv.h"
#include "src/gpu/ganesh/ops/GrOp.h"

class GrPaint;

namespace sk_gpu_test::test_ops {

/**
 * Fully specified device space rect op. The test Op draws a rectangle with local coords and a
 * local matrix. It is important to test effects in the presence of GP local matrices. Our standard
 * rect drawing code doesn't exercise this because it applies any local matrix to pre-transformed
 * local coord vertex attributes.
 */
GrOp::Owner MakeRect(GrRecordingContext*,
                     GrPaint&&,
                     const SkRect& drawRect,
                     const SkRect& localRect,
                     const SkMatrix& localM = SkMatrix::I());

/**
 * A simpler version of MakeRect that takes a single color FP instead of a full paint. Uses
 * SkBlendMode::kSrcOver.
 */
GrOp::Owner MakeRect(GrRecordingContext*,
                     std::unique_ptr<GrFragmentProcessor>,
                     const SkRect& drawRect,
                     const SkRect& localRect,
                     const SkMatrix& localM = SkMatrix::I());

/**
 * A simpler version of MakeRect that uses the same rect as the device space rect to draw as well as
 * the local rect. The local matrix is identity.
 */
GrOp::Owner MakeRect(GrRecordingContext*, GrPaint&&, const SkRect& rect);

}  // namespace sk_gpu_test::test_ops

#endif
