| // Copyright 2019 Google LLC | |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | |
| #include "include/core/SkTypes.h" | |
| #include "modules/skplaintexteditor/src/word_boundaries.h" | |
| #include "modules/skunicode/include/SkUnicode.h" | |
| #include <memory> | |
| #if defined(SK_UNICODE_ICU_IMPLEMENTATION) | |
| #include "modules/skunicode/include/SkUnicode_icu.h" | |
| #endif | |
| #if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION) | |
| #include "modules/skunicode/include/SkUnicode_libgrapheme.h" | |
| #endif | |
| #if defined(SK_UNICODE_ICU4X_IMPLEMENTATION) | |
| #include "modules/skunicode/include/SkUnicode_icu4x.h" | |
| #endif | |
| namespace { | |
| sk_sp<SkUnicode> get_unicode() { | |
| #if defined(SK_UNICODE_ICU_IMPLEMENTATION) | |
| if (auto unicode = SkUnicodes::ICU::Make()) { | |
| return unicode; | |
| } | |
| #endif // defined(SK_UNICODE_ICU_IMPLEMENTATION) | |
| #if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION) | |
| if (auto unicode = SkUnicodes::Libgrapheme::Make()) { | |
| return unicode; | |
| } | |
| #endif | |
| #if defined(SK_UNICODE_ICU4X_IMPLEMENTATION) | |
| if (auto unicode = SkUnicodes::ICU4X::Make()) { | |
| return unicode; | |
| } | |
| #endif | |
| SkDEBUGFAIL("Cannot make SkUnicode"); | |
| return nullptr; | |
| } | |
| } | |
| std::vector<bool> GetUtf8WordBoundaries(const char* begin, size_t byteCount, const char* locale) { | |
| auto unicode = get_unicode(); | |
| if (nullptr == unicode) { | |
| return {}; | |
| } | |
| std::vector<SkUnicode::Position> positions; | |
| if (!unicode->getWords(begin, byteCount, locale, &positions) || byteCount == 0) { | |
| return {}; | |
| } | |
| std::vector<bool> result; | |
| result.resize(byteCount); | |
| for (auto& pos : positions) { | |
| result[pos] = true; | |
| } | |
| return result; | |
| } |