Chromium Code Reviews| 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..59c58feaacfc4193531bb4d2a5aacdc14bb65153 |
| --- /dev/null |
| +++ b/Source/platform/fonts/ScriptRunIterator.h |
| @@ -0,0 +1,114 @@ |
| +// 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 |
|
eae
2015/08/28 21:10:24
Wrap at 80 col.
|
| + // object. Typically data is a singleton that exists for the life of the |
| + // process. |
| + ScriptRunIterator(const UChar* text, size_t length, const ScriptData* data); |
| + |
| + bool consume(unsigned& limit, UScriptCode& script); |
| + |
| +private: |
| + struct BracketRec { |
| + UChar32 ch; |
| + UScriptCode script; |
| + }; |
| + void openBracket(UChar32 ch); |
| + void closeBracket(UChar32 ch); |
| + bool mergeSets(); |
| + void fixupStack(UScriptCode resolve_code); |
| + bool fetch(size_t* pos, UChar32* ch); |
| + |
| + UScriptCode resolveCurrentScript() const; |
| + |
| + const UChar* m_text; |
| + const size_t m_length; |
| + |
| + Deque<BracketRec> m_brackets; |
| + size_t m_bracketsFixupDepth; |
| + static const int kMaxBrackets = 32; |
|
eae
2015/08/28 21:10:24
Could you please add a comment explaining why we l
|
| + |
| + 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); |
| +}; |
| + |
| +class PLATFORM_EXPORT ScriptData { |
|
eae
2015/08/28 21:10:24
What's the relationship between ScriptRunIterator
|
| +protected: |
| + ScriptData() = default; |
| + |
| +public: |
| + virtual ~ScriptData(); |
| + |
| + enum PairedBracketType { |
| + NONE, |
| + OPEN, |
| + CLOSE, |
| + COUNT |
| + }; |
| + |
| + static const int kMaxScriptCount = 20; |
| + |
| + virtual void getScripts(UChar32 ch, Vector<UScriptCode>& dst) const = 0; |
| + |
| + virtual UChar32 getPairedBracket(UChar32 ch) const = 0; |
| + |
| + virtual PairedBracketType getPairedBracketType(UChar32 ch) const = 0; |
| + |
| +private: |
| + DISALLOW_COPY_AND_ASSIGN(ScriptData); |
| +}; |
| + |
| +class PLATFORM_EXPORT ICUScriptData : public ScriptData { |
| +public: |
| + ~ICUScriptData() override |
| + { |
| + } |
| + |
| + static const ICUScriptData* instance(); |
| + |
| + void getScripts(UChar32 ch, Vector<UScriptCode>& dst) const override; |
| + |
| + UChar32 getPairedBracket(UChar32 ch) const override; |
| + |
| + PairedBracketType getPairedBracketType(UChar32 ch) const override; |
| + |
| +private: |
| + ICUScriptData() |
| + { |
| + } |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ICUScriptData); |
| +}; |
| +} |
| + |
| +#endif |