1 | /* |
2 | * Copyright 2018 Google Inc. |
3 | * |
4 | * Use of this source code is governed by a BSD-style license that can be |
5 | * found in the LICENSE file. |
6 | */ |
7 | |
8 | /************************************************************************************************** |
9 | *** This file was autogenerated from GrRRectBlurEffect.fp; do not modify. |
10 | **************************************************************************************************/ |
11 | #ifndef GrRRectBlurEffect_DEFINED |
12 | #define GrRRectBlurEffect_DEFINED |
13 | #include "include/core/SkTypes.h" |
14 | #include "include/core/SkM44.h" |
15 | |
16 | #include "include/gpu/GrContext.h" |
17 | #include "include/private/GrRecordingContext.h" |
18 | #include "src/core/SkBlurPriv.h" |
19 | #include "src/core/SkGpuBlurUtils.h" |
20 | #include "src/core/SkRRectPriv.h" |
21 | #include "src/gpu/GrCaps.h" |
22 | #include "src/gpu/GrClip.h" |
23 | #include "src/gpu/GrPaint.h" |
24 | #include "src/gpu/GrProxyProvider.h" |
25 | #include "src/gpu/GrRecordingContextPriv.h" |
26 | #include "src/gpu/GrRenderTargetContext.h" |
27 | #include "src/gpu/GrStyle.h" |
28 | |
29 | #include "src/gpu/GrCoordTransform.h" |
30 | #include "src/gpu/GrFragmentProcessor.h" |
31 | class GrRRectBlurEffect : public GrFragmentProcessor { |
32 | public: |
33 | static GrSurfaceProxyView find_or_create_rrect_blur_mask(GrRecordingContext* context, |
34 | const SkRRect& rrectToDraw, |
35 | const SkISize& dimensions, |
36 | float xformedSigma) { |
37 | static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); |
38 | GrUniqueKey key; |
39 | GrUniqueKey::Builder builder(&key, kDomain, 9, "RoundRect Blur Mask" ); |
40 | builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f); |
41 | |
42 | int index = 1; |
43 | for (auto c : {SkRRect::kUpperLeft_Corner, SkRRect::kUpperRight_Corner, |
44 | SkRRect::kLowerRight_Corner, SkRRect::kLowerLeft_Corner}) { |
45 | SkASSERT(SkScalarIsInt(rrectToDraw.radii(c).fX) && |
46 | SkScalarIsInt(rrectToDraw.radii(c).fY)); |
47 | builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fX); |
48 | builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fY); |
49 | } |
50 | builder.finish(); |
51 | |
52 | static constexpr auto kMaskOrigin = kBottomLeft_GrSurfaceOrigin; |
53 | GrProxyProvider* proxyProvider = context->priv().proxyProvider(); |
54 | |
55 | if (auto view = proxyProvider->findCachedProxyWithColorTypeFallback( |
56 | key, kMaskOrigin, GrColorType::kAlpha_8, 1)) { |
57 | return view; |
58 | } |
59 | |
60 | auto rtc = GrRenderTargetContext::MakeWithFallback( |
61 | context, GrColorType::kAlpha_8, nullptr, SkBackingFit::kExact, dimensions, 1, |
62 | GrMipMapped::kNo, GrProtected::kNo, kMaskOrigin); |
63 | if (!rtc) { |
64 | return {}; |
65 | } |
66 | |
67 | GrPaint paint; |
68 | |
69 | rtc->clear(nullptr, SK_PMColor4fTRANSPARENT, |
70 | GrRenderTargetContext::CanClearFullscreen::kYes); |
71 | rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw, |
72 | GrStyle::SimpleFill()); |
73 | |
74 | GrSurfaceProxyView srcView = rtc->readSurfaceView(); |
75 | if (!srcView) { |
76 | return {}; |
77 | } |
78 | SkASSERT(srcView.asTextureProxy()); |
79 | auto rtc2 = SkGpuBlurUtils::GaussianBlur(context, |
80 | std::move(srcView), |
81 | rtc->colorInfo().colorType(), |
82 | rtc->colorInfo().alphaType(), |
83 | nullptr, |
84 | SkIRect::MakeSize(dimensions), |
85 | SkIRect::MakeSize(dimensions), |
86 | xformedSigma, |
87 | xformedSigma, |
88 | SkTileMode::kClamp, |
89 | SkBackingFit::kExact); |
90 | if (!rtc2) { |
91 | return {}; |
92 | } |
93 | |
94 | GrSurfaceProxyView mask = rtc2->readSurfaceView(); |
95 | if (!mask) { |
96 | return {}; |
97 | } |
98 | SkASSERT(mask.asTextureProxy()); |
99 | SkASSERT(mask.origin() == kBottomLeft_GrSurfaceOrigin); |
100 | proxyProvider->assignUniqueKeyToProxy(key, mask.asTextureProxy()); |
101 | |
102 | return mask; |
103 | } |
104 | |
105 | static std::unique_ptr<GrFragmentProcessor> Make(GrRecordingContext* context, |
106 | float sigma, |
107 | float xformedSigma, |
108 | const SkRRect& srcRRect, |
109 | const SkRRect& devRRect); |
110 | GrRRectBlurEffect(const GrRRectBlurEffect& src); |
111 | std::unique_ptr<GrFragmentProcessor> clone() const override; |
112 | const char* name() const override { return "RRectBlurEffect" ; } |
113 | float sigma; |
114 | SkRect rect; |
115 | float cornerRadius; |
116 | TextureSampler ninePatchSampler; |
117 | |
118 | private: |
119 | GrRRectBlurEffect(float sigma, |
120 | SkRect rect, |
121 | float cornerRadius, |
122 | GrSurfaceProxyView ninePatchSampler) |
123 | : INHERITED(kGrRRectBlurEffect_ClassID, |
124 | (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) |
125 | , sigma(sigma) |
126 | , rect(rect) |
127 | , cornerRadius(cornerRadius) |
128 | , ninePatchSampler(std::move(ninePatchSampler)) { |
129 | this->setTextureSamplerCnt(1); |
130 | } |
131 | GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
132 | void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; |
133 | bool onIsEqual(const GrFragmentProcessor&) const override; |
134 | const TextureSampler& onTextureSampler(int) const override; |
135 | GR_DECLARE_FRAGMENT_PROCESSOR_TEST |
136 | typedef GrFragmentProcessor INHERITED; |
137 | }; |
138 | #endif |
139 | |