94b514bd0d8f63726617474fedc6ce4c4bc1ce5d
[pdfium.git] / core / src / fxcrt / fx_arabic.cpp
1 // 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_ucd.h"
8 #include "fx_arabic.h"
9
10 extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
11 IFX_BidiChar* IFX_BidiChar::Create()
12 {
13     return new CFX_BidiChar;
14 }
15 CFX_BidiChar::CFX_BidiChar()
16     : m_bSeparateNeutral(TRUE)
17     , m_iCurStart(0)
18     , m_iCurCount(0)
19     , m_iCurBidi(0)
20     , m_iLastBidi(0)
21     , m_iLastStart(0)
22     , m_iLastCount(0)
23 {
24 }
25 FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch)
26 {
27     FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
28     int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
29     int32_t iContext = 0;
30     switch (iBidiCls) {
31         case FX_BIDICLASS_L:
32         case FX_BIDICLASS_AN:
33         case FX_BIDICLASS_EN:
34             iContext = 1;
35             break;
36         case FX_BIDICLASS_R:
37         case FX_BIDICLASS_AL:
38             iContext = 2;
39             break;
40     }
41     FX_BOOL bRet = FALSE;
42     if (iContext != m_iCurBidi) {
43         if (m_bSeparateNeutral) {
44             bRet = TRUE;
45         } else {
46             if (m_iCurBidi == 0) {
47                 bRet = (m_iCurCount > 0);
48             } else {
49                 bRet = (iContext != 0);
50             }
51         }
52         if (bRet) {
53             m_iLastBidi = m_iCurBidi;
54             m_iLastStart = m_iCurStart;
55             m_iCurStart = m_iCurCount;
56             m_iLastCount = m_iCurCount - m_iLastStart;
57         }
58         if (m_bSeparateNeutral || iContext != 0) {
59             m_iCurBidi = iContext;
60         }
61     }
62     m_iCurCount ++;
63     return bRet;
64 }
65 FX_BOOL CFX_BidiChar::EndChar()
66 {
67     m_iLastBidi = m_iCurBidi;
68     m_iLastStart = m_iCurStart;
69     m_iCurStart = m_iCurCount;
70     m_iLastCount = m_iCurCount - m_iLastStart;
71     return m_iLastCount > 0;
72 }
73 int32_t CFX_BidiChar::GetBidiInfo(int32_t &iStart, int32_t &iCount)
74 {
75     iStart = m_iLastStart;
76     iCount = m_iLastCount;
77     return m_iLastBidi;
78 }
79 void CFX_BidiChar::Reset()
80 {
81     m_iCurStart = 0;
82     m_iCurCount = 0;
83     m_iCurBidi = 0;
84     m_iLastBidi = 0;
85     m_iLastStart = 0;
86     m_iLastCount = 0;
87 }