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