14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXCRT_FX_BIDI_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXCRT_FX_BIDI_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_string.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_system.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Processes characters and group them into segments based on text direction.
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_BidiChar {
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  enum Direction { NEUTRAL, LEFT, RIGHT };
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  struct Segment {
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t start;        // Start position.
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t count;        // Character count.
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    Direction direction;  // Segment direction.
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  };
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_BidiChar();
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Append a character and classify it as left, right, or neutral.
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Returns true if the character has a different direction than the
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // existing direction to indicate there is a segment to process.
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool AppendChar(FX_WCHAR wch);
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Call this after the last character has been appended. AppendChar()
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // must not be called after this.
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Returns true if there is still a segment to process.
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool EndChar();
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Call after a change in direction is indicated by the above to get
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // information about the segment to process.
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Segment GetSegmentInfo() const { return m_LastSegment; }
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void StartNewSegment(CFX_BidiChar::Direction direction);
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Segment m_CurrentSegment;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Segment m_LastSegment;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_BidiString {
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  using const_iterator = std::vector<CFX_BidiChar::Segment>::const_iterator;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  explicit CFX_BidiString(const CFX_WideString& str);
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CFX_BidiString();
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Overall direction is always LEFT or RIGHT, never NEUTRAL.
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_BidiChar::Direction OverallDirection() const {
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_eOverallDirection;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Force the overall direction to be R2L regardless of what was detected.
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetOverallDirectionRight();
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_WCHAR CharAt(size_t x) const { return m_Str[x]; }
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const_iterator begin() const { return m_Order.begin(); }
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const_iterator end() const { return m_Order.end(); }
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const CFX_WideString m_Str;
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFX_BidiChar> m_pBidiChar;
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CFX_BidiChar::Segment> m_Order;
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_BidiChar::Direction m_eOverallDirection;
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FXCRT_FX_BIDI_H_
76