1297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas/* 2130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas * Copyright 2018 Google Inc. 3297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas * 4297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas * Use of this source code is governed by a BSD-style license that can be 5297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas * found in the LICENSE file. 6297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas */ 7297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 8130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas/************************************************************************************************** 9130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas *** This file was autogenerated from GrRRectBlurEffect.fp; do not modify. 10130fb3f7aac19e40eddfc8fa85a9b39e7c99a7e8Ethan Nicholas **************************************************************************************************/ 11297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#ifndef GrRRectBlurEffect_DEFINED 12297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#define GrRRectBlurEffect_DEFINED 13297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "SkTypes.h" 14297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#if SK_SUPPORT_GPU 15297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 16297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrClip.h" 17297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrContext.h" 181afd4cdb0800e2e395b465da24eb71e0e834dafaRobert Phillips#include "GrContextPriv.h" 19297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrPaint.h" 201afd4cdb0800e2e395b465da24eb71e0e834dafaRobert Phillips#include "GrProxyProvider.h" 21297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrRenderTargetContext.h" 22297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrStyle.h" 23297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "SkBlurMaskFilter.h" 24297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "SkGpuBlurUtils.h" 25242135a402592e4fb40c5aba44cf8d483e68d292Mike Reed#include "SkRRectPriv.h" 26297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrFragmentProcessor.h" 27297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#include "GrCoordTransform.h" 28297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholasclass GrRRectBlurEffect : public GrFragmentProcessor { 29297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholaspublic: 30297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrContext* context, 31297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas const SkRRect& rrectToDraw, 32297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas const SkISize& size, 33297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas float xformedSigma) { 34297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); 35297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrUniqueKey key; 3667914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger GrUniqueKey::Builder builder(&key, kDomain, 9, "RoundRect Blur Mask"); 37297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f); 38297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 39297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas int index = 1; 40297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas for (auto c : {SkRRect::kUpperLeft_Corner, SkRRect::kUpperRight_Corner, 41297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkRRect::kLowerRight_Corner, SkRRect::kLowerLeft_Corner}) { 42297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkASSERT(SkScalarIsInt(rrectToDraw.radii(c).fX) && 43297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkScalarIsInt(rrectToDraw.radii(c).fY)); 44297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fX); 45297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fY); 46297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 47297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas builder.finish(); 48297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 491afd4cdb0800e2e395b465da24eb71e0e834dafaRobert Phillips GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider(); 501afd4cdb0800e2e395b465da24eb71e0e834dafaRobert Phillips 51579f094f1259931c30dfd1623e8e22d74b4a7531Robert Phillips sk_sp<GrTextureProxy> mask( 52579f094f1259931c30dfd1623e8e22d74b4a7531Robert Phillips proxyProvider->findOrCreateProxyByUniqueKey(key, kBottomLeft_GrSurfaceOrigin)); 53297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas if (!mask) { 54297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas // TODO: this could be approx but the texture coords will need to be updated 55297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas sk_sp<GrRenderTargetContext> rtc(context->makeDeferredRenderTargetContextWithFallback( 56297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkBackingFit::kExact, size.fWidth, size.fHeight, kAlpha_8_GrPixelConfig, 57297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas nullptr)); 58297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas if (!rtc) { 59297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas return nullptr; 60297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 61297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 62297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrPaint paint; 63297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 64297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas rtc->clear(nullptr, 0x0, GrRenderTargetContext::CanClearFullscreen::kYes); 65297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw, 66297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrStyle::SimpleFill()); 67297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 68297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef()); 69297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas if (!srcProxy) { 70297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas return nullptr; 71297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 72297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas sk_sp<GrRenderTargetContext> rtc2( 73297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkGpuBlurUtils::GaussianBlur(context, 74297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas std::move(srcProxy), 75297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas nullptr, 76297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkIRect::MakeWH(size.fWidth, size.fHeight), 77297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkIRect::EmptyIRect(), 78297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas xformedSigma, 79297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas xformedSigma, 80297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrTextureDomain::kIgnore_Mode, 81297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkBackingFit::kExact)); 82297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas if (!rtc2) { 83297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas return nullptr; 84297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 85297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 86297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas mask = rtc2->asTextureProxyRef(); 87297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas if (!mask) { 88297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas return nullptr; 89297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 90297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin); 911afd4cdb0800e2e395b465da24eb71e0e834dafaRobert Phillips proxyProvider->assignUniqueKeyToProxy(key, mask.get()); 92297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 93297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 94297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas return mask; 95297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 96297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas float sigma() const { return fSigma; } 97297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkRect rect() const { return fRect; } 98297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas float cornerRadius() const { return fCornerRadius; } 99297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 100297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas static std::unique_ptr<GrFragmentProcessor> Make(GrContext* context, float sigma, 101297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas float xformedSigma, const SkRRect& srcRRect, 102297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas const SkRRect& devRRect); 103297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrRRectBlurEffect(const GrRRectBlurEffect& src); 104297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas std::unique_ptr<GrFragmentProcessor> clone() const override; 105297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas const char* name() const override { return "RRectBlurEffect"; } 106297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas 107297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholasprivate: 108297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrRRectBlurEffect(float sigma, SkRect rect, float cornerRadius, 109297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas sk_sp<GrTextureProxy> ninePatchSampler) 110297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas : INHERITED(kGrRRectBlurEffect_ClassID, 111297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag) 112297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas , fSigma(sigma) 113297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas , fRect(rect) 114297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas , fCornerRadius(cornerRadius) 115297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas , fNinePatchSampler(std::move(ninePatchSampler)) { 116297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas this->addTextureSampler(&fNinePatchSampler); 117297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas } 118297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; 119297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; 120297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas bool onIsEqual(const GrFragmentProcessor&) const override; 121297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas GR_DECLARE_FRAGMENT_PROCESSOR_TEST 122297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas float fSigma; 123297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas SkRect fRect; 124297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas float fCornerRadius; 125297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas TextureSampler fNinePatchSampler; 126297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas typedef GrFragmentProcessor INHERITED; 127297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas}; 128297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#endif 129297d6efe852ebb98a324a71c79df8f7bbdcc3b94Ethan Nicholas#endif 130