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

Unified Diff: src/gpu/GrAtlasTextContext.cpp

Issue 1518763002: Move flush logic into GrAtlasTextBlob (Closed) Base URL: https://skia.googlesource.com/skia.git@cleanuptext8
Patch Set: silence compiler warning Created 5 years 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/GrAtlasTextContext.h ('k') | src/gpu/GrTextContext.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrAtlasTextContext.cpp
diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp
index 38b9c042d4433f71cf4ad1393748299191b09cc9..5e11eb58aca8fbd06072723b82fd847097821a6d 100644
--- a/src/gpu/GrAtlasTextContext.cpp
+++ b/src/gpu/GrAtlasTextContext.cpp
@@ -6,7 +6,6 @@
*/
#include "GrAtlasTextContext.h"
-#include "GrBlurUtils.h"
#include "GrDrawContext.h"
#include "GrDrawTarget.h"
#include "GrFontScaler.h"
@@ -204,8 +203,8 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc,
blob, x, y, drawFilter, clip);
}
- this->flush(blob, cacheBlob, dc, skPaint, grPaint, drawFilter,
- clip, viewMatrix, clipBounds, x, y, transX, transY);
+ cacheBlob->flushCached(blob, fContext, dc, this, fSurfaceProps, fDistanceAdjustTable, skPaint,
+ grPaint, drawFilter, clip, viewMatrix, clipBounds, x, y, transX, transY);
}
inline bool GrAtlasTextContext::canDrawAsDistanceFields(const SkPaint& skPaint,
@@ -536,7 +535,8 @@ void GrAtlasTextContext::onDrawText(GrDrawContext* dc,
SkAutoTUnref<GrAtlasTextBlob> blob(
this->createDrawTextBlob(clip, paint, skPaint, viewMatrix,
text, byteLength, x, y, regionClipBounds));
- this->flush(blob, dc, skPaint, paint, clip, regionClipBounds);
+ blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPaint, paint,
+ clip, regionClipBounds);
}
void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc,
@@ -552,7 +552,8 @@ void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc,
pos, scalarsPerPosition,
offset, regionClipBounds));
- this->flush(blob, dc, skPaint, paint, clip, regionClipBounds);
+ blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPaint, paint, clip,
+ regionClipBounds);
}
void GrAtlasTextContext::internalDrawBMPText(GrAtlasTextBlob* blob, int runIndex,
@@ -858,179 +859,6 @@ bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
return true;
}
-void GrAtlasTextContext::flushRunAsPaths(GrDrawContext* dc,
- const SkTextBlobRunIterator& it,
- const GrClip& clip, const SkPaint& skPaint,
- SkDrawFilter* drawFilter, const SkMatrix& viewMatrix,
- const SkIRect& clipBounds, SkScalar x, SkScalar y) {
- SkPaint runPaint = skPaint;
-
- size_t textLen = it.glyphCount() * sizeof(uint16_t);
- const SkPoint& offset = it.offset();
-
- it.applyFontToPaint(&runPaint);
-
- if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) {
- return;
- }
-
- runPaint.setFlags(FilterTextFlags(fSurfaceProps, runPaint));
-
- switch (it.positioning()) {
- case SkTextBlob::kDefault_Positioning:
- this->drawTextAsPath(dc, clip, runPaint, viewMatrix,
- (const char *)it.glyphs(),
- textLen, x + offset.x(), y + offset.y(), clipBounds);
- break;
- case SkTextBlob::kHorizontal_Positioning:
- this->drawPosTextAsPath(dc, clip, runPaint, viewMatrix,
- (const char*)it.glyphs(),
- textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()),
- clipBounds);
- break;
- case SkTextBlob::kFull_Positioning:
- this->drawPosTextAsPath(dc, clip, runPaint, viewMatrix,
- (const char*)it.glyphs(),
- textLen, it.pos(), 2, SkPoint::Make(x, y), clipBounds);
- break;
- }
-}
-
-inline GrDrawBatch*
-GrAtlasTextContext::createBatch(GrAtlasTextBlob* cacheBlob, const PerSubRunInfo& info,
- int glyphCount, int run, int subRun,
- GrColor color, SkScalar transX, SkScalar transY,
- const SkPaint& skPaint) {
- GrMaskFormat format = info.maskFormat();
- GrColor subRunColor;
- if (kARGB_GrMaskFormat == format) {
- uint8_t paintAlpha = skPaint.getAlpha();
- subRunColor = SkColorSetARGB(paintAlpha, paintAlpha, paintAlpha, paintAlpha);
- } else {
- subRunColor = color;
- }
-
- GrAtlasTextBatch* batch;
- if (info.drawAsDistanceFields()) {
- SkColor filteredColor;
- SkColorFilter* colorFilter = skPaint.getColorFilter();
- if (colorFilter) {
- filteredColor = colorFilter->filterColor(skPaint.getColor());
- } else {
- filteredColor = skPaint.getColor();
- }
- bool useBGR = SkPixelGeometryIsBGR(fSurfaceProps.pixelGeometry());
- batch = GrAtlasTextBatch::CreateDistanceField(glyphCount, fContext->getBatchFontCache(),
- fDistanceAdjustTable, filteredColor,
- info.hasUseLCDText(), useBGR);
- } else {
- batch = GrAtlasTextBatch::CreateBitmap(format, glyphCount, fContext->getBatchFontCache());
- }
- GrAtlasTextBatch::Geometry& geometry = batch->geometry();
- geometry.fBlob = SkRef(cacheBlob);
- geometry.fRun = run;
- geometry.fSubRun = subRun;
- geometry.fColor = subRunColor;
- geometry.fTransX = transX;
- geometry.fTransY = transY;
- batch->init();
-
- return batch;
-}
-
-inline void GrAtlasTextContext::flushRun(GrDrawContext* dc, GrPipelineBuilder* pipelineBuilder,
- GrAtlasTextBlob* cacheBlob, int run, GrColor color,
- SkScalar transX, SkScalar transY,
- const SkPaint& skPaint) {
- for (int subRun = 0; subRun < cacheBlob->fRuns[run].fSubRunInfo.count(); subRun++) {
- const PerSubRunInfo& info = cacheBlob->fRuns[run].fSubRunInfo[subRun];
- int glyphCount = info.glyphCount();
- if (0 == glyphCount) {
- continue;
- }
-
- SkAutoTUnref<GrDrawBatch> batch(this->createBatch(cacheBlob, info, glyphCount, run,
- subRun, color, transX, transY,
- skPaint));
- dc->drawBatch(pipelineBuilder, batch);
- }
-}
-
-inline void GrAtlasTextContext::flushBigGlyphs(GrAtlasTextBlob* cacheBlob,
- GrDrawContext* dc,
- const GrClip& clip, const SkPaint& skPaint,
- SkScalar transX, SkScalar transY,
- const SkIRect& clipBounds) {
- if (!cacheBlob->fBigGlyphs.count()) {
- return;
- }
-
- for (int i = 0; i < cacheBlob->fBigGlyphs.count(); i++) {
- GrAtlasTextBlob::BigGlyph& bigGlyph = cacheBlob->fBigGlyphs[i];
- bigGlyph.fVx += transX;
- bigGlyph.fVy += transY;
- SkMatrix ctm;
- ctm.setScale(bigGlyph.fScale, bigGlyph.fScale);
- ctm.postTranslate(bigGlyph.fVx, bigGlyph.fVy);
- if (bigGlyph.fApplyVM) {
- ctm.postConcat(cacheBlob->fViewMatrix);
- }
-
- GrBlurUtils::drawPathWithMaskFilter(fContext, dc, clip, bigGlyph.fPath,
- skPaint, ctm, nullptr, clipBounds, false);
- }
-}
-
-void GrAtlasTextContext::flush(const SkTextBlob* blob,
- GrAtlasTextBlob* cacheBlob,
- GrDrawContext* dc,
- const SkPaint& skPaint,
- const GrPaint& grPaint,
- SkDrawFilter* drawFilter,
- const GrClip& clip,
- const SkMatrix& viewMatrix,
- const SkIRect& clipBounds,
- SkScalar x, SkScalar y,
- SkScalar transX, SkScalar transY) {
- // We loop through the runs of the blob, flushing each. If any run is too large, then we flush
- // it as paths
- GrPipelineBuilder pipelineBuilder(grPaint, dc->accessRenderTarget(), clip);
-
- GrColor color = grPaint.getColor();
-
- SkTextBlobRunIterator it(blob);
- for (int run = 0; !it.done(); it.next(), run++) {
- if (cacheBlob->fRuns[run].fDrawAsPaths) {
- this->flushRunAsPaths(dc, it, clip, skPaint,
- drawFilter, viewMatrix, clipBounds, x, y);
- continue;
- }
- cacheBlob->fRuns[run].fVertexBounds.offset(transX, transY);
- this->flushRun(dc, &pipelineBuilder, cacheBlob, run, color,
- transX, transY, skPaint);
- }
-
- // Now flush big glyphs
- this->flushBigGlyphs(cacheBlob, dc, clip, skPaint, transX, transY, clipBounds);
-}
-
-void GrAtlasTextContext::flush(GrAtlasTextBlob* cacheBlob,
- GrDrawContext* dc,
- const SkPaint& skPaint,
- const GrPaint& grPaint,
- const GrClip& clip,
- const SkIRect& clipBounds) {
- GrPipelineBuilder pipelineBuilder(grPaint, dc->accessRenderTarget(), clip);
-
- GrColor color = grPaint.getColor();
- for (int run = 0; run < cacheBlob->fRunCount; run++) {
- this->flushRun(dc, &pipelineBuilder, cacheBlob, run, color, 0, 0, skPaint);
- }
-
- // Now flush big glyphs
- this->flushBigGlyphs(cacheBlob, dc, clip, skPaint, 0, 0, clipBounds);
-}
-
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef GR_TEST_UTILS
@@ -1080,7 +908,9 @@ DRAW_BATCH_TEST_DEFINE(TextBlobBatch) {
SkScalar transX = static_cast<SkScalar>(random->nextU());
SkScalar transY = static_cast<SkScalar>(random->nextU());
const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0];
- return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, transY, skPaint);
+ return blob->createBatch(info, textLen, 0, 0, color, transX, transY, skPaint,
+ gSurfaceProps, gTextContext->dfAdjustTable(),
+ context->getBatchFontCache());
}
#endif
« no previous file with comments | « src/gpu/GrAtlasTextContext.h ('k') | src/gpu/GrTextContext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698