aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar cdalton <cdalton@nvidia.com>2014-11-07 06:02:15 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2014-11-07 06:02:15 -0800
commit38e13adc18555f8e75f5ae6762e7c307214ae37f (patch)
tree88c3fb2665673b5b328964eb0b0b661dee433670
parentaa30ab3079ad3c1f408e3f170dac1cdd42ed2b62 (diff)
Remove 1d glyph positions from nvpr text
Removes the case for x-only glyph positions from nvpr text, opting to always send 2d glyph positions instead. The 1d glyph positions saved a bit on memory bandwidth, but ended up a net loss because they required more updates to the view matrix. Now we can draw an entire paragraph without touching the GL state, whereas before we would have to update the view matrix at every new line. BUG=skia: Review URL: https://codereview.chromium.org/700283002
-rw-r--r--src/gpu/GrStencilAndCoverTextContext.cpp81
-rw-r--r--src/gpu/GrStencilAndCoverTextContext.h6
2 files changed, 20 insertions, 67 deletions
diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp
index 94a6c2e528..14a14a0474 100644
--- a/src/gpu/GrStencilAndCoverTextContext.cpp
+++ b/src/gpu/GrStencilAndCoverTextContext.cpp
@@ -88,7 +88,7 @@ void GrStencilAndCoverTextContext::onDrawText(const GrPaint& paint,
// will turn off the use of device-space glyphs when perspective transforms
// are in use.
- this->init(paint, skPaint, byteLength, kMaxAccuracy_RenderMode, SkPoint::Make(0, 0));
+ this->init(paint, skPaint, byteLength, kMaxAccuracy_RenderMode);
// Transform our starting point.
if (fNeedsDeviceSpaceGlyphs) {
@@ -100,8 +100,6 @@ void GrStencilAndCoverTextContext::onDrawText(const GrPaint& paint,
SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc();
- fTransformType = GrPathRendering::kTranslate_PathTransformType;
-
const char* stop = text + byteLength;
// Measure first if needed.
@@ -175,49 +173,25 @@ void GrStencilAndCoverTextContext::onDrawPosText(const GrPaint& paint,
// transform is not part of SkPaint::measureText API, and thus we use the
// same glyphs as what were measured.
- this->init(paint, skPaint, byteLength, kMaxPerformance_RenderMode, offset);
+ this->init(paint, skPaint, byteLength, kMaxPerformance_RenderMode);
SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc();
const char* stop = text + byteLength;
- if (SkPaint::kLeft_Align == fSkPaint.getTextAlign()) {
- if (1 == scalarsPerPosition) {
- fTransformType = GrPathRendering::kTranslateX_PathTransformType;
- while (text < stop) {
- const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &text, 0, 0);
- if (glyph.fWidth) {
- this->appendGlyph(glyph.getGlyphID(), *pos);
- }
- pos++;
- }
- } else {
- SkASSERT(2 == scalarsPerPosition);
- fTransformType = GrPathRendering::kTranslate_PathTransformType;
- while (text < stop) {
- const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &text, 0, 0);
- if (glyph.fWidth) {
- this->appendGlyph(glyph.getGlyphID(), pos[0], pos[1]);
- }
- pos += 2;
- }
- }
- } else {
- fTransformType = GrPathRendering::kTranslate_PathTransformType;
- SkTextMapStateProc tmsProc(SkMatrix::I(), SkPoint::Make(0, 0), scalarsPerPosition);
- SkTextAlignProcScalar alignProc(fSkPaint.getTextAlign());
- while (text < stop) {
- const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &text, 0, 0);
- if (glyph.fWidth) {
- SkPoint tmsLoc;
- tmsProc(pos, &tmsLoc);
- SkPoint loc;
- alignProc(tmsLoc, glyph, &loc);
-
- this->appendGlyph(glyph.getGlyphID(), loc.x(), loc.y());
- }
- pos += scalarsPerPosition;
+ SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition);
+ SkTextAlignProcScalar alignProc(fSkPaint.getTextAlign());
+ while (text < stop) {
+ const SkGlyph& glyph = glyphCacheProc(fGlyphCache, &text, 0, 0);
+ if (glyph.fWidth) {
+ SkPoint tmsLoc;
+ tmsProc(pos, &tmsLoc);
+ SkPoint loc;
+ alignProc(tmsLoc, glyph, &loc);
+
+ this->appendGlyph(glyph.getGlyphID(), loc.x(), loc.y());
}
+ pos += scalarsPerPosition;
}
this->finish();
@@ -250,8 +224,7 @@ static GrPathRange* get_gr_glyphs(GrContext* ctx,
void GrStencilAndCoverTextContext::init(const GrPaint& paint,
const SkPaint& skPaint,
size_t textByteLength,
- RenderMode renderMode,
- const SkPoint& textTranslate) {
+ RenderMode renderMode) {
GrTextContext::init(paint, skPaint);
fContextInitialMatrix = fContext->getMatrix();
@@ -267,7 +240,6 @@ void GrStencilAndCoverTextContext::init(const GrPaint& paint,
if (fNeedsDeviceSpaceGlyphs) {
// SkDraw::ShouldDrawTextAsPaths takes care of perspective transforms.
SkASSERT(!fContextInitialMatrix.hasPerspective());
- SkASSERT(textTranslate.isZero()); // TODO: Handle textTranslate in device-space usecase.
fTextRatio = fTextInverseRatio = 1.0f;
@@ -349,9 +321,8 @@ void GrStencilAndCoverTextContext::init(const GrPaint& paint,
}
SkMatrix textMatrix;
- textMatrix.setTranslate(textTranslate.x(), textTranslate.y());
// Glyphs loaded by GPU path rendering have an inverted y-direction.
- textMatrix.preScale(fTextRatio, -fTextRatio);
+ textMatrix.setScale(fTextRatio, -fTextRatio);
fPaint.localCoordChange(textMatrix);
fContext->concatMatrix(textMatrix);
@@ -380,22 +351,7 @@ void GrStencilAndCoverTextContext::init(const GrPaint& paint,
SkASSERT(0 == fPendingGlyphCount);
}
-inline void GrStencilAndCoverTextContext::appendGlyph(uint16_t glyphID, float x) {
- SkASSERT(GrPathRendering::kTranslateX_PathTransformType == fTransformType);
-
- if (fPendingGlyphCount >= kGlyphBufferSize) {
- this->flush();
- }
-
- fIndexBuffer[fPendingGlyphCount] = glyphID;
- fTransformBuffer[fPendingGlyphCount] = fTextInverseRatio * x;
-
- ++fPendingGlyphCount;
-}
-
inline void GrStencilAndCoverTextContext::appendGlyph(uint16_t glyphID, float x, float y) {
- SkASSERT(GrPathRendering::kTranslate_PathTransformType == fTransformType);
-
if (fPendingGlyphCount >= kGlyphBufferSize) {
this->flush();
}
@@ -412,8 +368,9 @@ void GrStencilAndCoverTextContext::flush() {
return;
}
- fDrawTarget->drawPaths(fGlyphs, fIndexBuffer, fPendingGlyphCount,
- fTransformBuffer, fTransformType, GrPathRendering::kWinding_FillType);
+ fDrawTarget->drawPaths(fGlyphs, fIndexBuffer, fPendingGlyphCount, fTransformBuffer,
+ GrPathRendering::kTranslate_PathTransformType,
+ GrPathRendering::kWinding_FillType);
fPendingGlyphCount = 0;
}
diff --git a/src/gpu/GrStencilAndCoverTextContext.h b/src/gpu/GrStencilAndCoverTextContext.h
index 40d38c2375..535ebdbbb8 100644
--- a/src/gpu/GrStencilAndCoverTextContext.h
+++ b/src/gpu/GrStencilAndCoverTextContext.h
@@ -59,7 +59,6 @@ private:
GrPathRange* fGlyphs;
uint32_t fIndexBuffer[kGlyphBufferSize];
float fTransformBuffer[2 * kGlyphBufferSize];
- GrDrawTarget::PathTransformType fTransformType;
int fPendingGlyphCount;
SkMatrix fContextInitialMatrix;
bool fNeedsDeviceSpaceGlyphs;
@@ -76,10 +75,7 @@ private:
const SkScalar pos[], int scalarsPerPosition,
const SkPoint& offset) SK_OVERRIDE;
- void init(const GrPaint&, const SkPaint&, size_t textByteLength,
- RenderMode, const SkPoint& textTranslate);
- void initGlyphs(SkGlyphCache* cache);
- void appendGlyph(uint16_t glyphID, float x);
+ void init(const GrPaint&, const SkPaint&, size_t textByteLength, RenderMode);
void appendGlyph(uint16_t glyphID, float x, float y);
void flush();
void finish();