| 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 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 // then we can't really trust the atlas has all of the correct data.
Atlas evictions | 814 // then we can't really trust the atlas has all of the correct data.
Atlas evictions |
| 815 // should be pretty rare, so we just always regenerate in those case
s | 815 // should be pretty rare, so we just always regenerate in those case
s |
| 816 if (regenerateTextureCoords || regenerateColors) { | 816 if (regenerateTextureCoords || regenerateColors) { |
| 817 // first regenerate texture coordinates / colors if need be | 817 // first regenerate texture coordinates / colors if need be |
| 818 const SkDescriptor* desc = NULL; | 818 const SkDescriptor* desc = NULL; |
| 819 SkGlyphCache* cache = NULL; | 819 SkGlyphCache* cache = NULL; |
| 820 GrFontScaler* scaler = NULL; | 820 GrFontScaler* scaler = NULL; |
| 821 GrBatchTextStrike* strike = NULL; | 821 GrBatchTextStrike* strike = NULL; |
| 822 bool brokenRun = false; | 822 bool brokenRun = false; |
| 823 if (regenerateTextureCoords) { | 823 if (regenerateTextureCoords) { |
| 824 info.fBulkUseToken.reset(); | |
| 825 desc = run.fDescriptor.getDesc(); | 824 desc = run.fDescriptor.getDesc(); |
| 826 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); | 825 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); |
| 827 scaler = GrTextContext::GetGrFontScaler(cache); | 826 scaler = GrTextContext::GetGrFontScaler(cache); |
| 828 strike = fFontCache->getStrike(scaler); | 827 strike = fFontCache->getStrike(scaler); |
| 829 } | 828 } |
| 830 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { | 829 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { |
| 831 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info.
fGlyphStartIndex]; | 830 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info.
fGlyphStartIndex]; |
| 832 | 831 |
| 833 if (regenerateTextureCoords) { | 832 if (regenerateTextureCoords) { |
| 834 // Upload the glyph only if needed | 833 // Upload the glyph only if needed |
| 835 GrGlyph* glyph = strike->getGlyph(glyphID, scaler); | 834 GrGlyph* glyph = strike->getGlyph(glyphID, scaler); |
| 836 SkASSERT(glyph); | 835 SkASSERT(glyph); |
| 837 | 836 |
| 838 if (!fFontCache->hasGlyph(glyph) && | 837 if (!fFontCache->hasGlyph(glyph) && |
| 839 !strike->addGlyphToAtlas(batchTarget, glyph, scaler)
) { | 838 !strike->addGlyphToAtlas(batchTarget, glyph, scaler)
) { |
| 840 this->flush(batchTarget, &drawInfo, instancesToFlush
, | 839 this->flush(batchTarget, &drawInfo, instancesToFlush
, |
| 841 maxInstancesPerDraw); | 840 maxInstancesPerDraw); |
| 842 this->initDraw(batchTarget, gp, pipeline); | 841 this->initDraw(batchTarget, gp, pipeline); |
| 843 instancesToFlush = 0; | 842 instancesToFlush = 0; |
| 844 brokenRun = glyphIdx > 0; | 843 brokenRun = glyphIdx > 0; |
| 845 | 844 |
| 846 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(
batchTarget, glyph, | 845 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(
batchTarget, glyph, |
| 847
scaler); | 846
scaler); |
| 848 SkASSERT(success); | 847 SkASSERT(success); |
| 849 } | 848 } |
| 850 fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseT
oken, glyph, | 849 |
| 851 batchTarget->cu
rrentToken()); | 850 fFontCache->setGlyphRefToken(glyph, batchTarget->current
Token()); |
| 852 | 851 |
| 853 // Texture coords are the last vertex attribute so we ge
t a pointer to the | 852 // Texture coords are the last vertex attribute so we ge
t a pointer to the |
| 854 // first one and then map with stride in regenerateTextu
reCoords | 853 // first one and then map with stride in regenerateTextu
reCoords |
| 855 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert
ices); | 854 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert
ices); |
| 856 vertex += info.fVertexStartIndex; | 855 vertex += info.fVertexStartIndex; |
| 857 vertex += vertexStride * glyphIdx * kVerticesPerGlyph; | 856 vertex += vertexStride * glyphIdx * kVerticesPerGlyph; |
| 858 vertex += vertexStride - sizeof(SkIPoint16); | 857 vertex += vertexStride - sizeof(SkIPoint16); |
| 859 | 858 |
| 860 this->regenerateTextureCoords(glyph, vertex, vertexStrid
e); | 859 this->regenerateTextureCoords(glyph, vertex, vertexStrid
e); |
| 861 } | 860 } |
| 862 | 861 |
| 863 if (regenerateColors) { | 862 if (regenerateColors) { |
| 864 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert
ices); | 863 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert
ices); |
| 865 vertex += info.fVertexStartIndex; | 864 vertex += info.fVertexStartIndex; |
| 866 vertex += vertexStride * glyphIdx * kVerticesPerGlyph +
sizeof(SkPoint); | 865 vertex += vertexStride * glyphIdx * kVerticesPerGlyph +
sizeof(SkPoint); |
| 867 this->regenerateColors(vertex, vertexStride, args.fColor
); | 866 this->regenerateColors(vertex, vertexStride, args.fColor
); |
| 868 } | 867 } |
| 869 | 868 |
| 870 instancesToFlush++; | 869 instancesToFlush++; |
| 871 } | 870 } |
| 872 | 871 |
| 873 if (regenerateTextureCoords) { | 872 if (regenerateTextureCoords) { |
| 874 SkGlyphCache::AttachCache(cache); | 873 SkGlyphCache::AttachCache(cache); |
| 875 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt
lasGeneration : | 874 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt
lasGeneration : |
| 876 fFontCache->atlasGenerat
ion(fMaskFormat); | 875 fFontCache->atlasGenerat
ion(fMaskFormat); |
| 877 } | 876 } |
| 878 } else { | 877 } else { |
| 879 instancesToFlush += glyphCount; | 878 instancesToFlush += glyphCount; |
| 880 | |
| 881 // set use tokens for all of the glyphs in our subrun. This is
only valid if we | |
| 882 // have a valid atlas generation | |
| 883 fFontCache->setUseTokenBulk(info.fBulkUseToken, | |
| 884 batchTarget->currentToken(), | |
| 885 fMaskFormat); | |
| 886 } | 879 } |
| 887 | 880 |
| 888 // now copy all vertices | 881 // now copy all vertices |
| 889 size_t byteCount = info.fVertexEndIndex - info.fVertexStartIndex; | 882 size_t byteCount = info.fVertexEndIndex - info.fVertexStartIndex; |
| 890 memcpy(currVertex, blob->fVertices + info.fVertexStartIndex, byteCou
nt); | 883 memcpy(currVertex, blob->fVertices + info.fVertexStartIndex, byteCou
nt); |
| 891 | 884 |
| 892 currVertex += byteCount; | 885 currVertex += byteCount; |
| 893 } | 886 } |
| 894 | 887 |
| 895 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra
w); | 888 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra
w); |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 | 1131 |
| 1139 GrColor color = grPaint.getColor(); | 1132 GrColor color = grPaint.getColor(); |
| 1140 uint8_t paintAlpha = skPaint.getAlpha(); | 1133 uint8_t paintAlpha = skPaint.getAlpha(); |
| 1141 for (int run = 0; run < cacheBlob->fRunCount; run++) { | 1134 for (int run = 0; run < cacheBlob->fRunCount; run++) { |
| 1142 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, paintAlp
ha); | 1135 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, paintAlp
ha); |
| 1143 } | 1136 } |
| 1144 | 1137 |
| 1145 // Now flush big glyphs | 1138 // Now flush big glyphs |
| 1146 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip); | 1139 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip); |
| 1147 } | 1140 } |
| OLD | NEW |