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