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"
31class GrRRectBlurEffect : public GrFragmentProcessor {
32public:
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
118private:
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