Revert "FX_BOOL considered harmful, part 2."
[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 void CFX_BidiChar::SetPolicy(FX_BOOL bSeparateNeutral)
26 {
27     m_bSeparateNeutral = bSeparateNeutral;
28 }
29
30 FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch)
31 {
32     FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
33     int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
34     int32_t iContext = 0;
35     switch (iBidiCls) {
36         case FX_BIDICLASS_L:
37         case FX_BIDICLASS_AN:
38         case FX_BIDICLASS_EN:
39             iContext = 1;
40             break;
41         case FX_BIDICLASS_R:
42         case FX_BIDICLASS_AL:
43             iContext = 2;
44             break;
45     }
46     FX_BOOL bRet = FALSE;
47     if (iContext != m_iCurBidi) {
48         if (m_bSeparateNeutral) {
49             bRet = TRUE;
50         } else {
51             if (m_iCurBidi == 0) {
52                 bRet = (m_iCurCount > 0);
53             } else {
54                 bRet = (iContext != 0);
55             }
56         }
57         if (bRet) {
58             m_iLastBidi = m_iCurBidi;
59             m_iLastStart = m_iCurStart;
60             m_iCurStart = m_iCurCount;
61             m_iLastCount = m_iCurCount - m_iLastStart;
62         }
63         if (m_bSeparateNeutral || iContext != 0) {
64             m_iCurBidi = iContext;
65         }
66     }
67     m_iCurCount ++;
68     return bRet;
69 }
70 FX_BOOL CFX_BidiChar::EndChar()
71 {
72     m_iLastBidi = m_iCurBidi;
73     m_iLastStart = m_iCurStart;
74     m_iCurStart = m_iCurCount;
75     m_iLastCount = m_iCurCount - m_iLastStart;
76     return m_iLastCount > 0;
77 }
78 int32_t CFX_BidiChar::GetBidiInfo(int32_t &iStart, int32_t &iCount)
79 {
80     iStart = m_iLastStart;
81     iCount = m_iLastCount;
82     return m_iLastBidi;
83 }
84 void CFX_BidiChar::Reset()
85 {
86     m_iCurStart = 0;
87     m_iCurCount = 0;
88     m_iCurBidi = 0;
89     m_iLastBidi = 0;
90     m_iLastStart = 0;
91     m_iLastCount = 0;
92 }