Clean up GrQuad ctors
Refactor Sk4f transformations into reusable internal function.
Switches the SkRect+SkMatrix ctor to a factory method.
Adds simple constructors for Sk4fs and SkRects w/o transforms.
Bug: skia:
Change-Id: I88a4a5f7304b1cf00d68c7772bb0fc19c97abee3
Reviewed-on: https://skia-review.googlesource.com/c/191569
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/ops/GrDashOp.cpp b/src/gpu/ops/GrDashOp.cpp
index e493607..ca97f29 100644
--- a/src/gpu/ops/GrDashOp.cpp
+++ b/src/gpu/ops/GrDashOp.cpp
@@ -162,7 +162,7 @@
SkScalar radius = SkScalarHalf(strokeWidth) - 0.5f;
SkScalar centerX = SkScalarHalf(endInterval);
- vertices.writeQuad(GrQuad(rect, matrix),
+ vertices.writeQuad(GrQuad::MakeFromRect(rect, matrix),
GrVertexWriter::TriStripFromRect(dashRect),
intervalLength,
radius,
@@ -175,7 +175,7 @@
rectParam.set(halfOffLen + 0.5f, -halfStroke + 0.5f,
halfOffLen + startInterval - 0.5f, halfStroke - 0.5f);
- vertices.writeQuad(GrQuad(rect, matrix),
+ vertices.writeQuad(GrQuad::MakeFromRect(rect, matrix),
GrVertexWriter::TriStripFromRect(dashRect),
intervalLength,
rectParam);
@@ -586,7 +586,7 @@
draws[i].fLineLength, draws[i].fHalfDevStroke, draws[i].fIntervals[0],
draws[i].fIntervals[1], draws[i].fStrokeWidth, capType);
} else {
- vertices.writeQuad(GrQuad(rects[rectIndex], geom.fSrcRotInv));
+ vertices.writeQuad(GrQuad::MakeFromRect(rects[rectIndex], geom.fSrcRotInv));
}
}
rectIndex++;
@@ -599,7 +599,7 @@
draws[i].fIntervals[0], draws[i].fHalfDevStroke, draws[i].fIntervals[0],
draws[i].fIntervals[1], draws[i].fStrokeWidth, capType);
} else {
- vertices.writeQuad(GrQuad(rects[rectIndex], geom.fSrcRotInv));
+ vertices.writeQuad(GrQuad::MakeFromRect(rects[rectIndex], geom.fSrcRotInv));
}
}
rectIndex++;
@@ -612,7 +612,7 @@
draws[i].fIntervals[0], draws[i].fHalfDevStroke, draws[i].fIntervals[0],
draws[i].fIntervals[1], draws[i].fStrokeWidth, capType);
} else {
- vertices.writeQuad(GrQuad(rects[rectIndex], geom.fSrcRotInv));
+ vertices.writeQuad(GrQuad::MakeFromRect(rects[rectIndex], geom.fSrcRotInv));
}
}
rectIndex++;
diff --git a/src/gpu/ops/GrFillRectOp.cpp b/src/gpu/ops/GrFillRectOp.cpp
index bdf1a2e..8dcec21 100644
--- a/src/gpu/ops/GrFillRectOp.cpp
+++ b/src/gpu/ops/GrFillRectOp.cpp
@@ -204,7 +204,8 @@
void* vertices = vdata;
if (fHelper.isTrivial()) {
SkASSERT(fLocalQuads.count() == 0); // No local coords, so send an ignored dummy quad
- static const GrPerspQuad kIgnoredLocal(SkRect::MakeEmpty(), SkMatrix::I());
+ static const GrPerspQuad kIgnoredLocal(SkRect::MakeEmpty());
+
for (int i = 0; i < this->quadCount(); ++i) {
const ColorAndAA& info = fDeviceQuads.metadata(i);
vertices = GrQuadPerEdgeAA::Tessellate(vertices, vertexSpec, fDeviceQuads[i],
@@ -340,9 +341,10 @@
const SkMatrix& viewMatrix,
const SkRect& rect,
const GrUserStencilSettings* stencilSettings) {
+ GrQuadType dstQuadType = GrQuadTypeForTransformedRect(viewMatrix);
return FillRectOp::Make(context, std::move(paint), aaType, edgeAA, stencilSettings,
- GrPerspQuad(rect, viewMatrix), GrQuadTypeForTransformedRect(viewMatrix),
- GrPerspQuad(rect, SkMatrix::I()), GrQuadType::kRect);
+ GrPerspQuad::MakeFromRect(rect, viewMatrix), dstQuadType,
+ GrPerspQuad(rect), GrQuadType::kRect);
}
std::unique_ptr<GrDrawOp> MakePerEdgeWithLocalMatrix(GrRecordingContext* context,
@@ -353,10 +355,11 @@
const SkMatrix& localMatrix,
const SkRect& rect,
const GrUserStencilSettings* stencilSettings) {
+ GrQuadType dstQuadType = GrQuadTypeForTransformedRect(viewMatrix);
GrQuadType localQuadType = GrQuadTypeForTransformedRect(localMatrix);
return FillRectOp::Make(context, std::move(paint), aaType, edgeAA, stencilSettings,
- GrPerspQuad(rect, viewMatrix), GrQuadTypeForTransformedRect(viewMatrix),
- GrPerspQuad(rect, localMatrix), localQuadType);
+ GrPerspQuad::MakeFromRect(rect, viewMatrix), dstQuadType,
+ GrPerspQuad::MakeFromRect(rect, localMatrix), localQuadType);
}
std::unique_ptr<GrDrawOp> MakePerEdgeWithLocalRect(GrRecordingContext* context,
@@ -367,9 +370,10 @@
const SkRect& rect,
const SkRect& localRect,
const GrUserStencilSettings* stencilSettings) {
+ GrQuadType dstQuadType = GrQuadTypeForTransformedRect(viewMatrix);
return FillRectOp::Make(context, std::move(paint), aaType, edgeAA, stencilSettings,
- GrPerspQuad(rect, viewMatrix), GrQuadTypeForTransformedRect(viewMatrix),
- GrPerspQuad(localRect, SkMatrix::I()), GrQuadType::kRect);
+ GrPerspQuad::MakeFromRect(rect, viewMatrix), dstQuadType,
+ GrPerspQuad(localRect), GrQuadType::kRect);
}
std::unique_ptr<GrDrawOp> MakeSet(GrRecordingContext* context,
@@ -385,21 +389,23 @@
paint.setColor4f(quads[0].fColor);
std::unique_ptr<GrDrawOp> op = FillRectOp::Make(context, std::move(paint), aaType,
- quads[0].fAAFlags, stencilSettings, GrPerspQuad(quads[0].fRect, viewMatrix),
- deviceQuadType, GrPerspQuad(quads[0].fRect, quads[0].fLocalMatrix),
+ quads[0].fAAFlags, stencilSettings,
+ GrPerspQuad::MakeFromRect(quads[0].fRect, viewMatrix), deviceQuadType,
+ GrPerspQuad::MakeFromRect(quads[0].fRect, quads[0].fLocalMatrix),
GrQuadTypeForTransformedRect(quads[0].fLocalMatrix));
auto* fillRects = op->cast<FillRectOp>();
// Accumulate remaining quads similar to onCombineIfPossible() without creating an op
for (int i = 1; i < cnt; ++i) {
- GrPerspQuad deviceQuad(quads[i].fRect, viewMatrix);
+ GrPerspQuad deviceQuad = GrPerspQuad::MakeFromRect(quads[i].fRect, viewMatrix);
GrAAType resolvedAA;
GrQuadAAFlags resolvedEdgeFlags;
GrResolveAATypeForQuad(aaType, quads[i].fAAFlags, deviceQuad, deviceQuadType,
&resolvedAA, &resolvedEdgeFlags);
- fillRects->addQuad(deviceQuad, GrPerspQuad(quads[i].fRect, quads[i].fLocalMatrix),
+ fillRects->addQuad(deviceQuad,
+ GrPerspQuad::MakeFromRect(quads[i].fRect, quads[i].fLocalMatrix),
GrQuadTypeForTransformedRect(quads[i].fLocalMatrix), quads[i].fColor,
resolvedEdgeFlags,resolvedAA);
}
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index eb3ee7a..7d7e7c8 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -760,8 +760,7 @@
};
if (fUsesDistanceField && !ctm.hasPerspective()) {
- GrQuad quad(translatedBounds, ctm);
- vertices.writeQuad(quad,
+ vertices.writeQuad(GrQuad::MakeFromRect(translatedBounds, ctm),
color,
texCoords);
} else {
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index 8d44a43..e3c75ce 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -87,7 +87,7 @@
texRect.fTop = h - texRect.fTop;
texRect.fBottom = h - texRect.fBottom;
}
- return GrPerspQuad(texRect, SkMatrix::I());
+ return GrPerspQuad(texRect);
}
/**
@@ -201,7 +201,7 @@
, fFilter(static_cast<unsigned>(filter))
, fFinalized(0) {
GrQuadType quadType = GrQuadTypeForTransformedRect(viewMatrix);
- auto quad = GrPerspQuad(dstRect, viewMatrix);
+ auto quad = GrPerspQuad::MakeFromRect(dstRect, viewMatrix);
// Clean up disparities between the overall aa type and edge configuration and apply
// optimizations based on the rect and matrix when appropriate
@@ -264,7 +264,7 @@
if (!fProxies[p].fProxy->canSkipResourceAllocator()) {
fCanSkipAllocatorGather = static_cast<unsigned>(false);
}
- auto quad = GrPerspQuad(set[p].fDstRect, viewMatrix);
+ auto quad = GrPerspQuad::MakeFromRect(set[p].fDstRect, viewMatrix);
bounds.joinPossiblyEmptyRect(quad.bounds(quadType));
GrQuadAAFlags aaFlags;
// Don't update the overall aaType, might be inappropriate for some of the quads