| Index: src/gpu/GrAtlasTextContext.cpp
|
| diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp
|
| index b5620144b1ed732fb0f3200ce150795f5e3a6ddc..bc015ea379a801674f1f311372f888d4116bee5d 100644
|
| --- a/src/gpu/GrAtlasTextContext.cpp
|
| +++ b/src/gpu/GrAtlasTextContext.cpp
|
| @@ -875,10 +875,7 @@ void GrAtlasTextContext::internalDrawBMPText(BitmapTextBlob* blob, int runIndex,
|
| if (glyph.fWidth) {
|
| this->bmpAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kCoverage_MaskStyle),
|
| + glyph,
|
| Sk48Dot16FloorToInt(fx),
|
| Sk48Dot16FloorToInt(fy),
|
| color,
|
| @@ -945,10 +942,7 @@ void GrAtlasTextContext::internalDrawBMPPosText(BitmapTextBlob* blob, int runInd
|
| if (glyph.fWidth) {
|
| this->bmpAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kCoverage_MaskStyle),
|
| + glyph,
|
| Sk48Dot16FloorToInt(fx),
|
| Sk48Dot16FloorToInt(fy),
|
| color,
|
| @@ -983,10 +977,7 @@ void GrAtlasTextContext::internalDrawBMPPosText(BitmapTextBlob* blob, int runInd
|
|
|
| this->bmpAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kCoverage_MaskStyle),
|
| + glyph,
|
| Sk48Dot16FloorToInt(fx),
|
| Sk48Dot16FloorToInt(fy),
|
| color,
|
| @@ -1011,10 +1002,7 @@ void GrAtlasTextContext::internalDrawBMPPosText(BitmapTextBlob* blob, int runInd
|
| Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf); //halfSampleY;
|
| this->bmpAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kCoverage_MaskStyle),
|
| + glyph,
|
| Sk48Dot16FloorToInt(fx),
|
| Sk48Dot16FloorToInt(fy),
|
| color,
|
| @@ -1039,10 +1027,7 @@ void GrAtlasTextContext::internalDrawBMPPosText(BitmapTextBlob* blob, int runInd
|
| Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf); //halfSampleY;
|
| this->bmpAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kCoverage_MaskStyle),
|
| + glyph,
|
| Sk48Dot16FloorToInt(fx),
|
| Sk48Dot16FloorToInt(fy),
|
| color,
|
| @@ -1168,10 +1153,7 @@ void GrAtlasTextContext::internalDrawDFPosText(BitmapTextBlob* blob, int runInde
|
|
|
| if (!this->dfAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kDistance_MaskStyle),
|
| + glyph,
|
| x, y, color, fontScaler, clipRect,
|
| textRatio, viewMatrix)) {
|
| // couldn't append, send to fallback
|
| @@ -1201,10 +1183,7 @@ void GrAtlasTextContext::internalDrawDFPosText(BitmapTextBlob* blob, int runInde
|
|
|
| if (!this->dfAppendGlyph(blob,
|
| runIndex,
|
| - GrGlyph::Pack(glyph.getGlyphID(),
|
| - glyph.getSubXFixed(),
|
| - glyph.getSubYFixed(),
|
| - GrGlyph::kDistance_MaskStyle),
|
| + glyph,
|
| x - advanceX, y - advanceY, color,
|
| fontScaler,
|
| clipRect,
|
| @@ -1224,16 +1203,19 @@ void GrAtlasTextContext::internalDrawDFPosText(BitmapTextBlob* blob, int runInde
|
| }
|
|
|
| void GrAtlasTextContext::bmpAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
| - GrGlyph::PackedID packed,
|
| + const SkGlyph& skGlyph,
|
| int vx, int vy, GrColor color, GrFontScaler* scaler,
|
| const SkIRect& clipRect) {
|
| Run& run = blob->fRuns[runIndex];
|
| if (!fCurrStrike) {
|
| fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
|
| - run.fStrike.reset(SkRef(fCurrStrike));
|
| }
|
|
|
| - GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler);
|
| + GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(),
|
| + skGlyph.getSubXFixed(),
|
| + skGlyph.getSubYFixed(),
|
| + GrGlyph::kCoverage_MaskStyle);
|
| + GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler);
|
| if (!glyph) {
|
| return;
|
| }
|
| @@ -1259,7 +1241,7 @@ void GrAtlasTextContext::bmpAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
|
|
| // If the glyph is too large we fall back to paths
|
| if (glyph->fTooLargeForAtlas) {
|
| - this->appendGlyphPath(blob, glyph, scaler, SkIntToScalar(vx), SkIntToScalar(vy));
|
| + this->appendGlyphPath(blob, glyph, scaler, skGlyph, SkIntToScalar(vx), SkIntToScalar(vy));
|
| return;
|
| }
|
|
|
| @@ -1267,7 +1249,10 @@ void GrAtlasTextContext::bmpAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
|
|
| PerSubRunInfo* subRun = &run.fSubRunInfo.back();
|
| if (run.fInitialized && subRun->fMaskFormat != format) {
|
| - subRun = &run.fSubRunInfo.push_back();
|
| + subRun = &run.push_back();
|
| + subRun->fStrike.reset(SkRef(fCurrStrike));
|
| + } else if (!run.fInitialized) {
|
| + subRun->fStrike.reset(SkRef(fCurrStrike));
|
| }
|
|
|
| run.fInitialized = true;
|
| @@ -1285,7 +1270,7 @@ void GrAtlasTextContext::bmpAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
| }
|
|
|
| bool GrAtlasTextContext::dfAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
| - GrGlyph::PackedID packed,
|
| + const SkGlyph& skGlyph,
|
| SkScalar sx, SkScalar sy, GrColor color,
|
| GrFontScaler* scaler,
|
| const SkIRect& clipRect,
|
| @@ -1293,10 +1278,13 @@ bool GrAtlasTextContext::dfAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
| Run& run = blob->fRuns[runIndex];
|
| if (!fCurrStrike) {
|
| fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
|
| - run.fStrike.reset(SkRef(fCurrStrike));
|
| }
|
|
|
| - GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler);
|
| + GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(),
|
| + skGlyph.getSubXFixed(),
|
| + skGlyph.getSubYFixed(),
|
| + GrGlyph::kDistance_MaskStyle);
|
| + GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler);
|
| if (!glyph) {
|
| return true;
|
| }
|
| @@ -1335,11 +1323,15 @@ bool GrAtlasTextContext::dfAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
| // TODO combine with the above
|
| // If the glyph is too large we fall back to paths
|
| if (glyph->fTooLargeForAtlas) {
|
| - this->appendGlyphPath(blob, glyph, scaler, sx - dx, sy - dy);
|
| + this->appendGlyphPath(blob, glyph, scaler, skGlyph, sx - dx, sy - dy);
|
| return true;
|
| }
|
|
|
| PerSubRunInfo* subRun = &run.fSubRunInfo.back();
|
| + if (!run.fInitialized) {
|
| + subRun->fStrike.reset(SkRef(fCurrStrike));
|
| + }
|
| + run.fInitialized = true;
|
| SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat);
|
| subRun->fMaskFormat = kA8_GrMaskFormat;
|
|
|
| @@ -1352,17 +1344,16 @@ bool GrAtlasTextContext::dfAppendGlyph(BitmapTextBlob* blob, int runIndex,
|
| }
|
|
|
| inline void GrAtlasTextContext::appendGlyphPath(BitmapTextBlob* blob, GrGlyph* glyph,
|
| - GrFontScaler* scaler, SkScalar x, SkScalar y) {
|
| + GrFontScaler* scaler, const SkGlyph& skGlyph,
|
| + SkScalar x, SkScalar y) {
|
| if (NULL == glyph->fPath) {
|
| - SkPath* path = SkNEW(SkPath);
|
| - if (!scaler->getGlyphPath(glyph->glyphID(), path)) {
|
| - // flag the glyph as being dead?
|
| - SkDELETE(path);
|
| + const SkPath* glyphPath = scaler->getGlyphPath(skGlyph);
|
| + if (!glyphPath) {
|
| return;
|
| }
|
| - glyph->fPath = path;
|
| +
|
| + glyph->fPath = SkNEW_ARGS(SkPath, (*glyphPath));
|
| }
|
| - SkASSERT(glyph->fPath);
|
| blob->fBigGlyphs.push_back(BitmapTextBlob::BigGlyph(*glyph->fPath, x, y));
|
| }
|
|
|
| @@ -1585,7 +1576,7 @@ public:
|
|
|
| uint64_t currentAtlasGen = fFontCache->atlasGeneration(fMaskFormat);
|
| bool regenerateTextureCoords = info.fAtlasGeneration != currentAtlasGen ||
|
| - run.fStrike->isAbandoned();
|
| + info.fStrike->isAbandoned();
|
| bool regenerateColors;
|
| if (fUseDistanceFields) {
|
| regenerateColors = !fUseLCDText && run.fColor != args.fColor;
|
| @@ -1633,41 +1624,46 @@ public:
|
| desc = newDesc;
|
| cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
|
| scaler = GrTextContext::GetGrFontScaler(cache);
|
| - strike = run.fStrike;
|
| + strike = info.fStrike;
|
| typeface = run.fTypeface;
|
| }
|
|
|
| - if (run.fStrike->isAbandoned()) {
|
| + if (info.fStrike->isAbandoned()) {
|
| regenerateGlyphs = true;
|
| strike = fFontCache->getStrike(scaler);
|
| } else {
|
| - strike = run.fStrike;
|
| + strike = info.fStrike;
|
| }
|
| }
|
|
|
| for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) {
|
| if (regenerateTextureCoords) {
|
| size_t glyphOffset = glyphIdx + info.fGlyphStartIndex;
|
| - GrGlyph* glyph;
|
| +
|
| + GrGlyph* glyph = blob->fGlyphs[glyphOffset];
|
| + GrGlyph::PackedID id = glyph->fPackedID;
|
| + const SkGlyph& skGlyph = scaler->grToSkGlyph(id);
|
| if (regenerateGlyphs) {
|
| // Get the id from the old glyph, and use the new strike to lookup
|
| // the glyph.
|
| - glyph = blob->fGlyphs[glyphOffset];
|
| - blob->fGlyphs[glyphOffset] = strike->getGlyph(glyph->fPackedID,
|
| + blob->fGlyphs[glyphOffset] = strike->getGlyph(skGlyph, id, fMaskFormat,
|
| scaler);
|
| }
|
| glyph = blob->fGlyphs[glyphOffset];
|
| SkASSERT(glyph);
|
|
|
| if (!fFontCache->hasGlyph(glyph) &&
|
| - !strike->addGlyphToAtlas(batchTarget, glyph, scaler)) {
|
| + !strike->addGlyphToAtlas(batchTarget, glyph, scaler, skGlyph,
|
| + fMaskFormat)) {
|
| this->flush(batchTarget, &flushInfo);
|
| this->initDraw(batchTarget, gp, pipeline);
|
| brokenRun = glyphIdx > 0;
|
|
|
| SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(batchTarget,
|
| glyph,
|
| - scaler);
|
| + scaler,
|
| + skGlyph,
|
| + fMaskFormat);
|
| SkASSERT(success);
|
| }
|
| fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseToken, glyph,
|
| @@ -1705,7 +1701,7 @@ public:
|
| run.fColor = args.fColor;
|
| if (regenerateTextureCoords) {
|
| if (regenerateGlyphs) {
|
| - run.fStrike.reset(SkRef(strike));
|
| + info.fStrike.reset(SkRef(strike));
|
| }
|
| info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAtlasGeneration :
|
| fFontCache->atlasGeneration(fMaskFormat);
|
|
|