• 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 "include/core/SkTypes.h"
14 
15 #include "include/effects/SkBlurMaskFilter.h"
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:
find_or_create_rrect_blur_mask(GrRecordingContext * context,const SkRRect & rrectToDraw,const SkISize & size,float xformedSigma)33     static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrRecordingContext* context,
34                                                                 const SkRRect& rrectToDraw,
35                                                                 const SkISize& size,
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         GrProxyProvider* proxyProvider = context->priv().proxyProvider();
53 
54         sk_sp<GrTextureProxy> mask(proxyProvider->findOrCreateProxyByUniqueKey(
55                 key, GrColorType::kAlpha_8, kBottomLeft_GrSurfaceOrigin));
56         if (!mask) {
57             // TODO: this could be approx but the texture coords will need to be updated
58             sk_sp<GrRenderTargetContext> rtc(
59                     context->priv().makeDeferredRenderTargetContextWithFallback(
60                             SkBackingFit::kExact, size.fWidth, size.fHeight, GrColorType::kAlpha_8,
61                             nullptr));
62             if (!rtc) {
63                 return nullptr;
64             }
65 
66             GrPaint paint;
67 
68             rtc->clear(nullptr, SK_PMColor4fTRANSPARENT,
69                        GrRenderTargetContext::CanClearFullscreen::kYes);
70             rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw,
71                            GrStyle::SimpleFill());
72 
73             sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef());
74             if (!srcProxy) {
75                 return nullptr;
76             }
77             sk_sp<GrRenderTargetContext> rtc2(
78                     SkGpuBlurUtils::GaussianBlur(context,
79                                                  std::move(srcProxy),
80                                                  SkIPoint::Make(0, 0),
81                                                  nullptr,
82                                                  SkIRect::MakeWH(size.fWidth, size.fHeight),
83                                                  SkIRect::EmptyIRect(),
84                                                  xformedSigma,
85                                                  xformedSigma,
86                                                  GrTextureDomain::kIgnore_Mode,
87                                                  kPremul_SkAlphaType,
88                                                  SkBackingFit::kExact));
89             if (!rtc2) {
90                 return nullptr;
91             }
92 
93             mask = rtc2->asTextureProxyRef();
94             if (!mask) {
95                 return nullptr;
96             }
97             SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin);
98             proxyProvider->assignUniqueKeyToProxy(key, mask.get());
99         }
100 
101         return mask;
102     }
103 
104     static std::unique_ptr<GrFragmentProcessor> Make(GrRecordingContext* context,
105                                                      float sigma,
106                                                      float xformedSigma,
107                                                      const SkRRect& srcRRect,
108                                                      const SkRRect& devRRect);
109     GrRRectBlurEffect(const GrRRectBlurEffect& src);
110     std::unique_ptr<GrFragmentProcessor> clone() const override;
name()111     const char* name() const override { return "RRectBlurEffect"; }
112     float sigma;
113     SkRect rect;
114     float cornerRadius;
115     TextureSampler ninePatchSampler;
116 
117 private:
GrRRectBlurEffect(float sigma,SkRect rect,float cornerRadius,sk_sp<GrTextureProxy> ninePatchSampler)118     GrRRectBlurEffect(float sigma, SkRect rect, float cornerRadius,
119                       sk_sp<GrTextureProxy> ninePatchSampler)
120             : INHERITED(kGrRRectBlurEffect_ClassID,
121                         (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
122             , sigma(sigma)
123             , rect(rect)
124             , cornerRadius(cornerRadius)
125             , ninePatchSampler(std::move(ninePatchSampler)) {
126         this->setTextureSamplerCnt(1);
127     }
128     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
129     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
130     bool onIsEqual(const GrFragmentProcessor&) const override;
131     const TextureSampler& onTextureSampler(int) const override;
132     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
133     typedef GrFragmentProcessor INHERITED;
134 };
135 #endif
136