Index: src/gpu/GrAtlasTextContext.cpp |
diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp |
index 163601e836358bc482e97c1f4f9750e531450cf2..7d0d93684cd206758114f21f1d4a5f060c3f7868 100644 |
--- a/src/gpu/GrAtlasTextContext.cpp |
+++ b/src/gpu/GrAtlasTextContext.cpp |
@@ -149,11 +149,7 @@ GrAtlasTextContext* GrAtlasTextContext::Create(GrContext* context, |
return new GrAtlasTextContext(context, surfaceProps); |
} |
-bool GrAtlasTextContext::canDraw(const GrRenderTarget*, |
- const GrClip&, |
- const GrPaint&, |
- const SkPaint& skPaint, |
- const SkMatrix& viewMatrix) { |
+bool GrAtlasTextContext::canDraw(const SkPaint& skPaint, const SkMatrix& viewMatrix) { |
return this->canDrawAsDistanceFields(skPaint, viewMatrix) || |
!SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix); |
} |
@@ -335,9 +331,6 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, GrRenderTarget* rt, |
cacheBlob.reset(SkSafeRef(fCache->find(key))); |
} |
- SkIRect clipRect; |
- clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); |
- |
SkScalar transX = 0.f; |
SkScalar transY = 0.f; |
@@ -358,7 +351,7 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, GrRenderTarget* rt, |
cacheBlob.reset(SkRef(fCache->createCachedBlob(blob, key, blurRec, skPaint, |
GrAtlasTextBatch::kGrayTextVASize))); |
this->regenerateTextBlob(cacheBlob, skPaint, grPaint.getColor(), viewMatrix, |
- blob, x, y, drawFilter, clipRect, rt, clip); |
+ blob, x, y, drawFilter, clip); |
} else { |
// If we can reuse the blob, then make sure we update the blob's viewmatrix, and x/y |
// offsets. Note, we offset the vertex bounds right before flushing |
@@ -375,7 +368,7 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, GrRenderTarget* rt, |
kGrayTextVASize)); |
GrTextBlobCache::SetupCacheBlobKey(sanityBlob, key, blurRec, skPaint); |
this->regenerateTextBlob(sanityBlob, skPaint, grPaint.getColor(), viewMatrix, |
- blob, x, y, drawFilter, clipRect, rt, clip); |
+ blob, x, y, drawFilter, clip); |
GrAtlasTextBlob::AssertEqual(*sanityBlob, *cacheBlob); |
} |
@@ -389,7 +382,7 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, GrRenderTarget* rt, |
cacheBlob.reset(fCache->createBlob(blob, GrAtlasTextBatch::kGrayTextVASize)); |
} |
this->regenerateTextBlob(cacheBlob, skPaint, grPaint.getColor(), viewMatrix, |
- blob, x, y, drawFilter, clipRect, rt, clip); |
+ blob, x, y, drawFilter, clip); |
} |
this->flush(blob, cacheBlob, dc, rt, skPaint, grPaint, drawFilter, |
@@ -439,8 +432,8 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, |
const SkPaint& skPaint, GrColor color, |
const SkMatrix& viewMatrix, |
const SkTextBlob* blob, SkScalar x, SkScalar y, |
- SkDrawFilter* drawFilter, const SkIRect& clipRect, |
- GrRenderTarget* rt, const GrClip& clip) { |
+ SkDrawFilter* drawFilter, |
+ const GrClip& clip) { |
// The color here is the GrPaint color, and it is used to determine whether we |
// have to regenerate LCD text blobs. |
// We use this color vs the SkPaint color because it has the colorfilter applied. |
@@ -498,7 +491,7 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, |
case SkTextBlob::kDefault_Positioning: { |
this->internalDrawDFText(cacheBlob, run, dfPaint, color, viewMatrix, |
(const char *)it.glyphs(), textLen, |
- x + offset.x(), y + offset.y(), clipRect, textRatio, |
+ x + offset.x(), y + offset.y(), textRatio, |
&fallbackTxt, &fallbackPos, &dfOffset, runPaint); |
break; |
} |
@@ -507,7 +500,7 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, |
dfOffset = SkPoint::Make(x, y + offset.y()); |
this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, |
(const char*)it.glyphs(), textLen, it.pos(), |
- scalarsPerPosition, dfOffset, clipRect, textRatio, |
+ scalarsPerPosition, dfOffset, textRatio, |
&fallbackTxt, &fallbackPos); |
break; |
} |
@@ -515,15 +508,14 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, |
dfOffset = SkPoint::Make(x, y); |
this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, |
(const char*)it.glyphs(), textLen, it.pos(), |
- scalarsPerPosition, dfOffset, clipRect, textRatio, |
+ scalarsPerPosition, dfOffset, textRatio, |
&fallbackTxt, &fallbackPos); |
break; |
} |
} |
if (fallbackTxt.count()) { |
- this->fallbackDrawPosText(cacheBlob, run, rt, clip, color, runPaint, viewMatrix, |
- fallbackTxt, fallbackPos, scalarsPerPosition, dfOffset, |
- clipRect); |
+ this->fallbackDrawPosText(cacheBlob, run, clip, color, runPaint, viewMatrix, |
+ fallbackTxt, fallbackPos, scalarsPerPosition, dfOffset); |
} |
} else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) { |
cacheBlob->fRuns[run].fDrawAsPaths = true; |
@@ -535,17 +527,17 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, |
case SkTextBlob::kDefault_Positioning: |
this->internalDrawBMPText(cacheBlob, run, cache, runPaint, color, viewMatrix, |
(const char *)it.glyphs(), textLen, |
- x + offset.x(), y + offset.y(), clipRect); |
+ x + offset.x(), y + offset.y()); |
break; |
case SkTextBlob::kHorizontal_Positioning: |
this->internalDrawBMPPosText(cacheBlob, run, cache, runPaint, color, viewMatrix, |
(const char*)it.glyphs(), textLen, it.pos(), 1, |
- SkPoint::Make(x, y + offset.y()), clipRect); |
+ SkPoint::Make(x, y + offset.y())); |
break; |
case SkTextBlob::kFull_Positioning: |
this->internalDrawBMPPosText(cacheBlob, run, cache, runPaint, color, viewMatrix, |
(const char*)it.glyphs(), textLen, it.pos(), 2, |
- SkPoint::Make(x, y), clipRect); |
+ SkPoint::Make(x, y)); |
break; |
} |
SkGlyphCache::AttachCache(cache); |
@@ -614,15 +606,14 @@ inline void GrAtlasTextContext::initDistanceFieldPaint(GrAtlasTextBlob* blob, |
inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob, |
int runIndex, |
- GrRenderTarget* rt, const GrClip& clip, |
+ const GrClip& clip, |
GrColor color, |
const SkPaint& skPaint, |
const SkMatrix& viewMatrix, |
const SkTDArray<char>& fallbackTxt, |
const SkTDArray<SkScalar>& fallbackPos, |
int scalarsPerPosition, |
- const SkPoint& offset, |
- const SkIRect& clipRect) { |
+ const SkPoint& offset) { |
SkASSERT(fallbackTxt.count()); |
blob->setHasBitmap(); |
Run& run = blob->fRuns[runIndex]; |
@@ -635,7 +626,7 @@ inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob, |
run.fOverrideDescriptor->getDesc()); |
this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, color, viewMatrix, |
fallbackTxt.begin(), fallbackTxt.count(), |
- fallbackPos.begin(), scalarsPerPosition, offset, clipRect); |
+ fallbackPos.begin(), scalarsPerPosition, offset); |
SkGlyphCache::AttachCache(cache); |
} |
@@ -657,14 +648,12 @@ GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, |
} |
inline GrAtlasTextBlob* |
-GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, |
+GrAtlasTextContext::createDrawTextBlob(const GrClip& clip, |
const GrPaint& paint, const SkPaint& skPaint, |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
SkScalar x, SkScalar y, const SkIRect& regionClipBounds) { |
int glyphCount = skPaint.countText(text, byteLength); |
- SkIRect clipRect; |
- clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); |
GrAtlasTextBlob* blob; |
if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { |
@@ -676,11 +665,11 @@ GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, |
SkTDArray<SkScalar> fallbackPos; |
SkPoint offset; |
this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text, |
- byteLength, x, y, clipRect, textRatio, &fallbackTxt, &fallbackPos, |
+ byteLength, x, y, textRatio, &fallbackTxt, &fallbackPos, |
&offset, skPaint); |
if (fallbackTxt.count()) { |
- this->fallbackDrawPosText(blob, 0, rt, clip, paint.getColor(), skPaint, viewMatrix, |
- fallbackTxt, fallbackPos, 2, offset, clipRect); |
+ this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix, |
+ fallbackTxt, fallbackPos, 2, offset); |
} |
} else { |
blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBatch::kGrayTextVASize); |
@@ -688,14 +677,14 @@ GrAtlasTextContext::createDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, |
SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix, false); |
this->internalDrawBMPText(blob, 0, cache, skPaint, paint.getColor(), viewMatrix, text, |
- byteLength, x, y, clipRect); |
+ byteLength, x, y); |
SkGlyphCache::AttachCache(cache); |
} |
return blob; |
} |
inline GrAtlasTextBlob* |
-GrAtlasTextContext::createDrawPosTextBlob(GrRenderTarget* rt, const GrClip& clip, |
+GrAtlasTextContext::createDrawPosTextBlob(const GrClip& clip, |
const GrPaint& paint, const SkPaint& skPaint, |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
@@ -703,9 +692,6 @@ GrAtlasTextContext::createDrawPosTextBlob(GrRenderTarget* rt, const GrClip& clip |
const SkPoint& offset, const SkIRect& regionClipBounds) { |
int glyphCount = skPaint.countText(text, byteLength); |
- SkIRect clipRect; |
- clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); |
- |
GrAtlasTextBlob* blob; |
if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { |
SkPaint dfPaint; |
@@ -715,19 +701,18 @@ GrAtlasTextContext::createDrawPosTextBlob(GrRenderTarget* rt, const GrClip& clip |
SkTDArray<char> fallbackTxt; |
SkTDArray<SkScalar> fallbackPos; |
this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text, |
- byteLength, pos, scalarsPerPosition, offset, clipRect, |
+ byteLength, pos, scalarsPerPosition, offset, |
textRatio, &fallbackTxt, &fallbackPos); |
if (fallbackTxt.count()) { |
- this->fallbackDrawPosText(blob, 0, rt, clip, paint.getColor(), skPaint, viewMatrix, |
- fallbackTxt, fallbackPos, scalarsPerPosition, offset, |
- clipRect); |
+ this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix, |
+ fallbackTxt, fallbackPos, scalarsPerPosition, offset); |
} |
} else { |
blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBatch::kGrayTextVASize); |
blob->fViewMatrix = viewMatrix; |
SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix, false); |
this->internalDrawBMPPosText(blob, 0, cache, skPaint, paint.getColor(), viewMatrix, text, |
- byteLength, pos, scalarsPerPosition, offset, clipRect); |
+ byteLength, pos, scalarsPerPosition, offset); |
SkGlyphCache::AttachCache(cache); |
} |
return blob; |
@@ -740,7 +725,7 @@ void GrAtlasTextContext::onDrawText(GrDrawContext* dc, GrRenderTarget* rt, |
const char text[], size_t byteLength, |
SkScalar x, SkScalar y, const SkIRect& regionClipBounds) { |
SkAutoTUnref<GrAtlasTextBlob> blob( |
- this->createDrawTextBlob(rt, clip, paint, skPaint, viewMatrix, |
+ this->createDrawTextBlob(clip, paint, skPaint, viewMatrix, |
text, byteLength, x, y, regionClipBounds)); |
this->flush(blob, dc, rt, skPaint, paint, clip, regionClipBounds); |
} |
@@ -753,7 +738,7 @@ void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc, GrRenderTarget* rt, |
const SkScalar pos[], int scalarsPerPosition, |
const SkPoint& offset, const SkIRect& regionClipBounds) { |
SkAutoTUnref<GrAtlasTextBlob> blob( |
- this->createDrawPosTextBlob(rt, clip, paint, skPaint, viewMatrix, |
+ this->createDrawPosTextBlob(clip, paint, skPaint, viewMatrix, |
text, byteLength, |
pos, scalarsPerPosition, |
offset, regionClipBounds)); |
@@ -766,7 +751,7 @@ void GrAtlasTextContext::internalDrawBMPText(GrAtlasTextBlob* blob, int runIndex |
GrColor color, |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
- SkScalar x, SkScalar y, const SkIRect& clipRect) { |
+ SkScalar x, SkScalar y) { |
SkASSERT(byteLength == 0 || text != nullptr); |
// nothing to draw |
@@ -788,7 +773,7 @@ void GrAtlasTextContext::internalDrawBMPText(GrAtlasTextBlob* blob, int runIndex |
this->bmpAppendGlyph( |
blob, runIndex, glyph, |
SkScalarFloorToInt(position.fX), SkScalarFloorToInt(position.fY), |
- color, fontScaler, clipRect); |
+ color, fontScaler); |
} |
); |
} |
@@ -799,7 +784,7 @@ void GrAtlasTextContext::internalDrawBMPPosText(GrAtlasTextBlob* blob, int runIn |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
const SkScalar pos[], int scalarsPerPosition, |
- const SkPoint& offset, const SkIRect& clipRect) { |
+ const SkPoint& offset) { |
SkASSERT(byteLength == 0 || text != nullptr); |
SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
@@ -822,7 +807,7 @@ void GrAtlasTextContext::internalDrawBMPPosText(GrAtlasTextBlob* blob, int runIn |
this->bmpAppendGlyph( |
blob, runIndex, glyph, |
SkScalarFloorToInt(position.fX), SkScalarFloorToInt(position.fY), |
- color, fontScaler, clipRect); |
+ color, fontScaler); |
} |
); |
} |
@@ -831,7 +816,7 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, |
const SkPaint& skPaint, GrColor color, |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
- SkScalar x, SkScalar y, const SkIRect& clipRect, |
+ SkScalar x, SkScalar y, |
SkScalar textRatio, |
SkTDArray<char>* fallbackTxt, |
SkTDArray<SkScalar>* fallbackPos, |
@@ -897,7 +882,7 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, |
*offset = SkPoint::Make(x, y); |
this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text, byteLength, |
- positions.begin(), 2, *offset, clipRect, textRatio, fallbackTxt, |
+ positions.begin(), 2, *offset, textRatio, fallbackTxt, |
fallbackPos); |
} |
@@ -906,7 +891,7 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd |
const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, |
const SkScalar pos[], int scalarsPerPosition, |
- const SkPoint& offset, const SkIRect& clipRect, |
+ const SkPoint& offset, |
SkScalar textRatio, |
SkTDArray<char>* fallbackTxt, |
SkTDArray<SkScalar>* fallbackPos) { |
@@ -940,7 +925,7 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd |
if (!this->dfAppendGlyph(blob, |
runIndex, |
glyph, |
- x, y, color, fontScaler, clipRect, |
+ x, y, color, fontScaler, |
textRatio, viewMatrix)) { |
// couldn't append, send to fallback |
fallbackTxt->append(SkToInt(text-lastText), lastText); |
@@ -972,7 +957,6 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd |
glyph, |
x - advanceX, y - advanceY, color, |
fontScaler, |
- clipRect, |
textRatio, |
viewMatrix)) { |
// couldn't append, send to fallback |
@@ -992,8 +976,7 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd |
void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
const SkGlyph& skGlyph, |
- int vx, int vy, GrColor color, GrFontScaler* scaler, |
- const SkIRect& clipRect) { |
+ int vx, int vy, GrColor color, GrFontScaler* scaler) { |
Run& run = blob->fRuns[runIndex]; |
if (!fCurrStrike) { |
fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
@@ -1015,18 +998,6 @@ void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
int width = glyph->fBounds.width(); |
int height = glyph->fBounds.height(); |
-#if 0 |
- // Not checking the clip bounds might introduce a performance regression. However, its not |
- // clear if this is still true today with the larger tiles we use in Chrome. For repositionable |
- // blobs, we want to make sure we have all of the glyphs, so clipping them out is not ideal. |
- // We could store the cliprect in the key, but then we'd lose the ability to do integer scrolls |
- // TODO verify this |
- // check if we clipped out |
- if (clipRect.quickReject(x, y, x + width, y + height)) { |
- return; |
- } |
-#endif |
- |
// If the glyph is too large we fall back to paths |
if (glyph->fTooLargeForAtlas) { |
this->appendGlyphPath(blob, glyph, scaler, skGlyph, SkIntToScalar(vx), SkIntToScalar(vy)); |
@@ -1061,7 +1032,6 @@ bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
const SkGlyph& skGlyph, |
SkScalar sx, SkScalar sy, GrColor color, |
GrFontScaler* scaler, |
- const SkIRect& clipRect, |
SkScalar textRatio, const SkMatrix& viewMatrix) { |
Run& run = blob->fRuns[runIndex]; |
if (!fCurrStrike) { |
@@ -1096,18 +1066,6 @@ bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
sy += dy; |
SkRect glyphRect = SkRect::MakeXYWH(sx, sy, width, height); |
-#if 0 |
- // check if we clipped out |
- SkRect dstRect; |
- viewMatrix.mapRect(&dstRect, glyphRect); |
- if (clipRect.quickReject(SkScalarTruncToInt(dstRect.left()), |
- SkScalarTruncToInt(dstRect.top()), |
- SkScalarTruncToInt(dstRect.right()), |
- SkScalarTruncToInt(dstRect.bottom()))) { |
- return true; |
- } |
-#endif |
- |
// TODO combine with the above |
// If the glyph is too large we fall back to paths |
if (glyph->fTooLargeForAtlas) { |
@@ -1404,18 +1362,6 @@ DRAW_BATCH_TEST_DEFINE(TextBlobBatch) { |
gTextContext = GrAtlasTextContext::Create(context, gSurfaceProps); |
} |
- // create dummy render target |
- GrSurfaceDesc desc; |
- desc.fFlags = kRenderTarget_GrSurfaceFlag; |
- desc.fWidth = 1024; |
- desc.fHeight = 1024; |
- desc.fConfig = kRGBA_8888_GrPixelConfig; |
- desc.fSampleCnt = 0; |
- SkAutoTUnref<GrTexture> texture(context->textureProvider()->createTexture(desc, true, nullptr, 0)); |
- SkASSERT(texture); |
- SkASSERT(nullptr != texture->asRenderTarget()); |
- GrRenderTarget* rt = texture->asRenderTarget(); |
- |
// Setup dummy SkPaint / GrPaint |
GrColor color = GrRandomColor(random); |
SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); |
@@ -1440,7 +1386,7 @@ DRAW_BATCH_TEST_DEFINE(TextBlobBatch) { |
// 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(rt, clip, grPaint, skPaint, viewMatrix, text, |
+ gTextContext->createDrawTextBlob(clip, grPaint, skPaint, viewMatrix, text, |
static_cast<size_t>(textLen), 0, 0, noClip)); |
SkScalar transX = static_cast<SkScalar>(random->nextU()); |