1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrBitmapTextGeoProc_DEFINED
9#define GrBitmapTextGeoProc_DEFINED
10
11#include "GrProcessor.h"
12#include "GrGeometryProcessor.h"
13
14class GrGLBitmapTextGeoProc;
15class GrInvariantOutput;
16
17/**
18 * The output color of this effect is a modulation of the input color and a sample from a texture.
19 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
20 * coords are a custom attribute.
21 */
22class GrBitmapTextGeoProc : public GrGeometryProcessor {
23public:
24
25    static sk_sp<GrGeometryProcessor> Make(GrColor color,
26                                           const sk_sp<GrTextureProxy>* proxies,
27                                           int numProxies,
28                                           const GrSamplerState& p, GrMaskFormat format,
29                                           const SkMatrix& localMatrix, bool usesLocalCoords) {
30        return sk_sp<GrGeometryProcessor>(
31            new GrBitmapTextGeoProc(color, proxies, numProxies, p, format,
32                                    localMatrix, usesLocalCoords));
33    }
34
35    ~GrBitmapTextGeoProc() override {}
36
37    const char* name() const override { return "Texture"; }
38
39    const Attribute* inPosition() const { return fInPosition; }
40    const Attribute* inColor() const { return fInColor; }
41    const Attribute* inTextureCoords() const { return fInTextureCoords; }
42    GrMaskFormat maskFormat() const { return fMaskFormat; }
43    GrColor color() const { return fColor; }
44    bool hasVertexColor() const { return SkToBool(fInColor); }
45    const SkMatrix& localMatrix() const { return fLocalMatrix; }
46    bool usesLocalCoords() const { return fUsesLocalCoords; }
47
48    void addNewProxies(const sk_sp<GrTextureProxy>* proxies, int numProxies, const GrSamplerState&);
49
50    void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
51
52    GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override;
53
54private:
55    static constexpr int kMaxTextures = 4;
56
57    GrBitmapTextGeoProc(GrColor, const sk_sp<GrTextureProxy>* proxies, int numProxies,
58                        const GrSamplerState& params, GrMaskFormat format,
59                        const SkMatrix& localMatrix, bool usesLocalCoords);
60
61    GrColor          fColor;
62    SkMatrix         fLocalMatrix;
63    bool             fUsesLocalCoords;
64    TextureSampler   fTextureSamplers[kMaxTextures];
65    const Attribute* fInPosition;
66    const Attribute* fInColor;
67    const Attribute* fInTextureCoords;
68    GrMaskFormat     fMaskFormat;
69
70    GR_DECLARE_GEOMETRY_PROCESSOR_TEST
71
72    typedef GrGeometryProcessor INHERITED;
73};
74
75#endif
76