ICU project: script iterator in SkShaper
Change-Id: Idcc9290a7666cb590532150a44304d704c8ee34c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/319777
Commit-Queue: Julia Lavrova <jlavrova@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/modules/skshaper/src/SkUnicode_icu.cpp b/modules/skshaper/src/SkUnicode_icu.cpp
index 7eb0f86..806900d 100644
--- a/modules/skshaper/src/SkUnicode_icu.cpp
+++ b/modules/skshaper/src/SkUnicode_icu.cpp
@@ -11,6 +11,7 @@
#include "src/utils/SkUTF.h"
#include <unicode/ubidi.h>
#include <unicode/ubrk.h>
+#include <unicode/uscript.h>
#include <unicode/ustring.h>
#include <unicode/utext.h>
#include <unicode/utypes.h>
@@ -179,6 +180,25 @@
}
};
+class SkScriptIterator_icu : public SkScriptIterator {
+ public:
+ bool getScript(SkUnichar u, ScriptID* script) override {
+ UErrorCode status = U_ZERO_ERROR;
+ UScriptCode scriptCode = uscript_getScript(u, &status);
+ if (U_FAILURE (status)) {
+ return false;
+ }
+ if (script) {
+ *script = (ScriptID)scriptCode;
+ }
+ return true;
+ }
+
+ static std::unique_ptr<SkScriptIterator> makeScriptIterator() {
+ return std::unique_ptr<SkScriptIterator>(new SkScriptIterator_icu());
+ }
+};
+
class SkUnicode_icu : public SkUnicode {
static UBreakIteratorType convertType(BreakType type) {
@@ -376,6 +396,9 @@
BreakType breakType) override {
return SkBreakIterator_icu::makeUtf8BreakIterator(locale, breakType);
}
+ std::unique_ptr<SkScriptIterator> makeScriptIterator() override {
+ return SkScriptIterator_icu::makeScriptIterator();
+ }
// TODO: Use ICU data file to detect controls and whitespaces
bool isControl(SkUnichar utf8) override {