blob: 4390ef4297d9ba7e089370220a61c8deec800fe5 [file] [log] [blame]
// 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;
}