aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gpu/ops/GrSmallPathRenderer.cpp59
-rw-r--r--src/gpu/ops/GrSmallPathRenderer.h7
2 files changed, 23 insertions, 43 deletions
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index adccdb55a4..69cd669abb 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -277,10 +277,9 @@ private:
const Entry& args = fShapes[i];
ShapeData* shapeData;
- SkScalar maxScale;
if (fUsesDistanceField) {
// get mip level
- maxScale = SkScalarAbs(this->viewMatrix().getMaxScale());
+ SkScalar maxScale = SkScalarAbs(this->viewMatrix().getMaxScale());
const SkRect& bounds = args.fShape.bounds();
SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height());
// We try to create the DF at a 2^n scaled path resolution (1/2, 1, 2, 4, etc.)
@@ -361,7 +360,6 @@ private:
continue;
}
}
- maxScale = 1;
}
atlas->setLastUseToken(shapeData->fID, target->nextDrawToken());
@@ -371,7 +369,6 @@ private:
offset,
args.fColor,
vertexStride,
- maxScale,
args.fTranslate,
shapeData);
offset += kVerticesPerQuad * vertexStride;
@@ -407,11 +404,13 @@ private:
int width = devPathBounds.width() + 2*intPad;
int height = devPathBounds.height() + 2*intPad;
devPathBounds = SkIRect::MakeWH(width, height);
+ SkScalar translateX = intPad - dx;
+ SkScalar translateY = intPad - dy;
// draw path to bitmap
SkMatrix drawMatrix;
drawMatrix.setScale(scale, scale);
- drawMatrix.postTranslate(intPad - dx, intPad - dy);
+ drawMatrix.postTranslate(translateX, translateY);
SkASSERT(devPathBounds.fLeft == 0);
SkASSERT(devPathBounds.fTop == 0);
@@ -481,14 +480,17 @@ private:
shapeData->fID = id;
// set the bounds rect to the original bounds
- shapeData->fBounds = bounds;
+ shapeData->fBounds = SkRect::Make(devPathBounds);
+ shapeData->fBounds.offset(-translateX, -translateY);
+ shapeData->fBounds.fLeft /= scale;
+ shapeData->fBounds.fTop /= scale;
+ shapeData->fBounds.fRight /= scale;
+ shapeData->fBounds.fBottom /= scale;
- // set up path to texture coordinate transform
- shapeData->fScale = scale;
- dx -= SK_DistanceFieldPad + kAntiAliasPad;
- dy -= SK_DistanceFieldPad + kAntiAliasPad;
- shapeData->fTranslate.fX = atlasLocation.fX - dx;
- shapeData->fTranslate.fY = atlasLocation.fY - dy;
+ shapeData->fTextureCoords.set(atlasLocation.fX+SK_DistanceFieldPad,
+ atlasLocation.fY+SK_DistanceFieldPad,
+ atlasLocation.fX+SK_DistanceFieldPad+devPathBounds.width(),
+ atlasLocation.fY+SK_DistanceFieldPad+devPathBounds.height());
fShapeCache->add(shapeData);
fShapeList->addToTail(shapeData);
@@ -573,14 +575,11 @@ private:
shapeData->fKey.set(shape, ctm);
shapeData->fID = id;
- // set the bounds rect to the original bounds
shapeData->fBounds = SkRect::Make(devPathBounds);
shapeData->fBounds.offset(-translateX, -translateY);
- // set up path to texture coordinate transform
- shapeData->fScale = SK_Scalar1;
- shapeData->fTranslate.fX = atlasLocation.fX + translateX;
- shapeData->fTranslate.fY = atlasLocation.fY + translateY;
+ shapeData->fTextureCoords.set(atlasLocation.fX, atlasLocation.fY,
+ atlasLocation.fX+width, atlasLocation.fY+height);
fShapeCache->add(shapeData);
fShapeList->addToTail(shapeData);
@@ -595,17 +594,11 @@ private:
intptr_t offset,
GrColor color,
size_t vertexStride,
- SkScalar maxScale,
const SkVector& preTranslate,
const ShapeData* shapeData) const {
SkPoint* positions = reinterpret_cast<SkPoint*>(offset);
SkRect bounds = shapeData->fBounds;
- if (fUsesDistanceField) {
- // outset bounds to include ~1 pixel of AA in device space
- SkScalar outset = SkScalarInvert(maxScale);
- bounds.outset(outset, outset);
- }
// vertex positions
// TODO make the vertex attributes a struct
@@ -622,22 +615,10 @@ private:
}
// set up texture coordinates
- SkScalar texLeft = bounds.fLeft;
- SkScalar texTop = bounds.fTop;
- SkScalar texRight = bounds.fRight;
- SkScalar texBottom = bounds.fBottom;
-
- // transform original path's bounds to texture space
- SkScalar scale = shapeData->fScale;
- const SkVector& translate = shapeData->fTranslate;
- texLeft *= scale;
- texTop *= scale;
- texRight *= scale;
- texBottom *= scale;
- texLeft += translate.fX;
- texTop += translate.fY;
- texRight += translate.fX;
- texBottom += translate.fY;
+ SkScalar texLeft = shapeData->fTextureCoords.fLeft;
+ SkScalar texTop = shapeData->fTextureCoords.fTop;
+ SkScalar texRight = shapeData->fTextureCoords.fRight;
+ SkScalar texBottom = shapeData->fTextureCoords.fBottom;
// convert texcoords to unsigned short format
sk_sp<GrTextureProxy> proxy = atlas->getProxy();
diff --git a/src/gpu/ops/GrSmallPathRenderer.h b/src/gpu/ops/GrSmallPathRenderer.h
index 59006159f4..d10c4baa86 100644
--- a/src/gpu/ops/GrSmallPathRenderer.h
+++ b/src/gpu/ops/GrSmallPathRenderer.h
@@ -105,11 +105,10 @@ private:
// the matrix for the path with only fractional translation.
SkAutoSTArray<24, uint32_t> fKey;
};
- Key fKey;
+ Key fKey;
GrDrawOpAtlas::AtlasID fID;
- SkRect fBounds;
- SkScalar fScale;
- SkVector fTranslate;
+ SkRect fBounds;
+ GrIRect16 fTextureCoords;
SK_DECLARE_INTERNAL_LLIST_INTERFACE(ShapeData);
static inline const Key& GetKey(const ShapeData& data) {