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 "xfa/fgas/layout/fgas_textbreak.h" | 7 #include "xfa/fgas/layout/fgas_textbreak.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 m_eCharType(FX_CHARTYPE_Unknown), | 62 m_eCharType(FX_CHARTYPE_Unknown), |
63 m_bArabicNumber(FALSE), | 63 m_bArabicNumber(FALSE), |
64 m_bArabicComma(FALSE), | 64 m_bArabicComma(FALSE), |
65 m_pCurLine(nullptr), | 65 m_pCurLine(nullptr), |
66 m_iReady(0), | 66 m_iReady(0), |
67 m_iTolerance(0), | 67 m_iTolerance(0), |
68 m_iHorScale(100), | 68 m_iHorScale(100), |
69 m_iVerScale(100), | 69 m_iVerScale(100), |
70 m_iCharSpace(0) { | 70 m_iCharSpace(0) { |
71 m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0; | 71 m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0; |
72 if (m_bPagination) { | 72 int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar); |
73 m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_Char)); | 73 m_pTxtLine1.reset(new CFX_TxtLine(iSize)); |
74 m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_Char)); | 74 m_pTxtLine2.reset(new CFX_TxtLine(iSize)); |
75 } else { | 75 m_pCurLine = m_pTxtLine1.get(); |
76 m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_TxtChar)); | |
77 m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_TxtChar)); | |
78 } | |
79 m_pCurLine = m_pTxtLine1; | |
80 ResetArabicContext(); | 76 ResetArabicContext(); |
81 } | 77 } |
| 78 |
82 CFX_TxtBreak::~CFX_TxtBreak() { | 79 CFX_TxtBreak::~CFX_TxtBreak() { |
83 Reset(); | 80 Reset(); |
84 delete m_pTxtLine1; | |
85 delete m_pTxtLine2; | |
86 } | 81 } |
| 82 |
87 void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) { | 83 void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) { |
88 m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f); | 84 m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f); |
89 ASSERT(m_iLineWidth >= 20000); | 85 ASSERT(m_iLineWidth >= 20000); |
90 } | 86 } |
| 87 |
91 void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) { | 88 void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) { |
92 int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); | 89 int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); |
93 if (iLinePos < 0) { | 90 if (iLinePos < 0) { |
94 iLinePos = 0; | 91 iLinePos = 0; |
95 } | 92 } |
96 if (iLinePos > m_iLineWidth) { | 93 if (iLinePos > m_iLineWidth) { |
97 iLinePos = m_iLineWidth; | 94 iLinePos = m_iLineWidth; |
98 } | 95 } |
99 m_pCurLine->m_iStart = iLinePos; | 96 m_pCurLine->m_iStart = iLinePos; |
100 m_pCurLine->m_iWidth += iLinePos; | 97 m_pCurLine->m_iWidth += iLinePos; |
101 } | 98 } |
| 99 |
102 void CFX_TxtBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { | 100 void CFX_TxtBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { |
103 m_dwLayoutStyles = dwLayoutStyles; | 101 m_dwLayoutStyles = dwLayoutStyles; |
104 m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; | 102 m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; |
105 m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0; | 103 m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0; |
106 m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0; | 104 m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0; |
107 m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0; | 105 m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0; |
108 m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; | 106 m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; |
109 m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; | 107 m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; |
110 ResetArabicContext(); | 108 ResetArabicContext(); |
111 m_iLineRotation = GetLineRotation(m_dwLayoutStyles); | 109 m_iLineRotation = GetLineRotation(m_dwLayoutStyles); |
112 m_iRotation = m_iLineRotation + m_iCharRotation; | 110 m_iRotation = m_iLineRotation + m_iCharRotation; |
113 m_iRotation %= 4; | 111 m_iRotation %= 4; |
114 } | 112 } |
| 113 |
115 void CFX_TxtBreak::SetFont(CFGAS_GEFont* pFont) { | 114 void CFX_TxtBreak::SetFont(CFGAS_GEFont* pFont) { |
116 if (!pFont) { | 115 if (!pFont) { |
117 return; | 116 return; |
118 } | 117 } |
119 if (m_pFont == pFont) { | 118 if (m_pFont == pFont) { |
120 return; | 119 return; |
121 } | 120 } |
122 SetBreakStatus(); | 121 SetBreakStatus(); |
123 m_pFont = pFont; | 122 m_pFont = pFont; |
124 m_iDefChar = 0; | 123 m_iDefChar = 0; |
125 if (m_wDefChar != 0xFEFF && m_pFont) { | 124 if (m_wDefChar != 0xFEFF && m_pFont) { |
126 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 125 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
127 m_iDefChar *= m_iFontSize; | 126 m_iDefChar *= m_iFontSize; |
128 } | 127 } |
129 } | 128 } |
| 129 |
130 void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) { | 130 void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) { |
131 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 131 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |
132 if (m_iFontSize == iFontSize) { | 132 if (m_iFontSize == iFontSize) { |
133 return; | 133 return; |
134 } | 134 } |
135 SetBreakStatus(); | 135 SetBreakStatus(); |
136 m_iFontSize = iFontSize; | 136 m_iFontSize = iFontSize; |
137 m_iDefChar = 0; | 137 m_iDefChar = 0; |
138 if (m_wDefChar != 0xFEFF && m_pFont) { | 138 if (m_wDefChar != 0xFEFF && m_pFont) { |
139 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 139 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
140 m_iDefChar *= m_iFontSize; | 140 m_iDefChar *= m_iFontSize; |
141 } | 141 } |
142 } | 142 } |
| 143 |
143 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) { | 144 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) { |
144 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); | 145 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); |
145 if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { | 146 if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { |
146 m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; | 147 m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; |
147 } | 148 } |
148 m_bEquidistant = bEquidistant; | 149 m_bEquidistant = bEquidistant; |
149 } | 150 } |
| 151 |
150 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { | 152 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { |
151 m_wDefChar = wch; | 153 m_wDefChar = wch; |
152 m_iDefChar = 0; | 154 m_iDefChar = 0; |
153 if (m_wDefChar != 0xFEFF && m_pFont) { | 155 if (m_wDefChar != 0xFEFF && m_pFont) { |
154 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 156 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
155 if (m_iDefChar < 0) { | 157 if (m_iDefChar < 0) { |
156 m_iDefChar = 0; | 158 m_iDefChar = 0; |
157 } else { | 159 } else { |
158 m_iDefChar *= m_iFontSize; | 160 m_iDefChar *= m_iFontSize; |
159 } | 161 } |
160 } | 162 } |
161 } | 163 } |
| 164 |
162 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { | 165 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { |
163 if (wch != L'\r' && wch != L'\n') { | 166 if (wch != L'\r' && wch != L'\n') { |
164 return; | 167 return; |
165 } | 168 } |
166 m_wParagBreakChar = wch; | 169 m_wParagBreakChar = wch; |
167 } | 170 } |
| 171 |
168 void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) { | 172 void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) { |
169 m_iTolerance = FXSYS_round(fTolerance * 20000.0f); | 173 m_iTolerance = FXSYS_round(fTolerance * 20000.0f); |
170 } | 174 } |
| 175 |
171 void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) { | 176 void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) { |
172 if (iCharRotation < 0) { | 177 if (iCharRotation < 0) { |
173 iCharRotation += (-iCharRotation / 4 + 1) * 4; | 178 iCharRotation += (-iCharRotation / 4 + 1) * 4; |
174 } else if (iCharRotation > 3) { | 179 } else if (iCharRotation > 3) { |
175 iCharRotation -= (iCharRotation / 4) * 4; | 180 iCharRotation -= (iCharRotation / 4) * 4; |
176 } | 181 } |
177 if (m_iCharRotation == iCharRotation) { | 182 if (m_iCharRotation == iCharRotation) { |
178 return; | 183 return; |
179 } | 184 } |
180 SetBreakStatus(); | 185 SetBreakStatus(); |
181 m_iCharRotation = iCharRotation; | 186 m_iCharRotation = iCharRotation; |
182 m_iRotation = m_iLineRotation + m_iCharRotation; | 187 m_iRotation = m_iLineRotation + m_iCharRotation; |
183 m_iRotation %= 4; | 188 m_iRotation %= 4; |
184 } | 189 } |
| 190 |
185 void CFX_TxtBreak::SetAlignment(int32_t iAlignment) { | 191 void CFX_TxtBreak::SetAlignment(int32_t iAlignment) { |
186 ASSERT(iAlignment >= FX_TXTLINEALIGNMENT_Left && | 192 ASSERT(iAlignment >= FX_TXTLINEALIGNMENT_Left && |
187 iAlignment <= FX_TXTLINEALIGNMENT_Distributed); | 193 iAlignment <= FX_TXTLINEALIGNMENT_Distributed); |
188 m_iAlignment = iAlignment; | 194 m_iAlignment = iAlignment; |
189 ResetArabicContext(); | 195 ResetArabicContext(); |
190 } | 196 } |
| 197 |
191 void CFX_TxtBreak::ResetContextCharStyles() { | 198 void CFX_TxtBreak::ResetContextCharStyles() { |
192 m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment; | 199 m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment; |
193 if (m_bArabicNumber) { | 200 if (m_bArabicNumber) { |
194 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber; | 201 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber; |
195 } | 202 } |
196 if (m_bArabicComma) { | 203 if (m_bArabicComma) { |
197 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma; | 204 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma; |
198 } | 205 } |
199 if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) { | 206 if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) { |
200 m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder; | 207 m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder; |
201 } | 208 } |
202 m_dwContextCharStyles |= (m_iArabicContext << 8); | 209 m_dwContextCharStyles |= (m_iArabicContext << 8); |
203 } | 210 } |
| 211 |
204 uint32_t CFX_TxtBreak::GetContextCharStyles() const { | 212 uint32_t CFX_TxtBreak::GetContextCharStyles() const { |
205 return m_dwContextCharStyles; | 213 return m_dwContextCharStyles; |
206 } | 214 } |
| 215 |
207 void CFX_TxtBreak::SetContextCharStyles(uint32_t dwCharStyles) { | 216 void CFX_TxtBreak::SetContextCharStyles(uint32_t dwCharStyles) { |
208 m_iCurAlignment = dwCharStyles & 0x0F; | 217 m_iCurAlignment = dwCharStyles & 0x0F; |
209 m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; | 218 m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; |
210 m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; | 219 m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; |
211 m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0; | 220 m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0; |
212 m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8); | 221 m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8); |
213 ResetContextCharStyles(); | 222 ResetContextCharStyles(); |
214 } | 223 } |
| 224 |
215 void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) { | 225 void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) { |
216 m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); | 226 m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); |
217 } | 227 } |
| 228 |
218 void CFX_TxtBreak::SetUserData(void* pUserData) { | 229 void CFX_TxtBreak::SetUserData(void* pUserData) { |
219 if (m_pUserData == pUserData) { | 230 if (m_pUserData == pUserData) { |
220 return; | 231 return; |
221 } | 232 } |
222 SetBreakStatus(); | 233 SetBreakStatus(); |
223 m_pUserData = pUserData; | 234 m_pUserData = pUserData; |
224 } | 235 } |
| 236 |
225 void CFX_TxtBreak::SetBreakStatus() { | 237 void CFX_TxtBreak::SetBreakStatus() { |
226 if (m_bPagination) { | 238 if (m_bPagination) { |
227 return; | 239 return; |
228 } | 240 } |
229 int32_t iCount = m_pCurLine->CountChars(); | 241 int32_t iCount = m_pCurLine->CountChars(); |
230 if (iCount < 1) { | 242 if (iCount < 1) { |
231 return; | 243 return; |
232 } | 244 } |
233 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); | 245 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); |
234 if (pTC->m_dwStatus == 0) { | 246 if (pTC->m_dwStatus == 0) { |
235 pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; | 247 pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; |
236 } | 248 } |
237 } | 249 } |
| 250 |
238 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { | 251 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { |
239 if (iScale < 0) { | 252 if (iScale < 0) { |
240 iScale = 0; | 253 iScale = 0; |
241 } | 254 } |
242 if (iScale == m_iHorScale) { | 255 if (iScale == m_iHorScale) { |
243 return; | 256 return; |
244 } | 257 } |
245 SetBreakStatus(); | 258 SetBreakStatus(); |
246 m_iHorScale = iScale; | 259 m_iHorScale = iScale; |
247 } | 260 } |
| 261 |
248 void CFX_TxtBreak::SetVerticalScale(int32_t iScale) { | 262 void CFX_TxtBreak::SetVerticalScale(int32_t iScale) { |
249 if (iScale < 0) { | 263 if (iScale < 0) { |
250 iScale = 0; | 264 iScale = 0; |
251 } | 265 } |
252 if (iScale == m_iHorScale) { | 266 if (iScale == m_iHorScale) { |
253 return; | 267 return; |
254 } | 268 } |
255 SetBreakStatus(); | 269 SetBreakStatus(); |
256 m_iVerScale = iScale; | 270 m_iVerScale = iScale; |
257 } | 271 } |
| 272 |
258 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { | 273 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { |
259 m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); | 274 m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); |
260 } | 275 } |
| 276 |
261 static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; | 277 static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; |
262 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { | 278 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { |
263 return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; | 279 return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; |
264 } | 280 } |
| 281 |
265 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const { | 282 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const { |
266 CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars; | 283 CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars.get(); |
267 int32_t iCount = ca.GetSize(); | 284 int32_t iCount = ca.GetSize(); |
268 if (index < 0 || index >= iCount) { | 285 if (index < 0 || index >= iCount) { |
269 return nullptr; | 286 return nullptr; |
270 } | 287 } |
271 CFX_TxtChar* pTC; | 288 CFX_TxtChar* pTC; |
272 int32_t iStart = iCount - 1; | 289 int32_t iStart = iCount - 1; |
273 while (iStart > -1) { | 290 while (iStart > -1) { |
274 pTC = ca.GetDataPtr(iStart--); | 291 pTC = ca.GetDataPtr(iStart--); |
275 if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { | 292 if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { |
276 continue; | 293 continue; |
277 } | 294 } |
278 if (--index < 0) { | 295 if (--index < 0) { |
279 return pTC; | 296 return pTC; |
280 } | 297 } |
281 } | 298 } |
282 return nullptr; | 299 return nullptr; |
283 } | 300 } |
| 301 |
284 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const { | 302 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const { |
285 if (!bReady) | 303 if (!bReady) |
286 return m_pCurLine; | 304 return m_pCurLine; |
287 if (m_iReady == 1) | 305 if (m_iReady == 1) |
288 return m_pTxtLine1; | 306 return m_pTxtLine1.get(); |
289 if (m_iReady == 2) | 307 if (m_iReady == 2) |
290 return m_pTxtLine2; | 308 return m_pTxtLine2.get(); |
291 return nullptr; | 309 return nullptr; |
292 } | 310 } |
| 311 |
293 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const { | 312 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const { |
294 CFX_TxtLine* pTxtLine = GetTxtLine(bReady); | 313 CFX_TxtLine* pTxtLine = GetTxtLine(bReady); |
295 if (!pTxtLine) { | 314 if (!pTxtLine) { |
296 return nullptr; | 315 return nullptr; |
297 } | 316 } |
298 return pTxtLine->m_pLinePieces; | 317 return pTxtLine->m_pLinePieces.get(); |
299 } | 318 } |
| 319 |
300 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( | 320 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( |
301 FX_CHARTYPE chartype) const { | 321 FX_CHARTYPE chartype) const { |
302 return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; | 322 return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; |
303 } | 323 } |
| 324 |
304 void CFX_TxtBreak::ResetArabicContext() { | 325 void CFX_TxtBreak::ResetArabicContext() { |
305 if (m_bArabicContext) { | 326 if (m_bArabicContext) { |
306 m_bCurRTL = m_iCurArabicContext > 1; | 327 m_bCurRTL = m_iCurArabicContext > 1; |
307 m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right | 328 m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right |
308 : FX_TXTLINEALIGNMENT_Left; | 329 : FX_TXTLINEALIGNMENT_Left; |
309 m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); | 330 m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); |
310 m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; | 331 m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; |
311 } else { | 332 } else { |
312 if (m_bPagination) { | 333 if (m_bPagination) { |
313 m_bCurRTL = FALSE; | 334 m_bCurRTL = FALSE; |
314 m_iCurAlignment = 0; | 335 m_iCurAlignment = 0; |
315 } else { | 336 } else { |
316 m_bCurRTL = m_bRTL; | 337 m_bCurRTL = m_bRTL; |
317 m_iCurAlignment = m_iAlignment; | 338 m_iCurAlignment = m_iAlignment; |
318 } | 339 } |
319 if (m_bRTL) { | 340 if (m_bRTL) { |
320 m_bArabicNumber = m_iArabicContext >= 1; | 341 m_bArabicNumber = m_iArabicContext >= 1; |
321 } else { | 342 } else { |
322 m_bArabicNumber = m_iArabicContext > 1; | 343 m_bArabicNumber = m_iArabicContext > 1; |
323 } | 344 } |
324 m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; | 345 m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; |
325 } | 346 } |
326 m_bArabicComma = m_bArabicNumber; | 347 m_bArabicComma = m_bArabicNumber; |
327 ResetContextCharStyles(); | 348 ResetContextCharStyles(); |
328 } | 349 } |
| 350 |
329 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, | 351 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, |
330 uint32_t dwProps) { | 352 uint32_t dwProps) { |
331 if (!m_bPagination) { | 353 if (!m_bPagination) { |
332 pCurChar->m_dwStatus = 0; | 354 pCurChar->m_dwStatus = 0; |
333 pCurChar->m_pUserData = m_pUserData; | 355 pCurChar->m_pUserData = m_pUserData; |
334 } | 356 } |
335 if (m_bArabicContext || m_bArabicShapes) { | 357 if (m_bArabicContext || m_bArabicShapes) { |
336 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; | 358 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; |
337 int32_t iArabicContext = | 359 int32_t iArabicContext = |
338 (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) | 360 (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) |
339 ? 2 | 361 ? 2 |
340 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 | 362 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 |
341 : 1); | 363 : 1); |
342 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { | 364 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { |
343 m_iArabicContext = iArabicContext; | 365 m_iArabicContext = iArabicContext; |
344 if (m_iCurArabicContext == 1) { | 366 if (m_iCurArabicContext == 1) { |
345 m_iCurArabicContext = iArabicContext; | 367 m_iCurArabicContext = iArabicContext; |
346 } | 368 } |
347 ResetArabicContext(); | 369 ResetArabicContext(); |
348 if (!m_bPagination) { | 370 if (!m_bPagination) { |
349 CFX_TxtChar* pLastChar = GetLastChar(1, FALSE); | 371 CFX_TxtChar* pLastChar = GetLastChar(1, FALSE); |
350 if (pLastChar && pLastChar->m_dwStatus < 1) { | 372 if (pLastChar && pLastChar->m_dwStatus < 1) { |
351 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; | 373 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; |
352 } | 374 } |
353 } | 375 } |
354 } | 376 } |
355 } | 377 } |
356 pCurChar->m_dwCharStyles = m_dwContextCharStyles; | 378 pCurChar->m_dwCharStyles = m_dwContextCharStyles; |
357 } | 379 } |
| 380 |
358 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, | 381 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, |
359 int32_t iRotation) { | 382 int32_t iRotation) { |
360 FX_WCHAR wch = pCurChar->m_wCharCode; | 383 FX_WCHAR wch = pCurChar->m_wCharCode; |
361 FX_WCHAR wForm; | 384 FX_WCHAR wForm; |
362 int32_t iCharWidth = 0; | 385 int32_t iCharWidth = 0; |
363 pCurChar->m_iCharWidth = -1; | 386 pCurChar->m_iCharWidth = -1; |
364 if (m_bCombText) { | 387 if (m_bCombText) { |
365 iCharWidth = m_iCombWidth; | 388 iCharWidth = m_iCombWidth; |
366 } else { | 389 } else { |
367 if (m_bVertical != FX_IsOdd(iRotation)) { | 390 if (m_bVertical != FX_IsOdd(iRotation)) { |
(...skipping 27 matching lines...) Expand all Loading... |
395 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { | 418 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { |
396 iCharWidth = 0; | 419 iCharWidth = 0; |
397 } | 420 } |
398 } | 421 } |
399 iCharWidth *= m_iFontSize; | 422 iCharWidth *= m_iFontSize; |
400 iCharWidth = iCharWidth * m_iHorScale / 100; | 423 iCharWidth = iCharWidth * m_iHorScale / 100; |
401 } | 424 } |
402 pCurChar->m_iCharWidth = -iCharWidth; | 425 pCurChar->m_iCharWidth = -iCharWidth; |
403 return FX_TXTBREAK_None; | 426 return FX_TXTBREAK_None; |
404 } | 427 } |
| 428 |
405 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar, | 429 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar, |
406 int32_t iRotation) { | 430 int32_t iRotation) { |
407 m_eCharType = FX_CHARTYPE_Tab; | 431 m_eCharType = FX_CHARTYPE_Tab; |
408 if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { | 432 if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { |
409 return FX_TXTBREAK_None; | 433 return FX_TXTBREAK_None; |
410 } | 434 } |
411 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 435 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
412 int32_t iCharWidth; | 436 int32_t iCharWidth; |
413 if (m_bCombText) { | 437 if (m_bCombText) { |
414 iCharWidth = m_iCombWidth; | 438 iCharWidth = m_iCombWidth; |
415 } else { | 439 } else { |
416 if (m_bEquidistant) { | 440 if (m_bEquidistant) { |
417 iCharWidth = iLineWidth; | 441 iCharWidth = iLineWidth; |
418 iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; | 442 iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; |
419 if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { | 443 if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { |
420 iCharWidth += m_iTabWidth; | 444 iCharWidth += m_iTabWidth; |
421 } | 445 } |
422 } else { | 446 } else { |
423 iCharWidth = m_iTabWidth; | 447 iCharWidth = m_iTabWidth; |
424 } | 448 } |
425 } | 449 } |
426 pCurChar->m_iCharWidth = iCharWidth; | 450 pCurChar->m_iCharWidth = iCharWidth; |
427 iLineWidth += iCharWidth; | 451 iLineWidth += iCharWidth; |
428 if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { | 452 if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { |
429 return EndBreak(FX_TXTBREAK_LineBreak); | 453 return EndBreak(FX_TXTBREAK_LineBreak); |
430 } | 454 } |
431 return FX_TXTBREAK_None; | 455 return FX_TXTBREAK_None; |
432 } | 456 } |
| 457 |
433 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar, | 458 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar, |
434 int32_t iRotation) { | 459 int32_t iRotation) { |
435 m_eCharType = FX_CHARTYPE_Control; | 460 m_eCharType = FX_CHARTYPE_Control; |
436 uint32_t dwRet = FX_TXTBREAK_None; | 461 uint32_t dwRet = FX_TXTBREAK_None; |
437 if (!m_bSingleLine) { | 462 if (!m_bSingleLine) { |
438 FX_WCHAR wch = pCurChar->m_wCharCode; | 463 FX_WCHAR wch = pCurChar->m_wCharCode; |
439 switch (wch) { | 464 switch (wch) { |
440 case L'\v': | 465 case L'\v': |
441 case 0x2028: | 466 case 0x2028: |
442 dwRet = FX_TXTBREAK_LineBreak; | 467 dwRet = FX_TXTBREAK_LineBreak; |
443 break; | 468 break; |
444 case L'\f': | 469 case L'\f': |
445 dwRet = FX_TXTBREAK_PageBreak; | 470 dwRet = FX_TXTBREAK_PageBreak; |
446 break; | 471 break; |
447 case 0x2029: | 472 case 0x2029: |
448 dwRet = FX_TXTBREAK_ParagraphBreak; | 473 dwRet = FX_TXTBREAK_ParagraphBreak; |
449 break; | 474 break; |
450 default: | 475 default: |
451 if (wch == m_wParagBreakChar) { | 476 if (wch == m_wParagBreakChar) { |
452 dwRet = FX_TXTBREAK_ParagraphBreak; | 477 dwRet = FX_TXTBREAK_ParagraphBreak; |
453 } | 478 } |
454 break; | 479 break; |
455 } | 480 } |
456 if (dwRet != FX_TXTBREAK_None) { | 481 if (dwRet != FX_TXTBREAK_None) { |
457 dwRet = EndBreak(dwRet); | 482 dwRet = EndBreak(dwRet); |
458 } | 483 } |
459 } | 484 } |
460 return dwRet; | 485 return dwRet; |
461 } | 486 } |
| 487 |
462 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, | 488 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, |
463 int32_t iRotation) { | 489 int32_t iRotation) { |
464 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 490 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
465 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 491 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
466 FX_WCHAR wForm; | 492 FX_WCHAR wForm; |
467 int32_t iCharWidth = 0; | 493 int32_t iCharWidth = 0; |
468 CFX_Char* pLastChar = nullptr; | 494 CFX_Char* pLastChar = nullptr; |
469 FX_BOOL bAlef = FALSE; | 495 FX_BOOL bAlef = FALSE; |
470 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && | 496 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && |
471 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { | 497 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 iCharWidth = iCharWidth * m_iHorScale / 100; | 542 iCharWidth = iCharWidth * m_iHorScale / 100; |
517 } | 543 } |
518 pCurChar->m_iCharWidth = iCharWidth; | 544 pCurChar->m_iCharWidth = iCharWidth; |
519 iLineWidth += iCharWidth; | 545 iLineWidth += iCharWidth; |
520 m_pCurLine->m_iArabicChars++; | 546 m_pCurLine->m_iArabicChars++; |
521 if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { | 547 if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { |
522 return EndBreak(FX_TXTBREAK_LineBreak); | 548 return EndBreak(FX_TXTBREAK_LineBreak); |
523 } | 549 } |
524 return FX_TXTBREAK_None; | 550 return FX_TXTBREAK_None; |
525 } | 551 } |
| 552 |
526 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar, | 553 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar, |
527 int32_t iRotation) { | 554 int32_t iRotation) { |
528 uint32_t dwProps = pCurChar->m_dwCharProps; | 555 uint32_t dwProps = pCurChar->m_dwCharProps; |
529 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 556 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
530 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 557 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
531 int32_t iCharWidth = 0; | 558 int32_t iCharWidth = 0; |
532 m_eCharType = chartype; | 559 m_eCharType = chartype; |
533 FX_WCHAR wch = pCurChar->m_wCharCode; | 560 FX_WCHAR wch = pCurChar->m_wCharCode; |
534 FX_WCHAR wForm = wch; | 561 FX_WCHAR wForm = wch; |
535 if (chartype == FX_CHARTYPE_Numeric) { | 562 if (chartype == FX_CHARTYPE_Numeric) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 } | 628 } |
602 int32_t iRotation = m_iRotation; | 629 int32_t iRotation = m_iRotation; |
603 if (m_bVertical && (dwProps & 0x8000) != 0) { | 630 if (m_bVertical && (dwProps & 0x8000) != 0) { |
604 iRotation = (iRotation + 1) % 4; | 631 iRotation = (iRotation + 1) % 4; |
605 } | 632 } |
606 uint32_t dwRet2 = | 633 uint32_t dwRet2 = |
607 (this->*g_FX_TxtBreak_lpfAppendChar[chartype >> FX_CHARTYPEBITS])( | 634 (this->*g_FX_TxtBreak_lpfAppendChar[chartype >> FX_CHARTYPEBITS])( |
608 pCurChar, iRotation); | 635 pCurChar, iRotation); |
609 return std::max(dwRet1, dwRet2); | 636 return std::max(dwRet1, dwRet2); |
610 } | 637 } |
| 638 |
611 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() { | 639 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() { |
612 ASSERT(m_bArabicShapes); | 640 ASSERT(m_bArabicShapes); |
613 int32_t iCount = m_pCurLine->CountChars(); | 641 int32_t iCount = m_pCurLine->CountChars(); |
614 if (iCount < 2) { | 642 if (iCount < 2) { |
615 return; | 643 return; |
616 } | 644 } |
617 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 645 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
618 CFX_Char *pCur, *pNext; | 646 CFX_Char *pCur, *pNext; |
619 pCur = m_pCurLine->GetCharPtr(0); | 647 pCur = m_pCurLine->GetCharPtr(0); |
620 FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 648 FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 iCharWidth = iCharWidth * m_iHorScale / 100; | 680 iCharWidth = iCharWidth * m_iHorScale / 100; |
653 } | 681 } |
654 pCur->m_iCharWidth = iCharWidth; | 682 pCur->m_iCharWidth = iCharWidth; |
655 iLineWidth += iCharWidth; | 683 iLineWidth += iCharWidth; |
656 } | 684 } |
657 } | 685 } |
658 bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 686 bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
659 pCur = pNext; | 687 pCur = pNext; |
660 } while (i < iCount); | 688 } while (i < iCount); |
661 } | 689 } |
| 690 |
662 FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, | 691 FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, |
663 FX_BOOL bAllChars, | 692 FX_BOOL bAllChars, |
664 uint32_t dwStatus) { | 693 uint32_t dwStatus) { |
665 int32_t iCount = m_pCurLine->CountChars(); | 694 int32_t iCount = m_pCurLine->CountChars(); |
666 FX_BOOL bDone = FALSE; | 695 FX_BOOL bDone = FALSE; |
667 CFX_Char* pTC; | 696 CFX_Char* pTC; |
668 if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { | 697 if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { |
669 pTC = m_pCurLine->GetCharPtr(iCount - 1); | 698 pTC = m_pCurLine->GetCharPtr(iCount - 1); |
670 switch (pTC->GetCharType()) { | 699 switch (pTC->GetCharType()) { |
671 case FX_CHARTYPE_Tab: | 700 case FX_CHARTYPE_Tab: |
672 case FX_CHARTYPE_Control: | 701 case FX_CHARTYPE_Control: |
673 break; | 702 break; |
674 case FX_CHARTYPE_Space: | 703 case FX_CHARTYPE_Space: |
675 if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { | 704 if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { |
676 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 705 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
677 bDone = TRUE; | 706 bDone = TRUE; |
678 } | 707 } |
679 break; | 708 break; |
680 default: | 709 default: |
681 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 710 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
682 bDone = TRUE; | 711 bDone = TRUE; |
683 break; | 712 break; |
684 } | 713 } |
685 } | 714 } |
686 iCount = m_pCurLine->CountChars(); | 715 iCount = m_pCurLine->CountChars(); |
687 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 716 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
688 CFX_TxtPiece tp; | 717 CFX_TxtPiece tp; |
689 if (m_bPagination) { | 718 if (m_bPagination) { |
690 tp.m_dwStatus = dwStatus; | 719 tp.m_dwStatus = dwStatus; |
691 tp.m_iStartPos = m_pCurLine->m_iStart; | 720 tp.m_iStartPos = m_pCurLine->m_iStart; |
692 tp.m_iWidth = m_pCurLine->m_iWidth; | 721 tp.m_iWidth = m_pCurLine->m_iWidth; |
693 tp.m_iStartChar = 0; | 722 tp.m_iStartChar = 0; |
694 tp.m_iChars = iCount; | 723 tp.m_iChars = iCount; |
695 tp.m_pChars = m_pCurLine->m_pLineChars; | 724 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
696 tp.m_pUserData = m_pUserData; | 725 tp.m_pUserData = m_pUserData; |
697 pTC = m_pCurLine->GetCharPtr(0); | 726 pTC = m_pCurLine->GetCharPtr(0); |
698 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 727 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
699 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 728 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |
700 tp.m_iVerticalScale = pTC->m_iVertialScale; | 729 tp.m_iVerticalScale = pTC->m_iVertialScale; |
701 pCurPieces->Add(tp); | 730 pCurPieces->Add(tp); |
702 m_pCurLine = pNextLine; | 731 m_pCurLine = pNextLine; |
703 m_eCharType = FX_CHARTYPE_Unknown; | 732 m_eCharType = FX_CHARTYPE_Unknown; |
704 return TRUE; | 733 return TRUE; |
705 } | 734 } |
706 if (bAllChars && !bDone) { | 735 if (bAllChars && !bDone) { |
707 int32_t iEndPos = m_pCurLine->m_iWidth; | 736 int32_t iEndPos = m_pCurLine->m_iWidth; |
708 GetBreakPos(*m_pCurLine->m_pLineChars, iEndPos, bAllChars, TRUE); | 737 GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, TRUE); |
709 } | 738 } |
710 return FALSE; | 739 return FALSE; |
711 } | 740 } |
| 741 |
712 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { | 742 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { |
713 CFX_TxtPiece tp; | 743 CFX_TxtPiece tp; |
714 FX_TPO tpo; | 744 FX_TPO tpo; |
715 CFX_TxtChar* pTC; | 745 CFX_TxtChar* pTC; |
716 int32_t i, j; | 746 int32_t i, j; |
717 CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars; | 747 CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars.get(); |
718 int32_t iCount = m_pCurLine->CountChars(); | 748 int32_t iCount = m_pCurLine->CountChars(); |
719 FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); | 749 FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); |
720 if (!m_bPagination && bDone) { | 750 if (!m_bPagination && bDone) { |
721 int32_t iBidiNum = 0; | 751 int32_t iBidiNum = 0; |
722 for (i = 0; i < iCount; i++) { | 752 for (i = 0; i < iCount; i++) { |
723 pTC = chars.GetDataPtr(i); | 753 pTC = chars.GetDataPtr(i); |
724 pTC->m_iBidiPos = i; | 754 pTC->m_iBidiPos = i; |
725 if (pTC->GetCharType() != FX_CHARTYPE_Control) { | 755 if (pTC->GetCharType() != FX_CHARTYPE_Control) { |
726 iBidiNum = i; | 756 iBidiNum = i; |
727 } | 757 } |
728 if (i == 0) { | 758 if (i == 0) { |
729 pTC->m_iBidiLevel = 1; | 759 pTC->m_iBidiLevel = 1; |
730 } | 760 } |
731 } | 761 } |
732 FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0); | 762 FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0); |
733 } | 763 } |
734 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 764 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
735 if (!m_bPagination && | 765 if (!m_bPagination && |
736 (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) { | 766 (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) { |
737 tp.m_dwStatus = FX_TXTBREAK_PieceBreak; | 767 tp.m_dwStatus = FX_TXTBREAK_PieceBreak; |
738 tp.m_iStartPos = m_pCurLine->m_iStart; | 768 tp.m_iStartPos = m_pCurLine->m_iStart; |
739 tp.m_pChars = m_pCurLine->m_pLineChars; | 769 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
740 int32_t iBidiLevel = -1, iCharWidth; | 770 int32_t iBidiLevel = -1, iCharWidth; |
741 i = 0, j = -1; | 771 i = 0, j = -1; |
742 while (i < iCount) { | 772 while (i < iCount) { |
743 pTC = chars.GetDataPtr(i); | 773 pTC = chars.GetDataPtr(i); |
744 if (iBidiLevel < 0) { | 774 if (iBidiLevel < 0) { |
745 iBidiLevel = pTC->m_iBidiLevel; | 775 iBidiLevel = pTC->m_iBidiLevel; |
746 tp.m_iWidth = 0; | 776 tp.m_iWidth = 0; |
747 tp.m_iBidiLevel = iBidiLevel; | 777 tp.m_iBidiLevel = iBidiLevel; |
748 tp.m_iBidiPos = pTC->m_iBidiOrder; | 778 tp.m_iBidiPos = pTC->m_iBidiOrder; |
749 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 779 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 } | 828 } |
799 CFX_TxtPiece& ttp = pCurPieces->GetAt(j); | 829 CFX_TxtPiece& ttp = pCurPieces->GetAt(j); |
800 ttp.m_dwStatus = dwStatus; | 830 ttp.m_dwStatus = dwStatus; |
801 } | 831 } |
802 } else { | 832 } else { |
803 tp.m_dwStatus = dwStatus; | 833 tp.m_dwStatus = dwStatus; |
804 tp.m_iStartPos = m_pCurLine->m_iStart; | 834 tp.m_iStartPos = m_pCurLine->m_iStart; |
805 tp.m_iWidth = m_pCurLine->m_iWidth; | 835 tp.m_iWidth = m_pCurLine->m_iWidth; |
806 tp.m_iStartChar = 0; | 836 tp.m_iStartChar = 0; |
807 tp.m_iChars = iCount; | 837 tp.m_iChars = iCount; |
808 tp.m_pChars = m_pCurLine->m_pLineChars; | 838 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
809 tp.m_pUserData = m_pUserData; | 839 tp.m_pUserData = m_pUserData; |
810 pTC = chars.GetDataPtr(0); | 840 pTC = chars.GetDataPtr(0); |
811 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 841 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
812 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 842 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |
813 tp.m_iVerticalScale = pTC->m_iVertialScale; | 843 tp.m_iVerticalScale = pTC->m_iVertialScale; |
814 pCurPieces->Add(tp); | 844 pCurPieces->Add(tp); |
815 tpo.index = 0; | 845 tpo.index = 0; |
816 tpo.pos = 0; | 846 tpo.pos = 0; |
817 tpos.Add(tpo); | 847 tpos.Add(tpo); |
818 } | 848 } |
819 } | 849 } |
| 850 |
820 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos, | 851 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos, |
821 FX_BOOL bAllChars, | 852 FX_BOOL bAllChars, |
822 uint32_t dwStatus) { | 853 uint32_t dwStatus) { |
823 int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; | 854 int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; |
824 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 855 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
825 int32_t i, j, iCount = pCurPieces->GetSize(); | 856 int32_t i, j, iCount = pCurPieces->GetSize(); |
826 FX_BOOL bFind = FALSE; | 857 FX_BOOL bFind = FALSE; |
827 FX_TPO tpo; | 858 FX_TPO tpo; |
828 CFX_TxtChar* pTC; | 859 CFX_TxtChar* pTC; |
829 FX_CHARTYPE chartype; | 860 FX_CHARTYPE chartype; |
830 for (i = iCount - 1; i > -1; i--) { | 861 for (i = iCount - 1; i > -1; i--) { |
831 tpo = tpos.GetAt(i); | 862 tpo = tpos.GetAt(i); |
832 CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); | 863 CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); |
833 if (!bFind) { | 864 if (!bFind) { |
834 iNetWidth = ttp.GetEndPos(); | 865 iNetWidth = ttp.GetEndPos(); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 iOffset /= 2; | 930 iOffset /= 2; |
900 } | 931 } |
901 if (iOffset > 0) { | 932 if (iOffset > 0) { |
902 for (i = 0; i < iCount; i++) { | 933 for (i = 0; i < iCount; i++) { |
903 CFX_TxtPiece& ttp = pCurPieces->GetAt(i); | 934 CFX_TxtPiece& ttp = pCurPieces->GetAt(i); |
904 ttp.m_iStartPos += iOffset; | 935 ttp.m_iStartPos += iOffset; |
905 } | 936 } |
906 } | 937 } |
907 } | 938 } |
908 } | 939 } |
| 940 |
909 uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) { | 941 uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) { |
910 ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak && | 942 ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak && |
911 dwStatus <= FX_TXTBREAK_PageBreak); | 943 dwStatus <= FX_TXTBREAK_PageBreak); |
912 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 944 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
913 int32_t iCount = pCurPieces->GetSize(); | 945 int32_t iCount = pCurPieces->GetSize(); |
914 if (iCount > 0) { | 946 if (iCount > 0) { |
915 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); | 947 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); |
916 if (dwStatus > FX_TXTBREAK_PieceBreak) { | 948 if (dwStatus > FX_TXTBREAK_PieceBreak) { |
917 pLastPiece->m_dwStatus = dwStatus; | 949 pLastPiece->m_dwStatus = dwStatus; |
918 } else { | 950 } else { |
919 dwStatus = pLastPiece->m_dwStatus; | 951 dwStatus = pLastPiece->m_dwStatus; |
920 } | 952 } |
921 return dwStatus; | 953 return dwStatus; |
922 } else { | 954 } else { |
923 CFX_TxtLine* pLastLine = GetTxtLine(TRUE); | 955 CFX_TxtLine* pLastLine = GetTxtLine(TRUE); |
924 if (pLastLine) { | 956 if (pLastLine) { |
925 pCurPieces = pLastLine->m_pLinePieces; | 957 pCurPieces = pLastLine->m_pLinePieces.get(); |
926 iCount = pCurPieces->GetSize(); | 958 iCount = pCurPieces->GetSize(); |
927 if (iCount-- > 0) { | 959 if (iCount-- > 0) { |
928 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); | 960 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); |
929 if (dwStatus > FX_TXTBREAK_PieceBreak) { | 961 if (dwStatus > FX_TXTBREAK_PieceBreak) { |
930 pLastPiece->m_dwStatus = dwStatus; | 962 pLastPiece->m_dwStatus = dwStatus; |
931 } else { | 963 } else { |
932 dwStatus = pLastPiece->m_dwStatus; | 964 dwStatus = pLastPiece->m_dwStatus; |
933 } | 965 } |
934 return dwStatus; | 966 return dwStatus; |
935 } | 967 } |
936 return FX_TXTBREAK_None; | 968 return FX_TXTBREAK_None; |
937 } | 969 } |
938 iCount = m_pCurLine->CountChars(); | 970 iCount = m_pCurLine->CountChars(); |
939 if (iCount < 1) { | 971 if (iCount < 1) { |
940 return FX_TXTBREAK_None; | 972 return FX_TXTBREAK_None; |
941 } | 973 } |
942 if (!m_bPagination) { | 974 if (!m_bPagination) { |
943 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); | 975 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); |
944 pTC->m_dwStatus = dwStatus; | 976 pTC->m_dwStatus = dwStatus; |
945 } | 977 } |
946 if (dwStatus <= FX_TXTBREAK_PieceBreak) { | 978 if (dwStatus <= FX_TXTBREAK_PieceBreak) { |
947 return dwStatus; | 979 return dwStatus; |
948 } | 980 } |
949 } | 981 } |
950 m_iReady = (m_pCurLine == m_pTxtLine1) ? 1 : 2; | 982 m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2; |
951 CFX_TxtLine* pNextLine = | 983 CFX_TxtLine* pNextLine = |
952 (m_pCurLine == m_pTxtLine1) ? m_pTxtLine2 : m_pTxtLine1; | 984 (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get(); |
953 FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); | 985 FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); |
954 CFX_TPOArray tpos(100); | 986 CFX_TPOArray tpos(100); |
955 CFX_Char* pTC; | 987 CFX_Char* pTC; |
956 if (m_bArabicShapes) { | 988 if (m_bArabicShapes) { |
957 EndBreak_UpdateArabicShapes(); | 989 EndBreak_UpdateArabicShapes(); |
958 } | 990 } |
959 if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { | 991 if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { |
960 goto EndBreak_Ret; | 992 goto EndBreak_Ret; |
961 } | 993 } |
962 EndBreak_BidiLine(tpos, dwStatus); | 994 EndBreak_BidiLine(tpos, dwStatus); |
963 if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { | 995 if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { |
964 EndBreak_Alignment(tpos, bAllChars, dwStatus); | 996 EndBreak_Alignment(tpos, bAllChars, dwStatus); |
965 } | 997 } |
966 EndBreak_Ret: | 998 EndBreak_Ret: |
967 m_pCurLine = pNextLine; | 999 m_pCurLine = pNextLine; |
968 pTC = GetLastChar(0, FALSE); | 1000 pTC = GetLastChar(0, FALSE); |
969 m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; | 1001 m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; |
970 if (dwStatus == FX_TXTBREAK_ParagraphBreak) { | 1002 if (dwStatus == FX_TXTBREAK_ParagraphBreak) { |
971 m_iArabicContext = m_iCurArabicContext = 1; | 1003 m_iArabicContext = m_iCurArabicContext = 1; |
972 ResetArabicContext(); | 1004 ResetArabicContext(); |
973 } | 1005 } |
974 return dwStatus; | 1006 return dwStatus; |
975 } | 1007 } |
| 1008 |
976 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca, | 1009 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca, |
977 int32_t& iEndPos, | 1010 int32_t& iEndPos, |
978 FX_BOOL bAllChars, | 1011 FX_BOOL bAllChars, |
979 FX_BOOL bOnlyBrk) { | 1012 FX_BOOL bOnlyBrk) { |
980 int32_t iLength = ca.GetSize() - 1; | 1013 int32_t iLength = ca.GetSize() - 1; |
981 if (iLength < 1) { | 1014 if (iLength < 1) { |
982 return iLength; | 1015 return iLength; |
983 } | 1016 } |
984 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, | 1017 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, |
985 iLast = -1, iLastPos = -1; | 1018 iLast = -1, iLastPos = -1; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 if (iIndirect > -1) { | 1095 if (iIndirect > -1) { |
1063 iEndPos = iIndirectPos; | 1096 iEndPos = iIndirectPos; |
1064 return iIndirect; | 1097 return iIndirect; |
1065 } | 1098 } |
1066 if (iLast > -1) { | 1099 if (iLast > -1) { |
1067 iEndPos = iLastPos; | 1100 iEndPos = iLastPos; |
1068 return iLast; | 1101 return iLast; |
1069 } | 1102 } |
1070 return 0; | 1103 return 0; |
1071 } | 1104 } |
| 1105 |
1072 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, | 1106 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, |
1073 CFX_TxtLine* pNextLine, | 1107 CFX_TxtLine* pNextLine, |
1074 FX_BOOL bAllChars) { | 1108 FX_BOOL bAllChars) { |
1075 ASSERT(pCurLine && pNextLine); | 1109 ASSERT(pCurLine && pNextLine); |
1076 int32_t iCount = pCurLine->CountChars(); | 1110 int32_t iCount = pCurLine->CountChars(); |
1077 if (iCount < 2) { | 1111 if (iCount < 2) { |
1078 return; | 1112 return; |
1079 } | 1113 } |
1080 int32_t iEndPos = pCurLine->m_iWidth; | 1114 int32_t iEndPos = pCurLine->m_iWidth; |
1081 CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars; | 1115 CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars.get(); |
1082 int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); | 1116 int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); |
1083 if (iCharPos < 0) { | 1117 if (iCharPos < 0) { |
1084 iCharPos = 0; | 1118 iCharPos = 0; |
1085 } | 1119 } |
1086 iCharPos++; | 1120 iCharPos++; |
1087 if (iCharPos >= iCount) { | 1121 if (iCharPos >= iCount) { |
1088 pNextLine->RemoveAll(TRUE); | 1122 pNextLine->RemoveAll(TRUE); |
1089 CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); | 1123 CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); |
1090 pTC->m_nBreakType = FX_LBT_UNKNOWN; | 1124 pTC->m_nBreakType = FX_LBT_UNKNOWN; |
1091 return; | 1125 return; |
1092 } | 1126 } |
1093 CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars; | 1127 CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars.get(); |
1094 int cur_size = curChars.GetSize(); | 1128 int cur_size = curChars.GetSize(); |
1095 nextChars.SetSize(cur_size - iCharPos); | 1129 nextChars.SetSize(cur_size - iCharPos); |
1096 FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), | 1130 FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), |
1097 (cur_size - iCharPos) * sizeof(CFX_TxtChar)); | 1131 (cur_size - iCharPos) * sizeof(CFX_TxtChar)); |
1098 iCount -= iCharPos; | 1132 iCount -= iCharPos; |
1099 cur_size = curChars.GetSize(); | 1133 cur_size = curChars.GetSize(); |
1100 curChars.RemoveAt(cur_size - iCount, iCount); | 1134 curChars.RemoveAt(cur_size - iCount, iCount); |
1101 pCurLine->m_iWidth = iEndPos; | 1135 pCurLine->m_iWidth = iEndPos; |
1102 CFX_TxtChar* pTC = curChars.GetDataPtr(iCharPos - 1); | 1136 CFX_TxtChar* pTC = curChars.GetDataPtr(iCharPos - 1); |
1103 pTC->m_nBreakType = FX_LBT_UNKNOWN; | 1137 pTC->m_nBreakType = FX_LBT_UNKNOWN; |
1104 iCount = nextChars.GetSize(); | 1138 iCount = nextChars.GetSize(); |
1105 int32_t iCharWidth, iWidth = 0; | 1139 int32_t iCharWidth, iWidth = 0; |
1106 for (int32_t i = 0; i < iCount; i++) { | 1140 for (int32_t i = 0; i < iCount; i++) { |
1107 pTC = nextChars.GetDataPtr(i); | 1141 pTC = nextChars.GetDataPtr(i); |
1108 if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) { | 1142 if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) { |
1109 pCurLine->m_iArabicChars--; | 1143 pCurLine->m_iArabicChars--; |
1110 pNextLine->m_iArabicChars++; | 1144 pNextLine->m_iArabicChars++; |
1111 } | 1145 } |
1112 iCharWidth = pTC->m_iCharWidth; | 1146 iCharWidth = pTC->m_iCharWidth; |
1113 if (iCharWidth > 0) { | 1147 if (iCharWidth > 0) { |
1114 iWidth += iCharWidth; | 1148 iWidth += iCharWidth; |
1115 } | 1149 } |
1116 if (m_bPagination) { | 1150 if (m_bPagination) { |
1117 continue; | 1151 continue; |
1118 } | 1152 } |
1119 pTC->m_dwStatus = 0; | 1153 pTC->m_dwStatus = 0; |
1120 } | 1154 } |
1121 pNextLine->m_iWidth = iWidth; | 1155 pNextLine->m_iWidth = iWidth; |
1122 } | 1156 } |
| 1157 |
1123 int32_t CFX_TxtBreak::CountBreakChars() const { | 1158 int32_t CFX_TxtBreak::CountBreakChars() const { |
1124 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); | 1159 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); |
1125 return pTxtLine ? pTxtLine->CountChars() : 0; | 1160 return pTxtLine ? pTxtLine->CountChars() : 0; |
1126 } | 1161 } |
| 1162 |
1127 int32_t CFX_TxtBreak::CountBreakPieces() const { | 1163 int32_t CFX_TxtBreak::CountBreakPieces() const { |
1128 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); | 1164 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); |
1129 return pTxtPieces ? pTxtPieces->GetSize() : 0; | 1165 return pTxtPieces ? pTxtPieces->GetSize() : 0; |
1130 } | 1166 } |
| 1167 |
1131 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { | 1168 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { |
1132 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); | 1169 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); |
1133 if (!pTxtPieces) { | 1170 if (!pTxtPieces) { |
1134 return nullptr; | 1171 return nullptr; |
1135 } | 1172 } |
1136 if (index < 0 || index >= pTxtPieces->GetSize()) { | 1173 if (index < 0 || index >= pTxtPieces->GetSize()) { |
1137 return nullptr; | 1174 return nullptr; |
1138 } | 1175 } |
1139 return pTxtPieces->GetPtrAt(index); | 1176 return pTxtPieces->GetPtrAt(index); |
1140 } | 1177 } |
| 1178 |
1141 void CFX_TxtBreak::ClearBreakPieces() { | 1179 void CFX_TxtBreak::ClearBreakPieces() { |
1142 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); | 1180 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); |
1143 if (pTxtLine) { | 1181 if (pTxtLine) { |
1144 pTxtLine->RemoveAll(TRUE); | 1182 pTxtLine->RemoveAll(TRUE); |
1145 } | 1183 } |
1146 m_iReady = 0; | 1184 m_iReady = 0; |
1147 } | 1185 } |
| 1186 |
1148 void CFX_TxtBreak::Reset() { | 1187 void CFX_TxtBreak::Reset() { |
1149 m_eCharType = FX_CHARTYPE_Unknown; | 1188 m_eCharType = FX_CHARTYPE_Unknown; |
1150 m_iArabicContext = m_iCurArabicContext = 1; | 1189 m_iArabicContext = m_iCurArabicContext = 1; |
1151 ResetArabicContext(); | 1190 ResetArabicContext(); |
1152 m_pTxtLine1->RemoveAll(TRUE); | 1191 m_pTxtLine1->RemoveAll(TRUE); |
1153 m_pTxtLine2->RemoveAll(TRUE); | 1192 m_pTxtLine2->RemoveAll(TRUE); |
1154 } | 1193 } |
1155 | 1194 |
1156 struct FX_FORMCHAR { | 1195 struct FX_FORMCHAR { |
1157 uint16_t wch; | 1196 uint16_t wch; |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1541 pCharPos++; | 1580 pCharPos++; |
1542 } | 1581 } |
1543 } | 1582 } |
1544 if (iWidth > 0) { | 1583 if (iWidth > 0) { |
1545 wPrev = (FX_WCHAR)formChars[0].wch; | 1584 wPrev = (FX_WCHAR)formChars[0].wch; |
1546 } | 1585 } |
1547 wLast = wch; | 1586 wLast = wch; |
1548 } | 1587 } |
1549 return iCount; | 1588 return iCount; |
1550 } | 1589 } |
| 1590 |
1551 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, | 1591 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, |
1552 CFX_RectFArray& rtArray, | 1592 CFX_RectFArray& rtArray, |
1553 FX_BOOL bCharBBox) const { | 1593 FX_BOOL bCharBBox) const { |
1554 if (!pTxtRun || pTxtRun->iLength < 1) { | 1594 if (!pTxtRun || pTxtRun->iLength < 1) { |
1555 return 0; | 1595 return 0; |
1556 } | 1596 } |
1557 IFX_TxtAccess* pAccess = pTxtRun->pAccess; | 1597 IFX_TxtAccess* pAccess = pTxtRun->pAccess; |
1558 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; | 1598 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; |
1559 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); | 1599 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); |
1560 int32_t* pWidths = pTxtRun->pWidths; | 1600 int32_t* pWidths = pTxtRun->pWidths; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1688 m_iChars(0), | 1728 m_iChars(0), |
1689 m_iBidiLevel(0), | 1729 m_iBidiLevel(0), |
1690 m_iBidiPos(0), | 1730 m_iBidiPos(0), |
1691 m_iHorizontalScale(100), | 1731 m_iHorizontalScale(100), |
1692 m_iVerticalScale(100), | 1732 m_iVerticalScale(100), |
1693 m_dwCharStyles(0), | 1733 m_dwCharStyles(0), |
1694 m_pChars(nullptr), | 1734 m_pChars(nullptr), |
1695 m_pUserData(nullptr) {} | 1735 m_pUserData(nullptr) {} |
1696 | 1736 |
1697 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) | 1737 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) |
1698 : m_iStart(0), m_iWidth(0), m_iArabicChars(0) { | 1738 : m_pLineChars(new CFX_TxtCharArray), |
1699 m_pLineChars = new CFX_TxtCharArray; | 1739 m_pLinePieces(new CFX_TxtPieceArray(16)), |
1700 m_pLinePieces = new CFX_TxtPieceArray(16); | 1740 m_iStart(0), |
1701 } | 1741 m_iWidth(0), |
| 1742 m_iArabicChars(0) {} |
1702 | 1743 |
1703 CFX_TxtLine::~CFX_TxtLine() { | 1744 CFX_TxtLine::~CFX_TxtLine() { |
1704 RemoveAll(); | 1745 RemoveAll(); |
1705 delete m_pLineChars; | |
1706 delete m_pLinePieces; | |
1707 } | 1746 } |
OLD | NEW |