Reland "Wrap page index packing in helper methods."
Also simplifies the shaders if we know there's only one atlas texture.
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/266566
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Change-Id: Ibb21fa19b067879da411e9f08e1cc9275627cae9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268302
Reviewed-by: Jim Van Verth <jvanverth@google.com>
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index 7682401..19c90f8 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -197,12 +197,16 @@
auto* blobCoordsRB = reinterpret_cast<const uint16_t*>(blobVertices + 3 * vertexStride +
coordOffset);
// Pull out the texel coordinates and texture index bits
- uint16_t coordsRectL = blobCoordsLT[0] >> 1;
- uint16_t coordsRectT = blobCoordsLT[1] >> 1;
- uint16_t coordsRectR = blobCoordsRB[0] >> 1;
- uint16_t coordsRectB = blobCoordsRB[1] >> 1;
- uint16_t pageIndexX = blobCoordsLT[0] & 0x1;
- uint16_t pageIndexY = blobCoordsLT[1] & 0x1;
+ uint16_t coordsRectL = blobCoordsLT[0];
+ uint16_t coordsRectT = blobCoordsLT[1];
+ uint16_t coordsRectR = blobCoordsRB[0];
+ uint16_t coordsRectB = blobCoordsRB[1];
+ int index0, index1;
+ std::tie(coordsRectL, coordsRectT, index0) =
+ GrDrawOpAtlas::UnpackIndexFromTexCoords(coordsRectL, coordsRectT);
+ std::tie(coordsRectR, coordsRectB, index1) =
+ GrDrawOpAtlas::UnpackIndexFromTexCoords(coordsRectR, coordsRectB);
+ SkASSERT(index0 == index1);
int positionRectWidth = positionRect.width();
int positionRectHeight = positionRect.height();
@@ -228,10 +232,10 @@
positionRect.fBottom -= delta;
// Repack texel coordinates and index
- coordsRectL = coordsRectL << 1 | pageIndexX;
- coordsRectT = coordsRectT << 1 | pageIndexY;
- coordsRectR = coordsRectR << 1 | pageIndexX;
- coordsRectB = coordsRectB << 1 | pageIndexY;
+ std::tie(coordsRectL, coordsRectT) =
+ GrDrawOpAtlas::PackIndexInTexCoords(coordsRectL, coordsRectT, index0);
+ std::tie(coordsRectR, coordsRectB) =
+ GrDrawOpAtlas::PackIndexInTexCoords(coordsRectR, coordsRectB, index1);
// Set new positions and coords
SkPoint* currPosition = reinterpret_cast<SkPoint*>(currVertex);