| Index: src/gpu/batches/GrAAHairLinePathRenderer.cpp
|
| diff --git a/src/gpu/batches/GrAAHairLinePathRenderer.cpp b/src/gpu/batches/GrAAHairLinePathRenderer.cpp
|
| index 1f7407c5f633dc4731b10cf304051830c7524c0d..1a5e6971e7f5c22e740b9e7cb1161ec9a0dcca31 100644
|
| --- a/src/gpu/batches/GrAAHairLinePathRenderer.cpp
|
| +++ b/src/gpu/batches/GrAAHairLinePathRenderer.cpp
|
| @@ -676,15 +676,21 @@ class AAHairlineBatch : public GrVertexBatch {
|
| public:
|
| DEFINE_BATCH_CLASS_ID
|
|
|
| - struct Geometry {
|
| - GrColor fColor;
|
| - uint8_t fCoverage;
|
| - SkMatrix fViewMatrix;
|
| - SkPath fPath;
|
| - SkIRect fDevClipBounds;
|
| - };
|
| + AAHairlineBatch(GrColor color,
|
| + uint8_t coverage,
|
| + const SkMatrix& viewMatrix,
|
| + const SkPath& path,
|
| + SkIRect devClipBounds) : INHERITED(ClassID()) {
|
| + fGeoData.emplace_back(Geometry{color, coverage, viewMatrix, path, devClipBounds});
|
| +
|
| + // compute bounds
|
| + fBounds = path.getBounds();
|
| + viewMatrix.mapRect(&fBounds);
|
|
|
| - static GrDrawBatch* Create(const Geometry& geometry) { return new AAHairlineBatch(geometry); }
|
| + // 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.
|
| + fBounds.outset(0.5f, 0.5f);
|
| + }
|
|
|
| const char* name() const override { return "AAHairlineBatch"; }
|
|
|
| @@ -712,26 +718,12 @@ private:
|
| fBatch.fCoverage = fGeoData[0].fCoverage;
|
| }
|
|
|
| - SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| -
|
| void onPrepareDraws(Target*) const override;
|
|
|
| typedef SkTArray<SkPoint, true> PtArray;
|
| typedef SkTArray<int, true> IntArray;
|
| typedef SkTArray<float, true> FloatArray;
|
|
|
| - AAHairlineBatch(const Geometry& geometry) : INHERITED(ClassID()) {
|
| - fGeoData.push_back(geometry);
|
| -
|
| - // compute bounds
|
| - fBounds = geometry.fPath.getBounds();
|
| - geometry.fViewMatrix.mapRect(&fBounds);
|
| -
|
| - // 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.
|
| - fBounds.outset(0.5f, 0.5f);
|
| - }
|
| -
|
| bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
| AAHairlineBatch* that = t->cast<AAHairlineBatch>();
|
|
|
| @@ -766,7 +758,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;
|
| }
|
| @@ -777,6 +769,15 @@ private:
|
| const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; }
|
| bool coverageIgnored() const { return fBatch.fCoverageIgnored; }
|
|
|
| +
|
| + struct Geometry {
|
| + GrColor fColor;
|
| + uint8_t fCoverage;
|
| + SkMatrix fViewMatrix;
|
| + SkPath fPath;
|
| + SkIRect fDevClipBounds;
|
| + };
|
| +
|
| struct BatchTracker {
|
| GrColor fColor;
|
| uint8_t fCoverage;
|
| @@ -953,14 +954,7 @@ static GrDrawBatch* create_hairline_batch(GrColor color,
|
| 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);
|
| + return new AAHairlineBatch(color, newCoverage, viewMatrix, path, devClipBounds);
|
| }
|
|
|
| bool GrAAHairLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
|
|
|