diff options
author | Herb Derby <herb@google.com> | 2018-07-09 17:06:09 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-12 19:24:34 +0000 |
commit | ff19d3473b6099c908803fb41cd9a8a36f03a1a6 (patch) | |
tree | 5e5b619b101324e139e1914a4ba071fb5f3633a9 /src/core | |
parent | 8b5092671b1d0802e88b5202f67ceb94c9e5d236 (diff) |
Use simple buffers instead of vectors
Start using simple buffers, these will be used for
multiple runs latter on.
Change-Id: Iab0559d5a47eb5e54254a985051d5d25a91be69f
Reviewed-on: https://skia-review.googlesource.com/140791
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkGlyphCache.cpp | 6 | ||||
-rw-r--r-- | src/core/SkGlyphRun.cpp | 73 | ||||
-rw-r--r-- | src/core/SkGlyphRun.h | 19 | ||||
-rw-r--r-- | src/core/SkStrikeCache.cpp | 1 |
4 files changed, 65 insertions, 34 deletions
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp index 61e01af894..30f7def312 100644 --- a/src/core/SkGlyphCache.cpp +++ b/src/core/SkGlyphCache.cpp @@ -131,9 +131,9 @@ const SkGlyph& SkGlyphCache::getGlyphIDMetrics(uint16_t glyphID, SkFixed x, SkFi } void SkGlyphCache::getAdvances(SkSpan<const SkGlyphID> glyphIDs, SkPoint advances[]) { - for (ptrdiff_t i = 0; i < glyphIDs.size(); i++) { - auto glyph = this->getGlyphIDAdvance(glyphIDs[i]); - advances[i] = SkPoint::Make(glyph.fAdvanceX, glyph.fAdvanceY); + for (auto glyphID : glyphIDs) { + auto glyph = this->getGlyphIDAdvance(glyphID); + *advances++ = SkPoint::Make(glyph.fAdvanceX, glyph.fAdvanceY); } } diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp index 87274d4def..3bd9efc90f 100644 --- a/src/core/SkGlyphRun.cpp +++ b/src/core/SkGlyphRun.cpp @@ -91,7 +91,7 @@ SkSpan<const SkGlyphID> SkGlyphIDSet::uniquifyGlyphIDs( // If the following bzero becomes a performance problem, the memory can be marked as // initialized for valgrind and msan. // valgrind = VALGRIND_MAKE_MEM_DEFINED(fUniverseToUnique, universeSize * sizeof(SkGlyphID)) - // msan = sk_msan_assert_initialized(fUniverseToUnique, universeSize * sizeof(SkGlyphID)) + // msan = sk_msan_mark_initialized(fUniverseToUnique, universeSize * sizeof(SkGlyphID)) sk_bzero(fUniverseToUnique, universeSize * sizeof(SkGlyphID)); } @@ -168,10 +168,12 @@ SkGlyphRun* SkGlyphRunBuilder::useGlyphRun() { void SkGlyphRunBuilder::initialize(size_t totalRunSize) { fUniqueID = 0; - // Using resize is temporary until simpler buffers are in place. - fDenseIndex.resize(totalRunSize); - fPositions.resize(totalRunSize); - fUniqueGlyphIDs.resize(totalRunSize); + if (totalRunSize > fMaxTotalRunSize) { + fMaxTotalRunSize = totalRunSize; + fUniqueGlyphIDIndices.reset(fMaxTotalRunSize); + fPositions.reset(fMaxTotalRunSize); + fUniqueGlyphIDs.reset(fMaxTotalRunSize); + } // Be sure to clean up the last run before we reuse it. fScratchGlyphRun.~SkGlyphRun(); @@ -207,7 +209,7 @@ SkSpan<const SkGlyphID> SkGlyphRunBuilder::addDenseAndUnique( // There better be glyphs in the font if we want to uniqify. if (glyphUniverseSize > 0) { uniquifiedGlyphIDs = fGlyphIDSet.uniquifyGlyphIDs( - glyphUniverseSize, glyphIDs, fUniqueGlyphIDs.data(), fDenseIndex.data()); + glyphUniverseSize, glyphIDs, fUniqueGlyphIDs, fUniqueGlyphIDIndices); } } @@ -218,21 +220,23 @@ void SkGlyphRunBuilder::makeGlyphRun( const SkPaint& runPaint, SkSpan<const SkGlyphID> glyphIDs, SkSpan<const SkPoint> positions, + SkSpan<const uint16_t> uniqueGlyphIDIndices, + SkSpan<const SkGlyphID> uniqueGlyphIDs, SkSpan<const char> text, SkSpan<const uint32_t> clusters) { // Ignore empty runs. - if (!fDenseIndex.empty()) { + if (!glyphIDs.empty()) { SkPaint glyphRunPaint{runPaint}; glyphRunPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); glyphRunPaint.setTextAlign(SkPaint::kLeft_Align); new ((void*)&fScratchGlyphRun) SkGlyphRun{ std::move(glyphRunPaint), - SkSpan<const uint16_t>{fDenseIndex}, + uniqueGlyphIDIndices, positions, glyphIDs, - SkSpan<const SkGlyphID>{fUniqueGlyphIDs}, + uniqueGlyphIDs, text, clusters }; @@ -244,10 +248,12 @@ void SkGlyphRunBuilder::drawText( SkSpan<const char> text, SkSpan<const uint32_t> clusters) { SkASSERT(!glyphIDs.empty()); + auto runSize = glyphIDs.size(); + auto unqiueGlyphIDs = this->addDenseAndUnique(paint, glyphIDs); if (!unqiueGlyphIDs.empty()) { - fScratchAdvances.resize(fUniqueGlyphIDs.size()); + fScratchAdvances.resize(runSize); { auto cache = SkStrikeCache::FindOrCreateStrikeExclusive(paint); cache->getAdvances(unqiueGlyphIDs, fScratchAdvances.data()); @@ -255,9 +261,9 @@ void SkGlyphRunBuilder::drawText( SkPoint endOfLastGlyph = origin; - for (size_t i = 0; i < fDenseIndex.size(); i++) { + for (size_t i = 0; i < runSize; i++) { fPositions[i] = endOfLastGlyph; - endOfLastGlyph += fScratchAdvances[fDenseIndex[i]]; + endOfLastGlyph += fScratchAdvances[fUniqueGlyphIDIndices[i]]; } if (paint.getTextAlign() != SkPaint::kLeft_Align) { @@ -265,12 +271,20 @@ void SkGlyphRunBuilder::drawText( if (paint.getTextAlign() == SkPaint::kCenter_Align) { len.scale(SK_ScalarHalf); } - for (size_t i = 0; i < fDenseIndex.size(); i++) { - fPositions[i] -= len; + for (auto& pt : SkSpan<SkPoint>{fPositions, runSize}) { + pt -= len; } } - this->makeGlyphRun(paint, glyphIDs, SkSpan<const SkPoint>{fPositions}, text, clusters); + + this->makeGlyphRun( + paint, + glyphIDs, + SkSpan<const SkPoint>{fPositions, runSize}, + SkSpan<const uint16_t>{fUniqueGlyphIDIndices, runSize}, + unqiueGlyphIDs, + text, + clusters); } } @@ -278,6 +292,7 @@ void SkGlyphRunBuilder::drawPosTextH(const SkPaint& paint, SkSpan<const SkGlyphI const SkScalar* xpos, SkScalar constY, SkSpan<const char> text, SkSpan<const uint32_t> clusters) { SkASSERT(!glyphIDs.empty()); + auto runSize = glyphIDs.size(); // The dense indices are not used by the rest of the stack yet. #ifdef SK_DEBUG @@ -286,17 +301,26 @@ void SkGlyphRunBuilder::drawPosTextH(const SkPaint& paint, SkSpan<const SkGlyphI // TODO: when using the unique glyph system have a guard that there are actually glyphs like // drawText above. - for (size_t i = 0; i < fDenseIndex.size(); i++) { - fPositions[i] = SkPoint::Make(xpos[i], constY); + auto posCursor = fPositions.get(); + for (auto x : SkSpan<const SkScalar>{xpos, runSize}) { + *posCursor++ = SkPoint::Make(x, constY); } - this->makeGlyphRun(paint, glyphIDs, SkSpan<const SkPoint>{fPositions}, text, clusters); + this->makeGlyphRun( + paint, + glyphIDs, + SkSpan<const SkPoint>{fPositions, runSize}, + SkSpan<const uint16_t>{}, + SkSpan<const SkGlyphID>{}, + text, + clusters); } void SkGlyphRunBuilder::drawPosText(const SkPaint& paint, SkSpan<const SkGlyphID> glyphIDs, const SkPoint* pos, SkSpan<const char> text, SkSpan<const uint32_t> clusters) { SkASSERT(!glyphIDs.empty()); + auto runSize = glyphIDs.size(); // The dense indices are not used by the rest of the stack yet. #ifdef SK_DEBUG @@ -305,11 +329,14 @@ void SkGlyphRunBuilder::drawPosText(const SkPaint& paint, SkSpan<const SkGlyphID // TODO: when using the unique glyph system have a guard that there are actually glyphs like // drawText above. - for (size_t i = 0; i < fDenseIndex.size(); i++) { - fPositions[i] = pos[i]; - } - - this->makeGlyphRun(paint, glyphIDs, SkSpan<const SkPoint>{fPositions}, text, clusters); + this->makeGlyphRun( + paint, + glyphIDs, + SkSpan<const SkPoint>{pos, runSize}, + SkSpan<const uint16_t>{}, + SkSpan<const SkGlyphID>{}, + text, + clusters); } diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h index 7c3a74860c..affc044f76 100644 --- a/src/core/SkGlyphRun.h +++ b/src/core/SkGlyphRun.h @@ -24,23 +24,23 @@ template <typename T> class SkSpan { public: SkSpan() : fPtr{nullptr}, fSize{0} {} - SkSpan(T* ptr, ptrdiff_t size) : fPtr{ptr}, fSize{size} { SkASSERT(size >= 0); } + SkSpan(T* ptr, size_t size) : fPtr{ptr}, fSize{size} { } template <typename U> - explicit SkSpan(std::vector<U>& v) : fPtr{v.data()}, fSize{SkTo<ptrdiff_t>(v.size())} {} + explicit SkSpan(std::vector<U>& v) : fPtr{v.data()}, fSize{v.size()} {} SkSpan(const SkSpan<T>& o) = default; SkSpan& operator=( const SkSpan& other ) = default; - T& operator [] (ptrdiff_t i) const { return fPtr[i]; } + T& operator [] (size_t i) const { return fPtr[i]; } T* begin() const { return fPtr; } T* end() const { return fPtr + fSize; } const T* cbegin() const { return fPtr; } const T* cend() const { return fPtr + fSize; } T* data() const { return fPtr; } - ptrdiff_t size() const { return fSize; } + size_t size() const { return fSize; } bool empty() const { return fSize == 0; } private: T* fPtr; - ptrdiff_t fSize; + size_t fSize; }; class SkGlyphRun { @@ -120,6 +120,8 @@ private: const SkPaint& runPaint, SkSpan<const SkGlyphID> glyphIDs, SkSpan<const SkPoint> positions, + SkSpan<const uint16_t> uniqueGlyphIDIndices, + SkSpan<const SkGlyphID> uniqueGlyphIDs, SkSpan<const char> text, SkSpan<const uint32_t> clusters); @@ -136,9 +138,10 @@ private: uint64_t fUniqueID{0}; - std::vector<uint16_t> fDenseIndex; - std::vector<SkPoint> fPositions; - std::vector<SkGlyphID> fUniqueGlyphIDs; + size_t fMaxTotalRunSize{0}; + SkAutoTMalloc<uint16_t> fUniqueGlyphIDIndices; + SkAutoTMalloc<SkPoint> fPositions; + SkAutoTMalloc<SkGlyphID> fUniqueGlyphIDs; // 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. diff --git a/src/core/SkStrikeCache.cpp b/src/core/SkStrikeCache.cpp index 94f8c6d8bd..47b3c9bf8b 100644 --- a/src/core/SkStrikeCache.cpp +++ b/src/core/SkStrikeCache.cpp @@ -12,6 +12,7 @@ #include "SkGlyphCache.h" #include "SkGraphics.h" #include "SkMutex.h" +#include "SkTemplates.h" #include "SkTraceMemoryDump.h" #include "SkTypeface.h" #include "SkPaintPriv.h" |