• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "SkTypes.h"
14 #if SK_SUPPORT_GPU
15 
16 #include "GrClip.h"
17 #include "GrContext.h"
18 #include "GrContextPriv.h"
19 #include "GrPaint.h"
20 #include "GrProxyProvider.h"
21 #include "GrRenderTargetContext.h"
22 #include "GrStyle.h"
23 #include "SkBlurMaskFilter.h"
24 #include "SkGpuBlurUtils.h"
25 #include "GrFragmentProcessor.h"
26 #include "GrCoordTransform.h"
27 class GrRRectBlurEffect : public GrFragmentProcessor {
28 public:
find_or_create_rrect_blur_mask(GrContext * context,const SkRRect & rrectToDraw,const SkISize & size,float xformedSigma)29     static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrContext* context,
30                                                                 const SkRRect& rrectToDraw,
31                                                                 const SkISize& size,
32                                                                 float xformedSigma) {
33         static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
34         GrUniqueKey key;
35         GrUniqueKey::Builder builder(&key, kDomain, 9);
36         builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f);
37 
38         int index = 1;
39         for (auto c : {SkRRect::kUpperLeft_Corner, SkRRect::kUpperRight_Corner,
40                        SkRRect::kLowerRight_Corner, SkRRect::kLowerLeft_Corner}) {
41             SkASSERT(SkScalarIsInt(rrectToDraw.radii(c).fX) &&
42                      SkScalarIsInt(rrectToDraw.radii(c).fY));
43             builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fX);
44             builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fY);
45         }
46         builder.finish();
47 
48         GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
49 
50         sk_sp<GrTextureProxy> mask(
51                 proxyProvider->findOrCreateProxyByUniqueKey(key, kBottomLeft_GrSurfaceOrigin));
52         if (!mask) {
53             // TODO: this could be approx but the texture coords will need to be updated
54             sk_sp<GrRenderTargetContext> rtc(context->makeDeferredRenderTargetContextWithFallback(
55                     SkBackingFit::kExact, size.fWidth, size.fHeight, kAlpha_8_GrPixelConfig,
56                     nullptr));
57             if (!rtc) {
58                 return nullptr;
59             }
60 
61             GrPaint paint;
62 
63             rtc->clear(nullptr, 0x0, GrRenderTargetContext::CanClearFullscreen::kYes);
64             rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw,
65                            GrStyle::SimpleFill());
66 
67             sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef());
68             if (!srcProxy) {
69                 return nullptr;
70             }
71             sk_sp<GrRenderTargetContext> rtc2(
72                     SkGpuBlurUtils::GaussianBlur(context,
73                                                  std::move(srcProxy),
74                                                  nullptr,
75                                                  SkIRect::MakeWH(size.fWidth, size.fHeight),
76                                                  SkIRect::EmptyIRect(),
77                                                  xformedSigma,
78                                                  xformedSigma,
79                                                  GrTextureDomain::kIgnore_Mode,
80                                                  SkBackingFit::kExact));
81             if (!rtc2) {
82                 return nullptr;
83             }
84 
85             mask = rtc2->asTextureProxyRef();
86             if (!mask) {
87                 return nullptr;
88             }
89             SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin);
90             proxyProvider->assignUniqueKeyToProxy(key, mask.get());
91         }
92 
93         return mask;
94     }
sigma()95     float sigma() const { return fSigma; }
rect()96     SkRect rect() const { return fRect; }
cornerRadius()97     float cornerRadius() const { return fCornerRadius; }
98 
99     static std::unique_ptr<GrFragmentProcessor> Make(GrContext* context, float sigma,
100                                                      float xformedSigma, const SkRRect& srcRRect,
101                                                      const SkRRect& devRRect);
102     GrRRectBlurEffect(const GrRRectBlurEffect& src);
103     std::unique_ptr<GrFragmentProcessor> clone() const override;
name()104     const char* name() const override { return "RRectBlurEffect"; }
105 
106 private:
GrRRectBlurEffect(float sigma,SkRect rect,float cornerRadius,sk_sp<GrTextureProxy> ninePatchSampler)107     GrRRectBlurEffect(float sigma, SkRect rect, float cornerRadius,
108                       sk_sp<GrTextureProxy> ninePatchSampler)
109             : INHERITED(kGrRRectBlurEffect_ClassID,
110                         (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
111             , fSigma(sigma)
112             , fRect(rect)
113             , fCornerRadius(cornerRadius)
114             , fNinePatchSampler(std::move(ninePatchSampler)) {
115         this->addTextureSampler(&fNinePatchSampler);
116     }
117     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
118     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
119     bool onIsEqual(const GrFragmentProcessor&) const override;
120     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
121     float fSigma;
122     SkRect fRect;
123     float fCornerRadius;
124     TextureSampler fNinePatchSampler;
125     typedef GrFragmentProcessor INHERITED;
126 };
127 #endif
128 #endif
129