• 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 GrRectBlurEffect.fp; do not modify.
10  **************************************************************************************************/
11 #ifndef GrRectBlurEffect_DEFINED
12 #define GrRectBlurEffect_DEFINED
13 #include "SkTypes.h"
14 
15 #include "GrProxyProvider.h"
16 #include "GrShaderCaps.h"
17 #include "SkBlurMask.h"
18 #include "SkScalar.h"
19 #include "GrFragmentProcessor.h"
20 #include "GrCoordTransform.h"
21 class GrRectBlurEffect : public GrFragmentProcessor {
22 public:
CreateBlurProfileTexture(GrProxyProvider * proxyProvider,float sigma)23     static sk_sp<GrTextureProxy> CreateBlurProfileTexture(GrProxyProvider* proxyProvider,
24                                                           float sigma) {
25         unsigned int profileSize = SkScalarCeilToInt(6 * sigma);
26 
27         static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
28         GrUniqueKey key;
29         GrUniqueKey::Builder builder(&key, kDomain, 1, "Rect Blur Mask");
30         builder[0] = profileSize;
31         builder.finish();
32 
33         sk_sp<GrTextureProxy> blurProfile(
34                 proxyProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin));
35         if (!blurProfile) {
36             SkImageInfo ii = SkImageInfo::MakeA8(profileSize, 1);
37 
38             SkBitmap bitmap;
39             if (!bitmap.tryAllocPixels(ii)) {
40                 return nullptr;
41             }
42 
43             SkBlurMask::ComputeBlurProfile(bitmap.getAddr8(0, 0), profileSize, sigma);
44             bitmap.setImmutable();
45 
46             sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
47             if (!image) {
48                 return nullptr;
49             }
50 
51             blurProfile =
52                     proxyProvider->createTextureProxy(std::move(image), kNone_GrSurfaceFlags, 1,
53                                                       SkBudgeted::kYes, SkBackingFit::kExact);
54             if (!blurProfile) {
55                 return nullptr;
56             }
57 
58             SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin);
59             proxyProvider->assignUniqueKeyToProxy(key, blurProfile.get());
60         }
61 
62         return blurProfile;
63     }
rect()64     const SkRect& rect() const { return fRect; }
sigma()65     float sigma() const { return fSigma; }
66 
Make(GrProxyProvider * proxyProvider,const GrShaderCaps & caps,const SkRect & rect,float sigma)67     static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider* proxyProvider,
68                                                      const GrShaderCaps& caps, const SkRect& rect,
69                                                      float sigma) {
70         if (!caps.floatIs32Bits()) {
71             // We promote the rect uniform from half to float when it has large values for
72             // precision. If we don't have full float then fail.
73             if (SkScalarAbs(rect.fLeft) > 16000.f || SkScalarAbs(rect.fTop) > 16000.f ||
74                 SkScalarAbs(rect.fRight) > 16000.f || SkScalarAbs(rect.fBottom) > 16000.f ||
75                 SkScalarAbs(rect.width()) > 16000.f || SkScalarAbs(rect.height()) > 16000.f) {
76                 return nullptr;
77             }
78         }
79         int doubleProfileSize = SkScalarCeilToInt(12 * sigma);
80 
81         if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.height()) {
82             // if the blur sigma is too large so the gaussian overlaps the whole
83             // rect in either direction, fall back to CPU path for now.
84             return nullptr;
85         }
86 
87         sk_sp<GrTextureProxy> blurProfile(CreateBlurProfileTexture(proxyProvider, sigma));
88         if (!blurProfile) {
89             return nullptr;
90         }
91 
92         return std::unique_ptr<GrFragmentProcessor>(new GrRectBlurEffect(
93                 rect, sigma, std::move(blurProfile),
94                 GrSamplerState(GrSamplerState::WrapMode::kClamp, GrSamplerState::Filter::kBilerp)));
95     }
96     GrRectBlurEffect(const GrRectBlurEffect& src);
97     std::unique_ptr<GrFragmentProcessor> clone() const override;
name()98     const char* name() const override { return "RectBlurEffect"; }
99 
100 private:
GrRectBlurEffect(SkRect rect,float sigma,sk_sp<GrTextureProxy> blurProfile,GrSamplerState samplerParams)101     GrRectBlurEffect(SkRect rect, float sigma, sk_sp<GrTextureProxy> blurProfile,
102                      GrSamplerState samplerParams)
103             : INHERITED(kGrRectBlurEffect_ClassID,
104                         (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
105             , fRect(rect)
106             , fSigma(sigma)
107             , fBlurProfile(std::move(blurProfile), samplerParams) {
108         this->setTextureSamplerCnt(1);
109     }
110     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
111     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
112     bool onIsEqual(const GrFragmentProcessor&) const override;
113     const TextureSampler& onTextureSampler(int) const override;
114     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
115     SkRect fRect;
116     float fSigma;
117     TextureSampler fBlurProfile;
118     typedef GrFragmentProcessor INHERITED;
119 };
120 #endif
121