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 "GrBatch.h" | 9 #include "GrBatch.h" |
10 #include "GrBatchFontCache.h" | 10 #include "GrBatchFontCache.h" |
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 Sk48Dot16 fy = SkScalarTo48Dot16(y + halfSampleY); | 883 Sk48Dot16 fy = SkScalarTo48Dot16(y + halfSampleY); |
884 | 884 |
885 while (text < stop) { | 885 while (text < stop) { |
886 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fy
Mask); | 886 const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fy
Mask); |
887 | 887 |
888 fx += autokern.adjust(glyph); | 888 fx += autokern.adjust(glyph); |
889 | 889 |
890 if (glyph.fWidth) { | 890 if (glyph.fWidth) { |
891 this->bmpAppendGlyph(blob, | 891 this->bmpAppendGlyph(blob, |
892 runIndex, | 892 runIndex, |
893 GrGlyph::Pack(glyph.getGlyphID(), | 893 glyph, |
894 glyph.getSubXFixed(), | |
895 glyph.getSubYFixed(), | |
896 GrGlyph::kCoverage_MaskStyle), | |
897 Sk48Dot16FloorToInt(fx), | 894 Sk48Dot16FloorToInt(fx), |
898 Sk48Dot16FloorToInt(fy), | 895 Sk48Dot16FloorToInt(fy), |
899 color, | 896 color, |
900 fontScaler, | 897 fontScaler, |
901 clipRect); | 898 clipRect); |
902 } | 899 } |
903 | 900 |
904 fx += glyph.fAdvanceX; | 901 fx += glyph.fAdvanceX; |
905 fy += glyph.fAdvanceY; | 902 fy += glyph.fAdvanceY; |
906 } | 903 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 tmsProc(pos, &tmsLoc); | 950 tmsProc(pos, &tmsLoc); |
954 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + halfSampleX); | 951 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + halfSampleX); |
955 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + halfSampleY); | 952 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + halfSampleY); |
956 | 953 |
957 const SkGlyph& glyph = glyphCacheProc(cache, &text, | 954 const SkGlyph& glyph = glyphCacheProc(cache, &text, |
958 fx & fxMask, fy & fyMask); | 955 fx & fxMask, fy & fyMask); |
959 | 956 |
960 if (glyph.fWidth) { | 957 if (glyph.fWidth) { |
961 this->bmpAppendGlyph(blob, | 958 this->bmpAppendGlyph(blob, |
962 runIndex, | 959 runIndex, |
963 GrGlyph::Pack(glyph.getGlyphID(), | 960 glyph, |
964 glyph.getSubXFixed(), | |
965 glyph.getSubYFixed(), | |
966 GrGlyph::kCoverage_MaskSt
yle), | |
967 Sk48Dot16FloorToInt(fx), | 961 Sk48Dot16FloorToInt(fx), |
968 Sk48Dot16FloorToInt(fy), | 962 Sk48Dot16FloorToInt(fy), |
969 color, | 963 color, |
970 fontScaler, | 964 fontScaler, |
971 clipRect); | 965 clipRect); |
972 } | 966 } |
973 pos += scalarsPerPosition; | 967 pos += scalarsPerPosition; |
974 } | 968 } |
975 } else { | 969 } else { |
976 while (text < stop) { | 970 while (text < stop) { |
(...skipping 14 matching lines...) Expand all Loading... |
991 // have to call again, now that we've been "aligned" | 985 // have to call again, now that we've been "aligned" |
992 const SkGlyph& glyph = glyphCacheProc(cache, ¤tText, | 986 const SkGlyph& glyph = glyphCacheProc(cache, ¤tText, |
993 fx & fxMask, fy & fyMa
sk); | 987 fx & fxMask, fy & fyMa
sk); |
994 // the assumption is that the metrics haven't changed | 988 // the assumption is that the metrics haven't changed |
995 SkASSERT(prevAdvX == glyph.fAdvanceX); | 989 SkASSERT(prevAdvX == glyph.fAdvanceX); |
996 SkASSERT(prevAdvY == glyph.fAdvanceY); | 990 SkASSERT(prevAdvY == glyph.fAdvanceY); |
997 SkASSERT(glyph.fWidth); | 991 SkASSERT(glyph.fWidth); |
998 | 992 |
999 this->bmpAppendGlyph(blob, | 993 this->bmpAppendGlyph(blob, |
1000 runIndex, | 994 runIndex, |
1001 GrGlyph::Pack(glyph.getGlyphID(), | 995 glyph, |
1002 glyph.getSubXFixed(), | |
1003 glyph.getSubYFixed(), | |
1004 GrGlyph::kCoverage_MaskSt
yle), | |
1005 Sk48Dot16FloorToInt(fx), | 996 Sk48Dot16FloorToInt(fx), |
1006 Sk48Dot16FloorToInt(fy), | 997 Sk48Dot16FloorToInt(fy), |
1007 color, | 998 color, |
1008 fontScaler, | 999 fontScaler, |
1009 clipRect); | 1000 clipRect); |
1010 } | 1001 } |
1011 pos += scalarsPerPosition; | 1002 pos += scalarsPerPosition; |
1012 } | 1003 } |
1013 } | 1004 } |
1014 } else { // not subpixel | 1005 } else { // not subpixel |
1015 | 1006 |
1016 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { | 1007 if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { |
1017 while (text < stop) { | 1008 while (text < stop) { |
1018 // the last 2 parameters are ignored | 1009 // the last 2 parameters are ignored |
1019 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1010 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1020 | 1011 |
1021 if (glyph.fWidth) { | 1012 if (glyph.fWidth) { |
1022 SkPoint tmsLoc; | 1013 SkPoint tmsLoc; |
1023 tmsProc(pos, &tmsLoc); | 1014 tmsProc(pos, &tmsLoc); |
1024 | 1015 |
1025 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + SK_ScalarHalf);
//halfSampleX; | 1016 Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + SK_ScalarHalf);
//halfSampleX; |
1026 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf);
//halfSampleY; | 1017 Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf);
//halfSampleY; |
1027 this->bmpAppendGlyph(blob, | 1018 this->bmpAppendGlyph(blob, |
1028 runIndex, | 1019 runIndex, |
1029 GrGlyph::Pack(glyph.getGlyphID(), | 1020 glyph, |
1030 glyph.getSubXFixed(), | |
1031 glyph.getSubYFixed(), | |
1032 GrGlyph::kCoverage_MaskSt
yle), | |
1033 Sk48Dot16FloorToInt(fx), | 1021 Sk48Dot16FloorToInt(fx), |
1034 Sk48Dot16FloorToInt(fy), | 1022 Sk48Dot16FloorToInt(fy), |
1035 color, | 1023 color, |
1036 fontScaler, | 1024 fontScaler, |
1037 clipRect); | 1025 clipRect); |
1038 } | 1026 } |
1039 pos += scalarsPerPosition; | 1027 pos += scalarsPerPosition; |
1040 } | 1028 } |
1041 } else { | 1029 } else { |
1042 while (text < stop) { | 1030 while (text < stop) { |
1043 // the last 2 parameters are ignored | 1031 // the last 2 parameters are ignored |
1044 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1032 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1045 | 1033 |
1046 if (glyph.fWidth) { | 1034 if (glyph.fWidth) { |
1047 SkPoint tmsLoc; | 1035 SkPoint tmsLoc; |
1048 tmsProc(pos, &tmsLoc); | 1036 tmsProc(pos, &tmsLoc); |
1049 | 1037 |
1050 SkPoint alignLoc; | 1038 SkPoint alignLoc; |
1051 alignProc(tmsLoc, glyph, &alignLoc); | 1039 alignProc(tmsLoc, glyph, &alignLoc); |
1052 | 1040 |
1053 Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + SK_ScalarHalf
); //halfSampleX; | 1041 Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + SK_ScalarHalf
); //halfSampleX; |
1054 Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf
); //halfSampleY; | 1042 Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf
); //halfSampleY; |
1055 this->bmpAppendGlyph(blob, | 1043 this->bmpAppendGlyph(blob, |
1056 runIndex, | 1044 runIndex, |
1057 GrGlyph::Pack(glyph.getGlyphID(), | 1045 glyph, |
1058 glyph.getSubXFixed(), | |
1059 glyph.getSubYFixed(), | |
1060 GrGlyph::kCoverage_MaskSt
yle), | |
1061 Sk48Dot16FloorToInt(fx), | 1046 Sk48Dot16FloorToInt(fx), |
1062 Sk48Dot16FloorToInt(fy), | 1047 Sk48Dot16FloorToInt(fy), |
1063 color, | 1048 color, |
1064 fontScaler, | 1049 fontScaler, |
1065 clipRect); | 1050 clipRect); |
1066 } | 1051 } |
1067 pos += scalarsPerPosition; | 1052 pos += scalarsPerPosition; |
1068 } | 1053 } |
1069 } | 1054 } |
1070 } | 1055 } |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 const char* lastText = text; | 1161 const char* lastText = text; |
1177 // the last 2 parameters are ignored | 1162 // the last 2 parameters are ignored |
1178 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1163 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1179 | 1164 |
1180 if (glyph.fWidth) { | 1165 if (glyph.fWidth) { |
1181 SkScalar x = offset.x() + pos[0]; | 1166 SkScalar x = offset.x() + pos[0]; |
1182 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0)
; | 1167 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0)
; |
1183 | 1168 |
1184 if (!this->dfAppendGlyph(blob, | 1169 if (!this->dfAppendGlyph(blob, |
1185 runIndex, | 1170 runIndex, |
1186 GrGlyph::Pack(glyph.getGlyphID(), | 1171 glyph, |
1187 glyph.getSubXFixed(), | |
1188 glyph.getSubYFixed(), | |
1189 GrGlyph::kDistance_MaskSt
yle), | |
1190 x, y, color, fontScaler, clipRect, | 1172 x, y, color, fontScaler, clipRect, |
1191 textRatio, viewMatrix)) { | 1173 textRatio, viewMatrix)) { |
1192 // couldn't append, send to fallback | 1174 // couldn't append, send to fallback |
1193 fallbackTxt->append(SkToInt(text-lastText), lastText); | 1175 fallbackTxt->append(SkToInt(text-lastText), lastText); |
1194 *fallbackPos->append() = pos[0]; | 1176 *fallbackPos->append() = pos[0]; |
1195 if (2 == scalarsPerPosition) { | 1177 if (2 == scalarsPerPosition) { |
1196 *fallbackPos->append() = pos[1]; | 1178 *fallbackPos->append() = pos[1]; |
1197 } | 1179 } |
1198 } | 1180 } |
1199 } | 1181 } |
1200 pos += scalarsPerPosition; | 1182 pos += scalarsPerPosition; |
1201 } | 1183 } |
1202 } else { | 1184 } else { |
1203 SkScalar alignMul = SkPaint::kCenter_Align == skPaint.getTextAlign() ? S
K_ScalarHalf | 1185 SkScalar alignMul = SkPaint::kCenter_Align == skPaint.getTextAlign() ? S
K_ScalarHalf |
1204 : S
K_Scalar1; | 1186 : S
K_Scalar1; |
1205 while (text < stop) { | 1187 while (text < stop) { |
1206 const char* lastText = text; | 1188 const char* lastText = text; |
1207 // the last 2 parameters are ignored | 1189 // the last 2 parameters are ignored |
1208 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 1190 const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
1209 | 1191 |
1210 if (glyph.fWidth) { | 1192 if (glyph.fWidth) { |
1211 SkScalar x = offset.x() + pos[0]; | 1193 SkScalar x = offset.x() + pos[0]; |
1212 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0)
; | 1194 SkScalar y = offset.y() + (2 == scalarsPerPosition ? pos[1] : 0)
; |
1213 | 1195 |
1214 SkScalar advanceX = SkFixedToScalar(glyph.fAdvanceX) * alignMul
* textRatio; | 1196 SkScalar advanceX = SkFixedToScalar(glyph.fAdvanceX) * alignMul
* textRatio; |
1215 SkScalar advanceY = SkFixedToScalar(glyph.fAdvanceY) * alignMul
* textRatio; | 1197 SkScalar advanceY = SkFixedToScalar(glyph.fAdvanceY) * alignMul
* textRatio; |
1216 | 1198 |
1217 if (!this->dfAppendGlyph(blob, | 1199 if (!this->dfAppendGlyph(blob, |
1218 runIndex, | 1200 runIndex, |
1219 GrGlyph::Pack(glyph.getGlyphID(), | 1201 glyph, |
1220 glyph.getSubXFixed(), | |
1221 glyph.getSubYFixed(), | |
1222 GrGlyph::kDistance_MaskSt
yle), | |
1223 x - advanceX, y - advanceY, color, | 1202 x - advanceX, y - advanceY, color, |
1224 fontScaler, | 1203 fontScaler, |
1225 clipRect, | 1204 clipRect, |
1226 textRatio, | 1205 textRatio, |
1227 viewMatrix)) { | 1206 viewMatrix)) { |
1228 // couldn't append, send to fallback | 1207 // couldn't append, send to fallback |
1229 fallbackTxt->append(SkToInt(text-lastText), lastText); | 1208 fallbackTxt->append(SkToInt(text-lastText), lastText); |
1230 *fallbackPos->append() = pos[0]; | 1209 *fallbackPos->append() = pos[0]; |
1231 if (2 == scalarsPerPosition) { | 1210 if (2 == scalarsPerPosition) { |
1232 *fallbackPos->append() = pos[1]; | 1211 *fallbackPos->append() = pos[1]; |
1233 } | 1212 } |
1234 } | 1213 } |
1235 } | 1214 } |
1236 pos += scalarsPerPosition; | 1215 pos += scalarsPerPosition; |
1237 } | 1216 } |
1238 } | 1217 } |
1239 } | 1218 } |
1240 | 1219 |
1241 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, | 1220 void GrAtlasTextContext::bmpAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
1242 GrGlyph::PackedID packed, | 1221 const SkGlyph& skGlyph, |
1243 int vx, int vy, GrColor color, GrFontSca
ler* scaler, | 1222 int vx, int vy, GrColor color, GrFontSca
ler* scaler, |
1244 const SkIRect& clipRect) { | 1223 const SkIRect& clipRect) { |
1245 Run& run = blob->fRuns[runIndex]; | 1224 Run& run = blob->fRuns[runIndex]; |
1246 if (!fCurrStrike) { | 1225 if (!fCurrStrike) { |
1247 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); | 1226 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
1248 run.fStrike.reset(SkRef(fCurrStrike)); | 1227 run.fStrike.reset(SkRef(fCurrStrike)); |
1249 } | 1228 } |
1250 | 1229 |
1251 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); | 1230 GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(), |
| 1231 skGlyph.getSubXFixed(), |
| 1232 skGlyph.getSubYFixed(), |
| 1233 GrGlyph::kCoverage_MaskStyle); |
| 1234 GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler); |
1252 if (!glyph) { | 1235 if (!glyph) { |
1253 return; | 1236 return; |
1254 } | 1237 } |
1255 | 1238 |
1256 int x = vx + glyph->fBounds.fLeft; | 1239 int x = vx + glyph->fBounds.fLeft; |
1257 int y = vy + glyph->fBounds.fTop; | 1240 int y = vy + glyph->fBounds.fTop; |
1258 | 1241 |
1259 // keep them as ints until we've done the clip-test | 1242 // keep them as ints until we've done the clip-test |
1260 int width = glyph->fBounds.width(); | 1243 int width = glyph->fBounds.width(); |
1261 int height = glyph->fBounds.height(); | 1244 int height = glyph->fBounds.height(); |
1262 | 1245 |
1263 #if 0 | 1246 #if 0 |
1264 // Not checking the clip bounds might introduce a performance regression. H
owever, its not | 1247 // Not checking the clip bounds might introduce a performance regression. H
owever, its not |
1265 // clear if this is still true today with the larger tiles we use in Chrome.
For repositionable | 1248 // clear if this is still true today with the larger tiles we use in Chrome.
For repositionable |
1266 // blobs, we want to make sure we have all of the glyphs, so clipping them o
ut is not ideal. | 1249 // blobs, we want to make sure we have all of the glyphs, so clipping them o
ut is not ideal. |
1267 // We could store the cliprect in the key, but then we'd lose the ability to
do integer scrolls | 1250 // We could store the cliprect in the key, but then we'd lose the ability to
do integer scrolls |
1268 // TODO verify this | 1251 // TODO verify this |
1269 // check if we clipped out | 1252 // check if we clipped out |
1270 if (clipRect.quickReject(x, y, x + width, y + height)) { | 1253 if (clipRect.quickReject(x, y, x + width, y + height)) { |
1271 return; | 1254 return; |
1272 } | 1255 } |
1273 #endif | 1256 #endif |
1274 | 1257 |
1275 // If the glyph is too large we fall back to paths | 1258 // If the glyph is too large we fall back to paths |
1276 if (glyph->fTooLargeForAtlas) { | 1259 if (glyph->fTooLargeForAtlas) { |
1277 this->appendGlyphPath(blob, glyph, scaler, SkIntToScalar(vx), SkIntToSca
lar(vy)); | 1260 this->appendGlyphPath(blob, glyph, scaler, skGlyph, SkIntToScalar(vx), S
kIntToScalar(vy)); |
1278 return; | 1261 return; |
1279 } | 1262 } |
1280 | 1263 |
1281 GrMaskFormat format = glyph->fMaskFormat; | 1264 GrMaskFormat format = glyph->fMaskFormat; |
1282 | 1265 |
1283 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); | 1266 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); |
1284 if (run.fInitialized && subRun->fMaskFormat != format) { | 1267 if (run.fInitialized && subRun->fMaskFormat != format) { |
1285 subRun = &run.fSubRunInfo.push_back(); | 1268 subRun = &run.fSubRunInfo.push_back(); |
1286 } | 1269 } |
1287 | 1270 |
1288 run.fInitialized = true; | 1271 run.fInitialized = true; |
1289 | 1272 |
1290 size_t vertexStride = get_vertex_stride(format); | 1273 size_t vertexStride = get_vertex_stride(format); |
1291 | 1274 |
1292 SkRect r; | 1275 SkRect r; |
1293 r.fLeft = SkIntToScalar(x); | 1276 r.fLeft = SkIntToScalar(x); |
1294 r.fTop = SkIntToScalar(y); | 1277 r.fTop = SkIntToScalar(y); |
1295 r.fRight = r.fLeft + SkIntToScalar(width); | 1278 r.fRight = r.fLeft + SkIntToScalar(width); |
1296 r.fBottom = r.fTop + SkIntToScalar(height); | 1279 r.fBottom = r.fTop + SkIntToScalar(height); |
1297 subRun->fMaskFormat = format; | 1280 subRun->fMaskFormat = format; |
1298 this->appendGlyphCommon(blob, &run, subRun, r, color, vertexStride, kA8_GrMa
skFormat == format, | 1281 this->appendGlyphCommon(blob, &run, subRun, r, color, vertexStride, kA8_GrMa
skFormat == format, |
1299 glyph); | 1282 glyph); |
1300 } | 1283 } |
1301 | 1284 |
1302 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex, | 1285 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex, |
1303 GrGlyph::PackedID packed, | 1286 const SkGlyph& skGlyph, |
1304 SkScalar sx, SkScalar sy, GrColor color, | 1287 SkScalar sx, SkScalar sy, GrColor color, |
1305 GrFontScaler* scaler, | 1288 GrFontScaler* scaler, |
1306 const SkIRect& clipRect, | 1289 const SkIRect& clipRect, |
1307 SkScalar textRatio, const SkMatrix& viewM
atrix) { | 1290 SkScalar textRatio, const SkMatrix& viewM
atrix) { |
1308 Run& run = blob->fRuns[runIndex]; | 1291 Run& run = blob->fRuns[runIndex]; |
1309 if (!fCurrStrike) { | 1292 if (!fCurrStrike) { |
1310 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); | 1293 fCurrStrike = fContext->getBatchFontCache()->getStrike(scaler); |
1311 run.fStrike.reset(SkRef(fCurrStrike)); | 1294 run.fStrike.reset(SkRef(fCurrStrike)); |
1312 } | 1295 } |
1313 | 1296 |
1314 GrGlyph* glyph = fCurrStrike->getGlyph(packed, scaler); | 1297 GrGlyph::PackedID id = GrGlyph::Pack(skGlyph.getGlyphID(), |
| 1298 skGlyph.getSubXFixed(), |
| 1299 skGlyph.getSubYFixed(), |
| 1300 GrGlyph::kDistance_MaskStyle); |
| 1301 GrGlyph* glyph = fCurrStrike->getGlyph(skGlyph, id, scaler); |
1315 if (!glyph) { | 1302 if (!glyph) { |
1316 return true; | 1303 return true; |
1317 } | 1304 } |
1318 | 1305 |
1319 // fallback to color glyph support | 1306 // fallback to color glyph support |
1320 if (kA8_GrMaskFormat != glyph->fMaskFormat) { | 1307 if (kA8_GrMaskFormat != glyph->fMaskFormat) { |
1321 return false; | 1308 return false; |
1322 } | 1309 } |
1323 | 1310 |
1324 SkScalar dx = SkIntToScalar(glyph->fBounds.fLeft + SK_DistanceFieldInset); | 1311 SkScalar dx = SkIntToScalar(glyph->fBounds.fLeft + SK_DistanceFieldInset); |
(...skipping 18 matching lines...) Expand all Loading... |
1343 SkScalarTruncToInt(dstRect.top()), | 1330 SkScalarTruncToInt(dstRect.top()), |
1344 SkScalarTruncToInt(dstRect.right()), | 1331 SkScalarTruncToInt(dstRect.right()), |
1345 SkScalarTruncToInt(dstRect.bottom()))) { | 1332 SkScalarTruncToInt(dstRect.bottom()))) { |
1346 return true; | 1333 return true; |
1347 } | 1334 } |
1348 #endif | 1335 #endif |
1349 | 1336 |
1350 // TODO combine with the above | 1337 // TODO combine with the above |
1351 // If the glyph is too large we fall back to paths | 1338 // If the glyph is too large we fall back to paths |
1352 if (glyph->fTooLargeForAtlas) { | 1339 if (glyph->fTooLargeForAtlas) { |
1353 this->appendGlyphPath(blob, glyph, scaler, sx - dx, sy - dy); | 1340 this->appendGlyphPath(blob, glyph, scaler, skGlyph, sx - dx, sy - dy); |
1354 return true; | 1341 return true; |
1355 } | 1342 } |
1356 | 1343 |
1357 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); | 1344 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); |
1358 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); | 1345 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); |
1359 subRun->fMaskFormat = kA8_GrMaskFormat; | 1346 subRun->fMaskFormat = kA8_GrMaskFormat; |
1360 | 1347 |
1361 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD
Text); | 1348 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD
Text); |
1362 | 1349 |
1363 bool useColorVerts = !subRun->fUseLCDText; | 1350 bool useColorVerts = !subRun->fUseLCDText; |
1364 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride,
useColorVerts, | 1351 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride,
useColorVerts, |
1365 glyph); | 1352 glyph); |
1366 return true; | 1353 return true; |
1367 } | 1354 } |
1368 | 1355 |
1369 inline void GrAtlasTextContext::appendGlyphPath(GrAtlasTextBlob* blob, GrGlyph*
glyph, | 1356 inline void GrAtlasTextContext::appendGlyphPath(GrAtlasTextBlob* blob, GrGlyph*
glyph, |
1370 GrFontScaler* scaler, SkScalar x
, SkScalar y) { | 1357 GrFontScaler* scaler, const SkGl
yph& skGlyph, |
| 1358 SkScalar x, SkScalar y) { |
1371 if (NULL == glyph->fPath) { | 1359 if (NULL == glyph->fPath) { |
1372 SkPath* path = SkNEW(SkPath); | 1360 const SkPath* glyphPath = scaler->getGlyphPath(skGlyph); |
1373 if (!scaler->getGlyphPath(glyph->glyphID(), path)) { | 1361 if (!glyphPath) { |
1374 // flag the glyph as being dead? | |
1375 SkDELETE(path); | |
1376 return; | 1362 return; |
1377 } | 1363 } |
1378 glyph->fPath = path; | 1364 |
| 1365 glyph->fPath = SkNEW_ARGS(SkPath, (*glyphPath)); |
1379 } | 1366 } |
1380 SkASSERT(glyph->fPath); | |
1381 blob->fBigGlyphs.push_back(GrAtlasTextBlob::BigGlyph(*glyph->fPath, x, y)); | 1367 blob->fBigGlyphs.push_back(GrAtlasTextBlob::BigGlyph(*glyph->fPath, x, y)); |
1382 } | 1368 } |
1383 | 1369 |
1384 inline void GrAtlasTextContext::appendGlyphCommon(GrAtlasTextBlob* blob, Run* ru
n, | 1370 inline void GrAtlasTextContext::appendGlyphCommon(GrAtlasTextBlob* blob, Run* ru
n, |
1385 Run::SubRunInfo* subRun, | 1371 Run::SubRunInfo* subRun, |
1386 const SkRect& positions, GrCol
or color, | 1372 const SkRect& positions, GrCol
or color, |
1387 size_t vertexStride, bool useV
ertexColor, | 1373 size_t vertexStride, bool useV
ertexColor, |
1388 GrGlyph* glyph) { | 1374 GrGlyph* glyph) { |
1389 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; | 1375 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; |
1390 run->fVertexBounds.joinNonEmptyArg(positions); | 1376 run->fVertexBounds.joinNonEmptyArg(positions); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 regenerateGlyphs = true; | 1665 regenerateGlyphs = true; |
1680 strike = fFontCache->getStrike(scaler); | 1666 strike = fFontCache->getStrike(scaler); |
1681 } else { | 1667 } else { |
1682 strike = run.fStrike; | 1668 strike = run.fStrike; |
1683 } | 1669 } |
1684 } | 1670 } |
1685 | 1671 |
1686 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { | 1672 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { |
1687 if (regenerateTextureCoords) { | 1673 if (regenerateTextureCoords) { |
1688 size_t glyphOffset = glyphIdx + info.fGlyphStartIndex; | 1674 size_t glyphOffset = glyphIdx + info.fGlyphStartIndex; |
1689 GrGlyph* glyph; | 1675 |
| 1676 GrGlyph* glyph = blob->fGlyphs[glyphOffset]; |
| 1677 GrGlyph::PackedID id = glyph->fPackedID; |
| 1678 const SkGlyph& skGlyph = scaler->grToSkGlyph(id); |
1690 if (regenerateGlyphs) { | 1679 if (regenerateGlyphs) { |
1691 // Get the id from the old glyph, and use the new st
rike to lookup | 1680 // Get the id from the old glyph, and use the new st
rike to lookup |
1692 // the glyph. | 1681 // the glyph. |
1693 glyph = blob->fGlyphs[glyphOffset]; | 1682 blob->fGlyphs[glyphOffset] = strike->getGlyph(skGlyp
h, id, scaler); |
1694 blob->fGlyphs[glyphOffset] = strike->getGlyph(glyph-
>fPackedID, | |
1695 scaler
); | |
1696 } | 1683 } |
1697 glyph = blob->fGlyphs[glyphOffset]; | 1684 glyph = blob->fGlyphs[glyphOffset]; |
1698 SkASSERT(glyph); | 1685 SkASSERT(glyph); |
1699 SkASSERT(glyph->fMaskFormat == this->maskFormat()); | 1686 SkASSERT(id == glyph->fPackedID && |
| 1687 glyph->fMaskFormat == this->maskFormat()); |
1700 | 1688 |
1701 if (!fFontCache->hasGlyph(glyph) && | 1689 if (!fFontCache->hasGlyph(glyph) && |
1702 !strike->addGlyphToAtlas(batchTarget, glyph, scaler)
) { | 1690 !strike->addGlyphToAtlas(batchTarget, glyph, scaler,
skGlyph)) { |
1703 this->flush(batchTarget, &flushInfo); | 1691 this->flush(batchTarget, &flushInfo); |
1704 batchTarget->initDraw(gp, pipeline); | 1692 batchTarget->initDraw(gp, pipeline); |
1705 brokenRun = glyphIdx > 0; | 1693 brokenRun = glyphIdx > 0; |
1706 | 1694 |
1707 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(
batchTarget, | 1695 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(
batchTarget, |
1708
glyph, | 1696
glyph, |
1709
scaler); | 1697
scaler, |
| 1698
skGlyph); |
1710 SkASSERT(success); | 1699 SkASSERT(success); |
1711 } | 1700 } |
1712 fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseT
oken, glyph, | 1701 fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseT
oken, glyph, |
1713 batchTarget->cu
rrentToken()); | 1702 batchTarget->cu
rrentToken()); |
1714 | 1703 |
1715 // Texture coords are the last vertex attribute so we ge
t a pointer to the | 1704 // Texture coords are the last vertex attribute so we ge
t a pointer to the |
1716 // first one and then map with stride in regenerateTextu
reCoords | 1705 // first one and then map with stride in regenerateTextu
reCoords |
1717 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert
ices); | 1706 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert
ices); |
1718 vertex += info.fVertexStartIndex; | 1707 vertex += info.fVertexStartIndex; |
1719 vertex += vertexStride * glyphIdx * kVerticesPerGlyph; | 1708 vertex += vertexStride * glyphIdx * kVerticesPerGlyph; |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2291 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, | 2280 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, |
2292 static_cast<size_t>(textLen), 0, 0,
noClip)); | 2281 static_cast<size_t>(textLen), 0, 0,
noClip)); |
2293 | 2282 |
2294 SkScalar transX = static_cast<SkScalar>(random->nextU()); | 2283 SkScalar transX = static_cast<SkScalar>(random->nextU()); |
2295 SkScalar transY = static_cast<SkScalar>(random->nextU()); | 2284 SkScalar transY = static_cast<SkScalar>(random->nextU()); |
2296 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0]
; | 2285 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0]
; |
2297 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); | 2286 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); |
2298 } | 2287 } |
2299 | 2288 |
2300 #endif | 2289 #endif |
OLD | NEW |