fx_bidi.h revision 4d3acf4ec42bf6e838f9060103aff98fbf170794
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