| // 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 "../../include/fxcrt/fx_ext.h" | |
| #include "fx_arabic.h" | |
| extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; | |
| IFX_BidiChar* IFX_BidiChar::Create() | |
| { | |
| return FX_NEW CFX_BidiChar; | |
| } | |
| CFX_BidiChar::CFX_BidiChar() | |
| : m_bSeparateNeutral(TRUE) | |
| , m_iCurStart(0) | |
| , m_iCurCount(0) | |
| , m_iCurBidi(0) | |
| , m_iLastBidi(0) | |
| , m_iLastStart(0) | |
| , m_iLastCount(0) | |
| { | |
| } | |
| FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch) | |
| { | |
| FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; | |
| FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; | |
| FX_INT32 iContext = 0; | |
| switch (iBidiCls) { | |
| case FX_BIDICLASS_L: | |
| case FX_BIDICLASS_AN: | |
| case FX_BIDICLASS_EN: | |
| iContext = 1; | |
| break; | |
| case FX_BIDICLASS_R: | |
| case FX_BIDICLASS_AL: | |
| iContext = 2; | |
| break; | |
| } | |
| FX_BOOL bRet = FALSE; | |
| if (iContext != m_iCurBidi) { | |
| if (m_bSeparateNeutral) { | |
| bRet = TRUE; | |
| } else { | |
| if (m_iCurBidi == 0) { | |
| bRet = (m_iCurCount > 0); | |
| } else { | |
| bRet = (iContext != 0); | |
| } | |
| } | |
| if (bRet) { | |
| m_iLastBidi = m_iCurBidi; | |
| m_iLastStart = m_iCurStart; | |
| m_iCurStart = m_iCurCount; | |
| m_iLastCount = m_iCurCount - m_iLastStart; | |
| } | |
| if (m_bSeparateNeutral || iContext != 0) { | |
| m_iCurBidi = iContext; | |
| } | |
| } | |
| m_iCurCount ++; | |
| return bRet; | |
| } | |
| FX_BOOL CFX_BidiChar::EndChar() | |
| { | |
| m_iLastBidi = m_iCurBidi; | |
| m_iLastStart = m_iCurStart; | |
| m_iCurStart = m_iCurCount; | |
| m_iLastCount = m_iCurCount - m_iLastStart; | |
| return m_iLastCount > 0; | |
| } | |
| FX_INT32 CFX_BidiChar::GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) | |
| { | |
| iStart = m_iLastStart; | |
| iCount = m_iLastCount; | |
| return m_iLastBidi; | |
| } | |
| void CFX_BidiChar::Reset() | |
| { | |
| m_iCurStart = 0; | |
| m_iCurCount = 0; | |
| m_iCurBidi = 0; | |
| m_iLastBidi = 0; | |
| m_iLastStart = 0; | |
| m_iLastCount = 0; | |
| } |