OLD | NEW |
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 "GrAtlas.h" | 9 #include "GrAtlas.h" |
10 #include "GrBatch.h" | 10 #include "GrBatch.h" |
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 GrGlyph::PackedID packed, | 1194 GrGlyph::PackedID packed, |
1195 int vx, int vy, GrColor color, GrFontSca
ler* scaler, | 1195 int vx, int vy, GrColor color, GrFontSca
ler* scaler, |
1196 const SkIRect& clipRect) { | 1196 const SkIRect& clipRect) { |
1197 Run& run = blob->fRuns[runIndex]; | 1197 Run& run = blob->fRuns[runIndex]; |
1198 if (!fCurrStrike) { | 1198 if (!fCurrStrike) { |
1199 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); | 1199 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
1200 run.fStrike.reset(SkRef(fCurrStrike)); | 1200 run.fStrike.reset(SkRef(fCurrStrike)); |
1201 } | 1201 } |
1202 | 1202 |
1203 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); | 1203 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); |
1204 if (!glyph || glyph->fBounds.isEmpty()) { | 1204 if (!glyph) { |
1205 return; | 1205 return; |
1206 } | 1206 } |
1207 | 1207 |
1208 int x = vx + glyph->fBounds.fLeft; | 1208 int x = vx + glyph->fBounds.fLeft; |
1209 int y = vy + glyph->fBounds.fTop; | 1209 int y = vy + glyph->fBounds.fTop; |
1210 | 1210 |
1211 // keep them as ints until we've done the clip-test | 1211 // keep them as ints until we've done the clip-test |
1212 int width = glyph->fBounds.width(); | 1212 int width = glyph->fBounds.width(); |
1213 int height = glyph->fBounds.height(); | 1213 int height = glyph->fBounds.height(); |
1214 | 1214 |
1215 #if 0 | 1215 #if 0 |
1216 // Not checking the clip bounds might introduce a performance regression. H
owever, its not | 1216 // Not checking the clip bounds might introduce a performance regression. H
owever, its not |
1217 // clear if this is still true today with the larger tiles we use in Chrome.
For repositionable | 1217 // clear if this is still true today with the larger tiles we use in Chrome.
For repositionable |
1218 // blobs, we want to make sure we have all of the glyphs, so clipping them o
ut is not ideal. | 1218 // blobs, we want to make sure we have all of the glyphs, so clipping them o
ut is not ideal. |
1219 // We could store the cliprect in the key, but then we'd lose the ability to
do integer scrolls | 1219 // We could store the cliprect in the key, but then we'd lose the ability to
do integer scrolls |
1220 // TODO verify this | 1220 // TODO verify this |
1221 // check if we clipped out | 1221 // check if we clipped out |
1222 if (clipRect.quickReject(x, y, x + width, y + height)) { | 1222 if (clipRect.quickReject(x, y, x + width, y + height)) { |
1223 return; | 1223 return; |
1224 } | 1224 } |
1225 #endif | 1225 #endif |
1226 | 1226 |
1227 // If the glyph is too large we fall back to paths | 1227 // If the glyph is too large we fall back to paths |
1228 if (fCurrStrike->glyphTooLargeForAtlas(glyph)) { | 1228 if (glyph->fTooLargeForAtlas) { |
1229 this->appendGlyphPath(blob, glyph, scaler, vx, vy); | 1229 this->appendGlyphPath(blob, glyph, scaler, vx, vy); |
1230 return; | 1230 return; |
1231 } | 1231 } |
1232 | 1232 |
1233 GrMaskFormat format = glyph->fMaskFormat; | 1233 GrMaskFormat format = glyph->fMaskFormat; |
1234 | 1234 |
1235 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); | 1235 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); |
1236 if (run.fInitialized && subRun->fMaskFormat != format) { | 1236 if (run.fInitialized && subRun->fMaskFormat != format) { |
1237 subRun = &run.fSubRunInfo.push_back(); | 1237 subRun = &run.fSubRunInfo.push_back(); |
1238 } | 1238 } |
(...skipping 18 matching lines...) Expand all Loading... |
1257 GrFontScaler* scaler, | 1257 GrFontScaler* scaler, |
1258 const SkIRect& clipRect, | 1258 const SkIRect& clipRect, |
1259 SkScalar textRatio, const SkMatrix& viewM
atrix) { | 1259 SkScalar textRatio, const SkMatrix& viewM
atrix) { |
1260 Run& run = blob->fRuns[runIndex]; | 1260 Run& run = blob->fRuns[runIndex]; |
1261 if (!fCurrStrike) { | 1261 if (!fCurrStrike) { |
1262 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); | 1262 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
1263 run.fStrike.reset(SkRef(fCurrStrike)); | 1263 run.fStrike.reset(SkRef(fCurrStrike)); |
1264 } | 1264 } |
1265 | 1265 |
1266 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); | 1266 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); |
1267 if (!glyph || glyph->fBounds.isEmpty()) { | 1267 if (!glyph) { |
1268 return true; | 1268 return true; |
1269 } | 1269 } |
1270 | 1270 |
1271 // fallback to color glyph support | 1271 // fallback to color glyph support |
1272 if (kA8_GrMaskFormat != glyph->fMaskFormat) { | 1272 if (kA8_GrMaskFormat != glyph->fMaskFormat) { |
1273 return false; | 1273 return false; |
1274 } | 1274 } |
1275 | 1275 |
1276 SkScalar dx = SkIntToScalar(glyph->fBounds.fLeft + SK_DistanceFieldInset); | 1276 SkScalar dx = SkIntToScalar(glyph->fBounds.fLeft + SK_DistanceFieldInset); |
1277 SkScalar dy = SkIntToScalar(glyph->fBounds.fTop + SK_DistanceFieldInset); | 1277 SkScalar dy = SkIntToScalar(glyph->fBounds.fTop + SK_DistanceFieldInset); |
(...skipping 16 matching lines...) Expand all Loading... |
1294 if (clipRect.quickReject(SkScalarTruncToInt(dstRect.left()), | 1294 if (clipRect.quickReject(SkScalarTruncToInt(dstRect.left()), |
1295 SkScalarTruncToInt(dstRect.top()), | 1295 SkScalarTruncToInt(dstRect.top()), |
1296 SkScalarTruncToInt(dstRect.right()), | 1296 SkScalarTruncToInt(dstRect.right()), |
1297 SkScalarTruncToInt(dstRect.bottom()))) { | 1297 SkScalarTruncToInt(dstRect.bottom()))) { |
1298 return true; | 1298 return true; |
1299 } | 1299 } |
1300 #endif | 1300 #endif |
1301 | 1301 |
1302 // TODO combine with the above | 1302 // TODO combine with the above |
1303 // If the glyph is too large we fall back to paths | 1303 // If the glyph is too large we fall back to paths |
1304 if (fCurrStrike->glyphTooLargeForAtlas(glyph)) { | 1304 if (glyph->fTooLargeForAtlas) { |
1305 this->appendGlyphPath(blob, glyph, scaler, SkScalarRoundToInt(sx - dx), | 1305 this->appendGlyphPath(blob, glyph, scaler, SkScalarRoundToInt(sx - dx), |
1306 SkScalarRoundToInt(sy - dy)); | 1306 SkScalarRoundToInt(sy - dy)); |
1307 return true; | 1307 return true; |
1308 } | 1308 } |
1309 | 1309 |
1310 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); | 1310 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); |
1311 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); | 1311 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); |
1312 subRun->fMaskFormat = kA8_GrMaskFormat; | 1312 subRun->fMaskFormat = kA8_GrMaskFormat; |
1313 | 1313 |
1314 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD
Text); | 1314 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD
Text); |
(...skipping 23 matching lines...) Expand all Loading... |
1338 Run::SubRunInfo* subRun, | 1338 Run::SubRunInfo* subRun, |
1339 const SkRect& positions, GrCol
or color, | 1339 const SkRect& positions, GrCol
or color, |
1340 size_t vertexStride, bool useV
ertexColor, | 1340 size_t vertexStride, bool useV
ertexColor, |
1341 GrGlyph* glyph) { | 1341 GrGlyph* glyph) { |
1342 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; | 1342 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; |
1343 run->fVertexBounds.joinNonEmptyArg(positions); | 1343 run->fVertexBounds.joinNonEmptyArg(positions); |
1344 run->fColor = color; | 1344 run->fColor = color; |
1345 | 1345 |
1346 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVertices + subRun->fVert
exEndIndex); | 1346 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVertices + subRun->fVert
exEndIndex); |
1347 | 1347 |
1348 // V0 | |
1349 SkPoint* position = reinterpret_cast<SkPoint*>(vertex); | |
1350 position->set(positions.fLeft, positions.fTop); | |
1351 if (useVertexColor) { | 1348 if (useVertexColor) { |
| 1349 // V0 |
| 1350 SkPoint* position = reinterpret_cast<SkPoint*>(vertex); |
| 1351 position->set(positions.fLeft, positions.fTop); |
1352 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; | 1352 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; |
1353 *colorPtr = color; | 1353 *colorPtr = color; |
1354 } | 1354 vertex += vertexStride; |
1355 vertex += vertexStride; | |
1356 | 1355 |
1357 // V1 | 1356 // V1 |
1358 position = reinterpret_cast<SkPoint*>(vertex); | 1357 position = reinterpret_cast<SkPoint*>(vertex); |
1359 position->set(positions.fLeft, positions.fBottom); | 1358 position->set(positions.fLeft, positions.fBottom); |
1360 if (useVertexColor) { | 1359 colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
1361 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; | |
1362 *colorPtr = color; | 1360 *colorPtr = color; |
1363 } | 1361 vertex += vertexStride; |
1364 vertex += vertexStride; | |
1365 | 1362 |
1366 // V2 | 1363 // V2 |
1367 position = reinterpret_cast<SkPoint*>(vertex); | 1364 position = reinterpret_cast<SkPoint*>(vertex); |
1368 position->set(positions.fRight, positions.fBottom); | 1365 position->set(positions.fRight, positions.fBottom); |
1369 if (useVertexColor) { | 1366 colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
1370 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; | |
1371 *colorPtr = color; | 1367 *colorPtr = color; |
1372 } | 1368 vertex += vertexStride; |
1373 vertex += vertexStride; | |
1374 | 1369 |
1375 // V3 | 1370 // V3 |
1376 position = reinterpret_cast<SkPoint*>(vertex); | 1371 position = reinterpret_cast<SkPoint*>(vertex); |
1377 position->set(positions.fRight, positions.fTop); | 1372 position->set(positions.fRight, positions.fTop); |
1378 if (useVertexColor) { | 1373 colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
1379 SkColor* colorPtr = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint))
; | |
1380 *colorPtr = color; | 1374 *colorPtr = color; |
| 1375 } else { |
| 1376 // V0 |
| 1377 SkPoint* position = reinterpret_cast<SkPoint*>(vertex); |
| 1378 position->set(positions.fLeft, positions.fTop); |
| 1379 vertex += vertexStride; |
| 1380 |
| 1381 // V1 |
| 1382 position = reinterpret_cast<SkPoint*>(vertex); |
| 1383 position->set(positions.fLeft, positions.fBottom); |
| 1384 vertex += vertexStride; |
| 1385 |
| 1386 // V2 |
| 1387 position = reinterpret_cast<SkPoint*>(vertex); |
| 1388 position->set(positions.fRight, positions.fBottom); |
| 1389 vertex += vertexStride; |
| 1390 |
| 1391 // V3 |
| 1392 position = reinterpret_cast<SkPoint*>(vertex); |
| 1393 position->set(positions.fRight, positions.fTop); |
1381 } | 1394 } |
1382 | 1395 |
1383 subRun->fGlyphEndIndex++; | 1396 subRun->fGlyphEndIndex++; |
1384 subRun->fVertexEndIndex += vertexStride * kVerticesPerGlyph; | 1397 subRun->fVertexEndIndex += vertexStride * kVerticesPerGlyph; |
1385 } | 1398 } |
1386 | 1399 |
1387 class BitmapTextBatch : public GrBatch { | 1400 class BitmapTextBatch : public GrBatch { |
1388 public: | 1401 public: |
1389 typedef GrAtlasTextContext::DistanceAdjustTable DistanceAdjustTable; | 1402 typedef GrAtlasTextContext::DistanceAdjustTable DistanceAdjustTable; |
1390 typedef GrAtlasTextContext::BitmapTextBlob Blob; | 1403 typedef GrAtlasTextContext::BitmapTextBlob Blob; |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2147 pipelineBuilder.setFromPaint(grPaint, rt, clip); | 2160 pipelineBuilder.setFromPaint(grPaint, rt, clip); |
2148 | 2161 |
2149 GrColor color = grPaint.getColor(); | 2162 GrColor color = grPaint.getColor(); |
2150 for (int run = 0; run < cacheBlob->fRunCount; run++) { | 2163 for (int run = 0; run < cacheBlob->fRunCount; run++) { |
2151 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, 0, 0, sk
Paint); | 2164 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, 0, 0, sk
Paint); |
2152 } | 2165 } |
2153 | 2166 |
2154 // Now flush big glyphs | 2167 // Now flush big glyphs |
2155 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip, 0, 0); | 2168 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip, 0, 0); |
2156 } | 2169 } |
OLD | NEW |