| /* | 
 |  * Copyright 2015 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #ifndef GrTestBatch_DEFINED | 
 | #define GrTestBatch_DEFINED | 
 |  | 
 | #include "GrBatch.h" | 
 | #include "GrVertexBuffer.h" | 
 |  | 
 | /* | 
 |  * A simple batch only for testing purposes which actually doesn't batch at all, but can fit into | 
 |  * the batch pipeline and generate arbitrary geometry | 
 |  */ | 
 | class GrTestBatch : public GrBatch { | 
 | public: | 
 |     struct Geometry { | 
 |         GrColor fColor; | 
 |     }; | 
 |  | 
 |     virtual const char* name() const override = 0; | 
 |  | 
 |     void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 
 |         // When this is called on a batch, there is only one geometry bundle | 
 |         out->setKnownFourComponents(this->geoData(0)->fColor); | 
 |     } | 
 |  | 
 |     void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { | 
 |         out->setUnknownSingleComponent(); | 
 |     } | 
 |  | 
 |     void initBatchTracker(const GrPipelineInfo& init) override { | 
 |         // Handle any color overrides | 
 |         if (!init.readsColor()) { | 
 |             this->geoData(0)->fColor = GrColor_ILLEGAL; | 
 |         } | 
 |         init.getOverrideColorIfSet(&this->geoData(0)->fColor); | 
 |  | 
 |         // setup batch properties | 
 |         fBatch.fColorIgnored = !init.readsColor(); | 
 |         fBatch.fColor = this->geoData(0)->fColor; | 
 |         fBatch.fUsesLocalCoords = init.readsLocalCoords(); | 
 |         fBatch.fCoverageIgnored = !init.readsCoverage(); | 
 |     } | 
 |  | 
 |     void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override { | 
 |         batchTarget->initDraw(fGeometryProcessor, pipeline); | 
 |  | 
 |         this->onGenerateGeometry(batchTarget, pipeline); | 
 |     } | 
 |  | 
 | protected: | 
 |     GrTestBatch(const GrGeometryProcessor* gp, const SkRect& bounds) { | 
 |         fGeometryProcessor.reset(SkRef(gp)); | 
 |  | 
 |         this->setBounds(bounds); | 
 |     } | 
 |  | 
 |     const GrGeometryProcessor* geometryProcessor() const { return fGeometryProcessor; } | 
 |  | 
 | private: | 
 |     virtual Geometry* geoData(int index) = 0; | 
 |     virtual const Geometry* geoData(int index) const = 0; | 
 |  | 
 |     bool onCombineIfPossible(GrBatch* t) override { | 
 |         return false; | 
 |     } | 
 |  | 
 |     virtual void onGenerateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) = 0; | 
 |  | 
 |     struct BatchTracker { | 
 |         GrColor fColor; | 
 |         bool fUsesLocalCoords; | 
 |         bool fColorIgnored; | 
 |         bool fCoverageIgnored; | 
 |     }; | 
 |  | 
 |     SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; | 
 |     BatchTracker fBatch; | 
 | }; | 
 |  | 
 | #endif |