blob: 583ce817cf0df0d7fa1d2771f2d0fdf5e9e6932a [file] [log] [blame]
John Abd-El-Malek5110c472014-05-17 22:33:34 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "../../include/fxcrt/fx_ext.h"
8#include "fx_arabic.h"
9extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
10IFX_BidiChar* IFX_BidiChar::Create()
11{
12 return FX_NEW CFX_BidiChar;
13}
14CFX_BidiChar::CFX_BidiChar()
15 : m_bSeparateNeutral(TRUE)
16 , m_iCurStart(0)
17 , m_iCurCount(0)
18 , m_iCurBidi(0)
19 , m_iLastBidi(0)
20 , m_iLastStart(0)
21 , m_iLastCount(0)
22{
23}
24FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch)
25{
26 FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
27 FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
28 FX_INT32 iContext = 0;
29 switch (iBidiCls) {
30 case FX_BIDICLASS_L:
31 case FX_BIDICLASS_AN:
32 case FX_BIDICLASS_EN:
33 iContext = 1;
34 break;
35 case FX_BIDICLASS_R:
36 case FX_BIDICLASS_AL:
37 iContext = 2;
38 break;
39 }
40 FX_BOOL bRet = FALSE;
41 if (iContext != m_iCurBidi) {
42 if (m_bSeparateNeutral) {
43 bRet = TRUE;
44 } else {
45 if (m_iCurBidi == 0) {
46 bRet = (m_iCurCount > 0);
47 } else {
48 bRet = (iContext != 0);
49 }
50 }
51 if (bRet) {
52 m_iLastBidi = m_iCurBidi;
53 m_iLastStart = m_iCurStart;
54 m_iCurStart = m_iCurCount;
55 m_iLastCount = m_iCurCount - m_iLastStart;
56 }
57 if (m_bSeparateNeutral || iContext != 0) {
58 m_iCurBidi = iContext;
59 }
60 }
61 m_iCurCount ++;
62 return bRet;
63}
64FX_BOOL CFX_BidiChar::EndChar()
65{
66 m_iLastBidi = m_iCurBidi;
67 m_iLastStart = m_iCurStart;
68 m_iCurStart = m_iCurCount;
69 m_iLastCount = m_iCurCount - m_iLastStart;
70 return m_iLastCount > 0;
71}
72FX_INT32 CFX_BidiChar::GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount)
73{
74 iStart = m_iLastStart;
75 iCount = m_iLastCount;
76 return m_iLastBidi;
77}
78void CFX_BidiChar::Reset()
79{
80 m_iCurStart = 0;
81 m_iCurCount = 0;
82 m_iCurBidi = 0;
83 m_iLastBidi = 0;
84 m_iLastStart = 0;
85 m_iLastCount = 0;
86}