| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../include/fxcrt/fx_ucd.h" | 7 #include "../../include/fxcrt/fx_ucd.h" |
| 8 #include "fx_arabic.h" | 8 #include "fx_arabic.h" |
| 9 | 9 |
| 10 #ifdef __cplusplus | 10 #ifdef __cplusplus |
| (...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1046 } | 1046 } |
| 1047 }; | 1047 }; |
| 1048 void FX_BidiLine(CFX_TxtCharArray& chars, int32_t iCount, int32_t iBaseLevel) { | 1048 void FX_BidiLine(CFX_TxtCharArray& chars, int32_t iCount, int32_t iBaseLevel) { |
| 1049 CFX_BidiLineTemplate<CFX_TxtChar> blt; | 1049 CFX_BidiLineTemplate<CFX_TxtChar> blt; |
| 1050 blt.FX_BidiLine(chars, iCount, iBaseLevel); | 1050 blt.FX_BidiLine(chars, iCount, iBaseLevel); |
| 1051 } | 1051 } |
| 1052 void FX_BidiLine(CFX_RTFCharArray& chars, int32_t iCount, int32_t iBaseLevel) { | 1052 void FX_BidiLine(CFX_RTFCharArray& chars, int32_t iCount, int32_t iBaseLevel) { |
| 1053 CFX_BidiLineTemplate<CFX_RTFChar> blt; | 1053 CFX_BidiLineTemplate<CFX_RTFChar> blt; |
| 1054 blt.FX_BidiLine(chars, iCount, iBaseLevel); | 1054 blt.FX_BidiLine(chars, iCount, iBaseLevel); |
| 1055 } | 1055 } |
| 1056 IFX_BidiChar* IFX_BidiChar::Create() { | |
| 1057 return new CFX_BidiChar; | |
| 1058 } | |
| 1059 CFX_BidiChar::CFX_BidiChar() | |
| 1060 : m_bSeparateNeutral(TRUE), | |
| 1061 m_iCurStart(0), | |
| 1062 m_iCurCount(0), | |
| 1063 m_iCurBidi(0), | |
| 1064 m_iLastBidi(0), | |
| 1065 m_iLastStart(0), | |
| 1066 m_iLastCount(0) {} | |
| 1067 void CFX_BidiChar::SetPolicy(FX_BOOL bSeparateNeutral) { | |
| 1068 m_bSeparateNeutral = bSeparateNeutral; | |
| 1069 } | |
| 1070 | |
| 1071 FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch) { | |
| 1072 FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch]; | |
| 1073 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; | |
| 1074 int32_t iContext = 0; | |
| 1075 switch (iBidiCls) { | |
| 1076 case FX_BIDICLASS_L: | |
| 1077 case FX_BIDICLASS_AN: | |
| 1078 case FX_BIDICLASS_EN: | |
| 1079 iContext = 1; | |
| 1080 break; | |
| 1081 case FX_BIDICLASS_R: | |
| 1082 case FX_BIDICLASS_AL: | |
| 1083 iContext = 2; | |
| 1084 break; | |
| 1085 } | |
| 1086 FX_BOOL bRet = FALSE; | |
| 1087 if (iContext != m_iCurBidi) { | |
| 1088 if (m_bSeparateNeutral) { | |
| 1089 bRet = TRUE; | |
| 1090 } else { | |
| 1091 if (m_iCurBidi == 0) { | |
| 1092 bRet = (m_iCurCount > 0); | |
| 1093 } else { | |
| 1094 bRet = (iContext != 0); | |
| 1095 } | |
| 1096 } | |
| 1097 if (bRet) { | |
| 1098 m_iLastBidi = m_iCurBidi; | |
| 1099 m_iLastStart = m_iCurStart; | |
| 1100 m_iCurStart = m_iCurCount; | |
| 1101 m_iLastCount = m_iCurCount - m_iLastStart; | |
| 1102 } | |
| 1103 if (m_bSeparateNeutral || iContext != 0) { | |
| 1104 m_iCurBidi = iContext; | |
| 1105 } | |
| 1106 } | |
| 1107 m_iCurCount++; | |
| 1108 return bRet; | |
| 1109 } | |
| 1110 FX_BOOL CFX_BidiChar::EndChar() { | |
| 1111 m_iLastBidi = m_iCurBidi; | |
| 1112 m_iLastStart = m_iCurStart; | |
| 1113 m_iCurStart = m_iCurCount; | |
| 1114 m_iLastCount = m_iCurCount - m_iLastStart; | |
| 1115 return m_iLastCount > 0; | |
| 1116 } | |
| 1117 int32_t CFX_BidiChar::GetBidiInfo(int32_t& iStart, int32_t& iCount) { | |
| 1118 iStart = m_iLastStart; | |
| 1119 iCount = m_iLastCount; | |
| 1120 return m_iLastBidi; | |
| 1121 } | |
| 1122 void CFX_BidiChar::Reset() { | |
| 1123 m_iCurStart = 0; | |
| 1124 m_iCurCount = 0; | |
| 1125 m_iCurBidi = 0; | |
| 1126 m_iLastBidi = 0; | |
| 1127 m_iLastStart = 0; | |
| 1128 m_iLastCount = 0; | |
| 1129 } | |
| OLD | NEW |