blob: 3b83eff743dea533f7bd3def75771e3f05ac3e8e [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
Robert Phillipsbe9aff22019-02-15 11:33:22 -050015#include "GrCaps.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050016#include "GrClip.h"
Robert Phillips0d075de2019-03-04 11:08:13 -050017#include "GrContext.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050018#include "GrPaint.h"
Robert Phillips1afd4cd2018-01-08 13:40:32 -050019#include "GrProxyProvider.h"
Robert Phillips7af8fe52019-02-14 17:27:00 -050020#include "GrRecordingContext.h"
21#include "GrRecordingContextPriv.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050022#include "GrRenderTargetContext.h"
23#include "GrStyle.h"
24#include "SkBlurMaskFilter.h"
Mike Reed28d47732018-03-05 16:56:52 -050025#include "SkBlurPriv.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050026#include "SkGpuBlurUtils.h"
Mike Reed242135a2018-02-22 13:41:39 -050027#include "SkRRectPriv.h"
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050028#include "GrFragmentProcessor.h"
29#include "GrCoordTransform.h"
30class GrRRectBlurEffect : public GrFragmentProcessor {
31public:
Robert Phillips7af8fe52019-02-14 17:27:00 -050032 static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrRecordingContext* context,
Mike Kleina2a5cc02019-03-19 11:30:11 -050033 const SkRRect& rrectToDraw,
34 const SkISize& size,
35 float xformedSigma) {
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050036 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
Mike Kleina2a5cc02019-03-19 11:30:11 -050037 GrUniqueKey key;
38 GrUniqueKey::Builder builder(&key, kDomain, 9, "RoundRect Blur Mask");
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050039 builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f);
40
41 int index = 1;
Mike Kleina2a5cc02019-03-19 11:30:11 -050042 for (auto c : {SkRRect::kUpperLeft_Corner,
43 SkRRect::kUpperRight_Corner,
44 SkRRect::kLowerRight_Corner,
45 SkRRect::kLowerLeft_Corner}) {
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050046 SkASSERT(SkScalarIsInt(rrectToDraw.radii(c).fX) &&
47 SkScalarIsInt(rrectToDraw.radii(c).fY));
48 builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fX);
49 builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fY);
50 }
51 builder.finish();
52
Robert Phillips9da87e02019-02-04 13:26:26 -050053 GrProxyProvider* proxyProvider = context->priv().proxyProvider();
Robert Phillips1afd4cd2018-01-08 13:40:32 -050054
Robert Phillips579f0942018-01-08 14:53:35 -050055 sk_sp<GrTextureProxy> mask(
56 proxyProvider->findOrCreateProxyByUniqueKey(key, kBottomLeft_GrSurfaceOrigin));
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050057 if (!mask) {
Robert Phillipsf7c6dfa2019-02-05 07:46:49 -050058 GrBackendFormat format =
59 context->priv().caps()->getBackendFormatFromColorType(kAlpha_8_SkColorType);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050060 // TODO: this could be approx but the texture coords will need to be updated
Robert Phillips0c4b7b12018-03-06 08:20:37 -050061 sk_sp<GrRenderTargetContext> rtc(
Robert Phillips9da87e02019-02-04 13:26:26 -050062 context->priv().makeDeferredRenderTargetContextWithFallback(
Mike Kleina2a5cc02019-03-19 11:30:11 -050063 format,
64 SkBackingFit::kExact,
65 size.fWidth,
66 size.fHeight,
67 kAlpha_8_GrPixelConfig,
68 nullptr));
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050069 if (!rtc) {
70 return nullptr;
71 }
72
73 GrPaint paint;
74
Mike Kleina2a5cc02019-03-19 11:30:11 -050075 rtc->clear(nullptr,
76 SK_PMColor4fTRANSPARENT,
Brian Osman9a9baae2018-11-05 15:06:26 -050077 GrRenderTargetContext::CanClearFullscreen::kYes);
Mike Kleina2a5cc02019-03-19 11:30:11 -050078 rtc->drawRRect(GrNoClip(),
79 std::move(paint),
80 GrAA::kYes,
81 SkMatrix::I(),
82 rrectToDraw,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050083 GrStyle::SimpleFill());
84
85 sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef());
86 if (!srcProxy) {
87 return nullptr;
88 }
89 sk_sp<GrRenderTargetContext> rtc2(
90 SkGpuBlurUtils::GaussianBlur(context,
91 std::move(srcProxy),
92 nullptr,
93 SkIRect::MakeWH(size.fWidth, size.fHeight),
94 SkIRect::EmptyIRect(),
95 xformedSigma,
96 xformedSigma,
97 GrTextureDomain::kIgnore_Mode,
Robert Phillips213ce182018-04-25 09:13:28 -040098 kPremul_SkAlphaType,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -050099 SkBackingFit::kExact));
100 if (!rtc2) {
101 return nullptr;
102 }
103
104 mask = rtc2->asTextureProxyRef();
105 if (!mask) {
106 return nullptr;
107 }
108 SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin);
Robert Phillips1afd4cd2018-01-08 13:40:32 -0500109 proxyProvider->assignUniqueKeyToProxy(key, mask.get());
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500110 }
111
112 return mask;
113 }
Mike Kleina2a5cc02019-03-19 11:30:11 -0500114 float sigma() const { return fSigma; }
Michael Ludwiga4275592018-08-31 10:52:47 -0400115 const SkRect& rect() const { return fRect; }
Mike Kleina2a5cc02019-03-19 11:30:11 -0500116 float cornerRadius() const { return fCornerRadius; }
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500117
Robert Phillips7af8fe52019-02-14 17:27:00 -0500118 static std::unique_ptr<GrFragmentProcessor> Make(GrRecordingContext* context,
Mike Kleina2a5cc02019-03-19 11:30:11 -0500119 float sigma,
120 float xformedSigma,
121 const SkRRect& srcRRect,
122 const SkRRect& devRRect);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500123 GrRRectBlurEffect(const GrRRectBlurEffect& src);
124 std::unique_ptr<GrFragmentProcessor> clone() const override;
Mike Kleina2a5cc02019-03-19 11:30:11 -0500125 const char* name() const override { return "RRectBlurEffect"; }
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500126
127private:
Mike Kleina2a5cc02019-03-19 11:30:11 -0500128 GrRRectBlurEffect(float sigma,
129 SkRect rect,
130 float cornerRadius,
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500131 sk_sp<GrTextureProxy> ninePatchSampler)
132 : INHERITED(kGrRRectBlurEffect_ClassID,
133 (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
134 , fSigma(sigma)
135 , fRect(rect)
136 , fCornerRadius(cornerRadius)
137 , fNinePatchSampler(std::move(ninePatchSampler)) {
Brian Salomonf7dcd762018-07-30 14:48:15 -0400138 this->setTextureSamplerCnt(1);
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500139 }
140 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
141 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
142 bool onIsEqual(const GrFragmentProcessor&) const override;
Brian Salomonf7dcd762018-07-30 14:48:15 -0400143 const TextureSampler& onTextureSampler(int) const override;
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500144 GR_DECLARE_FRAGMENT_PROCESSOR_TEST
Mike Kleina2a5cc02019-03-19 11:30:11 -0500145 float fSigma;
146 SkRect fRect;
147 float fCornerRadius;
148 TextureSampler fNinePatchSampler;
Ethan Nicholas297d6ef2017-12-20 12:00:11 -0500149 typedef GrFragmentProcessor INHERITED;
150};
151#endif