1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2024 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_geom_AnalyticBlurMask_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_geom_AnalyticBlurMask_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkM44.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxy.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Rect.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <optional> 17*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 20*c8dee2aaSAndroid Build Coastguard Worker class SkRRect; 21*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 26*c8dee2aaSAndroid Build Coastguard Worker class Transform; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker /** 29*c8dee2aaSAndroid Build Coastguard Worker * AnalyticBlurMask holds the shader inputs used to do an analytic blur over rects, rrects, or 30*c8dee2aaSAndroid Build Coastguard Worker * circles. 31*c8dee2aaSAndroid Build Coastguard Worker */ 32*c8dee2aaSAndroid Build Coastguard Worker class AnalyticBlurMask { 33*c8dee2aaSAndroid Build Coastguard Worker public: 34*c8dee2aaSAndroid Build Coastguard Worker enum class ShapeType { 35*c8dee2aaSAndroid Build Coastguard Worker kRect, 36*c8dee2aaSAndroid Build Coastguard Worker kRRect, 37*c8dee2aaSAndroid Build Coastguard Worker kCircle, 38*c8dee2aaSAndroid Build Coastguard Worker }; 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker static_assert(0 == static_cast<int>(ShapeType::kRect), 41*c8dee2aaSAndroid Build Coastguard Worker "Blur shader code depends on AnalyticBlurMask::ShapeType"); 42*c8dee2aaSAndroid Build Coastguard Worker static_assert(1 == static_cast<int>(ShapeType::kRRect), 43*c8dee2aaSAndroid Build Coastguard Worker "Blur shader code depends on AnalyticBlurMask::ShapeType"); 44*c8dee2aaSAndroid Build Coastguard Worker static_assert(2 == static_cast<int>(ShapeType::kCircle), 45*c8dee2aaSAndroid Build Coastguard Worker "Blur shader code depends on AnalyticBlurMask::ShapeType"); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker AnalyticBlurMask() = delete; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker static std::optional<AnalyticBlurMask> Make(Recorder*, 50*c8dee2aaSAndroid Build Coastguard Worker const Transform& localToDevice, 51*c8dee2aaSAndroid Build Coastguard Worker float deviceSigma, 52*c8dee2aaSAndroid Build Coastguard Worker const SkRRect& srcRRect); 53*c8dee2aaSAndroid Build Coastguard Worker drawBounds()54*c8dee2aaSAndroid Build Coastguard Worker const Rect& drawBounds() const { return fDrawBounds; } deviceToScaledShape()55*c8dee2aaSAndroid Build Coastguard Worker const SkM44& deviceToScaledShape() const { return fDevToScaledShape; } shapeData()56*c8dee2aaSAndroid Build Coastguard Worker const Rect& shapeData() const { return fShapeData; } shapeType()57*c8dee2aaSAndroid Build Coastguard Worker ShapeType shapeType() const { return fShapeType; } blurData()58*c8dee2aaSAndroid Build Coastguard Worker const SkV2& blurData() const { return fBlurData; } refProxy()59*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> refProxy() const { return fProxy; } 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker private: AnalyticBlurMask(const Rect & drawBounds,const SkM44 & devToScaledShape,ShapeType shapeType,const Rect & shapeData,const SkV2 & blurData,sk_sp<TextureProxy> proxy)62*c8dee2aaSAndroid Build Coastguard Worker AnalyticBlurMask(const Rect& drawBounds, 63*c8dee2aaSAndroid Build Coastguard Worker const SkM44& devToScaledShape, 64*c8dee2aaSAndroid Build Coastguard Worker ShapeType shapeType, 65*c8dee2aaSAndroid Build Coastguard Worker const Rect& shapeData, 66*c8dee2aaSAndroid Build Coastguard Worker const SkV2& blurData, 67*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> proxy) 68*c8dee2aaSAndroid Build Coastguard Worker : fDrawBounds(drawBounds) 69*c8dee2aaSAndroid Build Coastguard Worker , fDevToScaledShape(devToScaledShape) 70*c8dee2aaSAndroid Build Coastguard Worker , fShapeData(shapeData) 71*c8dee2aaSAndroid Build Coastguard Worker , fBlurData(blurData) 72*c8dee2aaSAndroid Build Coastguard Worker , fShapeType(shapeType) 73*c8dee2aaSAndroid Build Coastguard Worker , fProxy(std::move(proxy)) {} 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker static std::optional<AnalyticBlurMask> MakeRect(Recorder*, 76*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& localToDevice, 77*c8dee2aaSAndroid Build Coastguard Worker float devSigma, 78*c8dee2aaSAndroid Build Coastguard Worker const SkRect& srcRect); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker static std::optional<AnalyticBlurMask> MakeCircle(Recorder*, 81*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& localToDevice, 82*c8dee2aaSAndroid Build Coastguard Worker float devSigma, 83*c8dee2aaSAndroid Build Coastguard Worker const SkRect& srcRect, 84*c8dee2aaSAndroid Build Coastguard Worker const SkRect& devRect); 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker static std::optional<AnalyticBlurMask> MakeRRect(Recorder* recorder, 87*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& localToDevice, 88*c8dee2aaSAndroid Build Coastguard Worker float devSigma, 89*c8dee2aaSAndroid Build Coastguard Worker const SkRRect& srcRRect, 90*c8dee2aaSAndroid Build Coastguard Worker const SkRRect& devRRect); 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker // Draw bounds in local space. 93*c8dee2aaSAndroid Build Coastguard Worker Rect fDrawBounds; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker // Transforms device-space coordinates to the shape data's space. 96*c8dee2aaSAndroid Build Coastguard Worker SkM44 fDevToScaledShape; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker // Shape data, which can define a rectangle, circle, or rounded rectangle. 99*c8dee2aaSAndroid Build Coastguard Worker // This data is in a local space defined by the concatenation of the local-to-device matrix and 100*c8dee2aaSAndroid Build Coastguard Worker // fDevToScaledShape. 101*c8dee2aaSAndroid Build Coastguard Worker Rect fShapeData; 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker // "fBlurData" holds different data depending on the shape type, for the unique needs of the 104*c8dee2aaSAndroid Build Coastguard Worker // shape types' respective shaders. 105*c8dee2aaSAndroid Build Coastguard Worker // In the rectangle case, it holds: 106*c8dee2aaSAndroid Build Coastguard Worker // x = a boolean indicating whether we can use a fast path for sampling the blur integral 107*c8dee2aaSAndroid Build Coastguard Worker // because the rectangle is larger than 6*sigma in both dimensions, and 108*c8dee2aaSAndroid Build Coastguard Worker // y = the value "1 / (6*sigma)". 109*c8dee2aaSAndroid Build Coastguard Worker // In the rounded rectangle case, it holds: 110*c8dee2aaSAndroid Build Coastguard Worker // x = the size of the blurred edge, defined as "2*blurRadius + cornerRadius", and 111*c8dee2aaSAndroid Build Coastguard Worker // y is unused. 112*c8dee2aaSAndroid Build Coastguard Worker // In the circle case, this data is unused. 113*c8dee2aaSAndroid Build Coastguard Worker SkV2 fBlurData; 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker ShapeType fShapeType; 116*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fProxy; 117*c8dee2aaSAndroid Build Coastguard Worker }; 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_geom_AnalyticBlurMask_DEFINED 122