Index: src/gpu/GrAtlasTextBlob.h |
diff --git a/src/gpu/GrAtlasTextBlob.h b/src/gpu/GrAtlasTextBlob.h |
index 6ea86627001ac42f87eab74026cb7030f21fb98e..09f9dc01a8aa97257b17b89e32b602e6ed5622a0 100644 |
--- a/src/gpu/GrAtlasTextBlob.h |
+++ b/src/gpu/GrAtlasTextBlob.h |
@@ -77,7 +77,6 @@ struct GrAtlasTextBlob : public SkRefCnt { |
, fVertexEndIndex(0) |
, fGlyphStartIndex(0) |
, fGlyphEndIndex(0) |
- , fTextRatio(1.0f) |
, fMaskFormat(kA8_GrMaskFormat) |
, fDrawAsDistanceFields(false) |
, fUseLCDText(false) {} |
@@ -89,18 +88,44 @@ struct GrAtlasTextBlob : public SkRefCnt { |
, fVertexEndIndex(that.fVertexEndIndex) |
, fGlyphStartIndex(that.fGlyphStartIndex) |
, fGlyphEndIndex(that.fGlyphEndIndex) |
- , fTextRatio(that.fTextRatio) |
, fMaskFormat(that.fMaskFormat) |
, fDrawAsDistanceFields(that.fDrawAsDistanceFields) |
, fUseLCDText(that.fUseLCDText) { |
} |
- // Distance field text cannot draw coloremoji, and so has to fall back. However, |
- // though the distance field text and the coloremoji may share the same run, they |
- // will have different descriptors. If fOverrideDescriptor is non-nullptr, then it |
- // will be used in place of the run's descriptor to regen texture coords |
- // TODO we could have a descriptor cache, it would reduce the size of these blobs |
- // significantly, and then the subrun could just have a refed pointer to the |
- // correct descriptor. |
+ |
+ void resetBulkUseToken() { fBulkUseToken.reset(); } |
+ GrBatchAtlas::BulkUseTokenUpdater* bulkUseToken() { return &fBulkUseToken; } |
+ void setStrike(GrBatchTextStrike* strike) { fStrike.reset(SkRef(strike)); } |
+ GrBatchTextStrike* strike() const { return fStrike.get(); } |
+ |
+ void setAtlasGeneration(uint64_t atlasGeneration) { fAtlasGeneration = atlasGeneration;} |
+ uint64_t atlasGeneration() const { return fAtlasGeneration; } |
+ |
+ size_t byteCount() const { return fVertexEndIndex - fVertexStartIndex; } |
+ void setVertexStartIndex(size_t vertStartIndex) { fVertexStartIndex = vertStartIndex;} |
+ size_t vertexStartIndex() const { return fVertexStartIndex; } |
+ void setVertexEndIndex(size_t vertEndIndex) { fVertexEndIndex = vertEndIndex; } |
+ size_t vertexEndIndex() const { return fVertexEndIndex; } |
+ void appendVertices(size_t vertexStride) { |
+ fVertexEndIndex += vertexStride * kVerticesPerGlyph; |
+ } |
+ |
+ uint32_t glyphCount() const { return fGlyphEndIndex - fGlyphStartIndex; } |
+ void setGlyphStartIndex(uint32_t glyphStartIndex) { fGlyphStartIndex = glyphStartIndex;} |
+ uint32_t glyphStartIndex() const { return fGlyphStartIndex; } |
+ void setGlyphEndIndex(uint32_t glyphEndIndex) { fGlyphEndIndex = glyphEndIndex; } |
+ uint32_t glyphEndIndex() const { return fGlyphEndIndex; } |
+ void glyphAppended() { fGlyphEndIndex++; } |
+ void setMaskFormat(GrMaskFormat format) { fMaskFormat = format; } |
+ GrMaskFormat maskFormat() const { return fMaskFormat; } |
+ |
+ // df properties |
+ void setUseLCDText(bool useLCDText) { fUseLCDText = useLCDText; } |
+ bool hasUseLCDText() const { return fUseLCDText; } |
+ void setDrawAsDistanceFields() { fDrawAsDistanceFields = true; } |
+ bool drawAsDistanceFields() const { return fDrawAsDistanceFields; } |
+ |
+ private: |
GrBatchAtlas::BulkUseTokenUpdater fBulkUseToken; |
SkAutoTUnref<GrBatchTextStrike> fStrike; |
uint64_t fAtlasGeneration; |
@@ -108,7 +133,6 @@ struct GrAtlasTextBlob : public SkRefCnt { |
size_t fVertexEndIndex; |
uint32_t fGlyphStartIndex; |
uint32_t fGlyphEndIndex; |
- SkScalar fTextRatio; // df property |
GrMaskFormat fMaskFormat; |
bool fDrawAsDistanceFields; // df property |
bool fUseLCDText; // df property |
@@ -119,11 +143,11 @@ struct GrAtlasTextBlob : public SkRefCnt { |
SubRunInfo& newSubRun = fSubRunInfo.push_back(); |
SubRunInfo& prevSubRun = fSubRunInfo.fromBack(1); |
- newSubRun.fGlyphStartIndex = prevSubRun.fGlyphEndIndex; |
- newSubRun.fGlyphEndIndex = prevSubRun.fGlyphEndIndex; |
+ newSubRun.setGlyphStartIndex(prevSubRun.glyphEndIndex()); |
+ newSubRun.setGlyphEndIndex(prevSubRun.glyphEndIndex()); |
- newSubRun.fVertexStartIndex = prevSubRun.fVertexEndIndex; |
- newSubRun.fVertexEndIndex = prevSubRun.fVertexEndIndex; |
+ newSubRun.setVertexStartIndex(prevSubRun.vertexEndIndex()); |
+ newSubRun.setVertexEndIndex(prevSubRun.vertexEndIndex()); |
return newSubRun; |
} |
static const int kMinSubRuns = 1; |
@@ -131,6 +155,11 @@ struct GrAtlasTextBlob : public SkRefCnt { |
SkRect fVertexBounds; |
SkSTArray<kMinSubRuns, SubRunInfo> fSubRunInfo; |
SkAutoDescriptor fDescriptor; |
+ |
+ // Distance field text cannot draw coloremoji, and so has to fall back. However, |
+ // though the distance field text and the coloremoji may share the same run, they |
+ // will have different descriptors. If fOverrideDescriptor is non-nullptr, then it |
+ // will be used in place of the run's descriptor to regen texture coords |
SkAutoTDelete<SkAutoDescriptor> fOverrideDescriptor; // df properties |
GrColor fColor; |
bool fInitialized; |
@@ -240,6 +269,12 @@ struct GrAtlasTextBlob : public SkRefCnt { |
bool hasBitmap() const { return SkToBool(fTextType & kHasBitmap_TextType); } |
void setHasDistanceField() { fTextType |= kHasDistanceField_TextType; } |
void setHasBitmap() { fTextType |= kHasBitmap_TextType; } |
+ void appendGlyph(Run::SubRunInfo* subrun, GrGlyph* glyph) { |
+ this->fGlyphs[subrun->glyphEndIndex()] = glyph; |
+ subrun->glyphAppended(); |
+ } |
+ |
+ static const int kVerticesPerGlyph = 4; |
#ifdef CACHE_SANITY_CHECK |
static void AssertEqual(const GrAtlasTextBlob&, const GrAtlasTextBlob&); |