blob: 54186769ceac569fcb1223917c499839001cdbe3 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkTypes.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050014
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#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"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050031class GrRRectBlurEffect : public GrFragmentProcessor {
32public:
Robert Phillips7af8fe52019-02-14 17:27:00 -050033 static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrRecordingContext* context,
Mike Kleind6ab77a2019-03-21 08:18:24 -050034 const SkRRect& rrectToDraw,
35 const SkISize& size,
36 float xformedSigma) {
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050037 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
Mike Kleind6ab77a2019-03-21 08:18:24 -050038 GrUniqueKey key;
39 GrUniqueKey::Builder builder(&key, kDomain, 9, "RoundRect Blur Mask");
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050040 builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f);
41
42 int index = 1;
Mike Kleind6ab77a2019-03-21 08:18:24 -050043 for (auto c : {SkRRect::kUpperLeft_Corner, SkRRect::kUpperRight_Corner,
44 SkRRect::kLowerRight_Corner, SkRRect::kLowerLeft_Corner}) {
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050045 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
Robert Phillips9da87e02019-02-04 13:26:26 -050052 GrProxyProvider* proxyProvider = context->priv().proxyProvider();
Robert Phillips1afd4cd2018-01-08 13:40:32 -050053
Robert Phillips579f0942018-01-08 14:53:35 -050054 sk_sp<GrTextureProxy> mask(
55 proxyProvider->findOrCreateProxyByUniqueKey(key, kBottomLeft_GrSurfaceOrigin));
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050056 if (!mask) {
Robert Phillipsf7c6dfa2019-02-05 07:46:49 -050057 GrBackendFormat format =
58 context->priv().caps()->getBackendFormatFromColorType(kAlpha_8_SkColorType);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050059 // TODO: this could be approx but the texture coords will need to be updated
Robert Phillips0c4b7b12018-03-06 08:20:37 -050060 sk_sp<GrRenderTargetContext> rtc(
Robert Phillips9da87e02019-02-04 13:26:26 -050061 context->priv().makeDeferredRenderTargetContextWithFallback(
Mike Kleind6ab77a2019-03-21 08:18:24 -050062 format, SkBackingFit::kExact, size.fWidth, size.fHeight,
63 kAlpha_8_GrPixelConfig, nullptr));
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050064 if (!rtc) {
65 return nullptr;
66 }
67
68 GrPaint paint;
69
Mike Kleind6ab77a2019-03-21 08:18:24 -050070 rtc->clear(nullptr, SK_PMColor4fTRANSPARENT,
Brian Osman9a9baae2018-11-05 15:06:26 -050071 GrRenderTargetContext::CanClearFullscreen::kYes);
Mike Kleind6ab77a2019-03-21 08:18:24 -050072 rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050073 GrStyle::SimpleFill());
74
75 sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef());
76 if (!srcProxy) {
77 return nullptr;
78 }
79 sk_sp<GrRenderTargetContext> rtc2(
80 SkGpuBlurUtils::GaussianBlur(context,
81 std::move(srcProxy),
Michael Ludwigb4580352019-06-21 16:01:42 -040082 SkIPoint::Make(0, 0),
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050083 nullptr,
84 SkIRect::MakeWH(size.fWidth, size.fHeight),
85 SkIRect::EmptyIRect(),
86 xformedSigma,
87 xformedSigma,
88 GrTextureDomain::kIgnore_Mode,
Robert Phillips213ce182018-04-25 09:13:28 -040089 kPremul_SkAlphaType,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050090 SkBackingFit::kExact));
91 if (!rtc2) {
92 return nullptr;
93 }
94
95 mask = rtc2->asTextureProxyRef();
96 if (!mask) {
97 return nullptr;
98 }
99 SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin);
Robert Phillips1afd4cd2018-01-08 13:40:32 -0500100 proxyProvider->assignUniqueKeyToProxy(key, mask.get());
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500101 }
102
103 return mask;
104 }
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500105
Robert Phillips7af8fe52019-02-14 17:27:00 -0500106 static std::unique_ptr<GrFragmentProcessor> Make(GrRecordingContext* context,
Mike Kleind6ab77a2019-03-21 08:18:24 -0500107 float sigma,
108 float xformedSigma,
109 const SkRRect& srcRRect,
110 const SkRRect& devRRect);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500111 GrRRectBlurEffect(const GrRRectBlurEffect& src);
112 std::unique_ptr<GrFragmentProcessor> clone() const override;
Mike Kleind6ab77a2019-03-21 08:18:24 -0500113 const char* name() const override { return "RRectBlurEffect"; }
Ethan Nicholasbcd51e82019-04-09 10:40:41 -0400114 float sigma;
115 SkRect rect;
116 float cornerRadius;
117 TextureSampler ninePatchSampler;
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500118
119private:
Mike Kleind6ab77a2019-03-21 08:18:24 -0500120 GrRRectBlurEffect(float sigma, SkRect rect, float cornerRadius,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500121 sk_sp<GrTextureProxy> ninePatchSampler)
122 : INHERITED(kGrRRectBlurEffect_ClassID,
123 (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
Ethan Nicholasbcd51e82019-04-09 10:40:41 -0400124 , sigma(sigma)
125 , rect(rect)
126 , cornerRadius(cornerRadius)
127 , ninePatchSampler(std::move(ninePatchSampler)) {
Brian Salomonf7dcd762018-07-30 14:48:15 -0400128 this->setTextureSamplerCnt(1);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500129 }
130 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
131 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
132 bool onIsEqual(const GrFragmentProcessor&) const override;
Brian Salomonf7dcd762018-07-30 14:48:15 -0400133 const TextureSampler& onTextureSampler(int) const override;
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500134 GR_DECLARE_FRAGMENT_PROCESSOR_TEST
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500135 typedef GrFragmentProcessor INHERITED;
136};
137#endif