Index: src/gpu/GrAAHairLinePathRenderer.cpp |
diff --git a/src/gpu/GrAAHairLinePathRenderer.cpp b/src/gpu/GrAAHairLinePathRenderer.cpp |
index 96e0677eceb691d8a457b44510d6627398f63423..ad6550072d796609526880b4829f986509f658f5 100644 |
--- a/src/gpu/GrAAHairLinePathRenderer.cpp |
+++ b/src/gpu/GrAAHairLinePathRenderer.cpp |
@@ -9,6 +9,7 @@ |
#include "GrBatch.h" |
#include "GrBatchTarget.h" |
+#include "GrBatchTest.h" |
#include "GrBufferAllocPool.h" |
#include "GrContext.h" |
#include "GrDefaultGeoProcFactory.h" |
@@ -1028,6 +1029,29 @@ void AAHairlineBatch::generateGeometry(GrBatchTarget* batchTarget, const GrPipel |
} |
} |
+static GrBatch* create_hairline_batch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkPath& path, |
+ const GrStrokeInfo& stroke, |
+ const SkIRect& devClipBounds, |
+ const GrIndexBuffer* linesIndexBuffer, |
+ const GrIndexBuffer* quadsIndexBuffer) { |
+ SkScalar hairlineCoverage; |
+ uint8_t newCoverage = 0xff; |
+ if (GrPathRenderer::IsStrokeHairlineOrEquivalent(stroke, viewMatrix, &hairlineCoverage)) { |
+ newCoverage = SkScalarRoundToInt(hairlineCoverage * 0xff); |
+ } |
+ |
+ AAHairlineBatch::Geometry geometry; |
+ geometry.fColor = color; |
+ geometry.fCoverage = newCoverage; |
+ geometry.fViewMatrix = viewMatrix; |
+ geometry.fPath = path; |
+ geometry.fDevClipBounds = devClipBounds; |
+ |
+ return AAHairlineBatch::Create(geometry, linesIndexBuffer, quadsIndexBuffer); |
+} |
+ |
bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
GrPipelineBuilder* pipelineBuilder, |
GrColor color, |
@@ -1040,26 +1064,45 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
return false; |
} |
- SkScalar hairlineCoverage; |
- uint8_t newCoverage = 0xff; |
- if (IsStrokeHairlineOrEquivalent(stroke, viewMatrix, &hairlineCoverage)) { |
- newCoverage = SkScalarRoundToInt(hairlineCoverage * 0xff); |
- } |
- |
SkIRect devClipBounds; |
pipelineBuilder->clip().getConservativeBounds(pipelineBuilder->getRenderTarget(), |
&devClipBounds); |
- AAHairlineBatch::Geometry geometry; |
- geometry.fColor = color; |
- geometry.fCoverage = newCoverage; |
- geometry.fViewMatrix = viewMatrix; |
- geometry.fPath = path; |
- geometry.fDevClipBounds = devClipBounds; |
- |
- SkAutoTUnref<GrBatch> batch(AAHairlineBatch::Create(geometry, fLinesIndexBuffer, |
- fQuadsIndexBuffer)); |
+ SkAutoTUnref<GrBatch> batch(create_hairline_batch(color, viewMatrix, path, stroke, |
+ devClipBounds, fLinesIndexBuffer, |
+ fQuadsIndexBuffer)); |
target->drawBatch(pipelineBuilder, batch); |
return true; |
} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+#ifdef GR_TEST_UTILS |
+ |
+BATCH_TEST_DEFINE(AAHairlineBatch) { |
+ // TODO put these in the cache |
+ static GrIndexBuffer* gQuadIndexBuffer; |
+ static GrIndexBuffer* gLineIndexBuffer; |
+ if (!gQuadIndexBuffer) { |
+ gQuadIndexBuffer = context->getGpu()->createInstancedIndexBuffer(kQuadIdxBufPattern, |
+ kIdxsPerQuad, |
+ kQuadsNumInIdxBuffer, |
+ kQuadNumVertices); |
+ gLineIndexBuffer = context->getGpu()->createInstancedIndexBuffer(kLineSegIdxBufPattern, |
+ kIdxsPerLineSeg, |
+ kLineSegsNumInIdxBuffer, |
+ kLineSegNumVertices); |
+ } |
+ |
+ GrColor color = GrRandomColor(random); |
+ SkMatrix viewMatrix = GrTest::TestMatrix(random); |
+ GrStrokeInfo stroke(SkStrokeRec::kHairline_InitStyle); |
+ SkPath path = GrTest::TestPath(random); |
+ SkIRect devClipBounds; |
+ devClipBounds.setEmpty(); |
+ return create_hairline_batch(color, viewMatrix, path, stroke, devClipBounds, gLineIndexBuffer, |
+ gQuadIndexBuffer); |
+} |
+ |
+#endif |