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 |