Index: Source/platform/fonts/ScriptRunIterator.h |
diff --git a/Source/platform/fonts/ScriptRunIterator.h b/Source/platform/fonts/ScriptRunIterator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1fd6ae7912ace9c68ae50dfac759600b3cc9639c |
--- /dev/null |
+++ b/Source/platform/fonts/ScriptRunIterator.h |
@@ -0,0 +1,121 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef ScriptRunIterator_h |
+#define ScriptRunIterator_h |
+ |
+#include "platform/PlatformExport.h" |
+#include "wtf/Deque.h" |
+#include "wtf/Vector.h" |
+#include "wtf/dtoa/utils.h" |
+ |
+#include <unicode/uchar.h> |
+#include <unicode/uscript.h> |
+ |
+namespace blink { |
+ |
+class ScriptData; |
+ |
+class PLATFORM_EXPORT ScriptRunIterator { |
+public: |
+ ScriptRunIterator(const UChar* text, size_t length); |
+ |
+ // This maintains a reference to data. It must exist for the lifetime of |
+ // this object. Typically data is a singleton that exists for the life of |
+ // the process. |
+ ScriptRunIterator(const UChar* text, size_t length, const ScriptData*); |
+ |
+ bool consume(unsigned& limit, UScriptCode&); |
+ |
+private: |
+ struct BracketRec { |
+ UChar32 ch; |
+ UScriptCode script; |
+ }; |
+ void openBracket(UChar32); |
+ void closeBracket(UChar32); |
+ bool mergeSets(); |
+ void fixupStack(UScriptCode resolvedScript); |
+ bool fetch(size_t* pos, UChar32*); |
+ |
+ UScriptCode resolveCurrentScript() const; |
+ |
+ const UChar* m_text; |
+ const size_t m_length; |
+ |
+ Deque<BracketRec> m_brackets; |
+ size_t m_bracketsFixupDepth; |
+ // Limit max brackets so that the bracket tracking buffer does not grow |
+ // excessively large when processing long runs of text. |
+ static const int kMaxBrackets = 32; |
+ |
+ Vector<UScriptCode> m_currentSet; |
+ Vector<UScriptCode> m_nextSet; |
+ Vector<UScriptCode> m_aheadSet; |
+ |
+ UChar32 m_aheadCharacter; |
+ size_t m_aheadPos; |
+ |
+ UScriptCode m_commonPreferred; |
+ |
+ const ScriptData* m_scriptData; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScriptRunIterator); |
+}; |
+ |
+// ScriptData is a wrapper which returns a set of scripts for a particular |
+// character retrieved from the character's primary script and script extensions, |
+// as per ICU / Unicode data. ScriptData maintains a certain priority order of |
+// the returned values, which are essential for mergeSets method to work |
+// correctly. |
+class PLATFORM_EXPORT ScriptData { |
+protected: |
+ ScriptData() = default; |
+ |
+public: |
+ virtual ~ScriptData(); |
+ |
+ enum PairedBracketType { |
+ BracketTypeNone, |
+ BracketTypeOpen, |
+ BracketTypeClose, |
+ BracketTypeCount |
+ }; |
+ |
+ static const int kMaxScriptCount; |
+ |
+ virtual void getScripts(UChar32, Vector<UScriptCode>& dst) const = 0; |
+ |
+ virtual UChar32 getPairedBracket(UChar32) const = 0; |
+ |
+ virtual PairedBracketType getPairedBracketType(UChar32) const = 0; |
+ |
+private: |
+ DISALLOW_COPY_AND_ASSIGN(ScriptData); |
+}; |
+ |
+class PLATFORM_EXPORT ICUScriptData : public ScriptData { |
+public: |
+ ~ICUScriptData() override |
+ { |
+ } |
+ |
+ static const ICUScriptData* instance(); |
+ |
+ void getScripts(UChar32, Vector<UScriptCode>& dst) const override; |
+ |
+ UChar32 getPairedBracket(UChar32) const override; |
+ |
+ PairedBracketType getPairedBracketType(UChar32) const override; |
+ |
+private: |
+ ICUScriptData() |
+ { |
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ICUScriptData); |
+}; |
+} |
+ |
+#endif |