Home | History | Annotate | Download | only in effects
      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 #if SK_SUPPORT_GPU
     15 
     16 #include "GrProxyProvider.h"
     17 #include "../effects/SkBlurMask.h"
     18 #include "GrFragmentProcessor.h"
     19 #include "GrCoordTransform.h"
     20 class GrRectBlurEffect : public GrFragmentProcessor {
     21 public:
     22     static sk_sp<GrTextureProxy> CreateBlurProfileTexture(GrProxyProvider* proxyProvider,
     23                                                           float sigma) {
     24         unsigned int profileSize = SkScalarCeilToInt(6 * sigma);
     25 
     26         static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
     27         GrUniqueKey key;
     28         GrUniqueKey::Builder builder(&key, kDomain, 1, "Rect Blur Mask");
     29         builder[0] = profileSize;
     30         builder.finish();
     31 
     32         sk_sp<GrTextureProxy> blurProfile(
     33                 proxyProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin));
     34         if (!blurProfile) {
     35             SkImageInfo ii = SkImageInfo::MakeA8(profileSize, 1);
     36 
     37             SkBitmap bitmap;
     38             if (!bitmap.tryAllocPixels(ii)) {
     39                 return nullptr;
     40             }
     41 
     42             SkBlurMask::ComputeBlurProfile(bitmap.getAddr8(0, 0), profileSize, sigma);
     43             bitmap.setImmutable();
     44 
     45             sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
     46             if (!image) {
     47                 return nullptr;
     48             }
     49 
     50             blurProfile = proxyProvider->createTextureProxy(std::move(image), kNone_GrSurfaceFlags,
     51                                                             kTopLeft_GrSurfaceOrigin, 1,
     52                                                             SkBudgeted::kYes, SkBackingFit::kExact);
     53             if (!blurProfile) {
     54                 return nullptr;
     55             }
     56 
     57             SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin);
     58             proxyProvider->assignUniqueKeyToProxy(key, blurProfile.get());
     59         }
     60 
     61         return blurProfile;
     62     }
     63     SkRect rect() const { return fRect; }
     64     float sigma() const { return fSigma; }
     65 
     66     static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider* proxyProvider,
     67                                                      const SkRect& rect, float sigma) {
     68         int doubleProfileSize = SkScalarCeilToInt(12 * sigma);
     69 
     70         if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.height()) {
     71             // if the blur sigma is too large so the gaussian overlaps the whole
     72             // rect in either direction, fall back to CPU path for now.
     73             return nullptr;
     74         }
     75 
     76         sk_sp<GrTextureProxy> blurProfile(CreateBlurProfileTexture(proxyProvider, sigma));
     77         if (!blurProfile) {
     78             return nullptr;
     79         }
     80 
     81         return std::unique_ptr<GrFragmentProcessor>(new GrRectBlurEffect(
     82                 rect, sigma, std::move(blurProfile),
     83                 GrSamplerState(GrSamplerState::WrapMode::kClamp, GrSamplerState::Filter::kBilerp)));
     84     }
     85     GrRectBlurEffect(const GrRectBlurEffect& src);
     86     std::unique_ptr<GrFragmentProcessor> clone() const override;
     87     const char* name() const override { return "RectBlurEffect"; }
     88 
     89 private:
     90     GrRectBlurEffect(SkRect rect, float sigma, sk_sp<GrTextureProxy> blurProfile,
     91                      GrSamplerState samplerParams)
     92             : INHERITED(kGrRectBlurEffect_ClassID,
     93                         (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
     94             , fRect(rect)
     95             , fSigma(sigma)
     96             , fBlurProfile(std::move(blurProfile), samplerParams) {
     97         this->addTextureSampler(&fBlurProfile);
     98     }
     99     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
    100     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
    101     bool onIsEqual(const GrFragmentProcessor&) const override;
    102     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
    103     SkRect fRect;
    104     float fSigma;
    105     TextureSampler fBlurProfile;
    106     typedef GrFragmentProcessor INHERITED;
    107 };
    108 #endif
    109 #endif
    110