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

Side by Side Diff: src/gpu/GrAtlasTextContext.cpp

Issue 1257253005: Move strike to subrun in GrAtlasTextContext (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tweak Created 5 years, 4 months 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 unified diff | Download patch
« no previous file with comments | « src/gpu/GrAtlasTextBlob.h ('k') | src/gpu/GrBatchAtlas.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 #include "GrAtlasTextContext.h" 7 #include "GrAtlasTextContext.h"
8 8
9 #include "GrBatch.h" 9 #include "GrBatch.h"
10 #include "GrBatchFontCache.h" 10 #include "GrBatchFontCache.h"
(...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 } 1214 }
1215 } 1215 }
1216 1216
1217 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, 1217 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
1218 const SkGlyph& skGlyph, 1218 const SkGlyph& skGlyph,
1219 int vx, int vy, GrColor color, GrFontSca ler* scaler, 1219 int vx, int vy, GrColor color, GrFontSca ler* scaler,
1220 const SkIRect& clipRect) { 1220 const SkIRect& clipRect) {
1221 Run& run = blob->fRuns[runIndex]; 1221 Run& run = blob->fRuns[runIndex];
1222 if (!fCurrStrike) { 1222 if (!fCurrStrike) {
1223 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); 1223 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
1224 run.fStrike.reset(SkRef(fCurrStrike));
1225 } 1224 }
1226 1225
1227 GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(), 1226 GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(),
1228 skGlyph.getSubXFixed(), 1227 skGlyph.getSubXFixed(),
1229 skGlyph.getSubYFixed(), 1228 skGlyph.getSubYFixed(),
1230 GrGlyph::kCoverage_MaskStyle); 1229 GrGlyph::kCoverage_MaskStyle);
1231 GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler); 1230 GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler);
1232 if (!glyph) { 1231 if (!glyph) {
1233 return; 1232 return;
1234 } 1233 }
(...skipping 21 matching lines...) Expand all
1256 if (glyph->fTooLargeForAtlas) { 1255 if (glyph->fTooLargeForAtlas) {
1257 this->appendGlyphPath(blob, glyph, scaler, skGlyph, SkIntToScalar(vx), S kIntToScalar(vy)); 1256 this->appendGlyphPath(blob, glyph, scaler, skGlyph, SkIntToScalar(vx), S kIntToScalar(vy));
1258 return; 1257 return;
1259 } 1258 }
1260 1259
1261 GrMaskFormat format = glyph->fMaskFormat; 1260 GrMaskFormat format = glyph->fMaskFormat;
1262 1261
1263 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); 1262 PerSubRunInfo* subRun = &run.fSubRunInfo.back();
1264 if (run.fInitialized && subRun->fMaskFormat != format) { 1263 if (run.fInitialized && subRun->fMaskFormat != format) {
1265 subRun = &run.push_back(); 1264 subRun = &run.push_back();
1265 subRun->fStrike.reset(SkRef(fCurrStrike));
1266 } else if (!run.fInitialized) {
1267 subRun->fStrike.reset(SkRef(fCurrStrike));
1266 } 1268 }
1267 1269
1268 run.fInitialized = true; 1270 run.fInitialized = true;
1269 1271
1270 size_t vertexStride = get_vertex_stride(format); 1272 size_t vertexStride = get_vertex_stride(format);
1271 1273
1272 SkRect r; 1274 SkRect r;
1273 r.fLeft = SkIntToScalar(x); 1275 r.fLeft = SkIntToScalar(x);
1274 r.fTop = SkIntToScalar(y); 1276 r.fTop = SkIntToScalar(y);
1275 r.fRight = r.fLeft + SkIntToScalar(width); 1277 r.fRight = r.fLeft + SkIntToScalar(width);
1276 r.fBottom = r.fTop + SkIntToScalar(height); 1278 r.fBottom = r.fTop + SkIntToScalar(height);
1277 subRun->fMaskFormat = format; 1279 subRun->fMaskFormat = format;
1278 this->appendGlyphCommon(blob, &run, subRun, r, color, vertexStride, kA8_GrMa skFormat == format, 1280 this->appendGlyphCommon(blob, &run, subRun, r, color, vertexStride, kA8_GrMa skFormat == format,
1279 glyph); 1281 glyph);
1280 } 1282 }
1281 1283
1282 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex, 1284 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
1283 const SkGlyph& skGlyph, 1285 const SkGlyph& skGlyph,
1284 SkScalar sx, SkScalar sy, GrColor color, 1286 SkScalar sx, SkScalar sy, GrColor color,
1285 GrFontScaler* scaler, 1287 GrFontScaler* scaler,
1286 const SkIRect& clipRect, 1288 const SkIRect& clipRect,
1287 SkScalar textRatio, const SkMatrix& viewM atrix) { 1289 SkScalar textRatio, const SkMatrix& viewM atrix) {
1288 Run& run = blob->fRuns[runIndex]; 1290 Run& run = blob->fRuns[runIndex];
1289 if (!fCurrStrike) { 1291 if (!fCurrStrike) {
1290 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); 1292 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler);
1291 run.fStrike.reset(SkRef(fCurrStrike));
1292 } 1293 }
1293 1294
1294 GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(), 1295 GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(),
1295 skGlyph.getSubXFixed(), 1296 skGlyph.getSubXFixed(),
1296 skGlyph.getSubYFixed(), 1297 skGlyph.getSubYFixed(),
1297 GrGlyph::kDistance_MaskStyle); 1298 GrGlyph::kDistance_MaskStyle);
1298 GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler); 1299 GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler);
1299 if (!glyph) { 1300 if (!glyph) {
1300 return true; 1301 return true;
1301 } 1302 }
(...skipping 30 matching lines...) Expand all
1332 #endif 1333 #endif
1333 1334
1334 // TODO combine with the above 1335 // TODO combine with the above
1335 // If the glyph is too large we fall back to paths 1336 // If the glyph is too large we fall back to paths
1336 if (glyph->fTooLargeForAtlas) { 1337 if (glyph->fTooLargeForAtlas) {
1337 this->appendGlyphPath(blob, glyph, scaler, skGlyph, sx - dx, sy - dy); 1338 this->appendGlyphPath(blob, glyph, scaler, skGlyph, sx - dx, sy - dy);
1338 return true; 1339 return true;
1339 } 1340 }
1340 1341
1341 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); 1342 PerSubRunInfo* subRun = &run.fSubRunInfo.back();
1343 if (!run.fInitialized) {
1344 subRun->fStrike.reset(SkRef(fCurrStrike));
1345 }
1346 run.fInitialized = true;
1342 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); 1347 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat);
1343 subRun->fMaskFormat = kA8_GrMaskFormat; 1348 subRun->fMaskFormat = kA8_GrMaskFormat;
1344 1349
1345 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD Text); 1350 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD Text);
1346 1351
1347 bool useColorVerts = !subRun->fUseLCDText; 1352 bool useColorVerts = !subRun->fUseLCDText;
1348 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride, useColorVerts, 1353 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride, useColorVerts,
1349 glyph); 1354 glyph);
1350 return true; 1355 return true;
1351 } 1356 }
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 SkTypeface* typeface = NULL; 1601 SkTypeface* typeface = NULL;
1597 1602
1598 for (int i = 0; i < fGeoCount; i++) { 1603 for (int i = 0; i < fGeoCount; i++) {
1599 Geometry& args = fGeoData[i]; 1604 Geometry& args = fGeoData[i];
1600 Blob* blob = args.fBlob; 1605 Blob* blob = args.fBlob;
1601 Run& run = blob->fRuns[args.fRun]; 1606 Run& run = blob->fRuns[args.fRun];
1602 TextInfo& info = run.fSubRunInfo[args.fSubRun]; 1607 TextInfo& info = run.fSubRunInfo[args.fSubRun];
1603 1608
1604 uint64_t currentAtlasGen = fFontCache->atlasGeneration(maskFormat); 1609 uint64_t currentAtlasGen = fFontCache->atlasGeneration(maskFormat);
1605 bool regenerateTextureCoords = info.fAtlasGeneration != currentAtlas Gen || 1610 bool regenerateTextureCoords = info.fAtlasGeneration != currentAtlas Gen ||
1606 run.fStrike->isAbandoned(); 1611 info.fStrike->isAbandoned();
1607 bool regenerateColors; 1612 bool regenerateColors;
1608 if (usesDistanceFields) { 1613 if (usesDistanceFields) {
1609 regenerateColors = !isLCD && run.fColor != args.fColor; 1614 regenerateColors = !isLCD && run.fColor != args.fColor;
1610 } else { 1615 } else {
1611 regenerateColors = kA8_GrMaskFormat == maskFormat && run.fColor != args.fColor; 1616 regenerateColors = kA8_GrMaskFormat == maskFormat && run.fColor != args.fColor;
1612 } 1617 }
1613 bool regeneratePositions = args.fTransX != 0.f || args.fTransY != 0. f; 1618 bool regeneratePositions = args.fTransX != 0.f || args.fTransY != 0. f;
1614 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex; 1619 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex;
1615 1620
1616 // We regenerate both texture coords and colors in the blob itself, and update the 1621 // We regenerate both texture coords and colors in the blob itself, and update the
(...skipping 27 matching lines...) Expand all
1644 run.fOverrideDescriptor->getDe sc() : 1649 run.fOverrideDescriptor->getDe sc() :
1645 run.fDescriptor.getDesc(); 1650 run.fDescriptor.getDesc();
1646 if (!cache || !SkTypeface::Equal(typeface, run.fTypeface) || 1651 if (!cache || !SkTypeface::Equal(typeface, run.fTypeface) ||
1647 !(desc->equals(*newDesc))) { 1652 !(desc->equals(*newDesc))) {
1648 if (cache) { 1653 if (cache) {
1649 SkGlyphCache::AttachCache(cache); 1654 SkGlyphCache::AttachCache(cache);
1650 } 1655 }
1651 desc = newDesc; 1656 desc = newDesc;
1652 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); 1657 cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
1653 scaler = GrTextContext::GetGrFontScaler(cache); 1658 scaler = GrTextContext::GetGrFontScaler(cache);
1654 strike = run.fStrike; 1659 strike = info.fStrike;
1655 typeface = run.fTypeface; 1660 typeface = run.fTypeface;
1656 } 1661 }
1657 1662
1658 if (run.fStrike->isAbandoned()) { 1663 if (info.fStrike->isAbandoned()) {
1659 regenerateGlyphs = true; 1664 regenerateGlyphs = true;
1660 strike = fFontCache->getStrike(scaler); 1665 strike = fFontCache->getStrike(scaler);
1661 } else { 1666 } else {
1662 strike = run.fStrike; 1667 strike = info.fStrike;
1663 } 1668 }
1664 } 1669 }
1665 1670
1666 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { 1671 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) {
1667 if (regenerateTextureCoords) { 1672 if (regenerateTextureCoords) {
1668 size_t glyphOffset = glyphIdx + info.fGlyphStartIndex; 1673 size_t glyphOffset = glyphIdx + info.fGlyphStartIndex;
1669 1674
1670 GrGlyph* glyph = blob->fGlyphs[glyphOffset]; 1675 GrGlyph* glyph = blob->fGlyphs[glyphOffset];
1671 GrGlyph::PackedID id = glyph->fPackedID; 1676 GrGlyph::PackedID id = glyph->fPackedID;
1672 const SkGlyph& skGlyph = scaler->grToSkGlyph(id); 1677 const SkGlyph& skGlyph = scaler->grToSkGlyph(id);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1725 SkScalar transY = args.fTransY; 1730 SkScalar transY = args.fTransY;
1726 this->regeneratePositions(vertex, vertexStride, transX, transY); 1731 this->regeneratePositions(vertex, vertexStride, transX, transY);
1727 } 1732 }
1728 flushInfo.fGlyphsToFlush++; 1733 flushInfo.fGlyphsToFlush++;
1729 } 1734 }
1730 1735
1731 // We my have changed the color so update it here 1736 // We my have changed the color so update it here
1732 run.fColor = args.fColor; 1737 run.fColor = args.fColor;
1733 if (regenerateTextureCoords) { 1738 if (regenerateTextureCoords) {
1734 if (regenerateGlyphs) { 1739 if (regenerateGlyphs) {
1735 run.fStrike.reset(SkRef(strike)); 1740 info.fStrike.reset(SkRef(strike));
1736 } 1741 }
1737 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt lasGeneration : 1742 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt lasGeneration :
1738 fFontCache->atlasGenerat ion(maskFormat); 1743 fFontCache->atlasGenerat ion(maskFormat);
1739 } 1744 }
1740 } else { 1745 } else {
1741 flushInfo.fGlyphsToFlush += glyphCount; 1746 flushInfo.fGlyphsToFlush += glyphCount;
1742 1747
1743 // set use tokens for all of the glyphs in our subrun. This is only valid if we 1748 // set use tokens for all of the glyphs in our subrun. This is only valid if we
1744 // have a valid atlas generation 1749 // have a valid atlas generation
1745 fFontCache->setUseTokenBulk(info.fBulkUseToken, 1750 fFontCache->setUseTokenBulk(info.fBulkUseToken,
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat rix, text, 2282 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat rix, text,
2278 static_cast<size_t>(textLen), 0, 0, noClip)); 2283 static_cast<size_t>(textLen), 0, 0, noClip));
2279 2284
2280 SkScalar transX = static_cast<SkScalar>(random->nextU()); 2285 SkScalar transX = static_cast<SkScalar>(random->nextU());
2281 SkScalar transY = static_cast<SkScalar>(random->nextU()); 2286 SkScalar transY = static_cast<SkScalar>(random->nextU());
2282 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0] ; 2287 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0] ;
2283 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t ransY, skPaint); 2288 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t ransY, skPaint);
2284 } 2289 }
2285 2290
2286 #endif 2291 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrAtlasTextBlob.h ('k') | src/gpu/GrBatchAtlas.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698