Index: src/gpu/batches/GrNonAAStrokeRectBatch.cpp |
diff --git a/src/gpu/batches/GrNonAAStrokeRectBatch.cpp b/src/gpu/batches/GrNonAAStrokeRectBatch.cpp |
index 2c5194241afc7526c2194ede86725a1b0026f998..a5de607c8192223848eda55ad672038b30a46ebc 100644 |
--- a/src/gpu/batches/GrNonAAStrokeRectBatch.cpp |
+++ b/src/gpu/batches/GrNonAAStrokeRectBatch.cpp |
@@ -48,9 +48,8 @@ public: |
GrColor fColor; |
}; |
- static GrDrawBatch* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, |
- SkScalar strokeWidth, bool snapToPixelCenters) { |
- return new NonAAStrokeRectBatch(color, viewMatrix, rect, strokeWidth, snapToPixelCenters); |
+ static NonAAStrokeRectBatch* Create() { |
+ return new NonAAStrokeRectBatch; |
} |
const char* name() const override { return "GrStrokeRectBatch"; } |
@@ -64,7 +63,45 @@ public: |
out->setKnownSingleComponent(0xff); |
} |
+ void append(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, |
+ SkScalar strokeWidth) { |
+ Geometry& geometry = fGeoData.push_back(); |
+ geometry.fViewMatrix = viewMatrix; |
+ geometry.fRect = rect; |
+ geometry.fStrokeWidth = strokeWidth; |
+ geometry.fColor = color; |
+ } |
+ |
+ void appendAndUpdateBounds(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, |
+ SkScalar strokeWidth, bool snapToPixelCenters) { |
+ this->append(color, viewMatrix, rect, strokeWidth); |
+ |
+ SkRect bounds; |
+ this->setupBounds(&bounds, fGeoData.back(), snapToPixelCenters); |
+ this->joinBounds(bounds); |
+ } |
+ |
+ void init(bool snapToPixelCenters) { |
+ const Geometry& geo = fGeoData[0]; |
+ fBatch.fHairline = geo.fStrokeWidth == 0; |
+ |
+ // setup bounds |
+ this->setupBounds(&fBounds, geo, snapToPixelCenters); |
+ } |
+ |
private: |
+ void setupBounds(SkRect* bounds, const Geometry& geo, bool snapToPixelCenters) { |
+ *bounds = geo.fRect; |
+ SkScalar rad = SkScalarHalf(geo.fStrokeWidth); |
+ bounds->outset(rad, rad); |
+ geo.fViewMatrix.mapRect(&fBounds); |
+ |
+ // If our caller snaps to pixel centers then we have to round out the bounds |
+ if (snapToPixelCenters) { |
+ bounds->roundOut(); |
+ } |
+ } |
+ |
void onPrepareDraws(Target* target) override { |
SkAutoTUnref<const GrGeometryProcessor> gp; |
{ |
@@ -139,30 +176,7 @@ private: |
fBatch.fCoverageIgnored = !opt.readsCoverage(); |
} |
- NonAAStrokeRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, |
- SkScalar strokeWidth, bool snapToPixelCenters) |
- : INHERITED(ClassID()) { |
- Geometry& geometry = fGeoData.push_back(); |
- geometry.fViewMatrix = viewMatrix; |
- geometry.fRect = rect; |
- geometry.fStrokeWidth = strokeWidth; |
- geometry.fColor = color; |
- |
- fBatch.fHairline = geometry.fStrokeWidth == 0; |
- |
- fGeoData.push_back(geometry); |
- |
- // setup bounds |
- fBounds = geometry.fRect; |
- SkScalar rad = SkScalarHalf(geometry.fStrokeWidth); |
- fBounds.outset(rad, rad); |
- geometry.fViewMatrix.mapRect(&fBounds); |
- |
- // If our caller snaps to pixel centers then we have to round out the bounds |
- if (snapToPixelCenters) { |
- fBounds.roundOut(); |
- } |
- } |
+ NonAAStrokeRectBatch() : INHERITED(ClassID()) {} |
GrColor color() const { return fBatch.fColor; } |
bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
@@ -207,7 +221,20 @@ GrDrawBatch* Create(GrColor color, |
const SkRect& rect, |
SkScalar strokeWidth, |
bool snapToPixelCenters) { |
- return NonAAStrokeRectBatch::Create(color, viewMatrix, rect, strokeWidth, snapToPixelCenters); |
+ NonAAStrokeRectBatch* batch = NonAAStrokeRectBatch::Create(); |
+ batch->append(color, viewMatrix, rect, strokeWidth); |
+ batch->init(snapToPixelCenters); |
+ return batch; |
+} |
+ |
+void Append(GrBatch* origBatch, |
+ GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& rect, |
+ SkScalar strokeWidth, |
+ bool snapToPixelCenters) { |
+ NonAAStrokeRectBatch* batch = origBatch->cast<NonAAStrokeRectBatch>(); |
+ batch->appendAndUpdateBounds(color, viewMatrix, rect, strokeWidth, snapToPixelCenters); |
} |
}; |
@@ -220,7 +247,7 @@ DRAW_BATCH_TEST_DEFINE(NonAAStrokeRectBatch) { |
SkRect rect = GrTest::TestRect(random); |
SkScalar strokeWidth = random->nextBool() ? 0.0f : 1.0f; |
- return NonAAStrokeRectBatch::Create(color, viewMatrix, rect, strokeWidth, random->nextBool()); |
+ return GrNonAAStrokeRectBatch::Create(color, viewMatrix, rect, strokeWidth, random->nextBool()); |
} |
#endif |