aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkGlyphRun.h
diff options
context:
space:
mode:
authorGravatar Herb Derby <herb@google.com>2018-07-09 17:06:09 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-07-10 22:15:05 +0000
commit819f73c23cfd8471e1cbc77ee7c14d8150457765 (patch)
tree9c0a8097d37d7c022439de6fee4642a11fa062a3 /src/core/SkGlyphRun.h
parent02ca49fc466bc54831c3a8f03b1b3c6ab6bba498 (diff)
Use new SkGlyphIDSet
Change-Id: I6b8080393a22a56577528f66630ad39372edf712 Reviewed-on: https://skia-review.googlesource.com/140243 Commit-Queue: Herb Derby <herb@google.com> Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src/core/SkGlyphRun.h')
-rw-r--r--src/core/SkGlyphRun.h51
1 files changed, 24 insertions, 27 deletions
diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h
index 7788376c70..7c3a74860c 100644
--- a/src/core/SkGlyphRun.h
+++ b/src/core/SkGlyphRun.h
@@ -83,26 +83,14 @@ private:
const SkPaint fRunPaint;
};
-// 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 {
+class SkGlyphIDSet {
public:
- SkGlyphSet() = default;
- uint16_t add(SkGlyphID glyphID);
- void reuse(uint32_t glyphUniverseSize, std::vector<SkGlyphID>* uniqueGlyphIDs);
-
+ SkSpan<const SkGlyphID> uniquifyGlyphIDs(
+ uint32_t universeSize, SkSpan<const SkGlyphID> glyphIDs,
+ SkGlyphID* uniqueGlyphIDs, uint16_t* denseindices);
private:
- uint32_t uniqueSize();
- uint32_t fUniverseSize{0};
- size_t fStartOfUniqueIDs{0};
- std::vector<uint16_t> fIndices;
- std::vector<SkGlyphID>* fUniqueGlyphIDs{nullptr};
+ size_t fUniverseToUniqueSize{0};
+ SkAutoTMalloc<uint16_t> fUniverseToUnique;
};
class SkGlyphRunBuilder {
@@ -115,25 +103,35 @@ 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();
- void addDenseAndUnique(const SkPaint& paint, const void* bytes, size_t byteLength);
+ 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 makeGlyphRun(
- const SkPaint& runPaint, SkSpan<const char> text, SkSpan<const uint32_t> clusters);
+ const SkPaint& runPaint,
+ SkSpan<const SkGlyphID> glyphIDs,
+ SkSpan<const SkPoint> positions,
+ SkSpan<const char> text,
+ SkSpan<const uint32_t> clusters);
void drawText(
- const SkPaint& paint, const void* bytes, size_t byteLength, SkPoint origin,
+ const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, SkPoint origin,
SkSpan<const char> text, SkSpan<const uint32_t> clusters);
void drawPosTextH(
- const SkPaint& paint, const void* bytes, size_t byteLength,
+ const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs,
const SkScalar* xpos, SkScalar constY,
SkSpan<const char> text, SkSpan<const uint32_t> clusters);
void drawPosText(
- const SkPaint& paint, const void* bytes, size_t byteLength, const SkPoint* pos,
+ const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, const SkPoint* pos,
SkSpan<const char> text, SkSpan<const uint32_t> clusters);
uint64_t fUniqueID{0};
@@ -141,7 +139,6 @@ 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.
@@ -155,7 +152,7 @@ private:
SkGlyphRun fScratchGlyphRun;
// Used for collecting the set of unique glyphs.
- SkGlyphSet fGlyphSet;
+ SkGlyphIDSet fGlyphIDSet;
};
#endif // SkGlyphRunInfo_DEFINED