| 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 1519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 SkAutoTUnref<const GrGeometryProcessor> gp; | 1530 SkAutoTUnref<const GrGeometryProcessor> gp; |
| 1531 if (fUseDistanceFields) { | 1531 if (fUseDistanceFields) { |
| 1532 gp.reset(this->setupDfProcessor(this->viewMatrix(), fFilteredColor,
this->color(), | 1532 gp.reset(this->setupDfProcessor(this->viewMatrix(), fFilteredColor,
this->color(), |
| 1533 texture)); | 1533 texture)); |
| 1534 } else { | 1534 } else { |
| 1535 GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::k
None_FilterMode); | 1535 GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::k
None_FilterMode); |
| 1536 gp.reset(GrBitmapTextGeoProc::Create(this->color(), | 1536 gp.reset(GrBitmapTextGeoProc::Create(this->color(), |
| 1537 texture, | 1537 texture, |
| 1538 params, | 1538 params, |
| 1539 fMaskFormat, | 1539 fMaskFormat, |
| 1540 localMatrix)); | 1540 localMatrix, |
| 1541 this->usesLocalCoords())); |
| 1541 } | 1542 } |
| 1542 | 1543 |
| 1543 FlushInfo flushInfo; | 1544 FlushInfo flushInfo; |
| 1544 flushInfo.fGlyphsToFlush = 0; | 1545 flushInfo.fGlyphsToFlush = 0; |
| 1545 size_t vertexStride = gp->getVertexStride(); | 1546 size_t vertexStride = gp->getVertexStride(); |
| 1546 SkASSERT(vertexStride == (fUseDistanceFields ? | 1547 SkASSERT(vertexStride == (fUseDistanceFields ? |
| 1547 get_vertex_stride_df(fMaskFormat, fUseLCDText)
: | 1548 get_vertex_stride_df(fMaskFormat, fUseLCDText)
: |
| 1548 get_vertex_stride(fMaskFormat))); | 1549 get_vertex_stride(fMaskFormat))); |
| 1549 | 1550 |
| 1550 this->initDraw(batchTarget, gp, pipeline); | 1551 batchTarget->initDraw(gp, pipeline); |
| 1551 | 1552 |
| 1552 int glyphCount = this->numGlyphs(); | 1553 int glyphCount = this->numGlyphs(); |
| 1553 int instanceCount = fInstanceCount; | 1554 int instanceCount = fInstanceCount; |
| 1554 const GrVertexBuffer* vertexBuffer; | 1555 const GrVertexBuffer* vertexBuffer; |
| 1555 | 1556 |
| 1556 void* vertices = batchTarget->makeVertSpace(vertexStride, | 1557 void* vertices = batchTarget->makeVertSpace(vertexStride, |
| 1557 glyphCount * kVerticesPerGly
ph, | 1558 glyphCount * kVerticesPerGly
ph, |
| 1558 &vertexBuffer, | 1559 &vertexBuffer, |
| 1559 &flushInfo.fVertexOffset); | 1560 &flushInfo.fVertexOffset); |
| 1560 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); | 1561 flushInfo.fVertexBuffer.reset(SkRef(vertexBuffer)); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1650 glyph = blob->fGlyphs[glyphOffset]; | 1651 glyph = blob->fGlyphs[glyphOffset]; |
| 1651 blob->fGlyphs[glyphOffset] = strike->getGlyph(glyph-
>fPackedID, | 1652 blob->fGlyphs[glyphOffset] = strike->getGlyph(glyph-
>fPackedID, |
| 1652 scaler
); | 1653 scaler
); |
| 1653 } | 1654 } |
| 1654 glyph = blob->fGlyphs[glyphOffset]; | 1655 glyph = blob->fGlyphs[glyphOffset]; |
| 1655 SkASSERT(glyph); | 1656 SkASSERT(glyph); |
| 1656 | 1657 |
| 1657 if (!fFontCache->hasGlyph(glyph) && | 1658 if (!fFontCache->hasGlyph(glyph) && |
| 1658 !strike->addGlyphToAtlas(batchTarget, glyph, scaler)
) { | 1659 !strike->addGlyphToAtlas(batchTarget, glyph, scaler)
) { |
| 1659 this->flush(batchTarget, &flushInfo); | 1660 this->flush(batchTarget, &flushInfo); |
| 1660 this->initDraw(batchTarget, gp, pipeline); | 1661 batchTarget->initDraw(gp, pipeline); |
| 1661 brokenRun = glyphIdx > 0; | 1662 brokenRun = glyphIdx > 0; |
| 1662 | 1663 |
| 1663 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(
batchTarget, | 1664 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(
batchTarget, |
| 1664
glyph, | 1665
glyph, |
| 1665
scaler); | 1666
scaler); |
| 1666 SkASSERT(success); | 1667 SkASSERT(success); |
| 1667 } | 1668 } |
| 1668 fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseT
oken, glyph, | 1669 fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseT
oken, glyph, |
| 1669 batchTarget->cu
rrentToken()); | 1670 batchTarget->cu
rrentToken()); |
| 1670 | 1671 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1842 void regeneratePositions(intptr_t vertex, size_t vertexStride, SkScalar tran
sX, | 1843 void regeneratePositions(intptr_t vertex, size_t vertexStride, SkScalar tran
sX, |
| 1843 SkScalar transY) { | 1844 SkScalar transY) { |
| 1844 for (int i = 0; i < kVerticesPerGlyph; i++) { | 1845 for (int i = 0; i < kVerticesPerGlyph; i++) { |
| 1845 SkPoint* point = reinterpret_cast<SkPoint*>(vertex); | 1846 SkPoint* point = reinterpret_cast<SkPoint*>(vertex); |
| 1846 point->fX += transX; | 1847 point->fX += transX; |
| 1847 point->fY += transY; | 1848 point->fY += transY; |
| 1848 vertex += vertexStride; | 1849 vertex += vertexStride; |
| 1849 } | 1850 } |
| 1850 } | 1851 } |
| 1851 | 1852 |
| 1852 void initDraw(GrBatchTarget* batchTarget, | |
| 1853 const GrGeometryProcessor* gp, | |
| 1854 const GrPipeline* pipeline) { | |
| 1855 batchTarget->initDraw(gp, pipeline); | |
| 1856 | |
| 1857 // TODO remove this when batch is everywhere | |
| 1858 GrPipelineInfo init; | |
| 1859 init.fColorIgnored = fBatch.fColorIgnored; | |
| 1860 init.fOverrideColor = GrColor_ILLEGAL; | |
| 1861 init.fCoverageIgnored = fBatch.fCoverageIgnored; | |
| 1862 init.fUsesLocalCoords = this->usesLocalCoords(); | |
| 1863 gp->initBatchTracker(batchTarget->currentBatchTracker(), init); | |
| 1864 } | |
| 1865 | |
| 1866 void flush(GrBatchTarget* batchTarget, FlushInfo* flushInfo) { | 1853 void flush(GrBatchTarget* batchTarget, FlushInfo* flushInfo) { |
| 1867 GrVertices vertices; | 1854 GrVertices vertices; |
| 1868 int maxGlyphsPerDraw = flushInfo->fIndexBuffer->maxQuads(); | 1855 int maxGlyphsPerDraw = flushInfo->fIndexBuffer->maxQuads(); |
| 1869 vertices.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuf
fer, | 1856 vertices.initInstanced(kTriangles_GrPrimitiveType, flushInfo->fVertexBuf
fer, |
| 1870 flushInfo->fIndexBuffer, flushInfo->fVertexOffset
, | 1857 flushInfo->fIndexBuffer, flushInfo->fVertexOffset
, |
| 1871 kVerticesPerGlyph, kIndicesPerGlyph, flushInfo->f
GlyphsToFlush, | 1858 kVerticesPerGlyph, kIndicesPerGlyph, flushInfo->f
GlyphsToFlush, |
| 1872 maxGlyphsPerDraw); | 1859 maxGlyphsPerDraw); |
| 1873 batchTarget->draw(vertices); | 1860 batchTarget->draw(vertices); |
| 1874 flushInfo->fVertexOffset += kVerticesPerGlyph * flushInfo->fGlyphsToFlus
h; | 1861 flushInfo->fVertexOffset += kVerticesPerGlyph * flushInfo->fGlyphsToFlus
h; |
| 1875 flushInfo->fGlyphsToFlush = 0; | 1862 flushInfo->fGlyphsToFlush = 0; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1985 GrDistanceFieldLCDTextGeoProc::DistanceAdjust widthAdjust = | 1972 GrDistanceFieldLCDTextGeoProc::DistanceAdjust widthAdjust = |
| 1986 GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(redCorrectio
n, | 1973 GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(redCorrectio
n, |
| 1987 greenCorrect
ion, | 1974 greenCorrect
ion, |
| 1988 blueCorrecti
on); | 1975 blueCorrecti
on); |
| 1989 | 1976 |
| 1990 return GrDistanceFieldLCDTextGeoProc::Create(color, | 1977 return GrDistanceFieldLCDTextGeoProc::Create(color, |
| 1991 viewMatrix, | 1978 viewMatrix, |
| 1992 texture, | 1979 texture, |
| 1993 params, | 1980 params, |
| 1994 widthAdjust, | 1981 widthAdjust, |
| 1995 flags); | 1982 flags, |
| 1983 this->usesLocalCoords()
); |
| 1996 } else { | 1984 } else { |
| 1997 flags |= kColorAttr_DistanceFieldEffectFlag; | 1985 flags |= kColorAttr_DistanceFieldEffectFlag; |
| 1998 #ifdef SK_GAMMA_APPLY_TO_A8 | 1986 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 1999 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fGamma, filtered
Color); | 1987 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fGamma, filtered
Color); |
| 2000 float correction = (*fDistanceAdjustTable)[lum >> kDistanceAdjustLum
Shift]; | 1988 float correction = (*fDistanceAdjustTable)[lum >> kDistanceAdjustLum
Shift]; |
| 2001 return GrDistanceFieldA8TextGeoProc::Create(color, | 1989 return GrDistanceFieldA8TextGeoProc::Create(color, |
| 2002 viewMatrix, | 1990 viewMatrix, |
| 2003 texture, | 1991 texture, |
| 2004 params, | 1992 params, |
| 2005 correction, | 1993 correction, |
| 2006 flags); | 1994 flags, |
| 1995 this->usesLocalCoords())
; |
| 2007 #else | 1996 #else |
| 2008 return GrDistanceFieldA8TextGeoProc::Create(color, | 1997 return GrDistanceFieldA8TextGeoProc::Create(color, |
| 2009 viewMatrix, | 1998 viewMatrix, |
| 2010 texture, | 1999 texture, |
| 2011 params, | 2000 params, |
| 2012 flags); | 2001 flags, |
| 2002 this->usesLocalCoords())
; |
| 2013 #endif | 2003 #endif |
| 2014 } | 2004 } |
| 2015 | 2005 |
| 2016 } | 2006 } |
| 2017 | 2007 |
| 2018 struct BatchTracker { | 2008 struct BatchTracker { |
| 2019 GrColor fColor; | 2009 GrColor fColor; |
| 2020 SkMatrix fViewMatrix; | 2010 SkMatrix fViewMatrix; |
| 2021 bool fUsesLocalCoords; | 2011 bool fUsesLocalCoords; |
| 2022 bool fColorIgnored; | 2012 bool fColorIgnored; |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2272 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, | 2262 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, |
| 2273 static_cast<size_t>(textLen), 0, 0,
noClip)); | 2263 static_cast<size_t>(textLen), 0, 0,
noClip)); |
| 2274 | 2264 |
| 2275 SkScalar transX = static_cast<SkScalar>(random->nextU()); | 2265 SkScalar transX = static_cast<SkScalar>(random->nextU()); |
| 2276 SkScalar transY = static_cast<SkScalar>(random->nextU()); | 2266 SkScalar transY = static_cast<SkScalar>(random->nextU()); |
| 2277 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun
s[0].fSubRunInfo[0]; | 2267 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun
s[0].fSubRunInfo[0]; |
| 2278 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); | 2268 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); |
| 2279 } | 2269 } |
| 2280 | 2270 |
| 2281 #endif | 2271 #endif |
| OLD | NEW |