| Index: src/gpu/GrContext.cpp
 | 
| diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
 | 
| index 78d005ff4083865011d7b6a8716dab6a0d846632..9d07fdfd9cdfedbbbda23996402c97c2dadacc55 100755
 | 
| --- a/src/gpu/GrContext.cpp
 | 
| +++ b/src/gpu/GrContext.cpp
 | 
| @@ -315,7 +315,7 @@ GrTexture* GrContext::createResizedTexture(const GrSurfaceDesc& desc,
 | 
|  
 | 
|          uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType |
 | 
|                           GrDefaultGeoProcFactory::kLocalCoord_GPType;
 | 
| -        const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(flags);
 | 
| +        const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(GrColor_WHITE, flags);
 | 
|          drawState.setGeometryProcessor(gp)->unref();
 | 
|  
 | 
|          GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStride(),  0);
 | 
| @@ -622,8 +622,10 @@ static bool apply_aa_to_rect(GrDrawTarget* target,
 | 
|                               SkRect* devBoundRect,
 | 
|                               const SkRect& rect,
 | 
|                               SkScalar strokeWidth,
 | 
| -                             const SkMatrix& combinedMatrix) {
 | 
| -    if (!ds->canTweakAlphaForCoverage() && !ds->couldApplyCoverage(*target->caps())) {
 | 
| +                             const SkMatrix& combinedMatrix,
 | 
| +                             GrColor color) {
 | 
| +    if (!ds->canTweakAlphaForCoverage() && !ds->canUseFracCoveragePrimProc(color,
 | 
| +                                                                           *target->caps())) {
 | 
|  #ifdef SK_DEBUG
 | 
|          //SkDebugf("Turning off AA to correctly apply blend.\n");
 | 
|  #endif
 | 
| @@ -722,9 +724,11 @@ void GrContext::drawRect(const GrPaint& paint,
 | 
|          }
 | 
|      }
 | 
|  
 | 
| +    GrColor color = paint.getColor();
 | 
|      SkRect devBoundRect;
 | 
|      bool needAA = paint.isAntiAlias() && !drawState.getRenderTarget()->isMultisampled();
 | 
| -    bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, rect, width, matrix);
 | 
| +    bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, rect, width, matrix,
 | 
| +                                           color);
 | 
|  
 | 
|      if (doAA) {
 | 
|          GrDrawState::AutoViewMatrixRestore avmr;
 | 
| @@ -736,13 +740,14 @@ void GrContext::drawRect(const GrPaint& paint,
 | 
|              const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec();
 | 
|              fAARectRenderer->strokeAARect(target,
 | 
|                                            &drawState,
 | 
| +                                          color,
 | 
|                                            rect,
 | 
|                                            matrix,
 | 
|                                            devBoundRect,
 | 
|                                            strokeRec);
 | 
|          } else {
 | 
|              // filled AA rect
 | 
| -            fAARectRenderer->fillAARect(target, &drawState, rect, matrix, devBoundRect);
 | 
| +            fAARectRenderer->fillAARect(target, &drawState, color, rect, matrix, devBoundRect);
 | 
|          }
 | 
|          return;
 | 
|      }
 | 
| @@ -753,7 +758,7 @@ void GrContext::drawRect(const GrPaint& paint,
 | 
|          // unitSquareVertexBuffer()
 | 
|  
 | 
|          static const int worstCaseVertCount = 10;
 | 
| -        const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create();
 | 
| +        const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(color);
 | 
|          drawState.setGeometryProcessor(gp)->unref();
 | 
|          GrDrawTarget::AutoReleaseGeometry geo(target,
 | 
|                                                worstCaseVertCount,
 | 
| @@ -788,7 +793,7 @@ void GrContext::drawRect(const GrPaint& paint,
 | 
|          target->drawNonIndexed(&drawState, primType, 0, vertCount);
 | 
|      } else {
 | 
|          // filled BW rect
 | 
| -        target->drawSimpleRect(&drawState, rect);
 | 
| +        target->drawSimpleRect(&drawState, color, rect);
 | 
|      }
 | 
|  }
 | 
|  
 | 
| @@ -805,14 +810,15 @@ void GrContext::drawRectToRect(const GrPaint& paint,
 | 
|  
 | 
|      GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target);
 | 
|  
 | 
| -    target->drawRect(&drawState, dstRect, &localRect, localMatrix);
 | 
| +    target->drawRect(&drawState, paint.getColor(), dstRect, &localRect, localMatrix);
 | 
|  }
 | 
|  
 | 
|  static void set_vertex_attributes(GrDrawState* drawState,
 | 
|                                    const SkPoint* texCoords,
 | 
|                                    const GrColor* colors,
 | 
|                                    int* colorOffset,
 | 
| -                                  int* texOffset) {
 | 
| +                                  int* texOffset,
 | 
| +                                  GrColor color) {
 | 
|      *texOffset = -1;
 | 
|      *colorOffset = -1;
 | 
|  
 | 
| @@ -829,7 +835,7 @@ static void set_vertex_attributes(GrDrawState* drawState,
 | 
|          *colorOffset = sizeof(SkPoint);
 | 
|          flags |= GrDefaultGeoProcFactory::kColor_GPType;
 | 
|      }
 | 
| -    drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(flags))->unref();
 | 
| +    drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(color, flags))->unref();
 | 
|  }
 | 
|  
 | 
|  void GrContext::drawVertices(const GrPaint& paint,
 | 
| @@ -852,7 +858,8 @@ void GrContext::drawVertices(const GrPaint& paint,
 | 
|      GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target);
 | 
|  
 | 
|      int colorOffset = -1, texOffset = -1;
 | 
| -    set_vertex_attributes(&drawState, texCoords, colors, &colorOffset, &texOffset);
 | 
| +    set_vertex_attributes(&drawState, texCoords, colors, &colorOffset, &texOffset,
 | 
| +                          paint.getColor());
 | 
|  
 | 
|      size_t vertexStride = drawState.getGeometryProcessor()->getVertexStride();
 | 
|      SkASSERT(vertexStride == sizeof(SkPoint) + (SkToBool(texCoords) ? sizeof(SkPoint) : 0)
 | 
| @@ -915,11 +922,12 @@ void GrContext::drawRRect(const GrPaint& paint,
 | 
|  
 | 
|      const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
 | 
|  
 | 
| -    if (!fOvalRenderer->drawRRect(target, &drawState, this, paint.isAntiAlias(), rrect,
 | 
| +    GrColor color = paint.getColor();
 | 
| +    if (!fOvalRenderer->drawRRect(target, &drawState, color, this, paint.isAntiAlias(), rrect,
 | 
|                                    strokeRec)) {
 | 
|          SkPath path;
 | 
|          path.addRRect(rrect);
 | 
| -        this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, strokeInfo);
 | 
| +        this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, strokeInfo);
 | 
|      }
 | 
|  }
 | 
|  
 | 
| @@ -938,14 +946,16 @@ void GrContext::drawDRRect(const GrPaint& paint,
 | 
|  
 | 
|      GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target);
 | 
|  
 | 
| -    if (!fOvalRenderer->drawDRRect(target, &drawState, this, paint.isAntiAlias(), outer, inner)) {
 | 
| +    GrColor color = paint.getColor();
 | 
| +    if (!fOvalRenderer->drawDRRect(target, &drawState, color, this, paint.isAntiAlias(), outer,
 | 
| +                                   inner)) {
 | 
|          SkPath path;
 | 
|          path.addRRect(inner);
 | 
|          path.addRRect(outer);
 | 
|          path.setFillType(SkPath::kEvenOdd_FillType);
 | 
|  
 | 
|          GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle);
 | 
| -        this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, fillRec);
 | 
| +        this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, fillRec);
 | 
|      }
 | 
|  }
 | 
|  
 | 
| @@ -976,17 +986,19 @@ void GrContext::drawOval(const GrPaint& paint,
 | 
|  
 | 
|      const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
 | 
|  
 | 
| -
 | 
| -    if (!fOvalRenderer->drawOval(target, &drawState, this, paint.isAntiAlias(), oval, strokeRec)) {
 | 
| +    GrColor color = paint.getColor();
 | 
| +    if (!fOvalRenderer->drawOval(target, &drawState, color, this, paint.isAntiAlias(), oval,
 | 
| +                                 strokeRec)) {
 | 
|          SkPath path;
 | 
|          path.addOval(oval);
 | 
| -        this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, strokeInfo);
 | 
| +        this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, strokeInfo);
 | 
|      }
 | 
|  }
 | 
|  
 | 
|  // Can 'path' be drawn as a pair of filled nested rectangles?
 | 
|  static bool is_nested_rects(GrDrawTarget* target,
 | 
|                              GrDrawState* drawState,
 | 
| +                            GrColor color,
 | 
|                              const SkPath& path,
 | 
|                              const SkStrokeRec& stroke,
 | 
|                              SkRect rects[2]) {
 | 
| @@ -1002,7 +1014,8 @@ static bool is_nested_rects(GrDrawTarget* target,
 | 
|          return false;
 | 
|      }
 | 
|  
 | 
| -    if (!drawState->canTweakAlphaForCoverage() && !drawState->couldApplyCoverage(*target->caps())) {
 | 
| +    if (!drawState->canTweakAlphaForCoverage() &&
 | 
| +        !drawState->canUseFracCoveragePrimProc(color, *target->caps())) {
 | 
|          return false;
 | 
|      }
 | 
|  
 | 
| @@ -1048,6 +1061,7 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
 | 
|         return;
 | 
|      }
 | 
|  
 | 
| +    GrColor color = paint.getColor();
 | 
|      if (strokeInfo.isDashed()) {
 | 
|          SkPoint pts[2];
 | 
|          if (path.isLine(pts)) {
 | 
| @@ -1061,7 +1075,7 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
 | 
|              SkMatrix origViewMatrix = drawState.getViewMatrix();
 | 
|              GrDrawState::AutoViewMatrixRestore avmr;
 | 
|              if (avmr.setIdentity(&drawState)) {
 | 
| -                if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, pts, paint,
 | 
| +                if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, color, pts, paint,
 | 
|                                                    strokeInfo, origViewMatrix)) {
 | 
|                      return;
 | 
|                  }
 | 
| @@ -1104,14 +1118,14 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
 | 
|          // Concave AA paths are expensive - try to avoid them for special cases
 | 
|          SkRect rects[2];
 | 
|  
 | 
| -        if (is_nested_rects(target, &drawState, path, strokeRec, rects)) {
 | 
| +        if (is_nested_rects(target, &drawState, color, path, strokeRec, rects)) {
 | 
|              SkMatrix origViewMatrix = drawState.getViewMatrix();
 | 
|              GrDrawState::AutoViewMatrixRestore avmr;
 | 
|              if (!avmr.setIdentity(&drawState)) {
 | 
|                  return;
 | 
|              }
 | 
|  
 | 
| -            fAARectRenderer->fillAANestedRects(target, &drawState, rects, origViewMatrix);
 | 
| +            fAARectRenderer->fillAANestedRects(target, &drawState, color, rects, origViewMatrix);
 | 
|              return;
 | 
|          }
 | 
|      }
 | 
| @@ -1120,14 +1134,15 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
 | 
|      bool isOval = path.isOval(&ovalRect);
 | 
|  
 | 
|      if (!isOval || path.isInverseFillType()
 | 
| -        || !fOvalRenderer->drawOval(target, &drawState, this, paint.isAntiAlias(), ovalRect,
 | 
| +        || !fOvalRenderer->drawOval(target, &drawState, color, this, paint.isAntiAlias(), ovalRect,
 | 
|                                      strokeRec)) {
 | 
| -        this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, strokeInfo);
 | 
| +        this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, strokeInfo);
 | 
|      }
 | 
|  }
 | 
|  
 | 
|  void GrContext::internalDrawPath(GrDrawTarget* target,
 | 
|                                   GrDrawState* drawState,
 | 
| +                                 GrColor color,
 | 
|                                   bool useAA,
 | 
|                                   const SkPath& path,
 | 
|                                   const GrStrokeInfo& strokeInfo) {
 | 
| @@ -1142,7 +1157,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target,
 | 
|      // thing WRT to the blend then we'll need some query on the PR.
 | 
|      bool useCoverageAA = useAA &&
 | 
|          !drawState->getRenderTarget()->isMultisampled() &&
 | 
| -        drawState->couldApplyCoverage(*target->caps());
 | 
| +        drawState->canUseFracCoveragePrimProc(color, *target->caps());
 | 
|  
 | 
|  
 | 
|      GrPathRendererChain::DrawType type =
 | 
| @@ -1179,7 +1194,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target,
 | 
|          return;
 | 
|      }
 | 
|  
 | 
| -    pr->drawPath(target, drawState, *pathPtr, *stroke, useCoverageAA);
 | 
| +    pr->drawPath(target, drawState, color, *pathPtr, *stroke, useCoverageAA);
 | 
|  }
 | 
|  
 | 
|  ////////////////////////////////////////////////////////////////////////////////
 | 
| @@ -1320,8 +1335,8 @@ bool GrContext::writeSurfacePixels(GrSurface* surface,
 | 
|          GrDrawState drawState(matrix);
 | 
|          drawState.addColorProcessor(fp);
 | 
|          drawState.setRenderTarget(renderTarget);
 | 
| -        drawTarget->drawSimpleRect(&drawState, SkRect::MakeWH(SkIntToScalar(width),
 | 
| -                                                              SkIntToScalar(height)));
 | 
| +        drawTarget->drawSimpleRect(&drawState, GrColor_WHITE,SkRect::MakeWH(SkIntToScalar(width),
 | 
| +                                                                            SkIntToScalar(height)));
 | 
|      }
 | 
|  
 | 
|      if (kFlushWrites_PixelOp & pixelOpsFlags) {
 | 
| @@ -1442,7 +1457,7 @@ bool GrContext::readRenderTargetPixels(GrRenderTarget* target,
 | 
|  
 | 
|                      drawState.setRenderTarget(tempTexture->asRenderTarget());
 | 
|                      SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
 | 
| -                    fDrawBuffer->drawSimpleRect(&drawState, rect);
 | 
| +                    fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, rect);
 | 
|                      // we want to read back from the scratch's origin
 | 
|                      left = 0;
 | 
|                      top = 0;
 | 
| @@ -1543,8 +1558,8 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds,
 | 
|              SkASSERT(acf);
 | 
|              ds->setFromPaint(*paint, fViewMatrix, fRenderTarget.get());
 | 
|  #if GR_DEBUG_PARTIAL_COVERAGE_CHECK
 | 
| -            if ((paint->hasMask() || 0xff != paint->fCoverage) &&
 | 
| -                !fDrawState->couldApplyCoverage(fGpu->caps())) {
 | 
| +            if ((paint->hasMask()) &&
 | 
| +                !fDrawState->canUseFracCoveragePrimProc(paint.getColor(), fGpu->caps())) {
 | 
|                  SkDebugf("Partial pixel coverage will be incorrectly blended.\n");
 | 
|              }
 | 
|  #endif
 | 
| 
 |