Hide NonAAStrokeRectBatch Geometry class and cleanup class.
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2126893002
Review-Url: https://codereview.chromium.org/2126893002
diff --git a/src/gpu/batches/GrNonAAStrokeRectBatch.cpp b/src/gpu/batches/GrNonAAStrokeRectBatch.cpp
index e443851..299d995 100644
--- a/src/gpu/batches/GrNonAAStrokeRectBatch.cpp
+++ b/src/gpu/batches/GrNonAAStrokeRectBatch.cpp
@@ -37,103 +37,84 @@
verts[9] = verts[1];
}
+// Allow all hairlines and all miters, so long as the miter limit doesn't produce beveled corners.
+inline static bool allowed_stroke(const SkStrokeRec& stroke) {
+ SkASSERT(stroke.getStyle() == SkStrokeRec::kStroke_Style ||
+ stroke.getStyle() == SkStrokeRec::kHairline_Style);
+ return !stroke.getWidth() ||
+ (stroke.getJoin() == SkPaint::kMiter_Join && stroke.getMiter() > SK_ScalarSqrt2);
+}
+
class NonAAStrokeRectBatch : public GrVertexBatch {
public:
DEFINE_BATCH_CLASS_ID
- struct Geometry {
- SkMatrix fViewMatrix;
- SkRect fRect;
- SkScalar fStrokeWidth;
- GrColor fColor;
- };
-
- static NonAAStrokeRectBatch* Create() {
- return new NonAAStrokeRectBatch;
- }
-
- const char* name() const override { return "GrStrokeRectBatch"; }
+ const char* name() const override { return "NonAAStrokeRectBatch"; }
void computePipelineOptimizations(GrInitInvariantOutput* color,
GrInitInvariantOutput* coverage,
GrBatchToXPOverrides* overrides) const override {
// When this is called on a batch, there is only one geometry bundle
- color->setKnownFourComponents(fGeoData[0].fColor);
+ color->setKnownFourComponents(fColor);
coverage->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;
-
+ static GrDrawBatch* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
+ const SkStrokeRec& stroke, bool snapToPixelCenters) {
+ if (!allowed_stroke(stroke)) {
+ return nullptr;
+ }
+ NonAAStrokeRectBatch* batch = new NonAAStrokeRectBatch();
+ batch->fColor = color;
+ batch->fViewMatrix = viewMatrix;
+ batch->fRect = rect;
// Sort the rect for hairlines
- geometry.fRect.sort();
- }
+ batch->fRect.sort();
+ batch->fStrokeWidth = stroke.getWidth();
- 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);
+ batch->fBounds = batch->fRect;
+ SkScalar rad = SkScalarHalf(batch->fStrokeWidth);
+ batch->fBounds.outset(rad, rad);
+ batch->fViewMatrix.mapRect(&batch->fBounds);
// If our caller snaps to pixel centers then we have to round out the bounds
if (snapToPixelCenters) {
// We want to be consistent with how we snap non-aa lines. To match what we do in
// GrGLSLVertexShaderBuilder, we first floor all the vertex values and then add half a
// pixel to force us to pixel centers.
- bounds->set(SkScalarFloorToScalar(bounds->fLeft),
- SkScalarFloorToScalar(bounds->fTop),
- SkScalarFloorToScalar(bounds->fRight),
- SkScalarFloorToScalar(bounds->fBottom));
- bounds->offset(0.5f, 0.5f);
+ batch->fBounds.set(SkScalarFloorToScalar(batch->fBounds.fLeft),
+ SkScalarFloorToScalar(batch->fBounds.fTop),
+ SkScalarFloorToScalar(batch->fBounds.fRight),
+ SkScalarFloorToScalar(batch->fBounds.fBottom));
+ batch->fBounds.offset(0.5f, 0.5f);
// Round out the bounds to integer values
- bounds->roundOut();
+ batch->fBounds.roundOut();
}
+ return batch;
}
+private:
+ NonAAStrokeRectBatch() : INHERITED(ClassID()) {}
+
void onPrepareDraws(Target* target) const override {
sk_sp<GrGeometryProcessor> gp;
{
using namespace GrDefaultGeoProcFactory;
- Color color(this->color());
- Coverage coverage(this->coverageIgnored() ? Coverage::kSolid_Type :
- Coverage::kNone_Type);
- LocalCoords localCoords(this->usesLocalCoords() ? LocalCoords::kUsePosition_Type :
- LocalCoords::kUnused_Type);
- gp = GrDefaultGeoProcFactory::Make(color, coverage, localCoords, this->viewMatrix());
+ Color color(fColor);
+ Coverage coverage(fOverrides.readsCoverage() ? Coverage::kSolid_Type
+ : Coverage::kNone_Type);
+ LocalCoords localCoords(fOverrides.readsLocalCoords() ? LocalCoords::kUsePosition_Type :
+ LocalCoords::kUnused_Type);
+ gp = GrDefaultGeoProcFactory::Make(color, coverage, localCoords, fViewMatrix);
}
size_t vertexStride = gp->getVertexStride();
SkASSERT(vertexStride == sizeof(GrDefaultGeoProcFactory::PositionAttr));
- const Geometry& args = fGeoData[0];
-
int vertexCount = kVertsPerHairlineRect;
- if (args.fStrokeWidth > 0) {
+ if (fStrokeWidth > 0) {
vertexCount = kVertsPerStrokeRect;
}
@@ -151,17 +132,17 @@
SkPoint* vertex = reinterpret_cast<SkPoint*>(verts);
GrPrimitiveType primType;
- if (args.fStrokeWidth > 0) {
+ if (fStrokeWidth > 0) {
primType = kTriangleStrip_GrPrimitiveType;
- init_stroke_rect_strip(vertex, args.fRect, args.fStrokeWidth);
+ init_stroke_rect_strip(vertex, fRect, fStrokeWidth);
} else {
// hairline
primType = kLineStrip_GrPrimitiveType;
- vertex[0].set(args.fRect.fLeft, args.fRect.fTop);
- vertex[1].set(args.fRect.fRight, args.fRect.fTop);
- vertex[2].set(args.fRect.fRight, args.fRect.fBottom);
- vertex[3].set(args.fRect.fLeft, args.fRect.fBottom);
- vertex[4].set(args.fRect.fLeft, args.fRect.fTop);
+ vertex[0].set(fRect.fLeft, fRect.fTop);
+ vertex[1].set(fRect.fRight, fRect.fTop);
+ vertex[2].set(fRect.fRight, fRect.fBottom);
+ vertex[3].set(fRect.fLeft, fRect.fBottom);
+ vertex[4].set(fRect.fLeft, fRect.fTop);
}
GrMesh mesh;
@@ -170,65 +151,30 @@
}
void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
- // Handle any color overrides
- if (!overrides.readsColor()) {
- fGeoData[0].fColor = GrColor_ILLEGAL;
- }
- overrides.getOverrideColorIfSet(&fGeoData[0].fColor);
-
- // setup batch properties
- fBatch.fColorIgnored = !overrides.readsColor();
- fBatch.fColor = fGeoData[0].fColor;
- fBatch.fUsesLocalCoords = overrides.readsLocalCoords();
- fBatch.fCoverageIgnored = !overrides.readsCoverage();
+ overrides.getOverrideColorIfSet(&fColor);
+ fOverrides = overrides;
}
- NonAAStrokeRectBatch() : INHERITED(ClassID()) {}
-
- GrColor color() const { return fBatch.fColor; }
- bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
- bool colorIgnored() const { return fBatch.fColorIgnored; }
- const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; }
- bool hairline() const { return fBatch.fHairline; }
- bool coverageIgnored() const { return fBatch.fCoverageIgnored; }
-
bool onCombineIfPossible(GrBatch* t, const GrCaps&) override {
- // if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *t->pipeline(),
- // t->bounds(), caps)) {
- // return false;
- // }
- // GrStrokeRectBatch* that = t->cast<StrokeRectBatch>();
-
// NonAA stroke rects cannot batch right now
// TODO make these batchable
return false;
}
- struct BatchTracker {
- GrColor fColor;
- bool fUsesLocalCoords;
- bool fColorIgnored;
- bool fCoverageIgnored;
- bool fHairline;
- };
+ GrColor fColor;
+ SkMatrix fViewMatrix;
+ SkRect fRect;
+ SkScalar fStrokeWidth;
+
+ GrXPOverridesForBatch fOverrides;
const static int kVertsPerHairlineRect = 5;
const static int kVertsPerStrokeRect = 10;
- BatchTracker fBatch;
- SkSTArray<1, Geometry, true> fGeoData;
typedef GrVertexBatch INHERITED;
};
-// Allow all hairlines and all miters, so long as the miter limit doesn't produce beveled corners.
-inline static bool allowed_stroke(const SkStrokeRec& stroke) {
- SkASSERT(stroke.getStyle() == SkStrokeRec::kStroke_Style ||
- stroke.getStyle() == SkStrokeRec::kHairline_Style);
- return !stroke.getWidth() ||
- (stroke.getJoin() == SkPaint::kMiter_Join && stroke.getMiter() > SK_ScalarSqrt2);
-}
-
namespace GrNonAAStrokeRectBatch {
GrDrawBatch* Create(GrColor color,
@@ -236,16 +182,10 @@
const SkRect& rect,
const SkStrokeRec& stroke,
bool snapToPixelCenters) {
- if (!allowed_stroke(stroke)) {
- return nullptr;
- }
- NonAAStrokeRectBatch* batch = NonAAStrokeRectBatch::Create();
- batch->append(color, viewMatrix, rect, stroke.getWidth());
- batch->init(snapToPixelCenters);
- return batch;
+ return NonAAStrokeRectBatch::Create(color, viewMatrix, rect, stroke, snapToPixelCenters);
}
-};
+}
#ifdef GR_TEST_UTILS