remove use of initial matrix
This was just wrong. It should be determine perspective
using the matrix that we are drawing with, and not the initial
matrix.
Change-Id: I8410ced714d2c766305656bdbd797f9dea59b71e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/339796
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Herb Derby <herb@google.com>
diff --git a/bench/GlyphQuadFillBench.cpp b/bench/GlyphQuadFillBench.cpp
index 6d3a0fa..f4c61a2 100644
--- a/bench/GlyphQuadFillBench.cpp
+++ b/bench/GlyphQuadFillBench.cpp
@@ -61,7 +61,7 @@
GrAtlasSubRun* subRun = fBlob->subRunList().head()->testingOnly_atlasSubRun();
SkASSERT(subRun);
subRun->testingOnly_packedGlyphIDToGrGlyph(&fCache);
- fVertices.reset(new char[subRun->vertexStride() * subRun->glyphCount() * 4]);
+ fVertices.reset(new char[subRun->vertexStride(view) * subRun->glyphCount() * 4]);
}
void onDraw(int loops, SkCanvas* canvas) override {
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index e868604..88a328b 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -236,7 +236,7 @@
for (const Geometry& geo : fGeometries.items()) {
const GrAtlasSubRun& subRun = geo.fSubRun;
- SkASSERT((int)subRun.vertexStride() == vertexStride);
+ SkASSERT((int) subRun.vertexStride(geo.fDrawMatrix) == vertexStride);
const int subRunEnd = subRun.glyphCount();
for (int subRunCursor = 0; subRunCursor < subRunEnd;) {
diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp
index caf0d6a..8f6a0e1 100644
--- a/src/gpu/text/GrTextBlob.cpp
+++ b/src/gpu/text/GrTextBlob.cpp
@@ -469,7 +469,7 @@
GrAtlasSubRun* testingOnly_atlasSubRun() override;
- size_t vertexStride() const override;
+ size_t vertexStride(const SkMatrix& drawMatrix) const override;
int glyphCount() const override;
@@ -590,7 +590,7 @@
return reuse;
}
-size_t DirectMaskSubRun::vertexStride() const {
+size_t DirectMaskSubRun::vertexStride(const SkMatrix&) const {
if (fMaskFormat != kARGB_GrMaskFormat) {
return sizeof(Mask2DVertex);
} else {
@@ -770,21 +770,21 @@
if (clip.isEmpty()) {
if (fMaskFormat != kARGB_GrMaskFormat) {
using Quad = Mask2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
direct_2D(quadData((Quad*)vertexDst), color, integralOriginOffset);
} else {
using Quad = ARGB2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
generalized_direct_2D(quadData((Quad*)vertexDst), color, integralOriginOffset);
}
} else {
if (fMaskFormat != kARGB_GrMaskFormat) {
using Quad = Mask2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
generalized_direct_2D(quadData((Quad*)vertexDst), color, integralOriginOffset, &clip);
} else {
using Quad = ARGB2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
generalized_direct_2D(quadData((Quad*)vertexDst), color, integralOriginOffset, &clip);
}
}
@@ -853,11 +853,10 @@
GrColor color, const SkMatrix& drawMatrix, SkPoint drawOrigin,
SkIRect clip) const override;
- size_t vertexStride() const override;
+ size_t vertexStride(const SkMatrix& drawMatrix) const override;
int glyphCount() const override;
private:
- bool hasW() const;
// The rectangle that surrounds all the glyph bounding boxes in device space.
SkRect deviceRect(const SkMatrix& drawMatrix, SkPoint drawOrigin) const;
@@ -995,10 +994,10 @@
fVertexData.subspan(offset, count));
};
- if (!this->hasW()) {
+ if (!drawMatrix.hasPerspective()) {
if (fMaskFormat == GrMaskFormat::kARGB_GrMaskFormat) {
using Quad = ARGB2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
fill_transformed_vertices_2D(
quadData((Quad*) vertexDst),
kDstPadding,
@@ -1007,7 +1006,7 @@
matrix);
} else {
using Quad = Mask2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
fill_transformed_vertices_2D(
quadData((Quad*) vertexDst),
kDstPadding,
@@ -1018,7 +1017,7 @@
} else {
if (fMaskFormat == GrMaskFormat::kARGB_GrMaskFormat) {
using Quad = ARGB3DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
fill_transformed_vertices_3D(
quadData((Quad*) vertexDst),
kDstPadding,
@@ -1027,7 +1026,7 @@
matrix);
} else {
using Quad = Mask3DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
fill_transformed_vertices_3D(
quadData((Quad*) vertexDst),
kDstPadding,
@@ -1038,14 +1037,14 @@
}
}
-size_t TransformedMaskSubRun::vertexStride() const {
+size_t TransformedMaskSubRun::vertexStride(const SkMatrix& drawMatrix) const {
switch (fMaskFormat) {
case kA8_GrMaskFormat:
- return this->hasW() ? sizeof(Mask3DVertex) : sizeof(Mask2DVertex);
+ return drawMatrix.hasPerspective() ? sizeof(Mask3DVertex) : sizeof(Mask2DVertex);
case kARGB_GrMaskFormat:
- return this->hasW() ? sizeof(ARGB3DVertex) : sizeof(ARGB2DVertex);
+ return drawMatrix.hasPerspective() ? sizeof(ARGB3DVertex) : sizeof(ARGB2DVertex);
default:
- SkASSERT(!this->hasW());
+ SkASSERT(!drawMatrix.hasPerspective());
return sizeof(Mask2DVertex);
}
SkUNREACHABLE;
@@ -1055,10 +1054,6 @@
return fVertexData.count();
}
-bool TransformedMaskSubRun::hasW() const {
- return fBlob->hasPerspective();
-}
-
SkRect TransformedMaskSubRun::deviceRect(const SkMatrix& drawMatrix, SkPoint drawOrigin) const {
SkRect outBounds = fVertexBounds;
outBounds.offset(drawOrigin);
@@ -1117,12 +1112,10 @@
GrColor color, const SkMatrix& drawMatrix, SkPoint drawOrigin,
SkIRect clip) const override;
- size_t vertexStride() const override;
+ size_t vertexStride(const SkMatrix& drawMatrix) const override;
int glyphCount() const override;
private:
- bool hasW() const;
-
// The rectangle that surrounds all the glyph bounding boxes in device space.
SkRect deviceRect(const SkMatrix& drawMatrix, SkPoint drawOrigin) const;
@@ -1297,8 +1290,8 @@
return fGlyphs.regenerateAtlas(begin, end, fMaskFormat, SK_DistanceFieldInset, target);
}
-size_t SDFTSubRun::vertexStride() const {
- return this->hasW() ? sizeof(Mask3DVertex) : sizeof(Mask2DVertex);
+size_t SDFTSubRun::vertexStride(const SkMatrix& drawMatrix) const {
+ return drawMatrix.hasPerspective() ? sizeof(Mask3DVertex) : sizeof(Mask2DVertex);
}
void SDFTSubRun::fillVertexData(
@@ -1314,9 +1307,9 @@
fVertexData.subspan(offset, count));
};
- if (!this->hasW()) {
+ if (!drawMatrix.hasPerspective()) {
using Quad = Mask2DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
fill_transformed_vertices_2D(
quadData((Quad*) vertexDst),
SK_DistanceFieldInset,
@@ -1325,7 +1318,7 @@
matrix);
} else {
using Quad = Mask3DVertex[4];
- SkASSERT(sizeof(Quad) == this->vertexStride() * kVerticesPerGlyph);
+ SkASSERT(sizeof(Quad) == this->vertexStride(drawMatrix) * kVerticesPerGlyph);
fill_transformed_vertices_3D(
quadData((Quad*) vertexDst),
SK_DistanceFieldInset,
@@ -1339,10 +1332,6 @@
return fVertexData.count();
}
-bool SDFTSubRun::hasW() const {
- return fBlob->hasPerspective();
-}
-
SkRect SDFTSubRun::deviceRect(const SkMatrix& drawMatrix, SkPoint drawOrigin) const {
SkRect outBounds = fVertexBounds;
outBounds.offset(drawOrigin);
diff --git a/src/gpu/text/GrTextBlob.h b/src/gpu/text/GrTextBlob.h
index c4810fc..7d09fed 100644
--- a/src/gpu/text/GrTextBlob.h
+++ b/src/gpu/text/GrTextBlob.h
@@ -174,7 +174,7 @@
virtual ~GrAtlasSubRun() = default;
- virtual size_t vertexStride() const = 0;
+ virtual size_t vertexStride(const SkMatrix& drawMatrix) const = 0;
virtual int glyphCount() const = 0;
virtual std::tuple<const GrClip*, GrOp::Owner>