Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(355)

Unified Diff: src/gpu/text/GrAtlasTextBlob.h

Issue 1716443005: Calculate translations to apply to vertices in batch (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/batches/GrAtlasTextBatch.cpp ('k') | src/gpu/text/GrAtlasTextBlob.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/text/GrAtlasTextBlob.h
diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h
index 8b175c8e96042e536b7ea290700012d4246692f3..a026693012a592856cc0951823e9ab2349d36abe 100644
--- a/src/gpu/text/GrAtlasTextBlob.h
+++ b/src/gpu/text/GrAtlasTextBlob.h
@@ -173,8 +173,7 @@ public:
}
}
- bool mustRegenerate(SkScalar* outTransX, SkScalar* outTransY, const SkPaint& paint,
- GrColor color, const SkMaskFilter::BlurRec& blurRec,
+ bool mustRegenerate(const SkPaint& paint, GrColor color, const SkMaskFilter::BlurRec& blurRec,
const SkMatrix& viewMatrix, SkScalar x, SkScalar y);
// flush a GrAtlasTextBlob associated with a SkTextBlob
@@ -189,8 +188,7 @@ public:
const GrClip& clip,
const SkMatrix& viewMatrix,
const SkIRect& clipBounds,
- SkScalar x, SkScalar y,
- SkScalar transX, SkScalar transY);
+ SkScalar x, SkScalar y);
// flush a throwaway GrAtlasTextBlob *not* associated with an SkTextBlob
void flushThrowaway(GrContext* context,
@@ -200,9 +198,12 @@ public:
const SkPaint& skPaint,
const GrPaint& grPaint,
const GrClip& clip,
- const SkIRect& clipBounds);
+ const SkMatrix& viewMatrix,
+ const SkIRect& clipBounds,
+ SkScalar x, SkScalar y);
- void computeSubRunBounds(SkRect* outBounds, int runIndex, int subRunIndex) {
+ void computeSubRunBounds(SkRect* outBounds, int runIndex, int subRunIndex,
+ const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
// We don't yet position distance field text on the cpu, so we have to map the vertex bounds
// into device space.
// We handle vertex bounds differently for distance field text and bitmap text because
@@ -214,8 +215,8 @@ public:
if (subRun.drawAsDistanceFields()) {
// Distance field text is positioned with the (X,Y) as part of the glyph position,
// and currently the view matrix is applied on the GPU
- outBounds->offset(fX - fInitialX, fY - fInitialY);
- fViewMatrix.mapRect(outBounds);
+ outBounds->offset(x - fInitialX, y - fInitialY);
+ viewMatrix.mapRect(outBounds);
} else {
// Bitmap text is fully positioned on the CPU, and offset by an (X,Y) translate in
// device space.
@@ -223,9 +224,9 @@ public:
boundsMatrix.postTranslate(-fInitialX, -fInitialY);
- boundsMatrix.postTranslate(fX, fY);
+ boundsMatrix.postTranslate(x, y);
- boundsMatrix.postConcat(fViewMatrix);
+ boundsMatrix.postConcat(viewMatrix);
boundsMatrix.mapRect(outBounds);
// Due to floating point numerical inaccuracies, we have to round out here
@@ -233,9 +234,6 @@ public:
}
}
- const SkMatrix& viewMatrix() const { return fViewMatrix; }
-
-
// position + local coord
static const size_t kColorTextVASize = sizeof(SkPoint) + sizeof(SkIPoint16);
static const size_t kGrayTextVASize = sizeof(SkPoint) + sizeof(GrColor) + sizeof(SkIPoint16);
@@ -261,7 +259,8 @@ public:
GrBlobRegenHelper *helper, int run, int subRun, SkGlyphCache** cache,
SkTypeface** typeface, GrFontScaler** scaler,
const SkDescriptor** desc, size_t vertexStride,
- GrColor color, SkScalar transX, SkScalar transY,
+ const SkMatrix& viewMatrix, SkScalar x, SkScalar y,
+ GrColor color,
void** vertices, size_t* byteCount, int* glyphCount);
const Key& key() const { return fKey; }
@@ -275,7 +274,7 @@ public:
////////////////////////////////////////////////////////////////////////////////////////////////
// Internal test methods
GrDrawBatch* test_createBatch(int glyphCount, int run, int subRun,
- GrColor color, SkScalar transX, SkScalar transY,
+ const SkMatrix& viewMatrix, SkScalar x, SkScalar y, GrColor color,
const SkPaint& skPaint, const SkSurfaceProps& props,
const GrDistanceFieldAdjustTable* distanceAdjustTable,
GrBatchFontCache* cache);
@@ -290,15 +289,14 @@ private:
SkScalar x, SkScalar y, SkScalar scale, bool applyVM);
inline void flushRun(GrDrawContext* dc, GrPipelineBuilder* pipelineBuilder,
- int run, GrColor color,
- SkScalar transX, SkScalar transY,
+ int run, const SkMatrix& viewMatrix, SkScalar x, SkScalar y, GrColor color,
const SkPaint& skPaint, const SkSurfaceProps& props,
const GrDistanceFieldAdjustTable* distanceAdjustTable,
GrBatchFontCache* cache);
void flushBigGlyphs(GrContext* context, GrDrawContext* dc,
const GrClip& clip, const SkPaint& skPaint,
- SkScalar transX, SkScalar transY,
+ const SkMatrix& viewMatrix, SkScalar x, SkScalar y,
const SkIRect& clipBounds);
void flushRunAsPaths(GrContext* context,
@@ -309,18 +307,23 @@ private:
SkDrawFilter* drawFilter, const SkMatrix& viewMatrix,
const SkIRect& clipBounds, SkScalar x, SkScalar y);
- // This function will only be called when we are regenerating a blob from scratch. We record the
+ // This function will only be called when we are generating a blob from scratch. We record the
// initial view matrix and initial offsets(x,y), because we record vertex bounds relative to
// these numbers. When blobs are reused with new matrices, we need to return to model space so
// we can update the vertex bounds appropriately.
void setupViewMatrix(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
- fViewMatrix = viewMatrix;
+ fInitialViewMatrix = viewMatrix;
if (!viewMatrix.invert(&fInitialViewMatrixInverse)) {
fInitialViewMatrixInverse = SkMatrix::I();
SkDebugf("Could not invert viewmatrix\n");
}
- fX = fInitialX = x;
- fY = fInitialY = y;
+ fInitialX = x;
+ fInitialY = y;
+
+ // make sure all initial subruns have the correct VM and X/Y applied
+ for (int i = 0; i < fRunCount; i++) {
+ fRuns[i].fSubRunInfo[0].init(fInitialViewMatrix, x, y);
+ }
}
/*
@@ -369,12 +372,15 @@ private:
SubRunInfo(const SubRunInfo& that)
: fBulkUseToken(that.fBulkUseToken)
, fStrike(SkSafeRef(that.fStrike.get()))
+ , fCurrentViewMatrix(that.fCurrentViewMatrix)
, fVertexBounds(that.fVertexBounds)
, fAtlasGeneration(that.fAtlasGeneration)
, fVertexStartIndex(that.fVertexStartIndex)
, fVertexEndIndex(that.fVertexEndIndex)
, fGlyphStartIndex(that.fGlyphStartIndex)
, fGlyphEndIndex(that.fGlyphEndIndex)
+ , fX(that.fX)
+ , fY(that.fY)
, fColor(that.fColor)
, fMaskFormat(that.fMaskFormat)
, fDrawAsDistanceFields(that.fDrawAsDistanceFields)
@@ -412,6 +418,9 @@ private:
fVertexStartIndex = prev.vertexEndIndex();
fVertexEndIndex = prev.vertexEndIndex();
+
+ // copy over viewmatrix settings
+ this->init(prev.fCurrentViewMatrix, prev.fX, prev.fY);
}
const SkRect& vertexBounds() const { return fVertexBounds; }
@@ -419,6 +428,16 @@ private:
fVertexBounds.joinNonEmptyArg(glyphBounds);
}
+ void init(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
+ fCurrentViewMatrix = viewMatrix;
+ fX = x;
+ fY = y;
+ }
+
+ // This function assumes the translation will be applied before it is called again
+ void computeTranslation(const SkMatrix& viewMatrix, SkScalar x, SkScalar y,
+ SkScalar*transX, SkScalar* transY);
+
// df properties
void setUseLCDText(bool useLCDText) { fUseLCDText = useLCDText; }
bool hasUseLCDText() const { return fUseLCDText; }
@@ -428,12 +447,15 @@ private:
private:
GrBatchAtlas::BulkUseTokenUpdater fBulkUseToken;
SkAutoTUnref<GrBatchTextStrike> fStrike;
+ SkMatrix fCurrentViewMatrix;
SkRect fVertexBounds;
uint64_t fAtlasGeneration;
size_t fVertexStartIndex;
size_t fVertexEndIndex;
uint32_t fGlyphStartIndex;
uint32_t fGlyphEndIndex;
+ SkScalar fX;
+ SkScalar fY;
GrColor fColor;
GrMaskFormat fMaskFormat;
bool fDrawAsDistanceFields; // df property
@@ -475,7 +497,8 @@ private:
inline GrDrawBatch* createBatch(const Run::SubRunInfo& info,
int glyphCount, int run, int subRun,
- GrColor color, SkScalar transX, SkScalar transY,
+ const SkMatrix& viewMatrix, SkScalar x, SkScalar y,
+ GrColor color,
const SkPaint& skPaint, const SkSurfaceProps& props,
const GrDistanceFieldAdjustTable* distanceAdjustTable,
GrBatchFontCache* cache);
@@ -483,14 +506,14 @@ private:
struct BigGlyph {
BigGlyph(const SkPath& path, SkScalar vx, SkScalar vy, SkScalar scale, bool applyVM)
: fPath(path)
- , fVx(vx)
- , fVy(vy)
, fScale(scale)
+ , fX(vx)
+ , fY(vy)
, fApplyVM(applyVM) {}
SkPath fPath;
- SkScalar fVx;
- SkScalar fVy;
SkScalar fScale;
+ SkScalar fX;
+ SkScalar fY;
bool fApplyVM;
};
@@ -514,14 +537,12 @@ private:
StrokeInfo fStrokeInfo;
SkTArray<BigGlyph> fBigGlyphs;
Key fKey;
- SkMatrix fViewMatrix;
+ SkMatrix fInitialViewMatrix;
SkMatrix fInitialViewMatrixInverse;
size_t fSize;
GrColor fPaintColor;
SkScalar fInitialX;
SkScalar fInitialY;
- SkScalar fX;
- SkScalar fY;
// We can reuse distance field text, but only if the new viewmatrix would not result in
// a mip change. Because there can be multiple runs in a blob, we track the overall
« no previous file with comments | « src/gpu/batches/GrAtlasTextBatch.cpp ('k') | src/gpu/text/GrAtlasTextBlob.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698