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 "GrBatchFontCache.h" | 9 #include "GrBatchFontCache.h" |
10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
(...skipping 1323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1334 SkScalarTruncToInt(dstRect.top()), | 1334 SkScalarTruncToInt(dstRect.top()), |
1335 SkScalarTruncToInt(dstRect.right()), | 1335 SkScalarTruncToInt(dstRect.right()), |
1336 SkScalarTruncToInt(dstRect.bottom()))) { | 1336 SkScalarTruncToInt(dstRect.bottom()))) { |
1337 return true; | 1337 return true; |
1338 } | 1338 } |
1339 #endif | 1339 #endif |
1340 | 1340 |
1341 // TODO combine with the above | 1341 // TODO combine with the above |
1342 // If the glyph is too large we fall back to paths | 1342 // If the glyph is too large we fall back to paths |
1343 if (glyph->fTooLargeForAtlas) { | 1343 if (glyph->fTooLargeForAtlas) { |
1344 this->appendGlyphPath(blob, glyph, scaler, skGlyph, sx - dx, sy - dy); | 1344 this->appendGlyphPath(blob, glyph, scaler, skGlyph, sx - dx, sy - dy, sc
ale, true); |
1345 return true; | 1345 return true; |
1346 } | 1346 } |
1347 | 1347 |
1348 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); | 1348 PerSubRunInfo* subRun = &run.fSubRunInfo.back(); |
1349 if (!run.fInitialized) { | 1349 if (!run.fInitialized) { |
1350 subRun->fStrike.reset(SkRef(fCurrStrike)); | 1350 subRun->fStrike.reset(SkRef(fCurrStrike)); |
1351 } | 1351 } |
1352 run.fInitialized = true; | 1352 run.fInitialized = true; |
1353 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); | 1353 SkASSERT(glyph->fMaskFormat == kA8_GrMaskFormat); |
1354 subRun->fMaskFormat = kA8_GrMaskFormat; | 1354 subRun->fMaskFormat = kA8_GrMaskFormat; |
1355 | 1355 |
1356 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD
Text); | 1356 size_t vertexStride = get_vertex_stride_df(kA8_GrMaskFormat, subRun->fUseLCD
Text); |
1357 | 1357 |
1358 bool useColorVerts = !subRun->fUseLCDText; | 1358 bool useColorVerts = !subRun->fUseLCDText; |
1359 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride,
useColorVerts, | 1359 this->appendGlyphCommon(blob, &run, subRun, glyphRect, color, vertexStride,
useColorVerts, |
1360 glyph); | 1360 glyph); |
1361 return true; | 1361 return true; |
1362 } | 1362 } |
1363 | 1363 |
1364 inline void GrAtlasTextContext::appendGlyphPath(GrAtlasTextBlob* blob, GrGlyph*
glyph, | 1364 inline void GrAtlasTextContext::appendGlyphPath(GrAtlasTextBlob* blob, GrGlyph*
glyph, |
1365 GrFontScaler* scaler, const SkGl
yph& skGlyph, | 1365 GrFontScaler* scaler, const SkGl
yph& skGlyph, |
1366 SkScalar x, SkScalar y) { | 1366 SkScalar x, SkScalar y, SkScalar
scale, |
| 1367 bool applyVM) { |
1367 if (NULL == glyph->fPath) { | 1368 if (NULL == glyph->fPath) { |
1368 const SkPath* glyphPath = scaler->getGlyphPath(skGlyph); | 1369 const SkPath* glyphPath = scaler->getGlyphPath(skGlyph); |
1369 if (!glyphPath) { | 1370 if (!glyphPath) { |
1370 return; | 1371 return; |
1371 } | 1372 } |
1372 | 1373 |
1373 glyph->fPath = SkNEW_ARGS(SkPath, (*glyphPath)); | 1374 glyph->fPath = SkNEW_ARGS(SkPath, (*glyphPath)); |
1374 } | 1375 } |
1375 blob->fBigGlyphs.push_back(GrAtlasTextBlob::BigGlyph(*glyph->fPath, x, y)); | 1376 blob->fBigGlyphs.push_back(GrAtlasTextBlob::BigGlyph(*glyph->fPath, x, y, sc
ale, applyVM)); |
1376 } | 1377 } |
1377 | 1378 |
1378 inline void GrAtlasTextContext::appendGlyphCommon(GrAtlasTextBlob* blob, Run* ru
n, | 1379 inline void GrAtlasTextContext::appendGlyphCommon(GrAtlasTextBlob* blob, Run* ru
n, |
1379 Run::SubRunInfo* subRun, | 1380 Run::SubRunInfo* subRun, |
1380 const SkRect& positions, GrCol
or color, | 1381 const SkRect& positions, GrCol
or color, |
1381 size_t vertexStride, bool useV
ertexColor, | 1382 size_t vertexStride, bool useV
ertexColor, |
1382 GrGlyph* glyph) { | 1383 GrGlyph* glyph) { |
1383 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; | 1384 blob->fGlyphs[subRun->fGlyphEndIndex] = glyph; |
1384 run->fVertexBounds.joinNonEmptyArg(positions); | 1385 run->fVertexBounds.joinNonEmptyArg(positions); |
1385 run->fColor = color; | 1386 run->fColor = color; |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1924 if (fFilteredColor != that->fFilteredColor) { | 1925 if (fFilteredColor != that->fFilteredColor) { |
1925 return false; | 1926 return false; |
1926 } | 1927 } |
1927 | 1928 |
1928 if (fUseBGR != that->fUseBGR) { | 1929 if (fUseBGR != that->fUseBGR) { |
1929 return false; | 1930 return false; |
1930 } | 1931 } |
1931 | 1932 |
1932 // TODO see note above | 1933 // TODO see note above |
1933 if (kLCDDistanceField_MaskType == fMaskType && this->color() != that
->color()) { | 1934 if (kLCDDistanceField_MaskType == fMaskType && this->color() != that
->color()) { |
| 1935 return false; |
1934 } | 1936 } |
1935 } | 1937 } |
1936 | 1938 |
1937 fBatch.fNumGlyphs += that->numGlyphs(); | 1939 fBatch.fNumGlyphs += that->numGlyphs(); |
1938 | 1940 |
1939 // Reallocate space for geo data if necessary and then import that's geo
data. | 1941 // Reallocate space for geo data if necessary and then import that's geo
data. |
1940 int newGeoCount = that->fGeoCount + fGeoCount; | 1942 int newGeoCount = that->fGeoCount + fGeoCount; |
1941 // We assume (and here enforce) that the allocation size is the smallest
power of two that | 1943 // We assume (and here enforce) that the allocation size is the smallest
power of two that |
1942 // is greater than or equal to the number of geometries (and at least | 1944 // is greater than or equal to the number of geometries (and at least |
1943 // kMinGeometryAllocated). | 1945 // kMinGeometryAllocated). |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2151 } | 2153 } |
2152 | 2154 |
2153 inline void GrAtlasTextContext::flushBigGlyphs(GrAtlasTextBlob* cacheBlob, GrRen
derTarget* rt, | 2155 inline void GrAtlasTextContext::flushBigGlyphs(GrAtlasTextBlob* cacheBlob, GrRen
derTarget* rt, |
2154 const GrClip& clip, const SkPaint
& skPaint, | 2156 const GrClip& clip, const SkPaint
& skPaint, |
2155 SkScalar transX, SkScalar transY, | 2157 SkScalar transX, SkScalar transY, |
2156 const SkIRect& clipBounds) { | 2158 const SkIRect& clipBounds) { |
2157 if (!cacheBlob->fBigGlyphs.count()) { | 2159 if (!cacheBlob->fBigGlyphs.count()) { |
2158 return; | 2160 return; |
2159 } | 2161 } |
2160 | 2162 |
2161 SkMatrix pathMatrix; | |
2162 if (!cacheBlob->fViewMatrix.invert(&pathMatrix)) { | |
2163 SkDebugf("could not invert viewmatrix\n"); | |
2164 return; | |
2165 } | |
2166 | |
2167 for (int i = 0; i < cacheBlob->fBigGlyphs.count(); i++) { | 2163 for (int i = 0; i < cacheBlob->fBigGlyphs.count(); i++) { |
2168 GrAtlasTextBlob::BigGlyph& bigGlyph = cacheBlob->fBigGlyphs[i]; | 2164 GrAtlasTextBlob::BigGlyph& bigGlyph = cacheBlob->fBigGlyphs[i]; |
2169 bigGlyph.fVx += transX; | 2165 bigGlyph.fVx += transX; |
2170 bigGlyph.fVy += transY; | 2166 bigGlyph.fVy += transY; |
2171 SkMatrix translate = cacheBlob->fViewMatrix; | 2167 SkMatrix ctm; |
2172 translate.postTranslate(bigGlyph.fVx, bigGlyph.fVy); | 2168 ctm.setScale(bigGlyph.fScale, bigGlyph.fScale); |
| 2169 ctm.postTranslate(bigGlyph.fVx, bigGlyph.fVy); |
| 2170 if (bigGlyph.fApplyVM) { |
| 2171 ctm.postConcat(cacheBlob->fViewMatrix); |
| 2172 } |
2173 | 2173 |
2174 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, rt, clip, bi
gGlyph.fPath, | 2174 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, rt, clip, bi
gGlyph.fPath, |
2175 skPaint, translate, &pathMatrix, cli
pBounds, false); | 2175 skPaint, ctm, nullptr, clipBounds, f
alse); |
2176 } | 2176 } |
2177 } | 2177 } |
2178 | 2178 |
2179 void GrAtlasTextContext::flush(const SkTextBlob* blob, | 2179 void GrAtlasTextContext::flush(const SkTextBlob* blob, |
2180 GrAtlasTextBlob* cacheBlob, | 2180 GrAtlasTextBlob* cacheBlob, |
2181 GrRenderTarget* rt, | 2181 GrRenderTarget* rt, |
2182 const SkPaint& skPaint, | 2182 const SkPaint& skPaint, |
2183 const GrPaint& grPaint, | 2183 const GrPaint& grPaint, |
2184 SkDrawFilter* drawFilter, | 2184 SkDrawFilter* drawFilter, |
2185 const GrClip& clip, | 2185 const GrClip& clip, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2286 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, | 2286 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, |
2287 static_cast<size_t>(textLen), 0, 0,
noClip)); | 2287 static_cast<size_t>(textLen), 0, 0,
noClip)); |
2288 | 2288 |
2289 SkScalar transX = static_cast<SkScalar>(random->nextU()); | 2289 SkScalar transX = static_cast<SkScalar>(random->nextU()); |
2290 SkScalar transY = static_cast<SkScalar>(random->nextU()); | 2290 SkScalar transY = static_cast<SkScalar>(random->nextU()); |
2291 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0]
; | 2291 const GrAtlasTextBlob::Run::SubRunInfo& info = blob->fRuns[0].fSubRunInfo[0]
; |
2292 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); | 2292 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); |
2293 } | 2293 } |
2294 | 2294 |
2295 #endif | 2295 #endif |
OLD | NEW |