1f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips/*
2f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips * Copyright 2016 Google Inc.
3f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips *
4f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips * Use of this source code is governed by a BSD-style license that can be
5f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips * found in the LICENSE file.
6f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips */
7f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
8f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#ifndef GrAlphaThresholdFragmentProcessor_DEFINED
9f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#define GrAlphaThresholdFragmentProcessor_DEFINED
10f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
11f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#include "SkTypes.h"
12f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
13f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#if SK_SUPPORT_GPU
14f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
156fb592e6afb0061c9c0af15ddf599e2903f508f1Brian Osman#include "GrColorSpaceXform.h"
16f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#include "GrCoordTransform.h"
17f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#include "GrFragmentProcessor.h"
18f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#include "GrProcessorUnitTest.h"
19f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
20f7142e71d7c0a7d8406679e207ff766085499d2erobertphillipsclass GrAlphaThresholdFragmentProcessor : public GrFragmentProcessor {
21f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
22f7142e71d7c0a7d8406679e207ff766085499d2erobertphillipspublic:
23296b1ccf9b8e9c8b945645efcbaa9c71c7135f58Robert Phillips    static sk_sp<GrFragmentProcessor> Make(GrResourceProvider* resourceProvider,
248e1c4e672553ecae2745168514240705f3516773Robert Phillips                                           sk_sp<GrTextureProxy> proxy,
258e1c4e672553ecae2745168514240705f3516773Robert Phillips                                           sk_sp<GrColorSpaceXform> colorSpaceXform,
26dbc8eeb592123619d9c5bb4b6c6225b9fd45d03bRobert Phillips                                           sk_sp<GrTextureProxy> maskProxy,
278e1c4e672553ecae2745168514240705f3516773Robert Phillips                                           float innerThreshold,
288e1c4e672553ecae2745168514240705f3516773Robert Phillips                                           float outerThreshold,
298e1c4e672553ecae2745168514240705f3516773Robert Phillips                                           const SkIRect& bounds) {
308e1c4e672553ecae2745168514240705f3516773Robert Phillips        return sk_sp<GrFragmentProcessor>(new GrAlphaThresholdFragmentProcessor(
31296b1ccf9b8e9c8b945645efcbaa9c71c7135f58Robert Phillips                                                                    resourceProvider,
328e1c4e672553ecae2745168514240705f3516773Robert Phillips                                                                    std::move(proxy),
338e1c4e672553ecae2745168514240705f3516773Robert Phillips                                                                    std::move(colorSpaceXform),
34dbc8eeb592123619d9c5bb4b6c6225b9fd45d03bRobert Phillips                                                                    std::move(maskProxy),
358e1c4e672553ecae2745168514240705f3516773Robert Phillips                                                                    innerThreshold, outerThreshold,
368e1c4e672553ecae2745168514240705f3516773Robert Phillips                                                                    bounds));
378e1c4e672553ecae2745168514240705f3516773Robert Phillips    }
38f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
39f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    const char* name() const override { return "Alpha Threshold"; }
40f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
41f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    float innerThreshold() const { return fInnerThreshold; }
42f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    float outerThreshold() const { return fOuterThreshold; }
43f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
446fb592e6afb0061c9c0af15ddf599e2903f508f1Brian Osman    GrColorSpaceXform* colorSpaceXform() const { return fColorSpaceXform.get(); }
456fb592e6afb0061c9c0af15ddf599e2903f508f1Brian Osman
46f7142e71d7c0a7d8406679e207ff766085499d2erobertphillipsprivate:
47587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon    static OptimizationFlags OptFlags(float outerThreshold);
48587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon
49296b1ccf9b8e9c8b945645efcbaa9c71c7135f58Robert Phillips    GrAlphaThresholdFragmentProcessor(GrResourceProvider*,
508e1c4e672553ecae2745168514240705f3516773Robert Phillips                                      sk_sp<GrTextureProxy> proxy,
518e1c4e672553ecae2745168514240705f3516773Robert Phillips                                      sk_sp<GrColorSpaceXform> colorSpaceXform,
52dbc8eeb592123619d9c5bb4b6c6225b9fd45d03bRobert Phillips                                      sk_sp<GrTextureProxy> maskProxy,
538e1c4e672553ecae2745168514240705f3516773Robert Phillips                                      float innerThreshold,
548e1c4e672553ecae2745168514240705f3516773Robert Phillips                                      float outerThreshold,
558e1c4e672553ecae2745168514240705f3516773Robert Phillips                                      const SkIRect& bounds);
568e1c4e672553ecae2745168514240705f3516773Robert Phillips
57f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
58f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
5994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
60f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
61f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    bool onIsEqual(const GrFragmentProcessor&) const override;
62f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
63f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
64f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
65f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    float fInnerThreshold;
66f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    float fOuterThreshold;
67f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    GrCoordTransform fImageCoordTransform;
680bbecb21ab82b3d742c491780bcc2e74be03efedBrian Salomon    TextureSampler   fImageTextureSampler;
696fb592e6afb0061c9c0af15ddf599e2903f508f1Brian Osman    // Color space transform is for the image (not the mask)
706fb592e6afb0061c9c0af15ddf599e2903f508f1Brian Osman    sk_sp<GrColorSpaceXform> fColorSpaceXform;
71f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    GrCoordTransform fMaskCoordTransform;
720bbecb21ab82b3d742c491780bcc2e74be03efedBrian Salomon    TextureSampler   fMaskTextureSampler;
73f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
74f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips    typedef GrFragmentProcessor INHERITED;
75f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips};
76f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips
77f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#endif
78f7142e71d7c0a7d8406679e207ff766085499d2erobertphillips#endif
79