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