diff options
Diffstat (limited to 'platform/default/bidi.cpp')
-rw-r--r-- | platform/default/bidi.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/platform/default/bidi.cpp b/platform/default/bidi.cpp index 25b4dbe3a7..08a02ee60f 100644 --- a/platform/default/bidi.cpp +++ b/platform/default/bidi.cpp @@ -18,7 +18,7 @@ public: UBiDi* bidiText = nullptr; UBiDi* bidiLine = nullptr; }; - + BiDi::BiDi() : impl(std::make_unique<BiDiImpl>()) {} BiDi::~BiDi() = default; @@ -36,8 +36,9 @@ std::u16string applyArabicShaping(const std::u16string& input) { // Pre-flighting will always set U_BUFFER_OVERFLOW_ERROR errorCode = U_ZERO_ERROR; - auto outputText = std::make_unique<UChar[]>(outputLength); - u_shapeArabic(input.c_str(), static_cast<int32_t>(input.size()), outputText.get(), outputLength, + std::u16string outputText(outputLength, 0); + + u_shapeArabic(input.c_str(), static_cast<int32_t>(input.size()), &outputText[0], outputLength, (U_SHAPE_LETTERS_SHAPE & U_SHAPE_LETTERS_MASK) | (U_SHAPE_TEXT_DIRECTION_LOGICAL & U_SHAPE_TEXT_DIRECTION_MASK), &errorCode); @@ -46,7 +47,7 @@ std::u16string applyArabicShaping(const std::u16string& input) { if (U_FAILURE(errorCode)) return input; - return std::u16string(outputText.get(), outputLength); + return outputText; } void BiDi::mergeParagraphLineBreaks(std::set<size_t>& lineBreakPoints) { @@ -73,6 +74,8 @@ std::vector<std::u16string> BiDi::applyLineBreaking(std::set<std::size_t> lineBr mergeParagraphLineBreaks(lineBreakPoints); std::vector<std::u16string> transformedLines; + transformedLines.reserve(lineBreakPoints.size()); + std::size_t start = 0; for (std::size_t lineBreakPoint : lineBreakPoints) { transformedLines.push_back(getLine(start, lineBreakPoint)); @@ -108,12 +111,12 @@ std::u16string BiDi::getLine(std::size_t start, std::size_t end) { // Setting UBIDI_INSERT_LRM_FOR_NUMERIC would require // ubidi_getLength(pBiDi)+2*ubidi_countRuns(pBiDi) const int32_t outputLength = ubidi_getProcessedLength(impl->bidiLine); - auto outputText = std::make_unique<UChar[]>(outputLength); + std::u16string outputText(outputLength, 0); // UBIDI_DO_MIRRORING: Apply unicode mirroring of characters like parentheses // UBIDI_REMOVE_BIDI_CONTROLS: Now that all the lines are set, remove control characters so that // they don't show up on screen (some fonts have glyphs representing them) - ubidi_writeReordered(impl->bidiLine, outputText.get(), outputLength, + ubidi_writeReordered(impl->bidiLine, &outputText[0], outputLength, UBIDI_DO_MIRRORING | UBIDI_REMOVE_BIDI_CONTROLS, &errorCode); if (U_FAILURE(errorCode)) { @@ -121,7 +124,7 @@ std::u16string BiDi::getLine(std::size_t start, std::size_t end) { u_errorName(errorCode)); } - return std::u16string(outputText.get(), outputLength); + return outputText; } } // end namespace mbgl |