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 
14 class GrGLBitmapTextGeoProc;
15 class 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  */
22 class GrBitmapTextGeoProc : public GrGeometryProcessor {
23 public:
24 
Make(GrColor color,const sk_sp<GrTextureProxy> * proxies,int numProxies,const GrSamplerState & p,GrMaskFormat format,const SkMatrix & localMatrix,bool usesLocalCoords)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 
~GrBitmapTextGeoProc()35     ~GrBitmapTextGeoProc() override {}
36 
name()37     const char* name() const override { return "Texture"; }
38 
inPosition()39     const Attribute* inPosition() const { return fInPosition; }
inColor()40     const Attribute* inColor() const { return fInColor; }
inTextureCoords()41     const Attribute* inTextureCoords() const { return fInTextureCoords; }
maskFormat()42     GrMaskFormat maskFormat() const { return fMaskFormat; }
color()43     GrColor color() const { return fColor; }
hasVertexColor()44     bool hasVertexColor() const { return SkToBool(fInColor); }
localMatrix()45     const SkMatrix& localMatrix() const { return fLocalMatrix; }
usesLocalCoords()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 
54 private:
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