From 5a5f1f1c905f2c352d2fbde143456124dd2c0fbf Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Fri, 12 Feb 2016 10:29:21 -0800 Subject: Make fx_bidi sane. Replace array of heterogenous ints with array of struct. Create a class for traversing a string. Flip array when R2L and process with forward iterator always. R=thestig@chromium.org Review URL: https://codereview.chromium.org/1682983002 . --- core/include/fxcrt/fx_bidi.h | 54 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 20 deletions(-) (limited to 'core/include') diff --git a/core/include/fxcrt/fx_bidi.h b/core/include/fxcrt/fx_bidi.h index a55ce6cfd2..ecf888b306 100644 --- a/core/include/fxcrt/fx_bidi.h +++ b/core/include/fxcrt/fx_bidi.h @@ -7,15 +7,23 @@ #ifndef CORE_INCLUDE_FXCRT_FX_BIDI_H_ #define CORE_INCLUDE_FXCRT_FX_BIDI_H_ +#include +#include + +#include "fx_string.h" #include "fx_system.h" // Processes characters and group them into segments based on text direction. class CFX_BidiChar { public: enum Direction { NEUTRAL, LEFT, RIGHT }; + struct Segment { + int32_t start; // Start position. + int32_t count; // Character count. + Direction direction; // Segment direction. + }; CFX_BidiChar(); - ~CFX_BidiChar(); // Append a character and classify it as left, right, or neutral. // Returns true if the character has a different direction than the @@ -27,33 +35,39 @@ class CFX_BidiChar { // Returns true if there is still a segment to process. bool EndChar(); - // Get information about the segment to process. - // The segment's start position and character count is returned in |iStart| - // and |iCount|, respectively. Pass in null pointers if the information is - // not needed. - // Returns the segment direction. - Direction GetBidiInfo(int32_t* iStart, int32_t* iCount) const; + // Call after a change in direction is indicated by the above to get + // information about the segment to process. + Segment GetSegmentInfo() const { return m_LastSegment; } private: - void SaveCurrentStateToLastState(); + void StartNewSegment(CFX_BidiChar::Direction direction); - // Position of the current segment. - int32_t m_iCurStart; + Segment m_CurrentSegment; + Segment m_LastSegment; +}; - // Number of characters in the current segment. - int32_t m_iCurCount; +class CFX_BidiString { + public: + using const_iterator = std::vector::const_iterator; + explicit CFX_BidiString(const CFX_WideString& str); - // Direction of the current segment. - Direction m_CurBidi; + // Overall direction is always LEFT or RIGHT, never NEUTRAL. + CFX_BidiChar::Direction OverallDirection() const { + return m_eOverallDirection; + } - // Number of characters in the last segment. - int32_t m_iLastStart; + // Force the overall direction to be R2L regardless of what was detected. + void SetOverallDirectionRight(); - // Number of characters in the last segment. - int32_t m_iLastCount; + FX_WCHAR CharAt(size_t x) const { return m_Str[x]; } + const_iterator begin() const { return m_Order.begin(); } + const_iterator end() const { return m_Order.end(); } - // Direction of the last segment. - Direction m_LastBidi; + private: + const CFX_WideString m_Str; + std::unique_ptr m_pBidiChar; + std::vector m_Order; + CFX_BidiChar::Direction m_eOverallDirection; }; #endif // CORE_INCLUDE_FXCRT_FX_BIDI_H_ -- cgit v1.2.3