aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/text/GrAtlasTextContext.cpp121
-rw-r--r--src/gpu/text/GrAtlasTextContext.h26
2 files changed, 61 insertions, 86 deletions
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp
index aca839cf2c..3769b0b439 100644
--- a/src/gpu/text/GrAtlasTextContext.cpp
+++ b/src/gpu/text/GrAtlasTextContext.cpp
@@ -291,41 +291,32 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob,
PerSubRunInfo& subRun = runIdx.fSubRunInfo.back();
subRun.setUseLCDText(runPaint.isLCDRenderText());
subRun.setDrawAsDistanceFields();
+ SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], dfPaint, nullptr, true);
- SkTDArray<char> fallbackTxt;
- SkTDArray<SkScalar> fallbackPos;
- SkPoint dfOffset;
- int scalarsPerPosition = 2;
switch (it.positioning()) {
case SkTextBlob::kDefault_Positioning: {
- this->internalDrawDFText(cacheBlob, run, dfPaint, color, viewMatrix,
+ this->internalDrawDFText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
(const char *)it.glyphs(), textLen,
- x + offset.x(), y + offset.y(), textRatio,
- &fallbackTxt, &fallbackPos, &dfOffset, runPaint);
+ x + offset.x(), y + offset.y(), textRatio, runPaint);
break;
}
case SkTextBlob::kHorizontal_Positioning: {
- scalarsPerPosition = 1;
- dfOffset = SkPoint::Make(x, y + offset.y());
- this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix,
+ SkPoint dfOffset = SkPoint::Make(x, y + offset.y());
+ this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
(const char*)it.glyphs(), textLen, it.pos(),
- scalarsPerPosition, dfOffset, textRatio,
- &fallbackTxt, &fallbackPos);
+ 1, dfOffset, textRatio,
+ runPaint);
break;
}
case SkTextBlob::kFull_Positioning: {
- dfOffset = SkPoint::Make(x, y);
- this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix,
+ SkPoint dfOffset = SkPoint::Make(x, y);
+ this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
(const char*)it.glyphs(), textLen, it.pos(),
- scalarsPerPosition, dfOffset, textRatio,
- &fallbackTxt, &fallbackPos);
+ 2, dfOffset, textRatio, runPaint);
break;
}
}
- if (fallbackTxt.count()) {
- this->fallbackDrawPosText(cacheBlob, run, clip, color, runPaint, viewMatrix,
- fallbackTxt, fallbackPos, scalarsPerPosition, dfOffset);
- }
+ SkGlyphCache::AttachCache(cache);
} else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) {
cacheBlob->fRuns[run].fDrawAsPaths = true;
} else {
@@ -418,7 +409,6 @@ inline void GrAtlasTextContext::initDistanceFieldPaint(GrAtlasTextBlob* blob,
inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob,
int runIndex,
- const GrClip& clip,
GrColor color,
const SkPaint& skPaint,
const SkMatrix& viewMatrix,
@@ -460,11 +450,10 @@ GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint,
}
inline GrAtlasTextBlob*
-GrAtlasTextContext::createDrawTextBlob(const GrClip& clip,
- const GrPaint& paint, const SkPaint& skPaint,
+GrAtlasTextContext::createDrawTextBlob(const GrPaint& paint, const SkPaint& skPaint,
const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
- SkScalar x, SkScalar y, const SkIRect& regionClipBounds) {
+ SkScalar x, SkScalar y) {
int glyphCount = skPaint.countText(text, byteLength);
GrAtlasTextBlob* blob;
@@ -472,17 +461,11 @@ GrAtlasTextContext::createDrawTextBlob(const GrClip& clip,
SkPaint dfPaint;
SkScalar textRatio;
blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio);
+ SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr, true);
- SkTDArray<char> fallbackTxt;
- SkTDArray<SkScalar> fallbackPos;
- SkPoint offset;
- this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text,
- byteLength, x, y, textRatio, &fallbackTxt, &fallbackPos,
- &offset, skPaint);
- if (fallbackTxt.count()) {
- this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix,
- fallbackTxt, fallbackPos, 2, offset);
- }
+ this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text,
+ byteLength, x, y, textRatio, skPaint);
+ SkGlyphCache::AttachCache(cache);
} else {
blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize);
blob->fViewMatrix = viewMatrix;
@@ -496,12 +479,11 @@ GrAtlasTextContext::createDrawTextBlob(const GrClip& clip,
}
inline GrAtlasTextBlob*
-GrAtlasTextContext::createDrawPosTextBlob(const GrClip& clip,
- const GrPaint& paint, const SkPaint& skPaint,
+GrAtlasTextContext::createDrawPosTextBlob(const GrPaint& paint, const SkPaint& skPaint,
const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
const SkScalar pos[], int scalarsPerPosition,
- const SkPoint& offset, const SkIRect& regionClipBounds) {
+ const SkPoint& offset) {
int glyphCount = skPaint.countText(text, byteLength);
GrAtlasTextBlob* blob;
@@ -509,16 +491,12 @@ GrAtlasTextContext::createDrawPosTextBlob(const GrClip& clip,
SkPaint dfPaint;
SkScalar textRatio;
blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio);
+ SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr, true);
- SkTDArray<char> fallbackTxt;
- SkTDArray<SkScalar> fallbackPos;
- this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text,
- byteLength, pos, scalarsPerPosition, offset,
- textRatio, &fallbackTxt, &fallbackPos);
- if (fallbackTxt.count()) {
- this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix,
- fallbackTxt, fallbackPos, scalarsPerPosition, offset);
- }
+ this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text,
+ byteLength, pos, scalarsPerPosition, offset, textRatio,
+ skPaint);
+ SkGlyphCache::AttachCache(cache);
} else {
blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize);
blob->fViewMatrix = viewMatrix;
@@ -538,8 +516,7 @@ void GrAtlasTextContext::onDrawText(GrDrawContext* dc,
const char text[], size_t byteLength,
SkScalar x, SkScalar y, const SkIRect& regionClipBounds) {
SkAutoTUnref<GrAtlasTextBlob> blob(
- this->createDrawTextBlob(clip, paint, skPaint, viewMatrix,
- text, byteLength, x, y, regionClipBounds));
+ this->createDrawTextBlob(paint, skPaint, viewMatrix, text, byteLength, x, y));
blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPaint, paint,
clip, regionClipBounds);
}
@@ -552,24 +529,22 @@ void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc,
const SkScalar pos[], int scalarsPerPosition,
const SkPoint& offset, const SkIRect& regionClipBounds) {
SkAutoTUnref<GrAtlasTextBlob> blob(
- this->createDrawPosTextBlob(clip, paint, skPaint, viewMatrix,
+ this->createDrawPosTextBlob(paint, skPaint, viewMatrix,
text, byteLength,
pos, scalarsPerPosition,
- offset, regionClipBounds));
+ offset));
blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPaint, paint, clip,
regionClipBounds);
}
void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
+ SkGlyphCache* cache,
const SkPaint& skPaint, GrColor color,
const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
SkScalar x, SkScalar y,
SkScalar textRatio,
- SkTDArray<char>* fallbackTxt,
- SkTDArray<SkScalar>* fallbackPos,
- SkPoint* offset,
const SkPaint& origPaint) {
SkASSERT(byteLength == 0 || text != nullptr);
@@ -628,22 +603,22 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
}
x -= alignX;
y -= alignY;
- *offset = SkPoint::Make(x, y);
+ SkPoint offset = SkPoint::Make(x, y);
- this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text, byteLength,
- positions.begin(), 2, *offset, textRatio, fallbackTxt,
- fallbackPos);
+ this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatrix, text, byteLength,
+ positions.begin(), 2, offset, textRatio, origPaint);
}
void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runIndex,
- const SkPaint& skPaint, GrColor color,
+ SkGlyphCache* cache,
+ const SkPaint& skPaint,
+ GrColor color,
const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
const SkScalar pos[], int scalarsPerPosition,
const SkPoint& offset,
SkScalar textRatio,
- SkTDArray<char>* fallbackTxt,
- SkTDArray<SkScalar>* fallbackPos) {
+ const SkPaint& origPaint) {
SkASSERT(byteLength == 0 || text != nullptr);
SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
@@ -653,10 +628,12 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
return;
}
+ SkTDArray<char> fallbackTxt;
+ SkTDArray<SkScalar> fallbackPos;
+
fCurrStrike = nullptr;
SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc();
- SkGlyphCache* cache = this->setupCache(&blob->fRuns[runIndex], skPaint, nullptr, true);
GrFontScaler* fontScaler = GetGrFontScaler(cache);
const char* stop = text + byteLength;
@@ -677,10 +654,10 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
x, y, color, fontScaler,
textRatio, viewMatrix)) {
// couldn't append, send to fallback
- fallbackTxt->append(SkToInt(text-lastText), lastText);
- *fallbackPos->append() = pos[0];
+ fallbackTxt.append(SkToInt(text-lastText), lastText);
+ *fallbackPos.append() = pos[0];
if (2 == scalarsPerPosition) {
- *fallbackPos->append() = pos[1];
+ *fallbackPos.append() = pos[1];
}
}
}
@@ -709,10 +686,10 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
textRatio,
viewMatrix)) {
// couldn't append, send to fallback
- fallbackTxt->append(SkToInt(text-lastText), lastText);
- *fallbackPos->append() = pos[0];
+ fallbackTxt.append(SkToInt(text-lastText), lastText);
+ *fallbackPos.append() = pos[0];
if (2 == scalarsPerPosition) {
- *fallbackPos->append() = pos[1];
+ *fallbackPos.append() = pos[1];
}
}
}
@@ -720,7 +697,10 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
}
}
- SkGlyphCache::AttachCache(cache);
+ if (fallbackTxt.count()) {
+ this->fallbackDrawPosText(blob, runIndex, origPaint.getColor(), origPaint, viewMatrix,
+ fallbackTxt, fallbackPos, scalarsPerPosition, offset);
+ }
}
bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
@@ -803,13 +783,12 @@ DRAW_BATCH_TEST_DEFINE(TextBlobBatch) {
// Setup clip
GrClip clip;
- SkIRect noClip = SkIRect::MakeLargest();
// right now we don't handle textblobs, nor do we handle drawPosText. Since we only
// intend to test the batch with this unit test, that is okay.
SkAutoTUnref<GrAtlasTextBlob> blob(
- gTextContext->createDrawTextBlob(clip, grPaint, skPaint, viewMatrix, text,
- static_cast<size_t>(textLen), 0, 0, noClip));
+ gTextContext->createDrawTextBlob(grPaint, skPaint, viewMatrix, text,
+ static_cast<size_t>(textLen), 0, 0));
SkScalar transX = static_cast<SkScalar>(random->nextU());
SkScalar transY = static_cast<SkScalar>(random->nextU());
diff --git a/src/gpu/text/GrAtlasTextContext.h b/src/gpu/text/GrAtlasTextContext.h
index 47f05404de..e38243d480 100644
--- a/src/gpu/text/GrAtlasTextContext.h
+++ b/src/gpu/text/GrAtlasTextContext.h
@@ -66,29 +66,27 @@ private:
// A helper for drawing BitmapText in a run of distance fields
inline void fallbackDrawPosText(GrAtlasTextBlob*, int runIndex,
- const GrClip&, GrColor color,
+ GrColor color,
const SkPaint&, const SkMatrix& viewMatrix,
const SkTDArray<char>& fallbackTxt,
const SkTDArray<SkScalar>& fallbackPos,
int scalarsPerPosition,
const SkPoint& offset);
- void internalDrawDFText(GrAtlasTextBlob*, int runIndex, const SkPaint&,
+ void internalDrawDFText(GrAtlasTextBlob*, int runIndex,
+ SkGlyphCache*, const SkPaint&,
GrColor color, const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
SkScalar x, SkScalar y,
- SkScalar textRatio,
- SkTDArray<char>* fallbackTxt,
- SkTDArray<SkScalar>* fallbackPos,
- SkPoint* offset, const SkPaint& origPaint);
- void internalDrawDFPosText(GrAtlasTextBlob*, int runIndex, const SkPaint&,
+ SkScalar textRatio, const SkPaint& origPaint);
+ void internalDrawDFPosText(GrAtlasTextBlob*, int runIndex,
+ SkGlyphCache*, const SkPaint&,
GrColor color, const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
const SkScalar pos[], int scalarsPerPosition,
const SkPoint& offset,
SkScalar textRatio,
- SkTDArray<char>* fallbackTxt,
- SkTDArray<SkScalar>* fallbackPos);
+ const SkPaint& origPaint);
// sets up the descriptor on the blob and returns a detached cache. Client must attach
inline static GrColor ComputeCanonicalColor(const SkPaint&, bool lcd);
@@ -104,17 +102,15 @@ private:
// Test methods
// TODO this is really ugly. It'd be much nicer if positioning could be moved to batch
- inline GrAtlasTextBlob* createDrawTextBlob(const GrClip&, const GrPaint&,
+ inline GrAtlasTextBlob* createDrawTextBlob(const GrPaint&,
const SkPaint&, const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
- SkScalar x, SkScalar y,
- const SkIRect& regionClipBounds);
- inline GrAtlasTextBlob* createDrawPosTextBlob(const GrClip&, const GrPaint&,
+ SkScalar x, SkScalar y);
+ inline GrAtlasTextBlob* createDrawPosTextBlob(const GrPaint&,
const SkPaint&, const SkMatrix& viewMatrix,
const char text[], size_t byteLength,
const SkScalar pos[], int scalarsPerPosition,
- const SkPoint& offset,
- const SkIRect& regionClipBounds);
+ const SkPoint& offset);
const GrDistanceFieldAdjustTable* dfAdjustTable() const { return fDistanceAdjustTable; }
GrBatchTextStrike* fCurrStrike;