1 /*
2  * Copyright 2015 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 GrDrawAtlasBatch_DEFINED
9 #define GrDrawAtlasBatch_DEFINED
10 
11 #include "GrColor.h"
12 #include "GrDefaultGeoProcFactory.h"
13 #include "GrVertexBatch.h"
14 
15 class GrDrawAtlasBatch : public GrVertexBatch {
16 public:
17     DEFINE_BATCH_CLASS_ID
18 
19     struct Geometry {
20         GrColor                 fColor;
21         SkTArray<uint8_t, true> fVerts;
22     };
23 
Create(const Geometry & geometry,const SkMatrix & viewMatrix,int spriteCount,const SkRSXform * xforms,const SkRect * rects,const SkColor * colors)24     static GrDrawBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix,
25                                int spriteCount, const SkRSXform* xforms, const SkRect* rects,
26                                const SkColor* colors) {
27         return new GrDrawAtlasBatch(geometry, viewMatrix, spriteCount, xforms, rects, colors);
28     }
29 
name()30     const char* name() const override { return "DrawAtlasBatch"; }
31 
computePipelineOptimizations(GrInitInvariantOutput * color,GrInitInvariantOutput * coverage,GrBatchToXPOverrides * overrides)32     void computePipelineOptimizations(GrInitInvariantOutput* color,
33                                       GrInitInvariantOutput* coverage,
34                                       GrBatchToXPOverrides* overrides) const override {
35         // When this is called on a batch, there is only one geometry bundle
36         if (this->hasColors()) {
37             color->setUnknownFourComponents();
38         } else {
39             color->setKnownFourComponents(fGeoData[0].fColor);
40         }
41         coverage->setKnownSingleComponent(0xff);
42     }
43 
geoData()44     SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
45 
46 private:
47     void onPrepareDraws(Target*) const override;
48 
49     void initBatchTracker(const GrXPOverridesForBatch&) override;
50 
51     GrDrawAtlasBatch(const Geometry& geometry, const SkMatrix& viewMatrix, int spriteCount,
52                      const SkRSXform* xforms, const SkRect* rects, const SkColor* colors);
53 
color()54     GrColor color() const { return fColor; }
colorIgnored()55     bool colorIgnored() const { return fColorIgnored; }
viewMatrix()56     const SkMatrix& viewMatrix() const { return fViewMatrix; }
hasColors()57     bool hasColors() const { return fHasColors; }
quadCount()58     int quadCount() const { return fQuadCount; }
coverageIgnored()59     bool coverageIgnored() const { return fCoverageIgnored; }
60 
61     bool onCombineIfPossible(GrBatch* t, const GrCaps&) override;
62     SkSTArray<1, Geometry, true> fGeoData;
63 
64     SkMatrix fViewMatrix;
65     GrColor  fColor;
66     int      fQuadCount;
67     bool     fColorIgnored;
68     bool     fCoverageIgnored;
69     bool     fHasColors;
70 
71     typedef GrVertexBatch INHERITED;
72 };
73 
74 #endif
75