| // Copyright 2014 PDFium Authors. All rights reserved. |
| // 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 |
| |
| #include "core/include/fxcrt/fx_bidi.h" |
| #include "core/include/fxcrt/fx_ucd.h" |
| |
| CFX_BidiChar::CFX_BidiChar() |
| : m_iCurStart(0), |
| m_iCurCount(0), |
| m_CurBidi(NEUTRAL), |
| m_iLastStart(0), |
| m_iLastCount(0), |
| m_LastBidi(NEUTRAL) { |
| } |
| |
| CFX_BidiChar::~CFX_BidiChar() { |
| } |
| |
| bool CFX_BidiChar::AppendChar(FX_WCHAR wch) { |
| FX_DWORD dwProps = FX_GetUnicodeProperties(wch); |
| int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; |
| Direction bidi = NEUTRAL; |
| switch (iBidiCls) { |
| case FX_BIDICLASS_L: |
| case FX_BIDICLASS_AN: |
| case FX_BIDICLASS_EN: |
| bidi = LEFT; |
| break; |
| case FX_BIDICLASS_R: |
| case FX_BIDICLASS_AL: |
| bidi = RIGHT; |
| break; |
| } |
| |
| bool bRet = (bidi != m_CurBidi); |
| if (bRet) { |
| SaveCurrentStateToLastState(); |
| m_CurBidi = bidi; |
| } |
| m_iCurCount++; |
| return bRet; |
| } |
| |
| bool CFX_BidiChar::EndChar() { |
| SaveCurrentStateToLastState(); |
| return m_iLastCount > 0; |
| } |
| |
| CFX_BidiChar::Direction CFX_BidiChar::GetBidiInfo(int32_t* iStart, |
| int32_t* iCount) const { |
| if (iStart) |
| *iStart = m_iLastStart; |
| if (iCount) |
| *iCount = m_iLastCount; |
| return m_LastBidi; |
| } |
| |
| void CFX_BidiChar::SaveCurrentStateToLastState() { |
| m_LastBidi = m_CurBidi; |
| m_iLastStart = m_iCurStart; |
| m_iCurStart = m_iCurCount; |
| m_iLastCount = m_iCurCount - m_iLastStart; |
| } |