Index: src/gpu/GrDrawContext.cpp |
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
index 48242e278f079dbedda890a360f69a1a8f33c0f3..9cf68ae2f3bb91809590ace498f3e663ede86bcf 100644 |
--- a/src/gpu/GrDrawContext.cpp |
+++ b/src/gpu/GrDrawContext.cpp |
@@ -616,12 +616,12 @@ void GrDrawContext::fillRectToRect(const GrClip& clip, |
} |
AutoCheckFlush acf(fDrawingManager); |
- SkAutoTUnref<GrDrawBatch> batch; |
bool useHWAA; |
if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
- batch.reset(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), croppedLocalRect, |
- paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); |
+ SkAutoTUnref<GrDrawBatch> batch(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), |
+ croppedLocalRect, paint.isAntiAlias(), |
+ fInstancedPipelineInfo, &useHWAA)); |
if (batch) { |
GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
@@ -629,20 +629,33 @@ void GrDrawContext::fillRectToRect(const GrClip& clip, |
} |
} |
- if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && |
- view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
- batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), viewMatrix, |
- croppedRect, croppedLocalRect)); |
- if (batch) { |
- GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
- this->drawBatch(pipelineBuilder, clip, batch); |
- return; |
- } |
- } else { |
+ if (!should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { |
this->drawNonAAFilledRect(clip, paint, viewMatrix, croppedRect, &croppedLocalRect, |
nullptr, nullptr); |
+ return; |
+ } |
+ |
+ if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
+ SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), |
+ viewMatrix, |
+ croppedRect, |
+ croppedLocalRect)); |
+ GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
+ this->drawBatch(pipelineBuilder, clip, batch); |
+ return; |
+ } |
+ |
+ SkMatrix viewAndUnLocalMatrix; |
+ if (!viewAndUnLocalMatrix.setRectToRect(localRect, rectToDraw, SkMatrix::kFill_ScaleToFit)) { |
+ SkDebugf("fillRectToRect called with empty local matrix.\n"); |
+ return; |
} |
+ viewAndUnLocalMatrix.postConcat(viewMatrix); |
+ SkPath path; |
+ path.setIsVolatile(true); |
+ path.addRect(localRect); |
+ this->internalDrawPath(clip, paint, viewAndUnLocalMatrix, path, GrStyle()); |
} |
void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
@@ -661,12 +674,12 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
} |
AutoCheckFlush acf(fDrawingManager); |
- SkAutoTUnref<GrDrawBatch> batch; |
bool useHWAA; |
if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
- batch.reset(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), localMatrix, |
- paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA)); |
+ SkAutoTUnref<GrDrawBatch> batch(ir->recordRect(croppedRect, viewMatrix, paint.getColor(), |
+ localMatrix, paint.isAntiAlias(), |
+ fInstancedPipelineInfo, &useHWAA)); |
if (batch) { |
GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
@@ -674,17 +687,32 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
} |
} |
- if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) && |
- view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
- batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, localMatrix, |
- croppedRect)); |
- GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
- this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
- } else { |
+ if (!should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) { |
this->drawNonAAFilledRect(clip, paint, viewMatrix, croppedRect, nullptr, |
&localMatrix, nullptr); |
+ return; |
} |
+ if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
+ SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, |
+ localMatrix, croppedRect)); |
+ GrPipelineBuilder pipelineBuilder(paint, useHWAA); |
+ this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
+ return; |
+ } |
+ |
+ SkMatrix viewAndUnLocalMatrix; |
+ if (!localMatrix.invert(&viewAndUnLocalMatrix)) { |
+ SkDebugf("fillRectWithLocalMatrix called with degenerate local matrix.\n"); |
+ return; |
+ } |
+ viewAndUnLocalMatrix.postConcat(viewMatrix); |
+ |
+ SkPath path; |
+ path.setIsVolatile(true); |
+ path.addRect(rectToDraw); |
+ path.transform(localMatrix); |
+ this->internalDrawPath(clip, paint, viewAndUnLocalMatrix, path, GrStyle()); |
} |
void GrDrawContext::drawVertices(const GrClip& clip, |