| // Copyright 2014 The PDFium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
 |  | 
 | #ifndef CORE_FXCRT_FX_BIDI_H_ | 
 | #define CORE_FXCRT_FX_BIDI_H_ | 
 |  | 
 | #include <stdint.h> | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "core/fxcrt/widestring.h" | 
 |  | 
 | // Processes characters and group them into segments based on text direction. | 
 | class CFX_BidiChar { | 
 |  public: | 
 |   enum class Direction { kNeutral, kLeft, kRight, kLeftWeak }; | 
 |   struct Segment { | 
 |     int32_t start;        // Start position. | 
 |     int32_t count;        // Character count. | 
 |     Direction direction;  // Segment direction. | 
 |   }; | 
 |  | 
 |   CFX_BidiChar(); | 
 |  | 
 |   // Append a character and classify it as left, left-weak, right, or neutral. | 
 |   // Returns true if the character has a different direction than the | 
 |   // existing direction to indicate there is a segment to process. | 
 |   bool AppendChar(wchar_t wch); | 
 |  | 
 |   // Call this after the last character has been appended. AppendChar() | 
 |   // must not be called after this. | 
 |   // Returns true if there is still a segment to process. | 
 |   bool EndChar(); | 
 |  | 
 |   // Call after a change in direction is indicated by the above to get | 
 |   // information about the segment to process. | 
 |   const Segment& GetSegmentInfo() const { return m_LastSegment; } | 
 |  | 
 |  private: | 
 |   void StartNewSegment(CFX_BidiChar::Direction direction); | 
 |  | 
 |   Segment m_CurrentSegment; | 
 |   Segment m_LastSegment; | 
 | }; | 
 |  | 
 | class CFX_BidiString { | 
 |  public: | 
 |   using const_iterator = std::vector<CFX_BidiChar::Segment>::const_iterator; | 
 |  | 
 |   explicit CFX_BidiString(const WideString& str); | 
 |   ~CFX_BidiString(); | 
 |  | 
 |   // Overall direction is always LEFT or RIGHT, never NEUTRAL. | 
 |   CFX_BidiChar::Direction OverallDirection() const; | 
 |  | 
 |   // Force the overall direction to be R2L regardless of what was detected. | 
 |   void SetOverallDirectionRight(); | 
 |  | 
 |   const_iterator begin() const { return m_Order.begin(); } | 
 |   const_iterator end() const { return m_Order.end(); } | 
 |  | 
 |  private: | 
 |   const WideString& m_Str; | 
 |   std::vector<CFX_BidiChar::Segment> m_Order; | 
 |   CFX_BidiChar::Direction m_eOverallDirection = CFX_BidiChar::Direction::kLeft; | 
 | }; | 
 |  | 
 | #endif  // CORE_FXCRT_FX_BIDI_H_ |