blob: e760f60f7a72712f490bff2203e3c371e154e8a9 [file] [log] [blame]
Ethan Nicholas297d6ef2017-12-20 12:00:11 -05001/*
Ethan Nicholas130fb3f2018-02-01 12:14:34 -05002 * Copyright 2018 Google Inc.
Ethan Nicholas297d6ef2017-12-20 12:00:11 -05003 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Ethan Nicholas130fb3f2018-02-01 12:14:34 -05008/**************************************************************************************************
9 *** This file was autogenerated from GrRRectBlurEffect.fp; do not modify.
10 **************************************************************************************************/
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050011#ifndef GrRRectBlurEffect_DEFINED
12#define GrRRectBlurEffect_DEFINED
13#include "SkTypes.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050014
15#include "GrClip.h"
16#include "GrContext.h"
Robert Phillips1afd4cd2018-01-08 13:40:32 -050017#include "GrContextPriv.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050018#include "GrPaint.h"
Robert Phillips1afd4cd2018-01-08 13:40:32 -050019#include "GrProxyProvider.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050020#include "GrRenderTargetContext.h"
21#include "GrStyle.h"
22#include "SkBlurMaskFilter.h"
Mike Reed28d47732018-03-05 16:56:52 -050023#include "SkBlurPriv.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050024#include "SkGpuBlurUtils.h"
Mike Reed242135a2018-02-22 13:41:39 -050025#include "SkRRectPriv.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050026#include "GrFragmentProcessor.h"
27#include "GrCoordTransform.h"
28class GrRRectBlurEffect : public GrFragmentProcessor {
29public:
30 static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrContext* context,
31 const SkRRect& rrectToDraw,
32 const SkISize& size,
33 float xformedSigma) {
34 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
35 GrUniqueKey key;
Derek Sollenbergercf6da8c2018-03-29 13:40:02 -040036 GrUniqueKey::Builder builder(&key, kDomain, 9, "RoundRect Blur Mask");
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050037 builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f);
38
39 int index = 1;
40 for (auto c : {SkRRect::kUpperLeft_Corner, SkRRect::kUpperRight_Corner,
41 SkRRect::kLowerRight_Corner, SkRRect::kLowerLeft_Corner}) {
42 SkASSERT(SkScalarIsInt(rrectToDraw.radii(c).fX) &&
43 SkScalarIsInt(rrectToDraw.radii(c).fY));
44 builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fX);
45 builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fY);
46 }
47 builder.finish();
48
Robert Phillips1afd4cd2018-01-08 13:40:32 -050049 GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
50
Robert Phillips579f0942018-01-08 14:53:35 -050051 sk_sp<GrTextureProxy> mask(
52 proxyProvider->findOrCreateProxyByUniqueKey(key, kBottomLeft_GrSurfaceOrigin));
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050053 if (!mask) {
54 // TODO: this could be approx but the texture coords will need to be updated
Robert Phillips0c4b7b12018-03-06 08:20:37 -050055 sk_sp<GrRenderTargetContext> rtc(
Robert Phillips8bac9282018-03-06 09:59:39 -050056 context->contextPriv().makeDeferredRenderTargetContextWithFallback(
57 SkBackingFit::kExact, size.fWidth, size.fHeight, kAlpha_8_GrPixelConfig,
58 nullptr));
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050059 if (!rtc) {
60 return nullptr;
61 }
62
63 GrPaint paint;
64
Brian Osman9a9baae2018-11-05 15:06:26 -050065 rtc->clear(nullptr, SK_PMColor4fTRANSPARENT,
66 GrRenderTargetContext::CanClearFullscreen::kYes);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050067 rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw,
68 GrStyle::SimpleFill());
69
70 sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef());
71 if (!srcProxy) {
72 return nullptr;
73 }
74 sk_sp<GrRenderTargetContext> rtc2(
75 SkGpuBlurUtils::GaussianBlur(context,
76 std::move(srcProxy),
77 nullptr,
78 SkIRect::MakeWH(size.fWidth, size.fHeight),
79 SkIRect::EmptyIRect(),
80 xformedSigma,
81 xformedSigma,
82 GrTextureDomain::kIgnore_Mode,
Robert Phillips213ce182018-04-25 09:13:28 -040083 kPremul_SkAlphaType,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050084 SkBackingFit::kExact));
85 if (!rtc2) {
86 return nullptr;
87 }
88
89 mask = rtc2->asTextureProxyRef();
90 if (!mask) {
91 return nullptr;
92 }
93 SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin);
Robert Phillips1afd4cd2018-01-08 13:40:32 -050094 proxyProvider->assignUniqueKeyToProxy(key, mask.get());
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050095 }
96
97 return mask;
98 }
99 float sigma() const { return fSigma; }
Michael Ludwiga4275592018-08-31 10:52:47 -0400100 const SkRect& rect() const { return fRect; }
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500101 float cornerRadius() const { return fCornerRadius; }
102
103 static std::unique_ptr<GrFragmentProcessor> Make(GrContext* context, float sigma,
104 float xformedSigma, const SkRRect& srcRRect,
105 const SkRRect& devRRect);
106 GrRRectBlurEffect(const GrRRectBlurEffect& src);
107 std::unique_ptr<GrFragmentProcessor> clone() const override;
108 const char* name() const override { return "RRectBlurEffect"; }
109
110private:
111 GrRRectBlurEffect(float sigma, SkRect rect, float cornerRadius,
112 sk_sp<GrTextureProxy> ninePatchSampler)
113 : INHERITED(kGrRRectBlurEffect_ClassID,
114 (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
115 , fSigma(sigma)
116 , fRect(rect)
117 , fCornerRadius(cornerRadius)
118 , fNinePatchSampler(std::move(ninePatchSampler)) {
Brian Salomonf7dcd762018-07-30 14:48:15 -0400119 this->setTextureSamplerCnt(1);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500120 }
121 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
122 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
123 bool onIsEqual(const GrFragmentProcessor&) const override;
Brian Salomonf7dcd762018-07-30 14:48:15 -0400124 const TextureSampler& onTextureSampler(int) const override;
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500125 GR_DECLARE_FRAGMENT_PROCESSOR_TEST
126 float fSigma;
127 SkRect fRect;
128 float fCornerRadius;
129 TextureSampler fNinePatchSampler;
130 typedef GrFragmentProcessor INHERITED;
131};
132#endif