diff options
Diffstat (limited to 'modules/skshaper')
-rw-r--r-- | modules/skshaper/src/SkShaper_harfbuzz.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/modules/skshaper/src/SkShaper_harfbuzz.cpp b/modules/skshaper/src/SkShaper_harfbuzz.cpp index 94c899d01e..2077dedadc 100644 --- a/modules/skshaper/src/SkShaper_harfbuzz.cpp +++ b/modules/skshaper/src/SkShaper_harfbuzz.cpp @@ -124,12 +124,13 @@ public: return ret; } - ret.init(utf8, std::move(bidi)); + ret.init(utf8, utf8 + utf8Bytes, std::move(bidi)); return ret; } - BiDiRunIterator(const char* utf8, ICUBiDi bidi) + BiDiRunIterator(const char* utf8, const char* end, ICUBiDi bidi) : fBidi(std::move(bidi)) , fEndOfCurrentRun(utf8) + , fEndOfAllRuns(end) , fUTF16LogicalPosition(0) , fLevel(UBIDI_DEFAULT_LTR) {} @@ -137,7 +138,7 @@ public: SkASSERT(fUTF16LogicalPosition < ubidi_getLength(fBidi.get())); int32_t endPosition = ubidi_getLength(fBidi.get()); fLevel = ubidi_getLevelAt(fBidi.get(), fUTF16LogicalPosition); - SkUnichar u = SkUTF8_NextUnichar(&fEndOfCurrentRun); + SkUnichar u = SkUTF8_NextUnichar(&fEndOfCurrentRun, fEndOfAllRuns); fUTF16LogicalPosition += SkUTF16_FromUnichar(u); UBiDiLevel level; while (fUTF16LogicalPosition < endPosition) { @@ -145,7 +146,7 @@ public: if (level != fLevel) { break; } - u = SkUTF8_NextUnichar(&fEndOfCurrentRun); + u = SkUTF8_NextUnichar(&fEndOfCurrentRun, fEndOfAllRuns); fUTF16LogicalPosition += SkUTF16_FromUnichar(u); } } @@ -162,6 +163,7 @@ public: private: ICUBiDi fBidi; const char* fEndOfCurrentRun; + const char* fEndOfAllRuns; int32_t fUTF16LogicalPosition; UBiDiLevel fLevel; }; @@ -182,11 +184,11 @@ public: {} void consume() override { SkASSERT(fCurrent < fEnd); - SkUnichar u = SkUTF8_NextUnichar(&fCurrent); + SkUnichar u = SkUTF8_NextUnichar(&fCurrent, fEnd); fCurrentScript = hb_unicode_script(fHBUnicode, u); while (fCurrent < fEnd) { const char* prev = fCurrent; - u = SkUTF8_NextUnichar(&fCurrent); + u = SkUTF8_NextUnichar(&fCurrent, fEnd); const hb_script_t script = hb_unicode_script(fHBUnicode, u); if (script != fCurrentScript) { if (fCurrentScript == HB_SCRIPT_INHERITED || fCurrentScript == HB_SCRIPT_COMMON) { @@ -241,7 +243,7 @@ public: {} void consume() override { SkASSERT(fCurrent < fEnd); - SkUnichar u = SkUTF8_NextUnichar(&fCurrent); + SkUnichar u = SkUTF8_NextUnichar(&fCurrent, fEnd); // If the starting typeface can handle this character, use it. if (fTypeface->charsToGlyphs(&u, SkTypeface::kUTF32_Encoding, nullptr, 1)) { fFallbackTypeface.reset(); @@ -263,7 +265,7 @@ public: while (fCurrent < fEnd) { const char* prev = fCurrent; - u = SkUTF8_NextUnichar(&fCurrent); + u = SkUTF8_NextUnichar(&fCurrent, fEnd); // If using a fallback and the initial typeface has this character, stop fallback. if (fFallbackTypeface && @@ -552,7 +554,7 @@ SkPoint SkShaper::shape(SkTextBlobBuilder* builder, const char* utf8Current = utf8Start; while (utf8Current < utf8End) { unsigned int cluster = utf8Current - utf8Start; - hb_codepoint_t u = SkUTF8_NextUnichar(&utf8Current); + hb_codepoint_t u = SkUTF8_NextUnichar(&utf8Current, utf8End); hb_buffer_add(buffer, u, cluster); } |