blob: bad6be10ed00056f61389bb5ab2f817e42b7b952 [file] [log] [blame]
Ethan Nicholas82399462017-10-16 12:35:44 -04001/*
Ethan Nicholas130fb3f2018-02-01 12:14:34 -05002 * Copyright 2018 Google Inc.
Ethan Nicholas82399462017-10-16 12:35:44 -04003 *
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 GrRectBlurEffect.fp; do not modify.
10 **************************************************************************************************/
Ethan Nicholas82399462017-10-16 12:35:44 -040011#ifndef GrRectBlurEffect_DEFINED
12#define GrRectBlurEffect_DEFINED
13#include "SkTypes.h"
Ethan Nicholas82399462017-10-16 12:35:44 -040014
Robert Phillips1afd4cd2018-01-08 13:40:32 -050015#include "GrProxyProvider.h"
Mike Reed554aa6a2018-03-12 11:36:26 -040016#include "SkBlurMask.h"
Brian Salomonff6a7cd2018-05-10 09:42:27 -040017#include "SkScalar.h"
Ethan Nicholas82399462017-10-16 12:35:44 -040018#include "GrFragmentProcessor.h"
19#include "GrCoordTransform.h"
Ethan Nicholas82399462017-10-16 12:35:44 -040020class GrRectBlurEffect : public GrFragmentProcessor {
21public:
Robert Phillips1afd4cd2018-01-08 13:40:32 -050022 static sk_sp<GrTextureProxy> CreateBlurProfileTexture(GrProxyProvider* proxyProvider,
Ethan Nicholas82399462017-10-16 12:35:44 -040023 float sigma) {
24 unsigned int profileSize = SkScalarCeilToInt(6 * sigma);
25
26 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
27 GrUniqueKey key;
Derek Sollenbergercf6da8c2018-03-29 13:40:02 -040028 GrUniqueKey::Builder builder(&key, kDomain, 1, "Rect Blur Mask");
Ethan Nicholas82399462017-10-16 12:35:44 -040029 builder[0] = profileSize;
30 builder.finish();
31
32 sk_sp<GrTextureProxy> blurProfile(
Robert Phillips1afd4cd2018-01-08 13:40:32 -050033 proxyProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin));
Ethan Nicholas82399462017-10-16 12:35:44 -040034 if (!blurProfile) {
Robert Phillipscb256592018-02-14 15:20:41 -050035 SkImageInfo ii = SkImageInfo::MakeA8(profileSize, 1);
Ethan Nicholas82399462017-10-16 12:35:44 -040036
Robert Phillipscb256592018-02-14 15:20:41 -050037 SkBitmap bitmap;
38 if (!bitmap.tryAllocPixels(ii)) {
39 return nullptr;
40 }
Ethan Nicholas82399462017-10-16 12:35:44 -040041
Robert Phillipscb256592018-02-14 15:20:41 -050042 SkBlurMask::ComputeBlurProfile(bitmap.getAddr8(0, 0), profileSize, sigma);
43 bitmap.setImmutable();
44
45 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
46 if (!image) {
47 return nullptr;
48 }
49
Brian Salomon58389b92018-03-07 13:01:25 -050050 blurProfile =
51 proxyProvider->createTextureProxy(std::move(image), kNone_GrSurfaceFlags, 1,
52 SkBudgeted::kYes, SkBackingFit::kExact);
Ethan Nicholas82399462017-10-16 12:35:44 -040053 if (!blurProfile) {
54 return nullptr;
55 }
56
57 SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin);
Robert Phillips1afd4cd2018-01-08 13:40:32 -050058 proxyProvider->assignUniqueKeyToProxy(key, blurProfile.get());
Ethan Nicholas82399462017-10-16 12:35:44 -040059 }
60
61 return blurProfile;
62 }
Michael Ludwiga4275592018-08-31 10:52:47 -040063 const SkRect& rect() const { return fRect; }
Ethan Nicholas82399462017-10-16 12:35:44 -040064 float sigma() const { return fSigma; }
65
Robert Phillips1afd4cd2018-01-08 13:40:32 -050066 static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider* proxyProvider,
Brian Salomonff6a7cd2018-05-10 09:42:27 -040067 const GrShaderCaps& caps, const SkRect& rect,
68 float sigma) {
69 if (!caps.floatIs32Bits()) {
70 // We promote the rect uniform from half to float when it has large values for
71 // precision. If we don't have full float then fail.
72 if (SkScalarAbs(rect.fLeft) > 16000.f || SkScalarAbs(rect.fTop) > 16000.f ||
73 SkScalarAbs(rect.fRight) > 16000.f || SkScalarAbs(rect.fBottom) > 16000.f ||
74 SkScalarAbs(rect.width()) > 16000.f || SkScalarAbs(rect.height()) > 16000.f) {
75 return nullptr;
76 }
77 }
Ethan Nicholas82399462017-10-16 12:35:44 -040078 int doubleProfileSize = SkScalarCeilToInt(12 * sigma);
79
80 if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.height()) {
81 // if the blur sigma is too large so the gaussian overlaps the whole
82 // rect in either direction, fall back to CPU path for now.
83 return nullptr;
84 }
85
Robert Phillips1afd4cd2018-01-08 13:40:32 -050086 sk_sp<GrTextureProxy> blurProfile(CreateBlurProfileTexture(proxyProvider, sigma));
Ethan Nicholas82399462017-10-16 12:35:44 -040087 if (!blurProfile) {
88 return nullptr;
89 }
90
Robert Phillips2b2936e2017-10-20 15:11:35 -040091 return std::unique_ptr<GrFragmentProcessor>(new GrRectBlurEffect(
92 rect, sigma, std::move(blurProfile),
93 GrSamplerState(GrSamplerState::WrapMode::kClamp, GrSamplerState::Filter::kBilerp)));
Ethan Nicholas82399462017-10-16 12:35:44 -040094 }
95 GrRectBlurEffect(const GrRectBlurEffect& src);
96 std::unique_ptr<GrFragmentProcessor> clone() const override;
97 const char* name() const override { return "RectBlurEffect"; }
98
99private:
Robert Phillips2b2936e2017-10-20 15:11:35 -0400100 GrRectBlurEffect(SkRect rect, float sigma, sk_sp<GrTextureProxy> blurProfile,
101 GrSamplerState samplerParams)
Ethan Nicholas82399462017-10-16 12:35:44 -0400102 : INHERITED(kGrRectBlurEffect_ClassID,
103 (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
104 , fRect(rect)
105 , fSigma(sigma)
Robert Phillips2b2936e2017-10-20 15:11:35 -0400106 , fBlurProfile(std::move(blurProfile), samplerParams) {
Brian Salomonf7dcd762018-07-30 14:48:15 -0400107 this->setTextureSamplerCnt(1);
Ethan Nicholas82399462017-10-16 12:35:44 -0400108 }
109 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
110 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
111 bool onIsEqual(const GrFragmentProcessor&) const override;
Brian Salomonf7dcd762018-07-30 14:48:15 -0400112 const TextureSampler& onTextureSampler(int) const override;
Ethan Nicholas82399462017-10-16 12:35:44 -0400113 GR_DECLARE_FRAGMENT_PROCESSOR_TEST
114 SkRect fRect;
115 float fSigma;
116 TextureSampler fBlurProfile;
117 typedef GrFragmentProcessor INHERITED;
118};
119#endif