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 GrRRectBlurEffect.fp; do not modify.
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot **************************************************************************************************/
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrRRectBlurEffect_DEFINED
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrRRectBlurEffect_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 "GrClip.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContext.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContextPriv.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrPaint.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrProxyProvider.h"
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrRenderTargetContext.h"
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrStyle.h"
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlurMaskFilter.h"
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGpuBlurUtils.h"
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrFragmentProcessor.h"
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrCoordTransform.h"
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrRRectBlurEffect : public GrFragmentProcessor {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrContext* context,
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                const SkRRect& rrectToDraw,
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                const SkISize& size,
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                float xformedSigma) {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrUniqueKey key;
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrUniqueKey::Builder builder(&key, kDomain, 9);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        builder[0] = SkScalarCeilToInt(xformedSigma - 1 / 6.0f);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int index = 1;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (auto c : {SkRRect::kUpperLeft_Corner, SkRRect::kUpperRight_Corner,
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                       SkRRect::kLowerRight_Corner, SkRRect::kLowerLeft_Corner}) {
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkASSERT(SkScalarIsInt(rrectToDraw.radii(c).fX) &&
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     SkScalarIsInt(rrectToDraw.radii(c).fY));
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fX);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            builder[index++] = SkScalarCeilToInt(rrectToDraw.radii(c).fY);
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        builder.finish();
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<GrTextureProxy> mask(
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                proxyProvider->findOrCreateProxyByUniqueKey(key, kBottomLeft_GrSurfaceOrigin));
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!mask) {
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // TODO: this could be approx but the texture coords will need to be updated
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<GrRenderTargetContext> rtc(context->makeDeferredRenderTargetContextWithFallback(
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkBackingFit::kExact, size.fWidth, size.fHeight, kAlpha_8_GrPixelConfig,
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    nullptr));
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!rtc) {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return nullptr;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GrPaint paint;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rtc->clear(nullptr, 0x0, GrRenderTargetContext::CanClearFullscreen::kYes);
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rtc->drawRRect(GrNoClip(), std::move(paint), GrAA::kYes, SkMatrix::I(), rrectToDraw,
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           GrStyle::SimpleFill());
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<GrTextureProxy> srcProxy(rtc->asTextureProxyRef());
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!srcProxy) {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return nullptr;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<GrRenderTargetContext> rtc2(
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkGpuBlurUtils::GaussianBlur(context,
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 std::move(srcProxy),
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 nullptr,
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 SkIRect::MakeWH(size.fWidth, size.fHeight),
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 SkIRect::EmptyIRect(),
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 xformedSigma,
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 xformedSigma,
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 GrTextureDomain::kIgnore_Mode,
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 SkBackingFit::kExact));
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!rtc2) {
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return nullptr;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            mask = rtc2->asTextureProxyRef();
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!mask) {
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return nullptr;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin);
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            proxyProvider->assignUniqueKeyToProxy(key, mask.get());
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return mask;
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    float sigma() const { return fSigma; }
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect rect() const { return fRect; }
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    float cornerRadius() const { return fCornerRadius; }
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static std::unique_ptr<GrFragmentProcessor> Make(GrContext* context, float sigma,
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     float xformedSigma, const SkRRect& srcRRect,
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     const SkRRect& devRRect);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrRRectBlurEffect(const GrRRectBlurEffect& src);
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<GrFragmentProcessor> clone() const override;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* name() const override { return "RRectBlurEffect"; }
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrRRectBlurEffect(float sigma, SkRect rect, float cornerRadius,
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                      sk_sp<GrTextureProxy> ninePatchSampler)
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            : INHERITED(kGrRRectBlurEffect_ClassID,
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        (OptimizationFlags)kCompatibleWithCoverageAsAlpha_OptimizationFlag)
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fSigma(sigma)
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fRect(rect)
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fCornerRadius(cornerRadius)
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fNinePatchSampler(std::move(ninePatchSampler)) {
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->addTextureSampler(&fNinePatchSampler);
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onIsEqual(const GrFragmentProcessor&) const override;
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GR_DECLARE_FRAGMENT_PROCESSOR_TEST
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    float fSigma;
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect fRect;
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    float fCornerRadius;
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TextureSampler fNinePatchSampler;
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GrFragmentProcessor INHERITED;
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
129