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