blob: 9352cb8982eb105b3310b97102d5e0f95ebfbadf [file] [log] [blame]
/*
* 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 "include/core/SkRect.h"
#include "include/gpu/GrTypes.h"
#include "src/gpu/ganesh/GrFragmentProcessor.h"
#include <memory>
class GrSurfaceProxyView;
class SkMatrix;
namespace skgpu { class KeyBuilder; }
struct GrShaderCaps;
// 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