diff options
author | Herb Derby <herb@google.com> | 2018-07-11 20:05:53 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-11 20:08:23 +0000 |
commit | c0a27081722eaebd005cf9c2eb78d7d1e4db7e2c (patch) | |
tree | 676d8c04690ac9e53c098a606a2c230ff2bce667 /src/core/SkGlyphRun.h | |
parent | 00a5eb8c12536f7843ccb137f94df88583813128 (diff) |
Revert "Use new SkGlyphIDSet - v2"
This reverts commit 0421083a447a8ab105d20c786f7d8377f30a6d5d.
Reason for revert: fushia page fault
Original change's description:
> Use new SkGlyphIDSet - v2
>
> Add bzero to make msan and valgrind happy.
>
> Change-Id: I9b4e2f2b8e690da4b4b920fef27d5a8854092219
> Reviewed-on: https://skia-review.googlesource.com/140563
> Reviewed-by: Mike Klein <mtklein@google.com>
> Commit-Queue: Herb Derby <herb@google.com>
TBR=mtklein@google.com,herb@google.com
Change-Id: I4e5e16644cbf56b5ff0b21afd6f3962e3976a1da
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/140803
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Diffstat (limited to 'src/core/SkGlyphRun.h')
-rw-r--r-- | src/core/SkGlyphRun.h | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h index 7c3a74860c..7788376c70 100644 --- a/src/core/SkGlyphRun.h +++ b/src/core/SkGlyphRun.h @@ -83,14 +83,26 @@ private: const SkPaint fRunPaint; }; -class SkGlyphIDSet { +// A faster set implementation that does not need any initialization, and reading the set items +// is order the number of items, and not the size of the universe. +// This implementation is based on the paper by Briggs and Torczon, "An Efficient Representation +// for Sparse Sets" +// +// This implementation assumes that the unique glyphs added are appended to a vector that may +// already have unique glyph from a previous computation. This allows the packing of multiple +// UniqueID sequences in a single vector. +class SkGlyphSet { public: - SkSpan<const SkGlyphID> uniquifyGlyphIDs( - uint32_t universeSize, SkSpan<const SkGlyphID> glyphIDs, - SkGlyphID* uniqueGlyphIDs, uint16_t* denseindices); + SkGlyphSet() = default; + uint16_t add(SkGlyphID glyphID); + void reuse(uint32_t glyphUniverseSize, std::vector<SkGlyphID>* uniqueGlyphIDs); + private: - size_t fUniverseToUniqueSize{0}; - SkAutoTMalloc<uint16_t> fUniverseToUnique; + uint32_t uniqueSize(); + uint32_t fUniverseSize{0}; + size_t fStartOfUniqueIDs{0}; + std::vector<uint16_t> fIndices; + std::vector<SkGlyphID>* fUniqueGlyphIDs{nullptr}; }; class SkGlyphRunBuilder { @@ -103,35 +115,25 @@ public: const SkScalar xpos[], SkScalar constY); void prepareDrawPosText( const SkPaint& paint, const void* bytes, size_t byteLength, const SkPoint pos[]); + void prepareTextBlob(const SkPaint& paint, const SkTextBlob& blob, SkPoint origin); SkGlyphRun* useGlyphRun(); private: - void initialize(size_t totalRunSize); - SkSpan<const SkGlyphID> textToGlyphIDs( - const SkPaint& paint, const void* bytes, size_t byteLength); - - // Returns the span of unique glyph IDs. - SkSpan<const SkGlyphID> addDenseAndUnique( - const SkPaint& paint, - SkSpan<const SkGlyphID> glyphIDs); - + void initialize(); + void addDenseAndUnique(const SkPaint& paint, const void* bytes, size_t byteLength); void makeGlyphRun( - const SkPaint& runPaint, - SkSpan<const SkGlyphID> glyphIDs, - SkSpan<const SkPoint> positions, - SkSpan<const char> text, - SkSpan<const uint32_t> clusters); + const SkPaint& runPaint, SkSpan<const char> text, SkSpan<const uint32_t> clusters); void drawText( - const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, SkPoint origin, + const SkPaint& paint, const void* bytes, size_t byteLength, SkPoint origin, SkSpan<const char> text, SkSpan<const uint32_t> clusters); void drawPosTextH( - const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, + const SkPaint& paint, const void* bytes, size_t byteLength, const SkScalar* xpos, SkScalar constY, SkSpan<const char> text, SkSpan<const uint32_t> clusters); void drawPosText( - const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, const SkPoint* pos, + const SkPaint& paint, const void* bytes, size_t byteLength, const SkPoint* pos, SkSpan<const char> text, SkSpan<const uint32_t> clusters); uint64_t fUniqueID{0}; @@ -139,6 +141,7 @@ private: std::vector<uint16_t> fDenseIndex; std::vector<SkPoint> fPositions; std::vector<SkGlyphID> fUniqueGlyphIDs; + SkGlyphID* fGlyphIDs{nullptr}; // Used as a temporary for preparing using utfN text. This implies that only one run of // glyph ids will ever be needed because blobs are already glyph based. @@ -152,7 +155,7 @@ private: SkGlyphRun fScratchGlyphRun; // Used for collecting the set of unique glyphs. - SkGlyphIDSet fGlyphIDSet; + SkGlyphSet fGlyphSet; }; #endif // SkGlyphRunInfo_DEFINED |