| Index: src/gpu/GrAAConvexPathRenderer.cpp
 | 
| diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp
 | 
| index 0d909b1dc6bd2b419431e84e5b4c99b5700180c4..1b7efefd07fc3888fd717d0d55fa4f3f4538aa9a 100644
 | 
| --- a/src/gpu/GrAAConvexPathRenderer.cpp
 | 
| +++ b/src/gpu/GrAAConvexPathRenderer.cpp
 | 
| @@ -525,8 +525,9 @@ static void create_vertices(const SegmentArray&  segments,
 | 
|  class QuadEdgeEffect : public GrGeometryProcessor {
 | 
|  public:
 | 
|  
 | 
| -    static GrGeometryProcessor* Create(GrColor color, const SkMatrix& localMatrix) {
 | 
| -        return SkNEW_ARGS(QuadEdgeEffect, (color, localMatrix));
 | 
| +    static GrGeometryProcessor* Create(GrColor color, const SkMatrix& localMatrix,
 | 
| +                                       bool usesLocalCoords) {
 | 
| +        return SkNEW_ARGS(QuadEdgeEffect, (color, localMatrix, usesLocalCoords));
 | 
|      }
 | 
|  
 | 
|      virtual ~QuadEdgeEffect() {}
 | 
| @@ -536,7 +537,9 @@ public:
 | 
|      const Attribute* inPosition() const { return fInPosition; }
 | 
|      const Attribute* inQuadEdge() const { return fInQuadEdge; }
 | 
|      GrColor color() const { return fColor; }
 | 
| +    bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
 | 
|      const SkMatrix& localMatrix() const { return fLocalMatrix; }
 | 
| +    bool usesLocalCoords() const { return fUsesLocalCoords; }
 | 
|  
 | 
|      class GLProcessor : public GrGLGeometryProcessor {
 | 
|      public:
 | 
| @@ -556,11 +559,10 @@ public:
 | 
|              args.fPB->addVarying("QuadEdge", &v);
 | 
|              vsBuilder->codeAppendf("%s = %s;", v.vsOut(), qe.inQuadEdge()->fName);
 | 
|  
 | 
| -            const BatchTracker& local = args.fBT.cast<BatchTracker>();
 | 
| -
 | 
|              // Setup pass through color
 | 
| -            this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL,
 | 
| -                                        &fColorUniform);
 | 
| +            if (!qe.colorIgnored()) {
 | 
| +                this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
 | 
| +            }
 | 
|  
 | 
|              // Setup position
 | 
|              this->setupPosition(pb, gpArgs, qe.inPosition()->fName);
 | 
| @@ -598,22 +600,22 @@ public:
 | 
|                                    const GrBatchTracker& bt,
 | 
|                                    const GrGLSLCaps&,
 | 
|                                    GrProcessorKeyBuilder* b) {
 | 
| -            const BatchTracker& local = bt.cast<BatchTracker>();
 | 
|              const QuadEdgeEffect& qee = gp.cast<QuadEdgeEffect>();
 | 
| -            uint32_t key = local.fInputColorType << 16;
 | 
| -            key |= local.fUsesLocalCoords && qee.localMatrix().hasPerspective() ? 0x1 : 0x0;
 | 
| +            uint32_t key = 0;
 | 
| +            key |= qee.usesLocalCoords() && qee.localMatrix().hasPerspective() ? 0x1 : 0x0;
 | 
| +            key |= qee.colorIgnored() ? 0x2 : 0x0;
 | 
|              b->add32(key);
 | 
|          }
 | 
|  
 | 
|          virtual void setData(const GrGLProgramDataManager& pdman,
 | 
|                               const GrPrimitiveProcessor& gp,
 | 
|                               const GrBatchTracker& bt) override {
 | 
| -            const BatchTracker& local = bt.cast<BatchTracker>();
 | 
| -            if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
 | 
| +            const QuadEdgeEffect& qe = gp.cast<QuadEdgeEffect>();
 | 
| +            if (qe.color() != fColor) {
 | 
|                  GrGLfloat c[4];
 | 
| -                GrColorToRGBAFloat(local.fColor, c);
 | 
| +                GrColorToRGBAFloat(qe.color(), c);
 | 
|                  pdman.set4fv(fColorUniform, 1, c);
 | 
| -                fColor = local.fColor;
 | 
| +                fColor = qe.color();
 | 
|              }
 | 
|          }
 | 
|  
 | 
| @@ -642,31 +644,21 @@ public:
 | 
|          return SkNEW_ARGS(GLProcessor, (*this, bt));
 | 
|      }
 | 
|  
 | 
| -    void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override {
 | 
| -        BatchTracker* local = bt->cast<BatchTracker>();
 | 
| -        local->fInputColorType = GetColorInputType(&local->fColor, this->color(), init, false);
 | 
| -        local->fUsesLocalCoords = init.fUsesLocalCoords;
 | 
| -    }
 | 
| -
 | 
|  private:
 | 
| -    QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix)
 | 
| +    QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix, bool usesLocalCoords)
 | 
|          : fColor(color)
 | 
| -        , fLocalMatrix(localMatrix) {
 | 
| +        , fLocalMatrix(localMatrix)
 | 
| +        , fUsesLocalCoords(usesLocalCoords) {
 | 
|          this->initClassID<QuadEdgeEffect>();
 | 
|          fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
 | 
|          fInQuadEdge = &this->addVertexAttrib(Attribute("inQuadEdge", kVec4f_GrVertexAttribType));
 | 
|      }
 | 
|  
 | 
| -    struct BatchTracker {
 | 
| -        GrGPInput fInputColorType;
 | 
| -        GrColor fColor;
 | 
| -        bool fUsesLocalCoords;
 | 
| -    };
 | 
| -
 | 
|      const Attribute* fInPosition;
 | 
|      const Attribute* fInQuadEdge;
 | 
|      GrColor          fColor;
 | 
|      SkMatrix         fLocalMatrix;
 | 
| +    bool             fUsesLocalCoords;
 | 
|  
 | 
|      GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
 | 
|  
 | 
| @@ -682,7 +674,8 @@ GrGeometryProcessor* QuadEdgeEffect::TestCreate(SkRandom* random,
 | 
|      // Doesn't work without derivative instructions.
 | 
|      return caps.shaderCaps()->shaderDerivativeSupport() ?
 | 
|             QuadEdgeEffect::Create(GrRandomColor(random),
 | 
| -                                  GrTest::TestMatrix(random)) : NULL;
 | 
| +                                  GrTest::TestMatrix(random),
 | 
| +                                  random->nextBool()) : NULL;
 | 
|  }
 | 
|  
 | 
|  ///////////////////////////////////////////////////////////////////////////////
 | 
| @@ -732,13 +725,16 @@ static void extract_verts(const GrAAConvexTessellator& tess,
 | 
|  }
 | 
|  
 | 
|  static const GrGeometryProcessor* create_fill_gp(bool tweakAlphaForCoverage,
 | 
| -                                                 const SkMatrix& localMatrix) {
 | 
| +                                                 const SkMatrix& localMatrix,
 | 
| +                                                 bool usesLocalCoords,
 | 
| +                                                 bool coverageIgnored) {
 | 
|      uint32_t flags = GrDefaultGeoProcFactory::kColor_GPType;
 | 
|      if (!tweakAlphaForCoverage) {
 | 
|          flags |= GrDefaultGeoProcFactory::kCoverage_GPType;
 | 
|      }
 | 
|  
 | 
| -    return GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE, SkMatrix::I(), localMatrix);
 | 
| +    return GrDefaultGeoProcFactory::Create(flags, GrColor_WHITE, usesLocalCoords, coverageIgnored,
 | 
| +                                           SkMatrix::I(), localMatrix);
 | 
|  }
 | 
|  
 | 
|  class AAConvexPathBatch : public GrBatch {
 | 
| @@ -791,18 +787,12 @@ public:
 | 
|  
 | 
|          // Setup GrGeometryProcessor
 | 
|          SkAutoTUnref<const GrGeometryProcessor> gp(
 | 
| -                                                create_fill_gp(canTweakAlphaForCoverage, invert));
 | 
| +                                                create_fill_gp(canTweakAlphaForCoverage, invert,
 | 
| +                                                               this->usesLocalCoords(),
 | 
| +                                                               this->coverageIgnored()));
 | 
|  
 | 
|          batchTarget->initDraw(gp, pipeline);
 | 
|  
 | 
| -        // TODO remove this when batch is everywhere
 | 
| -        GrPipelineInfo init;
 | 
| -        init.fColorIgnored = fBatch.fColorIgnored;
 | 
| -        init.fOverrideColor = GrColor_ILLEGAL;
 | 
| -        init.fCoverageIgnored = fBatch.fCoverageIgnored;
 | 
| -        init.fUsesLocalCoords = this->usesLocalCoords();
 | 
| -        gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
 | 
| -
 | 
|          size_t vertexStride = gp->getVertexStride();
 | 
|  
 | 
|          SkASSERT(canTweakAlphaForCoverage ?
 | 
| @@ -870,19 +860,11 @@ public:
 | 
|          }
 | 
|  
 | 
|          // Setup GrGeometryProcessor
 | 
| -        SkAutoTUnref<GrGeometryProcessor> quadProcessor(QuadEdgeEffect::Create(this->color(),
 | 
| -                                                                               invert));
 | 
| +        SkAutoTUnref<GrGeometryProcessor> quadProcessor(
 | 
| +                QuadEdgeEffect::Create(this->color(), invert, this->usesLocalCoords()));
 | 
|  
 | 
|          batchTarget->initDraw(quadProcessor, pipeline);
 | 
|  
 | 
| -        // TODO remove this when batch is everywhere
 | 
| -        GrPipelineInfo init;
 | 
| -        init.fColorIgnored = fBatch.fColorIgnored;
 | 
| -        init.fOverrideColor = GrColor_ILLEGAL;
 | 
| -        init.fCoverageIgnored = fBatch.fCoverageIgnored;
 | 
| -        init.fUsesLocalCoords = this->usesLocalCoords();
 | 
| -        quadProcessor->initBatchTracker(batchTarget->currentBatchTracker(), init);
 | 
| -
 | 
|          // TODO generate all segments for all paths and use one vertex buffer
 | 
|          for (int i = 0; i < instanceCount; i++) {
 | 
|              Geometry& args = fGeoData[i];
 | 
| @@ -991,6 +973,7 @@ private:
 | 
|      bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
 | 
|      bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCoverage; }
 | 
|      const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; }
 | 
| +    bool coverageIgnored() const { return fBatch.fCoverageIgnored; }
 | 
|  
 | 
|      struct BatchTracker {
 | 
|          GrColor fColor;
 | 
| 
 |