1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2018 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/**************************************************************************************************
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *** This file was autogenerated from GrRectBlurEffect.fp; do not modify.
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot **************************************************************************************************/
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrRectBlurEffect_DEFINED
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrRectBlurEffect_DEFINED
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypes.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrProxyProvider.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "../effects/SkBlurMask.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrFragmentProcessor.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrCoordTransform.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrRectBlurEffect : public GrFragmentProcessor {
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<GrTextureProxy> CreateBlurProfileTexture(GrProxyProvider* proxyProvider,
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                          float sigma) {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        unsigned int profileSize = SkScalarCeilToInt(6 * sigma);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrUniqueKey key;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrUniqueKey::Builder builder(&key, kDomain, 1);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        builder[0] = profileSize;
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        builder.finish();
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<GrTextureProxy> blurProfile(
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                proxyProvider->findOrCreateProxyByUniqueKey(key, kTopLeft_GrSurfaceOrigin));
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!blurProfile) {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GrSurfaceDesc texDesc;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            texDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            texDesc.fWidth = profileSize;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            texDesc.fHeight = 1;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            texDesc.fConfig = kAlpha_8_GrPixelConfig;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            std::unique_ptr<uint8_t[]> profile(SkBlurMask::ComputeBlurProfile(sigma));
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            blurProfile =
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    proxyProvider->createTextureProxy(texDesc, SkBudgeted::kYes, profile.get(), 0);
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!blurProfile) {
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return nullptr;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin);
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            proxyProvider->assignUniqueKeyToProxy(key, blurProfile.get());
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return blurProfile;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect rect() const { return fRect; }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    float sigma() const { return fSigma; }
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static std::unique_ptr<GrFragmentProcessor> Make(GrProxyProvider* proxyProvider,
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     const SkRect& rect, float sigma) {
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int doubleProfileSize = SkScalarCeilToInt(12 * sigma);
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.height()) {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // if the blur sigma is too large so the gaussian overlaps the whole
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // rect in either direction, fall back to CPU path for now.
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return nullptr;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<GrTextureProxy> blurProfile(CreateBlurProfileTexture(proxyProvider, sigma));
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!blurProfile) {
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return nullptr;
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return std::unique_ptr<GrFragmentProcessor>(new GrRectBlurEffect(
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                rect, sigma, std::move(blurProfile),
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                GrSamplerState(GrSamplerState::WrapMode::kClamp, GrSamplerState::Filter::kBilerp)));
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrRectBlurEffect(const GrRectBlurEffect& src);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<GrFragmentProcessor> clone() const override;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* name() const override { return "RectBlurEffect"; }
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrRectBlurEffect(SkRect rect, float sigma, sk_sp<GrTextureProxy> blurProfile,
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     GrSamplerState samplerParams)
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            : INHERITED(kGrRectBlurEffect_ClassID,
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fRect(rect)
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fSigma(sigma)
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fBlurProfile(std::move(blurProfile), samplerParams) {
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->addTextureSampler(&fBlurProfile);
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onIsEqual(const GrFragmentProcessor&) const override;
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GR_DECLARE_FRAGMENT_PROCESSOR_TEST
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect fRect;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    float fSigma;
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TextureSampler fBlurProfile;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GrFragmentProcessor INHERITED;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
102