/* * Copyright 2024 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_geom_AnalyticBlurMask_DEFINED #define skgpu_graphite_geom_AnalyticBlurMask_DEFINED #include "include/core/SkM44.h" #include "include/core/SkRefCnt.h" #include "src/gpu/graphite/TextureProxy.h" #include "src/gpu/graphite/geom/Rect.h" #include #include class SkMatrix; class SkRRect; struct SkRect; namespace skgpu::graphite { class Recorder; class Transform; /** * AnalyticBlurMask holds the shader inputs used to do an analytic blur over rects, rrects, or * circles. */ class AnalyticBlurMask { public: enum class ShapeType { kRect, kRRect, kCircle, }; static_assert(0 == static_cast(ShapeType::kRect), "Blur shader code depends on AnalyticBlurMask::ShapeType"); static_assert(1 == static_cast(ShapeType::kRRect), "Blur shader code depends on AnalyticBlurMask::ShapeType"); static_assert(2 == static_cast(ShapeType::kCircle), "Blur shader code depends on AnalyticBlurMask::ShapeType"); AnalyticBlurMask() = delete; static std::optional Make(Recorder*, const Transform& localToDevice, float deviceSigma, const SkRRect& srcRRect); const Rect& drawBounds() const { return fDrawBounds; } const SkM44& deviceToScaledShape() const { return fDevToScaledShape; } const Rect& shapeData() const { return fShapeData; } ShapeType shapeType() const { return fShapeType; } const SkV2& blurData() const { return fBlurData; } sk_sp refProxy() const { return fProxy; } private: AnalyticBlurMask(const Rect& drawBounds, const SkM44& devToScaledShape, ShapeType shapeType, const Rect& shapeData, const SkV2& blurData, sk_sp proxy) : fDrawBounds(drawBounds) , fDevToScaledShape(devToScaledShape) , fShapeData(shapeData) , fBlurData(blurData) , fShapeType(shapeType) , fProxy(std::move(proxy)) {} static std::optional MakeRect(Recorder*, const SkMatrix& localToDevice, float devSigma, const SkRect& srcRect); static std::optional MakeCircle(Recorder*, const SkMatrix& localToDevice, float devSigma, const SkRect& srcRect, const SkRect& devRect); static std::optional MakeRRect(Recorder* recorder, const SkMatrix& localToDevice, float devSigma, const SkRRect& srcRRect, const SkRRect& devRRect); // Draw bounds in local space. Rect fDrawBounds; // Transforms device-space coordinates to the shape data's space. SkM44 fDevToScaledShape; // Shape data, which can define a rectangle, circle, or rounded rectangle. // This data is in a local space defined by the concatenation of the local-to-device matrix and // fDevToScaledShape. Rect fShapeData; // "fBlurData" holds different data depending on the shape type, for the unique needs of the // shape types' respective shaders. // In the rectangle case, it holds: // x = a boolean indicating whether we can use a fast path for sampling the blur integral // because the rectangle is larger than 6*sigma in both dimensions, and // y = the value "1 / (6*sigma)". // In the rounded rectangle case, it holds: // x = the size of the blurred edge, defined as "2*blurRadius + cornerRadius", and // y is unused. // In the circle case, this data is unused. SkV2 fBlurData; ShapeType fShapeType; sk_sp fProxy; }; } // namespace skgpu::graphite #endif // skgpu_graphite_geom_AnalyticBlurMask_DEFINED