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 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:
     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     }
     95     float sigma() const { return fSigma; }
     96     SkRect rect() const { return fRect; }
     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;
    104     const char* name() const override { return "RRectBlurEffect"; }
    105 
    106 private:
    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