Index: src/gpu/batches/GrDefaultPathRenderer.cpp |
diff --git a/src/gpu/batches/GrDefaultPathRenderer.cpp b/src/gpu/batches/GrDefaultPathRenderer.cpp |
index 97200a1981a13615b36d72ba8a80fd9ec2036bf2..769faa84b0b8a4f4e85c63d4f8d6d264fc1e1d99 100644 |
--- a/src/gpu/batches/GrDefaultPathRenderer.cpp |
+++ b/src/gpu/batches/GrDefaultPathRenderer.cpp |
@@ -97,16 +97,22 @@ class DefaultPathBatch : public GrVertexBatch { |
public: |
DEFINE_BATCH_CLASS_ID |
- struct Geometry { |
- GrColor fColor; |
- SkPath fPath; |
- SkScalar fTolerance; |
- }; |
+ DefaultPathBatch(GrColor color, const SkPath& path, SkScalar tolerance, |
+ uint8_t coverage, const SkMatrix& viewMatrix, bool isHairline, |
+ const SkRect& devBounds) |
+ : INHERITED(ClassID()) { |
+ fBatch.fCoverage = coverage; |
+ fBatch.fIsHairline = isHairline; |
+ fBatch.fViewMatrix = viewMatrix; |
+ fGeoData.emplace_back(Geometry{color, path, tolerance}); |
+ |
+ this->setBounds(devBounds); |
- static GrDrawBatch* Create(const Geometry& geometry, uint8_t coverage, |
- const SkMatrix& viewMatrix, bool isHairline, |
- const SkRect& devBounds) { |
- return new DefaultPathBatch(geometry, coverage, viewMatrix, isHairline, devBounds); |
+ // This is b.c. hairlines are notionally infinitely thin so without expansion |
+ // two overlapping lines could be reordered even though they hit the same pixels. |
+ if (isHairline) { |
+ fBounds.outset(0.5f, 0.5f); |
+ } |
} |
const char* name() const override { return "DefaultPathBatch"; } |
@@ -256,25 +262,6 @@ private: |
target->putBackVertices((size_t)(maxVertices - vertexOffset), (size_t)vertexStride); |
} |
- SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
- |
- DefaultPathBatch(const Geometry& geometry, uint8_t coverage, const SkMatrix& viewMatrix, |
- bool isHairline, const SkRect& devBounds) |
- : INHERITED(ClassID()) { |
- fBatch.fCoverage = coverage; |
- fBatch.fIsHairline = isHairline; |
- fBatch.fViewMatrix = viewMatrix; |
- fGeoData.push_back(geometry); |
- |
- this->setBounds(devBounds); |
- |
- // This is b.c. hairlines are notionally infinitely thin so without expansion |
- // two overlapping lines could be reordered even though they hit the same pixels. |
- if (isHairline) { |
- fBounds.outset(0.5f, 0.5f); |
- } |
- } |
- |
bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
DefaultPathBatch* that = t->cast<DefaultPathBatch>(); |
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(), |
@@ -298,7 +285,7 @@ private: |
return false; |
} |
- fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin()); |
+ fGeoData.push_back_n(that->fGeoData.count(), that->fGeoData.begin()); |
this->joinBounds(that->bounds()); |
return true; |
} |
@@ -417,6 +404,12 @@ private: |
bool fIsHairline; |
}; |
+ struct Geometry { |
+ GrColor fColor; |
+ SkPath fPath; |
+ SkScalar fTolerance; |
+ }; |
+ |
BatchTracker fBatch; |
SkSTArray<1, Geometry, true> fGeoData; |
@@ -577,14 +570,9 @@ bool GrDefaultPathRenderer::internalDrawPath(GrDrawContext* drawContext, |
drawContext->drawBatch(pipelineBuilder, clip, batch); |
} else { |
- DefaultPathBatch::Geometry geometry; |
- geometry.fColor = color; |
- geometry.fPath = path; |
- geometry.fTolerance = srcSpaceTol; |
- |
- SkAutoTUnref<GrDrawBatch> batch(DefaultPathBatch::Create(geometry, newCoverage, |
- viewMatrix, isHairline, |
- devBounds)); |
+ SkAutoTUnref<GrDrawBatch> batch(new DefaultPathBatch(color, path, srcSpaceTol, |
+ newCoverage, viewMatrix, |
+ isHairline, devBounds)); |
GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(paint)); |
pipelineBuilder.setDrawFace(drawFace[p]); |
@@ -654,14 +642,9 @@ DRAW_BATCH_TEST_DEFINE(DefaultPathBatch) { |
SkScalar tol = GrPathUtils::kDefaultTolerance; |
SkScalar srcSpaceTol = GrPathUtils::scaleToleranceToSrc(tol, viewMatrix, bounds); |
- DefaultPathBatch::Geometry geometry; |
- geometry.fColor = color; |
- geometry.fPath = path; |
- geometry.fTolerance = srcSpaceTol; |
- |
viewMatrix.mapRect(&bounds); |
uint8_t coverage = GrRandomCoverage(random); |
- return DefaultPathBatch::Create(geometry, coverage, viewMatrix, true, bounds); |
+ return new DefaultPathBatch(color, path, srcSpaceTol, coverage, viewMatrix, true, bounds); |
} |
#endif |