blob: 3b7d0c1c71a98781aab5416ddc84c8519cc699e7 [file] [log] [blame]
// 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_ucd.h"
#include "fx_arabic.h"
extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
IFX_BidiChar* IFX_BidiChar::Create() {
return 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) {}
void CFX_BidiChar::SetPolicy(FX_BOOL bSeparateNeutral) {
m_bSeparateNeutral = bSeparateNeutral;
}
FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch) {
FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
int32_t 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;
}
int32_t CFX_BidiChar::GetBidiInfo(int32_t& iStart, int32_t& 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;
}