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

#ifndef GrGrModulateAtlasCoverageEffect_DEFINED
#define GrGrModulateAtlasCoverageEffect_DEFINED

#include "src/gpu/ganesh/GrFragmentProcessor.h"

// Multiplies 'inputFP' by the coverage value in an atlas, optionally inverting or clamping to 0.
class GrModulateAtlasCoverageEffect : public GrFragmentProcessor {
public:
    enum class Flags {
        kNone = 0,
        kInvertCoverage = 1 << 0,  // Return inputColor * (1 - atlasCoverage).
        kCheckBounds = 1 << 1  // Clamp atlasCoverage to 0 if outside the path's valid atlas bounds.
    };

    GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags);

    GrModulateAtlasCoverageEffect(Flags flags, std::unique_ptr<GrFragmentProcessor> inputFP,
                                  GrSurfaceProxyView atlasView, const SkMatrix& devToAtlasMatrix,
                                  const SkIRect& devIBounds);

    GrModulateAtlasCoverageEffect(const GrModulateAtlasCoverageEffect& that);

    const char* name() const override {
        return "GrModulateAtlasCoverageFP";
    }

    std::unique_ptr<GrFragmentProcessor> clone() const override {
        return std::make_unique<GrModulateAtlasCoverageEffect>(*this);
    }

private:
    void onAddToKey(const GrShaderCaps&, skgpu::KeyBuilder* b) const override;

    bool onIsEqual(const GrFragmentProcessor& that) const override {
        auto fp = that.cast<GrModulateAtlasCoverageEffect>();
        return fFlags == fp.fFlags && fBounds == fp.fBounds;
    }
    std::unique_ptr<ProgramImpl> onMakeProgramImpl() const override;

    const Flags fFlags;
    const SkIRect fBounds;
};

GR_MAKE_BITFIELD_CLASS_OPS(GrModulateAtlasCoverageEffect::Flags)

#endif
