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 19 matching lines...) Expand all Loading... |
30 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Others, | 30 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Others, |
31 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Others, | 31 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Others, |
32 }; | 32 }; |
33 | 33 |
34 } // namespace | 34 } // namespace |
35 | 35 |
36 CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies) | 36 CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies) |
37 : m_dwPolicies(dwPolicies), | 37 : m_dwPolicies(dwPolicies), |
38 m_iLineWidth(2000000), | 38 m_iLineWidth(2000000), |
39 m_dwLayoutStyles(0), | 39 m_dwLayoutStyles(0), |
40 m_bVertical(FALSE), | 40 m_bVertical(false), |
41 m_bArabicContext(FALSE), | 41 m_bArabicContext(false), |
42 m_bArabicShapes(FALSE), | 42 m_bArabicShapes(false), |
43 m_bRTL(FALSE), | 43 m_bRTL(false), |
44 m_bSingleLine(FALSE), | 44 m_bSingleLine(false), |
45 m_bCombText(FALSE), | 45 m_bCombText(false), |
46 m_iArabicContext(1), | 46 m_iArabicContext(1), |
47 m_iCurArabicContext(1), | 47 m_iCurArabicContext(1), |
48 m_pFont(nullptr), | 48 m_pFont(nullptr), |
49 m_iFontSize(240), | 49 m_iFontSize(240), |
50 m_bEquidistant(TRUE), | 50 m_bEquidistant(true), |
51 m_iTabWidth(720000), | 51 m_iTabWidth(720000), |
52 m_wDefChar(0xFEFF), | 52 m_wDefChar(0xFEFF), |
53 m_wParagBreakChar(L'\n'), | 53 m_wParagBreakChar(L'\n'), |
54 m_iDefChar(0), | 54 m_iDefChar(0), |
55 m_iLineRotation(0), | 55 m_iLineRotation(0), |
56 m_iCharRotation(0), | 56 m_iCharRotation(0), |
57 m_iRotation(0), | 57 m_iRotation(0), |
58 m_iAlignment(FX_TXTLINEALIGNMENT_Left), | 58 m_iAlignment(FX_TXTLINEALIGNMENT_Left), |
59 m_dwContextCharStyles(0), | 59 m_dwContextCharStyles(0), |
60 m_iCombWidth(360000), | 60 m_iCombWidth(360000), |
61 m_pUserData(nullptr), | 61 m_pUserData(nullptr), |
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 int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar); | 72 int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar); |
73 m_pTxtLine1.reset(new CFX_TxtLine(iSize)); | 73 m_pTxtLine1.reset(new CFX_TxtLine(iSize)); |
74 m_pTxtLine2.reset(new CFX_TxtLine(iSize)); | 74 m_pTxtLine2.reset(new CFX_TxtLine(iSize)); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 if (!pFont) { | 115 if (!pFont) { |
116 return; | 116 return; |
117 } | 117 } |
118 if (m_pFont == pFont) { | 118 if (m_pFont == pFont) { |
119 return; | 119 return; |
120 } | 120 } |
121 SetBreakStatus(); | 121 SetBreakStatus(); |
122 m_pFont = pFont; | 122 m_pFont = pFont; |
123 m_iDefChar = 0; | 123 m_iDefChar = 0; |
124 if (m_wDefChar != 0xFEFF && m_pFont) { | 124 if (m_wDefChar != 0xFEFF && m_pFont) { |
125 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 125 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); |
126 m_iDefChar *= m_iFontSize; | 126 m_iDefChar *= m_iFontSize; |
127 } | 127 } |
128 } | 128 } |
129 | 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 |
144 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) { | 144 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, bool bEquidistant) { |
145 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); | 145 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); |
146 if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { | 146 if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { |
147 m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; | 147 m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; |
148 } | 148 } |
149 m_bEquidistant = bEquidistant; | 149 m_bEquidistant = bEquidistant; |
150 } | 150 } |
151 | 151 |
152 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { | 152 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { |
153 m_wDefChar = wch; | 153 m_wDefChar = wch; |
154 m_iDefChar = 0; | 154 m_iDefChar = 0; |
155 if (m_wDefChar != 0xFEFF && m_pFont) { | 155 if (m_wDefChar != 0xFEFF && m_pFont) { |
156 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 156 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); |
157 if (m_iDefChar < 0) { | 157 if (m_iDefChar < 0) { |
158 m_iDefChar = 0; | 158 m_iDefChar = 0; |
159 } else { | 159 } else { |
160 m_iDefChar *= m_iFontSize; | 160 m_iDefChar *= m_iFontSize; |
161 } | 161 } |
162 } | 162 } |
163 } | 163 } |
164 | 164 |
165 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { | 165 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { |
166 if (wch != L'\r' && wch != L'\n') { | 166 if (wch != L'\r' && wch != L'\n') { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 | 272 |
273 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { | 273 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { |
274 m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); | 274 m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); |
275 } | 275 } |
276 | 276 |
277 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}; |
278 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { | 278 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { |
279 return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; | 279 return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; |
280 } | 280 } |
281 | 281 |
282 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const { | 282 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const { |
283 CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars.get(); | 283 CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars.get(); |
284 int32_t iCount = ca.GetSize(); | 284 int32_t iCount = ca.GetSize(); |
285 if (index < 0 || index >= iCount) { | 285 if (index < 0 || index >= iCount) { |
286 return nullptr; | 286 return nullptr; |
287 } | 287 } |
288 CFX_TxtChar* pTC; | 288 CFX_TxtChar* pTC; |
289 int32_t iStart = iCount - 1; | 289 int32_t iStart = iCount - 1; |
290 while (iStart > -1) { | 290 while (iStart > -1) { |
291 pTC = ca.GetDataPtr(iStart--); | 291 pTC = ca.GetDataPtr(iStart--); |
292 if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { | 292 if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { |
293 continue; | 293 continue; |
294 } | 294 } |
295 if (--index < 0) { | 295 if (--index < 0) { |
296 return pTC; | 296 return pTC; |
297 } | 297 } |
298 } | 298 } |
299 return nullptr; | 299 return nullptr; |
300 } | 300 } |
301 | 301 |
302 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const { | 302 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(bool bReady) const { |
303 if (!bReady) | 303 if (!bReady) |
304 return m_pCurLine; | 304 return m_pCurLine; |
305 if (m_iReady == 1) | 305 if (m_iReady == 1) |
306 return m_pTxtLine1.get(); | 306 return m_pTxtLine1.get(); |
307 if (m_iReady == 2) | 307 if (m_iReady == 2) |
308 return m_pTxtLine2.get(); | 308 return m_pTxtLine2.get(); |
309 return nullptr; | 309 return nullptr; |
310 } | 310 } |
311 | 311 |
312 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const { | 312 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(bool bReady) const { |
313 CFX_TxtLine* pTxtLine = GetTxtLine(bReady); | 313 CFX_TxtLine* pTxtLine = GetTxtLine(bReady); |
314 if (!pTxtLine) { | 314 if (!pTxtLine) { |
315 return nullptr; | 315 return nullptr; |
316 } | 316 } |
317 return pTxtLine->m_pLinePieces.get(); | 317 return pTxtLine->m_pLinePieces.get(); |
318 } | 318 } |
319 | 319 |
320 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( | 320 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( |
321 FX_CHARTYPE chartype) const { | 321 FX_CHARTYPE chartype) const { |
322 return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; | 322 return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; |
323 } | 323 } |
324 | 324 |
325 void CFX_TxtBreak::ResetArabicContext() { | 325 void CFX_TxtBreak::ResetArabicContext() { |
326 if (m_bArabicContext) { | 326 if (m_bArabicContext) { |
327 m_bCurRTL = m_iCurArabicContext > 1; | 327 m_bCurRTL = m_iCurArabicContext > 1; |
328 m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right | 328 m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right |
329 : FX_TXTLINEALIGNMENT_Left; | 329 : FX_TXTLINEALIGNMENT_Left; |
330 m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); | 330 m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); |
331 m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; | 331 m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; |
332 } else { | 332 } else { |
333 if (m_bPagination) { | 333 if (m_bPagination) { |
334 m_bCurRTL = FALSE; | 334 m_bCurRTL = false; |
335 m_iCurAlignment = 0; | 335 m_iCurAlignment = 0; |
336 } else { | 336 } else { |
337 m_bCurRTL = m_bRTL; | 337 m_bCurRTL = m_bRTL; |
338 m_iCurAlignment = m_iAlignment; | 338 m_iCurAlignment = m_iAlignment; |
339 } | 339 } |
340 if (m_bRTL) { | 340 if (m_bRTL) { |
341 m_bArabicNumber = m_iArabicContext >= 1; | 341 m_bArabicNumber = m_iArabicContext >= 1; |
342 } else { | 342 } else { |
343 m_bArabicNumber = m_iArabicContext > 1; | 343 m_bArabicNumber = m_iArabicContext > 1; |
344 } | 344 } |
(...skipping 16 matching lines...) Expand all Loading... |
361 ? 2 | 361 ? 2 |
362 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 | 362 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 |
363 : 1); | 363 : 1); |
364 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { | 364 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { |
365 m_iArabicContext = iArabicContext; | 365 m_iArabicContext = iArabicContext; |
366 if (m_iCurArabicContext == 1) { | 366 if (m_iCurArabicContext == 1) { |
367 m_iCurArabicContext = iArabicContext; | 367 m_iCurArabicContext = iArabicContext; |
368 } | 368 } |
369 ResetArabicContext(); | 369 ResetArabicContext(); |
370 if (!m_bPagination) { | 370 if (!m_bPagination) { |
371 CFX_TxtChar* pLastChar = GetLastChar(1, FALSE); | 371 CFX_TxtChar* pLastChar = GetLastChar(1, false); |
372 if (pLastChar && pLastChar->m_dwStatus < 1) { | 372 if (pLastChar && pLastChar->m_dwStatus < 1) { |
373 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; | 373 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; |
374 } | 374 } |
375 } | 375 } |
376 } | 376 } |
377 } | 377 } |
378 pCurChar->m_dwCharStyles = m_dwContextCharStyles; | 378 pCurChar->m_dwCharStyles = m_dwContextCharStyles; |
379 } | 379 } |
380 | 380 |
381 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, | 381 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, |
382 int32_t iRotation) { | 382 int32_t iRotation) { |
383 FX_WCHAR wch = pCurChar->m_wCharCode; | 383 FX_WCHAR wch = pCurChar->m_wCharCode; |
384 FX_WCHAR wForm; | 384 FX_WCHAR wForm; |
385 int32_t iCharWidth = 0; | 385 int32_t iCharWidth = 0; |
386 pCurChar->m_iCharWidth = -1; | 386 pCurChar->m_iCharWidth = -1; |
387 if (m_bCombText) { | 387 if (m_bCombText) { |
388 iCharWidth = m_iCombWidth; | 388 iCharWidth = m_iCombWidth; |
389 } else { | 389 } else { |
390 if (m_bVertical != FX_IsOdd(iRotation)) { | 390 if (m_bVertical != FX_IsOdd(iRotation)) { |
391 iCharWidth = 1000; | 391 iCharWidth = 1000; |
392 } else { | 392 } else { |
393 wForm = wch; | 393 wForm = wch; |
394 if (!m_bPagination) { | 394 if (!m_bPagination) { |
395 CFX_TxtChar* pLastChar = GetLastChar(0, FALSE); | 395 CFX_TxtChar* pLastChar = GetLastChar(0, false); |
396 if (pLastChar && | 396 if (pLastChar && |
397 (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { | 397 (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { |
398 FX_BOOL bShadda = FALSE; | 398 bool bShadda = false; |
399 if (wch == 0x0651) { | 399 if (wch == 0x0651) { |
400 FX_WCHAR wLast = pLastChar->m_wCharCode; | 400 FX_WCHAR wLast = pLastChar->m_wCharCode; |
401 if (wLast >= 0x064C && wLast <= 0x0650) { | 401 if (wLast >= 0x064C && wLast <= 0x0650) { |
402 wForm = FX_GetArabicFromShaddaTable(wLast); | 402 wForm = FX_GetArabicFromShaddaTable(wLast); |
403 bShadda = TRUE; | 403 bShadda = true; |
404 } | 404 } |
405 } else if (wch >= 0x064C && wch <= 0x0650) { | 405 } else if (wch >= 0x064C && wch <= 0x0650) { |
406 if (pLastChar->m_wCharCode == 0x0651) { | 406 if (pLastChar->m_wCharCode == 0x0651) { |
407 wForm = FX_GetArabicFromShaddaTable(wch); | 407 wForm = FX_GetArabicFromShaddaTable(wch); |
408 bShadda = TRUE; | 408 bShadda = true; |
409 } | 409 } |
410 } | 410 } |
411 if (bShadda) { | 411 if (bShadda) { |
412 pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; | 412 pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; |
413 pLastChar->m_iCharWidth = 0; | 413 pLastChar->m_iCharWidth = 0; |
414 pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; | 414 pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; |
415 } | 415 } |
416 } | 416 } |
417 } | 417 } |
418 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { | 418 if (!m_pFont->GetCharWidth(wForm, iCharWidth, false)) { |
419 iCharWidth = 0; | 419 iCharWidth = 0; |
420 } | 420 } |
421 } | 421 } |
422 iCharWidth *= m_iFontSize; | 422 iCharWidth *= m_iFontSize; |
423 iCharWidth = iCharWidth * m_iHorScale / 100; | 423 iCharWidth = iCharWidth * m_iHorScale / 100; |
424 } | 424 } |
425 pCurChar->m_iCharWidth = -iCharWidth; | 425 pCurChar->m_iCharWidth = -iCharWidth; |
426 return FX_TXTBREAK_None; | 426 return FX_TXTBREAK_None; |
427 } | 427 } |
428 | 428 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 return dwRet; | 485 return dwRet; |
486 } | 486 } |
487 | 487 |
488 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, | 488 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, |
489 int32_t iRotation) { | 489 int32_t iRotation) { |
490 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 490 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
491 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 491 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
492 FX_WCHAR wForm; | 492 FX_WCHAR wForm; |
493 int32_t iCharWidth = 0; | 493 int32_t iCharWidth = 0; |
494 CFX_Char* pLastChar = nullptr; | 494 CFX_Char* pLastChar = nullptr; |
495 FX_BOOL bAlef = FALSE; | 495 bool bAlef = false; |
496 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && | 496 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && |
497 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { | 497 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { |
498 pLastChar = GetLastChar(1); | 498 pLastChar = GetLastChar(1); |
499 if (pLastChar) { | 499 if (pLastChar) { |
500 iCharWidth = pLastChar->m_iCharWidth; | 500 iCharWidth = pLastChar->m_iCharWidth; |
501 if (iCharWidth > 0) { | 501 if (iCharWidth > 0) { |
502 iLineWidth -= iCharWidth; | 502 iLineWidth -= iCharWidth; |
503 } | 503 } |
504 CFX_Char* pPrevChar = GetLastChar(2); | 504 CFX_Char* pPrevChar = GetLastChar(2); |
505 wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); | 505 wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); |
506 bAlef = (wForm == 0xFEFF && | 506 bAlef = (wForm == 0xFEFF && |
507 pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); | 507 pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); |
508 int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation; | 508 int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation; |
509 if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) { | 509 if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) { |
510 iLastRotation++; | 510 iLastRotation++; |
511 } | 511 } |
512 if (m_bVertical != FX_IsOdd(iLastRotation)) { | 512 if (m_bVertical != FX_IsOdd(iLastRotation)) { |
513 iCharWidth = 1000; | 513 iCharWidth = 1000; |
514 } else { | 514 } else { |
515 m_pFont->GetCharWidth(wForm, iCharWidth, FALSE); | 515 m_pFont->GetCharWidth(wForm, iCharWidth, false); |
516 } | 516 } |
517 if (wForm == 0xFEFF) { | 517 if (wForm == 0xFEFF) { |
518 iCharWidth = m_iDefChar; | 518 iCharWidth = m_iDefChar; |
519 } | 519 } |
520 iCharWidth *= m_iFontSize; | 520 iCharWidth *= m_iFontSize; |
521 iCharWidth = iCharWidth * m_iHorScale / 100; | 521 iCharWidth = iCharWidth * m_iHorScale / 100; |
522 pLastChar->m_iCharWidth = iCharWidth; | 522 pLastChar->m_iCharWidth = iCharWidth; |
523 iLineWidth += iCharWidth; | 523 iLineWidth += iCharWidth; |
524 iCharWidth = 0; | 524 iCharWidth = 0; |
525 } | 525 } |
526 } | 526 } |
527 m_eCharType = chartype; | 527 m_eCharType = chartype; |
528 wForm = pdfium::arabic::GetFormChar(pCurChar, bAlef ? nullptr : pLastChar, | 528 wForm = pdfium::arabic::GetFormChar(pCurChar, bAlef ? nullptr : pLastChar, |
529 nullptr); | 529 nullptr); |
530 if (m_bCombText) { | 530 if (m_bCombText) { |
531 iCharWidth = m_iCombWidth; | 531 iCharWidth = m_iCombWidth; |
532 } else { | 532 } else { |
533 if (m_bVertical != FX_IsOdd(iRotation)) { | 533 if (m_bVertical != FX_IsOdd(iRotation)) { |
534 iCharWidth = 1000; | 534 iCharWidth = 1000; |
535 } else { | 535 } else { |
536 m_pFont->GetCharWidth(wForm, iCharWidth, FALSE); | 536 m_pFont->GetCharWidth(wForm, iCharWidth, false); |
537 } | 537 } |
538 if (wForm == 0xFEFF) { | 538 if (wForm == 0xFEFF) { |
539 iCharWidth = m_iDefChar; | 539 iCharWidth = m_iDefChar; |
540 } | 540 } |
541 iCharWidth *= m_iFontSize; | 541 iCharWidth *= m_iFontSize; |
542 iCharWidth = iCharWidth * m_iHorScale / 100; | 542 iCharWidth = iCharWidth * m_iHorScale / 100; |
543 } | 543 } |
544 pCurChar->m_iCharWidth = iCharWidth; | 544 pCurChar->m_iCharWidth = iCharWidth; |
545 iLineWidth += iCharWidth; | 545 iLineWidth += iCharWidth; |
546 m_pCurLine->m_iArabicChars++; | 546 m_pCurLine->m_iArabicChars++; |
(...skipping 23 matching lines...) Expand all Loading... |
570 pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicComma; | 570 pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicComma; |
571 } | 571 } |
572 } else if (m_bCurRTL || m_bVertical) { | 572 } else if (m_bCurRTL || m_bVertical) { |
573 wForm = FX_GetMirrorChar(wch, dwProps, m_bCurRTL, m_bVertical); | 573 wForm = FX_GetMirrorChar(wch, dwProps, m_bCurRTL, m_bVertical); |
574 } | 574 } |
575 if (m_bCombText) { | 575 if (m_bCombText) { |
576 iCharWidth = m_iCombWidth; | 576 iCharWidth = m_iCombWidth; |
577 } else { | 577 } else { |
578 if (m_bVertical != FX_IsOdd(iRotation)) { | 578 if (m_bVertical != FX_IsOdd(iRotation)) { |
579 iCharWidth = 1000; | 579 iCharWidth = 1000; |
580 } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { | 580 } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, false)) { |
581 iCharWidth = m_iDefChar; | 581 iCharWidth = m_iDefChar; |
582 } | 582 } |
583 iCharWidth *= m_iFontSize; | 583 iCharWidth *= m_iFontSize; |
584 iCharWidth = iCharWidth * m_iHorScale / 100; | 584 iCharWidth = iCharWidth * m_iHorScale / 100; |
585 } | 585 } |
586 iCharWidth += m_iCharSpace; | 586 iCharWidth += m_iCharSpace; |
587 pCurChar->m_iCharWidth = iCharWidth; | 587 pCurChar->m_iCharWidth = iCharWidth; |
588 iLineWidth += iCharWidth; | 588 iLineWidth += iCharWidth; |
589 FX_BOOL bBreak = (chartype != FX_CHARTYPE_Space || | 589 bool bBreak = (chartype != FX_CHARTYPE_Space || |
590 (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0); | 590 (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0); |
591 if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) { | 591 if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) { |
592 return EndBreak(FX_TXTBREAK_LineBreak); | 592 return EndBreak(FX_TXTBREAK_LineBreak); |
593 } | 593 } |
594 return FX_TXTBREAK_None; | 594 return FX_TXTBREAK_None; |
595 } | 595 } |
596 | 596 |
597 uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) { | 597 uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) { |
598 uint32_t dwProps = kTextLayoutCodeProperties[(uint16_t)wch]; | 598 uint32_t dwProps = kTextLayoutCodeProperties[(uint16_t)wch]; |
599 FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); | 599 FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); |
600 CFX_TxtChar* pCurChar = m_pCurLine->m_pLineChars->AddSpace(); | 600 CFX_TxtChar* pCurChar = m_pCurLine->m_pLineChars->AddSpace(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 } | 637 } |
638 | 638 |
639 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() { | 639 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() { |
640 ASSERT(m_bArabicShapes); | 640 ASSERT(m_bArabicShapes); |
641 int32_t iCount = m_pCurLine->CountChars(); | 641 int32_t iCount = m_pCurLine->CountChars(); |
642 if (iCount < 2) { | 642 if (iCount < 2) { |
643 return; | 643 return; |
644 } | 644 } |
645 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 645 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
646 CFX_Char* pCur = m_pCurLine->GetCharPtr(0); | 646 CFX_Char* pCur = m_pCurLine->GetCharPtr(0); |
647 FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 647 bool bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
648 pCur = m_pCurLine->GetCharPtr(1); | 648 pCur = m_pCurLine->GetCharPtr(1); |
649 FX_WCHAR wch, wForm; | 649 FX_WCHAR wch, wForm; |
650 FX_BOOL bNextNum; | 650 bool bNextNum; |
651 int32_t i = 1; | 651 int32_t i = 1; |
652 int32_t iCharWidth; | 652 int32_t iCharWidth; |
653 int32_t iRotation; | 653 int32_t iRotation; |
654 CFX_Char* pNext; | 654 CFX_Char* pNext; |
655 do { | 655 do { |
656 i++; | 656 i++; |
657 if (i < iCount) { | 657 if (i < iCount) { |
658 pNext = m_pCurLine->GetCharPtr(i); | 658 pNext = m_pCurLine->GetCharPtr(i); |
659 bNextNum = (pNext->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 659 bNextNum = (pNext->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
660 } else { | 660 } else { |
661 pNext = nullptr; | 661 pNext = nullptr; |
662 bNextNum = FALSE; | 662 bNextNum = false; |
663 } | 663 } |
664 wch = pCur->m_wCharCode; | 664 wch = pCur->m_wCharCode; |
665 if (wch == L'.') { | 665 if (wch == L'.') { |
666 if (bPrevNum && bNextNum) { | 666 if (bPrevNum && bNextNum) { |
667 iRotation = m_iRotation; | 667 iRotation = m_iRotation; |
668 if (m_bVertical && (pCur->m_dwCharProps & 0x8000) != 0) { | 668 if (m_bVertical && (pCur->m_dwCharProps & 0x8000) != 0) { |
669 iRotation = ((iRotation + 1) & 0x03); | 669 iRotation = ((iRotation + 1) & 0x03); |
670 } | 670 } |
671 wForm = wch == L'.' ? 0x066B : 0x066C; | 671 wForm = wch == L'.' ? 0x066B : 0x066C; |
672 iLineWidth -= pCur->m_iCharWidth; | 672 iLineWidth -= pCur->m_iCharWidth; |
673 if (m_bCombText) { | 673 if (m_bCombText) { |
674 iCharWidth = m_iCombWidth; | 674 iCharWidth = m_iCombWidth; |
675 } else { | 675 } else { |
676 if (m_bVertical != FX_IsOdd(iRotation)) { | 676 if (m_bVertical != FX_IsOdd(iRotation)) { |
677 iCharWidth = 1000; | 677 iCharWidth = 1000; |
678 } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { | 678 } else if (!m_pFont->GetCharWidth(wForm, iCharWidth, false)) { |
679 iCharWidth = m_iDefChar; | 679 iCharWidth = m_iDefChar; |
680 } | 680 } |
681 iCharWidth *= m_iFontSize; | 681 iCharWidth *= m_iFontSize; |
682 iCharWidth = iCharWidth * m_iHorScale / 100; | 682 iCharWidth = iCharWidth * m_iHorScale / 100; |
683 } | 683 } |
684 pCur->m_iCharWidth = iCharWidth; | 684 pCur->m_iCharWidth = iCharWidth; |
685 iLineWidth += iCharWidth; | 685 iLineWidth += iCharWidth; |
686 } | 686 } |
687 } | 687 } |
688 bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 688 bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
689 pCur = pNext; | 689 pCur = pNext; |
690 } while (i < iCount); | 690 } while (i < iCount); |
691 } | 691 } |
692 | 692 |
693 FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, | 693 bool CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, |
694 FX_BOOL bAllChars, | 694 bool bAllChars, |
695 uint32_t dwStatus) { | 695 uint32_t dwStatus) { |
696 int32_t iCount = m_pCurLine->CountChars(); | 696 int32_t iCount = m_pCurLine->CountChars(); |
697 FX_BOOL bDone = FALSE; | 697 bool bDone = false; |
698 CFX_Char* pTC; | 698 CFX_Char* pTC; |
699 if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { | 699 if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { |
700 pTC = m_pCurLine->GetCharPtr(iCount - 1); | 700 pTC = m_pCurLine->GetCharPtr(iCount - 1); |
701 switch (pTC->GetCharType()) { | 701 switch (pTC->GetCharType()) { |
702 case FX_CHARTYPE_Tab: | 702 case FX_CHARTYPE_Tab: |
703 case FX_CHARTYPE_Control: | 703 case FX_CHARTYPE_Control: |
704 break; | 704 break; |
705 case FX_CHARTYPE_Space: | 705 case FX_CHARTYPE_Space: |
706 if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { | 706 if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { |
707 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 707 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
708 bDone = TRUE; | 708 bDone = true; |
709 } | 709 } |
710 break; | 710 break; |
711 default: | 711 default: |
712 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 712 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
713 bDone = TRUE; | 713 bDone = true; |
714 break; | 714 break; |
715 } | 715 } |
716 } | 716 } |
717 iCount = m_pCurLine->CountChars(); | 717 iCount = m_pCurLine->CountChars(); |
718 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); | 718 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
719 CFX_TxtPiece tp; | 719 CFX_TxtPiece tp; |
720 if (m_bPagination) { | 720 if (m_bPagination) { |
721 tp.m_dwStatus = dwStatus; | 721 tp.m_dwStatus = dwStatus; |
722 tp.m_iStartPos = m_pCurLine->m_iStart; | 722 tp.m_iStartPos = m_pCurLine->m_iStart; |
723 tp.m_iWidth = m_pCurLine->m_iWidth; | 723 tp.m_iWidth = m_pCurLine->m_iWidth; |
724 tp.m_iStartChar = 0; | 724 tp.m_iStartChar = 0; |
725 tp.m_iChars = iCount; | 725 tp.m_iChars = iCount; |
726 tp.m_pChars = m_pCurLine->m_pLineChars.get(); | 726 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
727 tp.m_pUserData = m_pUserData; | 727 tp.m_pUserData = m_pUserData; |
728 pTC = m_pCurLine->GetCharPtr(0); | 728 pTC = m_pCurLine->GetCharPtr(0); |
729 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 729 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
730 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 730 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |
731 tp.m_iVerticalScale = pTC->m_iVertialScale; | 731 tp.m_iVerticalScale = pTC->m_iVertialScale; |
732 pCurPieces->Add(tp); | 732 pCurPieces->Add(tp); |
733 m_pCurLine = pNextLine; | 733 m_pCurLine = pNextLine; |
734 m_eCharType = FX_CHARTYPE_Unknown; | 734 m_eCharType = FX_CHARTYPE_Unknown; |
735 return TRUE; | 735 return true; |
736 } | 736 } |
737 if (bAllChars && !bDone) { | 737 if (bAllChars && !bDone) { |
738 int32_t iEndPos = m_pCurLine->m_iWidth; | 738 int32_t iEndPos = m_pCurLine->m_iWidth; |
739 GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, TRUE); | 739 GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, true); |
740 } | 740 } |
741 return FALSE; | 741 return false; |
742 } | 742 } |
743 | 743 |
744 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { | 744 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { |
745 CFX_TxtPiece tp; | 745 CFX_TxtPiece tp; |
746 FX_TPO tpo; | 746 FX_TPO tpo; |
747 CFX_TxtChar* pTC; | 747 CFX_TxtChar* pTC; |
748 int32_t i, j; | 748 int32_t i, j; |
749 CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars.get(); | 749 CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars.get(); |
750 int32_t iCount = m_pCurLine->CountChars(); | 750 int32_t iCount = m_pCurLine->CountChars(); |
751 FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); | 751 bool bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); |
752 if (!m_bPagination && bDone) { | 752 if (!m_bPagination && bDone) { |
753 int32_t iBidiNum = 0; | 753 int32_t iBidiNum = 0; |
754 for (i = 0; i < iCount; i++) { | 754 for (i = 0; i < iCount; i++) { |
755 pTC = chars.GetDataPtr(i); | 755 pTC = chars.GetDataPtr(i); |
756 pTC->m_iBidiPos = i; | 756 pTC->m_iBidiPos = i; |
757 if (pTC->GetCharType() != FX_CHARTYPE_Control) { | 757 if (pTC->GetCharType() != FX_CHARTYPE_Control) { |
758 iBidiNum = i; | 758 iBidiNum = i; |
759 } | 759 } |
760 if (i == 0) { | 760 if (i == 0) { |
761 pTC->m_iBidiLevel = 1; | 761 pTC->m_iBidiLevel = 1; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 844 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |
845 tp.m_iVerticalScale = pTC->m_iVertialScale; | 845 tp.m_iVerticalScale = pTC->m_iVertialScale; |
846 pCurPieces->Add(tp); | 846 pCurPieces->Add(tp); |
847 tpo.index = 0; | 847 tpo.index = 0; |
848 tpo.pos = 0; | 848 tpo.pos = 0; |
849 tpos.Add(tpo); | 849 tpos.Add(tpo); |
850 } | 850 } |
851 } | 851 } |
852 | 852 |
853 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos, | 853 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos, |
854 FX_BOOL bAllChars, | 854 bool bAllChars, |
855 uint32_t dwStatus) { | 855 uint32_t dwStatus) { |
856 int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; | 856 int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; |
857 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); | 857 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
858 int32_t i, j, iCount = pCurPieces->GetSize(); | 858 int32_t i, j, iCount = pCurPieces->GetSize(); |
859 FX_BOOL bFind = FALSE; | 859 bool bFind = false; |
860 FX_TPO tpo; | 860 FX_TPO tpo; |
861 CFX_TxtChar* pTC; | 861 CFX_TxtChar* pTC; |
862 FX_CHARTYPE chartype; | 862 FX_CHARTYPE chartype; |
863 for (i = iCount - 1; i > -1; i--) { | 863 for (i = iCount - 1; i > -1; i--) { |
864 tpo = tpos.GetAt(i); | 864 tpo = tpos.GetAt(i); |
865 CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); | 865 CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); |
866 if (!bFind) { | 866 if (!bFind) { |
867 iNetWidth = ttp.GetEndPos(); | 867 iNetWidth = ttp.GetEndPos(); |
868 } | 868 } |
869 FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel); | 869 bool bArabic = FX_IsOdd(ttp.m_iBidiLevel); |
870 j = bArabic ? 0 : ttp.m_iChars - 1; | 870 j = bArabic ? 0 : ttp.m_iChars - 1; |
871 while (j > -1 && j < ttp.m_iChars) { | 871 while (j > -1 && j < ttp.m_iChars) { |
872 pTC = ttp.GetCharPtr(j); | 872 pTC = ttp.GetCharPtr(j); |
873 if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) { | 873 if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) { |
874 iGapChars++; | 874 iGapChars++; |
875 } | 875 } |
876 if (!bFind || !bAllChars) { | 876 if (!bFind || !bAllChars) { |
877 chartype = pTC->GetCharType(); | 877 chartype = pTC->GetCharType(); |
878 if (chartype == FX_CHARTYPE_Space || chartype == FX_CHARTYPE_Control) { | 878 if (chartype == FX_CHARTYPE_Space || chartype == FX_CHARTYPE_Control) { |
879 if (!bFind) { | 879 if (!bFind) { |
880 iCharWidth = pTC->m_iCharWidth; | 880 iCharWidth = pTC->m_iCharWidth; |
881 if (bAllChars && iCharWidth > 0) { | 881 if (bAllChars && iCharWidth > 0) { |
882 iNetWidth -= iCharWidth; | 882 iNetWidth -= iCharWidth; |
883 } | 883 } |
884 } | 884 } |
885 } else { | 885 } else { |
886 bFind = TRUE; | 886 bFind = true; |
887 if (!bAllChars) { | 887 if (!bAllChars) { |
888 break; | 888 break; |
889 } | 889 } |
890 } | 890 } |
891 } | 891 } |
892 j += bArabic ? 1 : -1; | 892 j += bArabic ? 1 : -1; |
893 } | 893 } |
894 if (!bAllChars && bFind) { | 894 if (!bAllChars && bFind) { |
895 break; | 895 break; |
896 } | 896 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 int32_t iCount = pCurPieces->GetSize(); | 947 int32_t iCount = pCurPieces->GetSize(); |
948 if (iCount > 0) { | 948 if (iCount > 0) { |
949 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); | 949 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); |
950 if (dwStatus > FX_TXTBREAK_PieceBreak) { | 950 if (dwStatus > FX_TXTBREAK_PieceBreak) { |
951 pLastPiece->m_dwStatus = dwStatus; | 951 pLastPiece->m_dwStatus = dwStatus; |
952 } else { | 952 } else { |
953 dwStatus = pLastPiece->m_dwStatus; | 953 dwStatus = pLastPiece->m_dwStatus; |
954 } | 954 } |
955 return dwStatus; | 955 return dwStatus; |
956 } else { | 956 } else { |
957 CFX_TxtLine* pLastLine = GetTxtLine(TRUE); | 957 CFX_TxtLine* pLastLine = GetTxtLine(true); |
958 if (pLastLine) { | 958 if (pLastLine) { |
959 pCurPieces = pLastLine->m_pLinePieces.get(); | 959 pCurPieces = pLastLine->m_pLinePieces.get(); |
960 iCount = pCurPieces->GetSize(); | 960 iCount = pCurPieces->GetSize(); |
961 if (iCount-- > 0) { | 961 if (iCount-- > 0) { |
962 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); | 962 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); |
963 if (dwStatus > FX_TXTBREAK_PieceBreak) { | 963 if (dwStatus > FX_TXTBREAK_PieceBreak) { |
964 pLastPiece->m_dwStatus = dwStatus; | 964 pLastPiece->m_dwStatus = dwStatus; |
965 } else { | 965 } else { |
966 dwStatus = pLastPiece->m_dwStatus; | 966 dwStatus = pLastPiece->m_dwStatus; |
967 } | 967 } |
968 return dwStatus; | 968 return dwStatus; |
969 } | 969 } |
970 return FX_TXTBREAK_None; | 970 return FX_TXTBREAK_None; |
971 } | 971 } |
972 iCount = m_pCurLine->CountChars(); | 972 iCount = m_pCurLine->CountChars(); |
973 if (iCount < 1) { | 973 if (iCount < 1) { |
974 return FX_TXTBREAK_None; | 974 return FX_TXTBREAK_None; |
975 } | 975 } |
976 if (!m_bPagination) { | 976 if (!m_bPagination) { |
977 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); | 977 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); |
978 pTC->m_dwStatus = dwStatus; | 978 pTC->m_dwStatus = dwStatus; |
979 } | 979 } |
980 if (dwStatus <= FX_TXTBREAK_PieceBreak) { | 980 if (dwStatus <= FX_TXTBREAK_PieceBreak) { |
981 return dwStatus; | 981 return dwStatus; |
982 } | 982 } |
983 } | 983 } |
984 m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2; | 984 m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2; |
985 CFX_TxtLine* pNextLine = | 985 CFX_TxtLine* pNextLine = |
986 (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get(); | 986 (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get(); |
987 FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); | 987 bool bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); |
988 CFX_TPOArray tpos(100); | 988 CFX_TPOArray tpos(100); |
989 CFX_Char* pTC; | 989 CFX_Char* pTC; |
990 if (m_bArabicShapes) { | 990 if (m_bArabicShapes) { |
991 EndBreak_UpdateArabicShapes(); | 991 EndBreak_UpdateArabicShapes(); |
992 } | 992 } |
993 if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { | 993 if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { |
994 goto EndBreak_Ret; | 994 goto EndBreak_Ret; |
995 } | 995 } |
996 EndBreak_BidiLine(tpos, dwStatus); | 996 EndBreak_BidiLine(tpos, dwStatus); |
997 if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { | 997 if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { |
998 EndBreak_Alignment(tpos, bAllChars, dwStatus); | 998 EndBreak_Alignment(tpos, bAllChars, dwStatus); |
999 } | 999 } |
1000 EndBreak_Ret: | 1000 EndBreak_Ret: |
1001 m_pCurLine = pNextLine; | 1001 m_pCurLine = pNextLine; |
1002 pTC = GetLastChar(0, FALSE); | 1002 pTC = GetLastChar(0, false); |
1003 m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; | 1003 m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; |
1004 if (dwStatus == FX_TXTBREAK_ParagraphBreak) { | 1004 if (dwStatus == FX_TXTBREAK_ParagraphBreak) { |
1005 m_iArabicContext = m_iCurArabicContext = 1; | 1005 m_iArabicContext = m_iCurArabicContext = 1; |
1006 ResetArabicContext(); | 1006 ResetArabicContext(); |
1007 } | 1007 } |
1008 return dwStatus; | 1008 return dwStatus; |
1009 } | 1009 } |
1010 | 1010 |
1011 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca, | 1011 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca, |
1012 int32_t& iEndPos, | 1012 int32_t& iEndPos, |
1013 FX_BOOL bAllChars, | 1013 bool bAllChars, |
1014 FX_BOOL bOnlyBrk) { | 1014 bool bOnlyBrk) { |
1015 int32_t iLength = ca.GetSize() - 1; | 1015 int32_t iLength = ca.GetSize() - 1; |
1016 if (iLength < 1) { | 1016 if (iLength < 1) { |
1017 return iLength; | 1017 return iLength; |
1018 } | 1018 } |
1019 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, | 1019 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, |
1020 iLast = -1, iLastPos = -1; | 1020 iLast = -1, iLastPos = -1; |
1021 if (m_bSingleLine || iEndPos <= m_iLineWidth) { | 1021 if (m_bSingleLine || iEndPos <= m_iLineWidth) { |
1022 if (!bAllChars) { | 1022 if (!bAllChars) { |
1023 return iLength; | 1023 return iLength; |
1024 } | 1024 } |
1025 iBreak = iLength; | 1025 iBreak = iLength; |
1026 iBreakPos = iEndPos; | 1026 iBreakPos = iEndPos; |
1027 } | 1027 } |
1028 FX_BOOL bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0; | 1028 bool bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0; |
1029 FX_BOOL bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0; | 1029 bool bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0; |
1030 FX_LINEBREAKTYPE eType; | 1030 FX_LINEBREAKTYPE eType; |
1031 uint32_t nCodeProp, nCur, nNext; | 1031 uint32_t nCodeProp, nCur, nNext; |
1032 CFX_Char* pCur = ca.GetDataPtr(iLength--); | 1032 CFX_Char* pCur = ca.GetDataPtr(iLength--); |
1033 if (bAllChars) { | 1033 if (bAllChars) { |
1034 pCur->m_nBreakType = FX_LBT_UNKNOWN; | 1034 pCur->m_nBreakType = FX_LBT_UNKNOWN; |
1035 } | 1035 } |
1036 nCodeProp = pCur->m_dwCharProps; | 1036 nCodeProp = pCur->m_dwCharProps; |
1037 nNext = nCodeProp & 0x003F; | 1037 nNext = nCodeProp & 0x003F; |
1038 int32_t iCharWidth = pCur->m_iCharWidth; | 1038 int32_t iCharWidth = pCur->m_iCharWidth; |
1039 if (iCharWidth > 0) { | 1039 if (iCharWidth > 0) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 } | 1100 } |
1101 if (iLast > -1) { | 1101 if (iLast > -1) { |
1102 iEndPos = iLastPos; | 1102 iEndPos = iLastPos; |
1103 return iLast; | 1103 return iLast; |
1104 } | 1104 } |
1105 return 0; | 1105 return 0; |
1106 } | 1106 } |
1107 | 1107 |
1108 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, | 1108 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, |
1109 CFX_TxtLine* pNextLine, | 1109 CFX_TxtLine* pNextLine, |
1110 FX_BOOL bAllChars) { | 1110 bool bAllChars) { |
1111 ASSERT(pCurLine && pNextLine); | 1111 ASSERT(pCurLine && pNextLine); |
1112 int32_t iCount = pCurLine->CountChars(); | 1112 int32_t iCount = pCurLine->CountChars(); |
1113 if (iCount < 2) { | 1113 if (iCount < 2) { |
1114 return; | 1114 return; |
1115 } | 1115 } |
1116 int32_t iEndPos = pCurLine->m_iWidth; | 1116 int32_t iEndPos = pCurLine->m_iWidth; |
1117 CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars.get(); | 1117 CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars.get(); |
1118 int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); | 1118 int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false); |
1119 if (iCharPos < 0) { | 1119 if (iCharPos < 0) { |
1120 iCharPos = 0; | 1120 iCharPos = 0; |
1121 } | 1121 } |
1122 iCharPos++; | 1122 iCharPos++; |
1123 if (iCharPos >= iCount) { | 1123 if (iCharPos >= iCount) { |
1124 pNextLine->RemoveAll(TRUE); | 1124 pNextLine->RemoveAll(true); |
1125 CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); | 1125 CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); |
1126 pTC->m_nBreakType = FX_LBT_UNKNOWN; | 1126 pTC->m_nBreakType = FX_LBT_UNKNOWN; |
1127 return; | 1127 return; |
1128 } | 1128 } |
1129 CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars.get(); | 1129 CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars.get(); |
1130 int cur_size = curChars.GetSize(); | 1130 int cur_size = curChars.GetSize(); |
1131 nextChars.SetSize(cur_size - iCharPos); | 1131 nextChars.SetSize(cur_size - iCharPos); |
1132 FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), | 1132 FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), |
1133 (cur_size - iCharPos) * sizeof(CFX_TxtChar)); | 1133 (cur_size - iCharPos) * sizeof(CFX_TxtChar)); |
1134 iCount -= iCharPos; | 1134 iCount -= iCharPos; |
(...skipping 16 matching lines...) Expand all Loading... |
1151 } | 1151 } |
1152 if (m_bPagination) { | 1152 if (m_bPagination) { |
1153 continue; | 1153 continue; |
1154 } | 1154 } |
1155 pTC->m_dwStatus = 0; | 1155 pTC->m_dwStatus = 0; |
1156 } | 1156 } |
1157 pNextLine->m_iWidth = iWidth; | 1157 pNextLine->m_iWidth = iWidth; |
1158 } | 1158 } |
1159 | 1159 |
1160 int32_t CFX_TxtBreak::CountBreakChars() const { | 1160 int32_t CFX_TxtBreak::CountBreakChars() const { |
1161 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); | 1161 CFX_TxtLine* pTxtLine = GetTxtLine(true); |
1162 return pTxtLine ? pTxtLine->CountChars() : 0; | 1162 return pTxtLine ? pTxtLine->CountChars() : 0; |
1163 } | 1163 } |
1164 | 1164 |
1165 int32_t CFX_TxtBreak::CountBreakPieces() const { | 1165 int32_t CFX_TxtBreak::CountBreakPieces() const { |
1166 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); | 1166 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(true); |
1167 return pTxtPieces ? pTxtPieces->GetSize() : 0; | 1167 return pTxtPieces ? pTxtPieces->GetSize() : 0; |
1168 } | 1168 } |
1169 | 1169 |
1170 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { | 1170 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { |
1171 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); | 1171 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(true); |
1172 if (!pTxtPieces) { | 1172 if (!pTxtPieces) { |
1173 return nullptr; | 1173 return nullptr; |
1174 } | 1174 } |
1175 if (index < 0 || index >= pTxtPieces->GetSize()) { | 1175 if (index < 0 || index >= pTxtPieces->GetSize()) { |
1176 return nullptr; | 1176 return nullptr; |
1177 } | 1177 } |
1178 return pTxtPieces->GetPtrAt(index); | 1178 return pTxtPieces->GetPtrAt(index); |
1179 } | 1179 } |
1180 | 1180 |
1181 void CFX_TxtBreak::ClearBreakPieces() { | 1181 void CFX_TxtBreak::ClearBreakPieces() { |
1182 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); | 1182 CFX_TxtLine* pTxtLine = GetTxtLine(true); |
1183 if (pTxtLine) { | 1183 if (pTxtLine) { |
1184 pTxtLine->RemoveAll(TRUE); | 1184 pTxtLine->RemoveAll(true); |
1185 } | 1185 } |
1186 m_iReady = 0; | 1186 m_iReady = 0; |
1187 } | 1187 } |
1188 | 1188 |
1189 void CFX_TxtBreak::Reset() { | 1189 void CFX_TxtBreak::Reset() { |
1190 m_eCharType = FX_CHARTYPE_Unknown; | 1190 m_eCharType = FX_CHARTYPE_Unknown; |
1191 m_iArabicContext = m_iCurArabicContext = 1; | 1191 m_iArabicContext = m_iCurArabicContext = 1; |
1192 ResetArabicContext(); | 1192 ResetArabicContext(); |
1193 m_pTxtLine1->RemoveAll(TRUE); | 1193 m_pTxtLine1->RemoveAll(true); |
1194 m_pTxtLine2->RemoveAll(TRUE); | 1194 m_pTxtLine2->RemoveAll(true); |
1195 } | 1195 } |
1196 | 1196 |
1197 struct FX_FORMCHAR { | 1197 struct FX_FORMCHAR { |
1198 uint16_t wch; | 1198 uint16_t wch; |
1199 uint16_t wForm; | 1199 uint16_t wForm; |
1200 int32_t iWidth; | 1200 int32_t iWidth; |
1201 }; | 1201 }; |
1202 | 1202 |
1203 int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun, | 1203 int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun, |
1204 FXTEXT_CHARPOS* pCharPos, | 1204 FXTEXT_CHARPOS* pCharPos, |
1205 FX_BOOL bCharCode, | 1205 bool bCharCode, |
1206 CFX_WideString* pWSForms, | 1206 CFX_WideString* pWSForms, |
1207 FX_AdjustCharDisplayPos pAdjustPos) const { | 1207 FX_AdjustCharDisplayPos pAdjustPos) const { |
1208 if (!pTxtRun || pTxtRun->iLength < 1) { | 1208 if (!pTxtRun || pTxtRun->iLength < 1) { |
1209 return 0; | 1209 return 0; |
1210 } | 1210 } |
1211 IFX_TxtAccess* pAccess = pTxtRun->pAccess; | 1211 IFX_TxtAccess* pAccess = pTxtRun->pAccess; |
1212 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; | 1212 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; |
1213 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); | 1213 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); |
1214 int32_t* pWidths = pTxtRun->pWidths; | 1214 int32_t* pWidths = pTxtRun->pWidths; |
1215 int32_t iLength = pTxtRun->iLength - 1; | 1215 int32_t iLength = pTxtRun->iLength - 1; |
1216 CFGAS_GEFont* pFont = pTxtRun->pFont; | 1216 CFGAS_GEFont* pFont = pTxtRun->pFont; |
1217 uint32_t dwStyles = pTxtRun->dwStyles; | 1217 uint32_t dwStyles = pTxtRun->dwStyles; |
1218 CFX_RectF rtText(*pTxtRun->pRect); | 1218 CFX_RectF rtText(*pTxtRun->pRect); |
1219 FX_BOOL bRTLPiece = | 1219 bool bRTLPiece = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; |
1220 (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; | 1220 bool bArabicNumber = |
1221 FX_BOOL bArabicNumber = | |
1222 (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; | 1221 (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; |
1223 FX_BOOL bArabicComma = | 1222 bool bArabicComma = |
1224 (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; | 1223 (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; |
1225 FX_FLOAT fFontSize = pTxtRun->fFontSize; | 1224 FX_FLOAT fFontSize = pTxtRun->fFontSize; |
1226 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 1225 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |
1227 int32_t iAscent = pFont->GetAscent(); | 1226 int32_t iAscent = pFont->GetAscent(); |
1228 int32_t iDescent = pFont->GetDescent(); | 1227 int32_t iDescent = pFont->GetDescent(); |
1229 int32_t iMaxHeight = iAscent - iDescent; | 1228 int32_t iMaxHeight = iAscent - iDescent; |
1230 FX_FLOAT fFontHeight = fFontSize; | 1229 FX_FLOAT fFontHeight = fFontSize; |
1231 FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; | 1230 FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; |
1232 FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; | 1231 FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; |
1233 FX_BOOL bVerticalDoc = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; | 1232 bool bVerticalDoc = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; |
1234 FX_BOOL bVerticalChar = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; | 1233 bool bVerticalChar = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; |
1235 int32_t iRotation = GetLineRotation(dwStyles) + pTxtRun->iCharRotation; | 1234 int32_t iRotation = GetLineRotation(dwStyles) + pTxtRun->iCharRotation; |
1236 FX_FLOAT fX, fY, fCharWidth, fCharHeight; | 1235 FX_FLOAT fX, fY, fCharWidth, fCharHeight; |
1237 int32_t iHorScale = pTxtRun->iHorizontalScale; | 1236 int32_t iHorScale = pTxtRun->iHorizontalScale; |
1238 int32_t iVerScale = pTxtRun->iVerticalScale; | 1237 int32_t iVerScale = pTxtRun->iVerticalScale; |
1239 FX_BOOL bSkipSpace = pTxtRun->bSkipSpace; | 1238 bool bSkipSpace = pTxtRun->bSkipSpace; |
1240 FX_FORMCHAR formChars[3]; | 1239 FX_FORMCHAR formChars[3]; |
1241 FX_FLOAT fYBase; | 1240 FX_FLOAT fYBase; |
1242 fX = rtText.left; | 1241 fX = rtText.left; |
1243 if (bVerticalDoc) { | 1242 if (bVerticalDoc) { |
1244 fX += (rtText.width - fFontSize) / 2.0f; | 1243 fX += (rtText.width - fFontSize) / 2.0f; |
1245 fYBase = bRTLPiece ? rtText.bottom() : rtText.top; | 1244 fYBase = bRTLPiece ? rtText.bottom() : rtText.top; |
1246 fY = fYBase; | 1245 fY = fYBase; |
1247 } else { | 1246 } else { |
1248 if (bRTLPiece) { | 1247 if (bRTLPiece) { |
1249 fX = rtText.right(); | 1248 fX = rtText.right(); |
1250 } | 1249 } |
1251 fYBase = rtText.top + (rtText.height - fFontSize) / 2.0f; | 1250 fYBase = rtText.top + (rtText.height - fFontSize) / 2.0f; |
1252 fY = fYBase + fAscent; | 1251 fY = fYBase + fAscent; |
1253 } | 1252 } |
1254 int32_t iCount = 0; | 1253 int32_t iCount = 0; |
1255 int32_t iNext = 0; | 1254 int32_t iNext = 0; |
1256 FX_WCHAR wPrev = 0xFEFF; | 1255 FX_WCHAR wPrev = 0xFEFF; |
1257 FX_WCHAR wNext = 0xFEFF; | 1256 FX_WCHAR wNext = 0xFEFF; |
1258 FX_WCHAR wForm = 0xFEFF; | 1257 FX_WCHAR wForm = 0xFEFF; |
1259 FX_WCHAR wLast = 0xFEFF; | 1258 FX_WCHAR wLast = 0xFEFF; |
1260 FX_BOOL bShadda = FALSE; | 1259 bool bShadda = false; |
1261 FX_BOOL bLam = FALSE; | 1260 bool bLam = false; |
1262 for (int32_t i = 0; i <= iLength; i++) { | 1261 for (int32_t i = 0; i <= iLength; i++) { |
1263 int32_t iWidth; | 1262 int32_t iWidth; |
1264 FX_WCHAR wch; | 1263 FX_WCHAR wch; |
1265 if (pAccess) { | 1264 if (pAccess) { |
1266 wch = pAccess->GetChar(pIdentity, i); | 1265 wch = pAccess->GetChar(pIdentity, i); |
1267 iWidth = pAccess->GetWidth(pIdentity, i); | 1266 iWidth = pAccess->GetWidth(pIdentity, i); |
1268 } else { | 1267 } else { |
1269 wch = *pStr++; | 1268 wch = *pStr++; |
1270 iWidth = *pWidths++; | 1269 iWidth = *pWidths++; |
1271 } | 1270 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1308 } else { | 1307 } else { |
1309 wNext = 0xFEFF; | 1308 wNext = 0xFEFF; |
1310 } | 1309 } |
1311 wForm = pdfium::arabic::GetFormChar(wch, wPrev, wNext); | 1310 wForm = pdfium::arabic::GetFormChar(wch, wPrev, wNext); |
1312 bLam = (wPrev == 0x0644 && wch == 0x0644 && wNext == 0x0647); | 1311 bLam = (wPrev == 0x0644 && wch == 0x0644 && wNext == 0x0647); |
1313 } else if (chartype == FX_CHARTYPE_Combination) { | 1312 } else if (chartype == FX_CHARTYPE_Combination) { |
1314 wForm = wch; | 1313 wForm = wch; |
1315 if (wch >= 0x064C && wch <= 0x0651) { | 1314 if (wch >= 0x064C && wch <= 0x0651) { |
1316 if (bShadda) { | 1315 if (bShadda) { |
1317 wForm = 0xFEFF; | 1316 wForm = 0xFEFF; |
1318 bShadda = FALSE; | 1317 bShadda = false; |
1319 } else { | 1318 } else { |
1320 wNext = 0xFEFF; | 1319 wNext = 0xFEFF; |
1321 if (pAccess) { | 1320 if (pAccess) { |
1322 iNext = i + 1; | 1321 iNext = i + 1; |
1323 if (iNext <= iLength) { | 1322 if (iNext <= iLength) { |
1324 wNext = pAccess->GetChar(pIdentity, iNext); | 1323 wNext = pAccess->GetChar(pIdentity, iNext); |
1325 } | 1324 } |
1326 } else { | 1325 } else { |
1327 if (i < iLength) { | 1326 if (i < iLength) { |
1328 wNext = *pStr; | 1327 wNext = *pStr; |
1329 } | 1328 } |
1330 } | 1329 } |
1331 if (wch == 0x0651) { | 1330 if (wch == 0x0651) { |
1332 if (wNext >= 0x064C && wNext <= 0x0650) { | 1331 if (wNext >= 0x064C && wNext <= 0x0650) { |
1333 wForm = FX_GetArabicFromShaddaTable(wNext); | 1332 wForm = FX_GetArabicFromShaddaTable(wNext); |
1334 bShadda = TRUE; | 1333 bShadda = true; |
1335 } | 1334 } |
1336 } else { | 1335 } else { |
1337 if (wNext == 0x0651) { | 1336 if (wNext == 0x0651) { |
1338 wForm = FX_GetArabicFromShaddaTable(wch); | 1337 wForm = FX_GetArabicFromShaddaTable(wch); |
1339 bShadda = TRUE; | 1338 bShadda = true; |
1340 } | 1339 } |
1341 } | 1340 } |
1342 } | 1341 } |
1343 } else { | 1342 } else { |
1344 bShadda = FALSE; | 1343 bShadda = false; |
1345 } | 1344 } |
1346 } else if (chartype == FX_CHARTYPE_Numeric) { | 1345 } else if (chartype == FX_CHARTYPE_Numeric) { |
1347 wForm = wch; | 1346 wForm = wch; |
1348 if (bArabicNumber) { | 1347 if (bArabicNumber) { |
1349 wForm += 0x0630; | 1348 wForm += 0x0630; |
1350 } | 1349 } |
1351 } else if (wch == L'.') { | 1350 } else if (wch == L'.') { |
1352 wForm = wch; | 1351 wForm = wch; |
1353 if (bArabicNumber) { | 1352 if (bArabicNumber) { |
1354 wNext = 0xFEFF; | 1353 wNext = 0xFEFF; |
(...skipping 15 matching lines...) Expand all Loading... |
1370 wForm = wch; | 1369 wForm = wch; |
1371 if (bArabicComma) { | 1370 if (bArabicComma) { |
1372 wForm = 0x060C; | 1371 wForm = 0x060C; |
1373 } | 1372 } |
1374 } else if (bRTLPiece || bVerticalChar) { | 1373 } else if (bRTLPiece || bVerticalChar) { |
1375 wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar); | 1374 wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar); |
1376 } else { | 1375 } else { |
1377 wForm = wch; | 1376 wForm = wch; |
1378 } | 1377 } |
1379 if (chartype != FX_CHARTYPE_Combination) { | 1378 if (chartype != FX_CHARTYPE_Combination) { |
1380 bShadda = FALSE; | 1379 bShadda = false; |
1381 } | 1380 } |
1382 if (chartype < FX_CHARTYPE_ArabicAlef) { | 1381 if (chartype < FX_CHARTYPE_ArabicAlef) { |
1383 bLam = FALSE; | 1382 bLam = false; |
1384 } | 1383 } |
1385 dwProps = FX_GetUnicodeProperties(wForm); | 1384 dwProps = FX_GetUnicodeProperties(wForm); |
1386 int32_t iCharRotation = iRotation; | 1385 int32_t iCharRotation = iRotation; |
1387 if (bVerticalChar && (dwProps & 0x8000) != 0) { | 1386 if (bVerticalChar && (dwProps & 0x8000) != 0) { |
1388 iCharRotation++; | 1387 iCharRotation++; |
1389 } | 1388 } |
1390 iCharRotation %= 4; | 1389 iCharRotation %= 4; |
1391 FX_BOOL bEmptyChar = | 1390 bool bEmptyChar = |
1392 (chartype >= FX_CHARTYPE_Tab && chartype <= FX_CHARTYPE_Control); | 1391 (chartype >= FX_CHARTYPE_Tab && chartype <= FX_CHARTYPE_Control); |
1393 if (wForm == 0xFEFF) { | 1392 if (wForm == 0xFEFF) { |
1394 bEmptyChar = TRUE; | 1393 bEmptyChar = true; |
1395 } | 1394 } |
1396 int32_t iForms = bLam ? 3 : 1; | 1395 int32_t iForms = bLam ? 3 : 1; |
1397 iCount += (bEmptyChar && bSkipSpace) ? 0 : iForms; | 1396 iCount += (bEmptyChar && bSkipSpace) ? 0 : iForms; |
1398 if (!pCharPos) { | 1397 if (!pCharPos) { |
1399 if (iWidth > 0) { | 1398 if (iWidth > 0) { |
1400 wPrev = wch; | 1399 wPrev = wch; |
1401 } | 1400 } |
1402 wLast = wch; | 1401 wLast = wch; |
1403 continue; | 1402 continue; |
1404 } | 1403 } |
1405 int32_t iCharWidth = iWidth; | 1404 int32_t iCharWidth = iWidth; |
1406 if (iCharWidth < 0) { | 1405 if (iCharWidth < 0) { |
1407 iCharWidth = -iCharWidth; | 1406 iCharWidth = -iCharWidth; |
1408 } | 1407 } |
1409 iCharWidth /= iFontSize; | 1408 iCharWidth /= iFontSize; |
1410 formChars[0].wch = wch; | 1409 formChars[0].wch = wch; |
1411 formChars[0].wForm = wForm; | 1410 formChars[0].wForm = wForm; |
1412 formChars[0].iWidth = iCharWidth; | 1411 formChars[0].iWidth = iCharWidth; |
1413 if (bLam) { | 1412 if (bLam) { |
1414 formChars[1].wForm = 0x0651; | 1413 formChars[1].wForm = 0x0651; |
1415 iCharWidth = 0; | 1414 iCharWidth = 0; |
1416 pFont->GetCharWidth(0x0651, iCharWidth, FALSE); | 1415 pFont->GetCharWidth(0x0651, iCharWidth, false); |
1417 formChars[1].iWidth = iCharWidth; | 1416 formChars[1].iWidth = iCharWidth; |
1418 formChars[2].wForm = 0x0670; | 1417 formChars[2].wForm = 0x0670; |
1419 iCharWidth = 0; | 1418 iCharWidth = 0; |
1420 pFont->GetCharWidth(0x0670, iCharWidth, FALSE); | 1419 pFont->GetCharWidth(0x0670, iCharWidth, false); |
1421 formChars[2].iWidth = iCharWidth; | 1420 formChars[2].iWidth = iCharWidth; |
1422 } | 1421 } |
1423 for (int32_t j = 0; j < iForms; j++) { | 1422 for (int32_t j = 0; j < iForms; j++) { |
1424 wForm = (FX_WCHAR)formChars[j].wForm; | 1423 wForm = (FX_WCHAR)formChars[j].wForm; |
1425 iCharWidth = formChars[j].iWidth; | 1424 iCharWidth = formChars[j].iWidth; |
1426 if (j > 0) { | 1425 if (j > 0) { |
1427 chartype = FX_CHARTYPE_Combination; | 1426 chartype = FX_CHARTYPE_Combination; |
1428 wch = wForm; | 1427 wch = wForm; |
1429 wLast = (FX_WCHAR)formChars[j - 1].wForm; | 1428 wLast = (FX_WCHAR)formChars[j - 1].wForm; |
1430 } | 1429 } |
1431 if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { | 1430 if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { |
1432 pCharPos->m_GlyphIndex = | 1431 pCharPos->m_GlyphIndex = |
1433 bCharCode ? wch : pFont->GetGlyphIndex(wForm, FALSE); | 1432 bCharCode ? wch : pFont->GetGlyphIndex(wForm, false); |
1434 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 1433 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
1435 pCharPos->m_ExtGID = pCharPos->m_GlyphIndex; | 1434 pCharPos->m_ExtGID = pCharPos->m_GlyphIndex; |
1436 #endif | 1435 #endif |
1437 pCharPos->m_FontCharWidth = iCharWidth; | 1436 pCharPos->m_FontCharWidth = iCharWidth; |
1438 if (pWSForms) { | 1437 if (pWSForms) { |
1439 *pWSForms += wForm; | 1438 *pWSForms += wForm; |
1440 } | 1439 } |
1441 } | 1440 } |
1442 int32_t iCharHeight; | 1441 int32_t iCharHeight; |
1443 if (bVerticalDoc) { | 1442 if (bVerticalDoc) { |
1444 iCharHeight = iCharWidth; | 1443 iCharHeight = iCharWidth; |
1445 iCharWidth = 1000; | 1444 iCharWidth = 1000; |
1446 } else { | 1445 } else { |
1447 iCharHeight = 1000; | 1446 iCharHeight = 1000; |
1448 } | 1447 } |
1449 fCharWidth = fFontSize * iCharWidth / 1000.0f; | 1448 fCharWidth = fFontSize * iCharWidth / 1000.0f; |
1450 fCharHeight = fFontSize * iCharHeight / 1000.0f; | 1449 fCharHeight = fFontSize * iCharHeight / 1000.0f; |
1451 if (bRTLPiece && chartype != FX_CHARTYPE_Combination) { | 1450 if (bRTLPiece && chartype != FX_CHARTYPE_Combination) { |
1452 if (bVerticalDoc) { | 1451 if (bVerticalDoc) { |
1453 fY -= fCharHeight; | 1452 fY -= fCharHeight; |
1454 } else { | 1453 } else { |
1455 fX -= fCharWidth; | 1454 fX -= fCharWidth; |
1456 } | 1455 } |
1457 } | 1456 } |
1458 if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { | 1457 if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { |
1459 pCharPos->m_OriginX = fX; | 1458 pCharPos->m_OriginX = fX; |
1460 pCharPos->m_OriginY = fY; | 1459 pCharPos->m_OriginY = fY; |
1461 if ((dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0) { | 1460 if ((dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0) { |
1462 int32_t iFormWidth = iCharWidth; | 1461 int32_t iFormWidth = iCharWidth; |
1463 pFont->GetCharWidth(wForm, iFormWidth, FALSE); | 1462 pFont->GetCharWidth(wForm, iFormWidth, false); |
1464 FX_FLOAT fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f; | 1463 FX_FLOAT fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f; |
1465 if (bVerticalDoc) { | 1464 if (bVerticalDoc) { |
1466 pCharPos->m_OriginY += fOffset; | 1465 pCharPos->m_OriginY += fOffset; |
1467 } else { | 1466 } else { |
1468 pCharPos->m_OriginX += fOffset; | 1467 pCharPos->m_OriginX += fOffset; |
1469 } | 1468 } |
1470 } | 1469 } |
1471 if (chartype == FX_CHARTYPE_Combination) { | 1470 if (chartype == FX_CHARTYPE_Combination) { |
1472 CFX_Rect rtBBox; | 1471 CFX_Rect rtBBox; |
1473 rtBBox.Reset(); | 1472 rtBBox.Reset(); |
1474 if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) { | 1473 if (pFont->GetCharBBox(wForm, rtBBox, false)) { |
1475 pCharPos->m_OriginY = | 1474 pCharPos->m_OriginY = |
1476 fYBase + fFontSize - | 1475 fYBase + fFontSize - |
1477 fFontSize * (FX_FLOAT)rtBBox.height / (FX_FLOAT)iMaxHeight; | 1476 fFontSize * (FX_FLOAT)rtBBox.height / (FX_FLOAT)iMaxHeight; |
1478 } | 1477 } |
1479 if (wForm == wch && wLast != 0xFEFF) { | 1478 if (wForm == wch && wLast != 0xFEFF) { |
1480 uint32_t dwLastProps = FX_GetUnicodeProperties(wLast); | 1479 uint32_t dwLastProps = FX_GetUnicodeProperties(wLast); |
1481 if ((dwLastProps & FX_CHARTYPEBITSMASK) == | 1480 if ((dwLastProps & FX_CHARTYPEBITSMASK) == |
1482 FX_CHARTYPE_Combination) { | 1481 FX_CHARTYPE_Combination) { |
1483 CFX_Rect rtBox; | 1482 CFX_Rect rtBox; |
1484 rtBox.Reset(); | 1483 rtBox.Reset(); |
1485 if (pFont->GetCharBBox(wLast, rtBox, FALSE)) { | 1484 if (pFont->GetCharBBox(wLast, rtBox, false)) { |
1486 pCharPos->m_OriginY -= fFontSize * rtBox.height / iMaxHeight; | 1485 pCharPos->m_OriginY -= fFontSize * rtBox.height / iMaxHeight; |
1487 } | 1486 } |
1488 } | 1487 } |
1489 } | 1488 } |
1490 } | 1489 } |
1491 CFX_PointF ptOffset; | 1490 CFX_PointF ptOffset; |
1492 FX_BOOL bAdjusted = FALSE; | 1491 bool bAdjusted = false; |
1493 if (pAdjustPos) { | 1492 if (pAdjustPos) { |
1494 bAdjusted = pAdjustPos(wForm, bCharCode, pFont, fFontSize, | 1493 bAdjusted = pAdjustPos(wForm, bCharCode, pFont, fFontSize, |
1495 bVerticalChar, ptOffset); | 1494 bVerticalChar, ptOffset); |
1496 } | 1495 } |
1497 if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) { | 1496 if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) { |
1498 CFX_Rect rtBBox; | 1497 CFX_Rect rtBBox; |
1499 rtBBox.Reset(); | 1498 rtBBox.Reset(); |
1500 if (pFont->GetCharBBox(wForm, rtBBox, FALSE)) { | 1499 if (pFont->GetCharBBox(wForm, rtBBox, false)) { |
1501 ptOffset.x = fFontSize * (850 - rtBBox.right()) / iMaxHeight; | 1500 ptOffset.x = fFontSize * (850 - rtBBox.right()) / iMaxHeight; |
1502 ptOffset.y = fFontSize * (iAscent - rtBBox.top - 150) / iMaxHeight; | 1501 ptOffset.y = fFontSize * (iAscent - rtBBox.top - 150) / iMaxHeight; |
1503 } | 1502 } |
1504 } | 1503 } |
1505 pCharPos->m_OriginX += ptOffset.x; | 1504 pCharPos->m_OriginX += ptOffset.x; |
1506 pCharPos->m_OriginY -= ptOffset.y; | 1505 pCharPos->m_OriginY -= ptOffset.y; |
1507 } | 1506 } |
1508 if (!bRTLPiece && chartype != FX_CHARTYPE_Combination) { | 1507 if (!bRTLPiece && chartype != FX_CHARTYPE_Combination) { |
1509 if (bVerticalDoc) { | 1508 if (bVerticalDoc) { |
1510 fY += fCharHeight; | 1509 fY += fCharHeight; |
1511 } else { | 1510 } else { |
1512 fX += fCharWidth; | 1511 fX += fCharWidth; |
1513 } | 1512 } |
1514 } | 1513 } |
1515 if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { | 1514 if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { |
1516 pCharPos->m_bGlyphAdjust = TRUE; | 1515 pCharPos->m_bGlyphAdjust = true; |
1517 if (bVerticalDoc) { | 1516 if (bVerticalDoc) { |
1518 if (iCharRotation == 0) { | 1517 if (iCharRotation == 0) { |
1519 pCharPos->m_AdjustMatrix[0] = -1; | 1518 pCharPos->m_AdjustMatrix[0] = -1; |
1520 pCharPos->m_AdjustMatrix[1] = 0; | 1519 pCharPos->m_AdjustMatrix[1] = 0; |
1521 pCharPos->m_AdjustMatrix[2] = 0; | 1520 pCharPos->m_AdjustMatrix[2] = 0; |
1522 pCharPos->m_AdjustMatrix[3] = 1; | 1521 pCharPos->m_AdjustMatrix[3] = 1; |
1523 pCharPos->m_OriginY += fAscent; | 1522 pCharPos->m_OriginY += fAscent; |
1524 } else if (iCharRotation == 1) { | 1523 } else if (iCharRotation == 1) { |
1525 pCharPos->m_AdjustMatrix[0] = 0; | 1524 pCharPos->m_AdjustMatrix[0] = 0; |
1526 pCharPos->m_AdjustMatrix[1] = -1; | 1525 pCharPos->m_AdjustMatrix[1] = -1; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1585 if (iWidth > 0) { | 1584 if (iWidth > 0) { |
1586 wPrev = (FX_WCHAR)formChars[0].wch; | 1585 wPrev = (FX_WCHAR)formChars[0].wch; |
1587 } | 1586 } |
1588 wLast = wch; | 1587 wLast = wch; |
1589 } | 1588 } |
1590 return iCount; | 1589 return iCount; |
1591 } | 1590 } |
1592 | 1591 |
1593 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, | 1592 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, |
1594 CFX_RectFArray& rtArray, | 1593 CFX_RectFArray& rtArray, |
1595 FX_BOOL bCharBBox) const { | 1594 bool bCharBBox) const { |
1596 if (!pTxtRun || pTxtRun->iLength < 1) { | 1595 if (!pTxtRun || pTxtRun->iLength < 1) { |
1597 return 0; | 1596 return 0; |
1598 } | 1597 } |
1599 IFX_TxtAccess* pAccess = pTxtRun->pAccess; | 1598 IFX_TxtAccess* pAccess = pTxtRun->pAccess; |
1600 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; | 1599 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; |
1601 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); | 1600 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); |
1602 int32_t* pWidths = pTxtRun->pWidths; | 1601 int32_t* pWidths = pTxtRun->pWidths; |
1603 int32_t iLength = pTxtRun->iLength; | 1602 int32_t iLength = pTxtRun->iLength; |
1604 CFX_RectF rect(*pTxtRun->pRect); | 1603 CFX_RectF rect(*pTxtRun->pRect); |
1605 FX_BOOL bRTLPiece = | 1604 bool bRTLPiece = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; |
1606 (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; | |
1607 FX_FLOAT fFontSize = pTxtRun->fFontSize; | 1605 FX_FLOAT fFontSize = pTxtRun->fFontSize; |
1608 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 1606 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |
1609 FX_FLOAT fScale = fFontSize / 1000.0f; | 1607 FX_FLOAT fScale = fFontSize / 1000.0f; |
1610 CFGAS_GEFont* pFont = pTxtRun->pFont; | 1608 CFGAS_GEFont* pFont = pTxtRun->pFont; |
1611 if (!pFont) { | 1609 if (!pFont) { |
1612 bCharBBox = FALSE; | 1610 bCharBBox = false; |
1613 } | 1611 } |
1614 CFX_Rect bbox; | 1612 CFX_Rect bbox; |
1615 bbox.Set(0, 0, 0, 0); | 1613 bbox.Set(0, 0, 0, 0); |
1616 if (bCharBBox) { | 1614 if (bCharBBox) { |
1617 bCharBBox = pFont->GetBBox(bbox); | 1615 bCharBBox = pFont->GetBBox(bbox); |
1618 } | 1616 } |
1619 FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale); | 1617 FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale); |
1620 FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); | 1618 FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); |
1621 rtArray.RemoveAll(); | 1619 rtArray.RemoveAll(); |
1622 rtArray.SetSize(iLength); | 1620 rtArray.SetSize(iLength); |
1623 FX_BOOL bVertical = | 1621 bool bVertical = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; |
1624 (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; | 1622 bool bSingleLine = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; |
1625 FX_BOOL bSingleLine = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; | 1623 bool bCombText = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; |
1626 FX_BOOL bCombText = (pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; | |
1627 FX_WCHAR wch, wLineBreakChar = pTxtRun->wLineBreakChar; | 1624 FX_WCHAR wch, wLineBreakChar = pTxtRun->wLineBreakChar; |
1628 int32_t iCharSize; | 1625 int32_t iCharSize; |
1629 FX_FLOAT fCharSize, fStart; | 1626 FX_FLOAT fCharSize, fStart; |
1630 if (bVertical) { | 1627 if (bVertical) { |
1631 fStart = bRTLPiece ? rect.bottom() : rect.top; | 1628 fStart = bRTLPiece ? rect.bottom() : rect.top; |
1632 } else { | 1629 } else { |
1633 fStart = bRTLPiece ? rect.right() : rect.left; | 1630 fStart = bRTLPiece ? rect.right() : rect.left; |
1634 } | 1631 } |
1635 for (int32_t i = 0; i < iLength; i++) { | 1632 for (int32_t i = 0; i < iLength; i++) { |
1636 if (pAccess) { | 1633 if (pAccess) { |
1637 wch = pAccess->GetChar(pIdentity, i); | 1634 wch = pAccess->GetChar(pIdentity, i); |
1638 iCharSize = pAccess->GetWidth(pIdentity, i); | 1635 iCharSize = pAccess->GetWidth(pIdentity, i); |
1639 } else { | 1636 } else { |
1640 wch = *pStr++; | 1637 wch = *pStr++; |
1641 iCharSize = *pWidths++; | 1638 iCharSize = *pWidths++; |
1642 } | 1639 } |
1643 fCharSize = (FX_FLOAT)iCharSize / 20000.0f; | 1640 fCharSize = (FX_FLOAT)iCharSize / 20000.0f; |
1644 FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch)); | 1641 bool bRet = (!bSingleLine && FX_IsCtrlCode(wch)); |
1645 if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || | 1642 if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || |
1646 (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { | 1643 (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { |
1647 bRet = FALSE; | 1644 bRet = false; |
1648 } | 1645 } |
1649 if (bRet) { | 1646 if (bRet) { |
1650 iCharSize = iFontSize * 500; | 1647 iCharSize = iFontSize * 500; |
1651 fCharSize = fFontSize / 2.0f; | 1648 fCharSize = fFontSize / 2.0f; |
1652 } | 1649 } |
1653 if (bVertical) { | 1650 if (bVertical) { |
1654 rect.top = fStart; | 1651 rect.top = fStart; |
1655 if (bRTLPiece) { | 1652 if (bRTLPiece) { |
1656 rect.top -= fCharSize; | 1653 rect.top -= fCharSize; |
1657 fStart -= fCharSize; | 1654 fStart -= fCharSize; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 iLength(0), | 1706 iLength(0), |
1710 pFont(nullptr), | 1707 pFont(nullptr), |
1711 fFontSize(12), | 1708 fFontSize(12), |
1712 dwStyles(0), | 1709 dwStyles(0), |
1713 iHorizontalScale(100), | 1710 iHorizontalScale(100), |
1714 iVerticalScale(100), | 1711 iVerticalScale(100), |
1715 iCharRotation(0), | 1712 iCharRotation(0), |
1716 dwCharStyles(0), | 1713 dwCharStyles(0), |
1717 pRect(nullptr), | 1714 pRect(nullptr), |
1718 wLineBreakChar(L'\n'), | 1715 wLineBreakChar(L'\n'), |
1719 bSkipSpace(TRUE) {} | 1716 bSkipSpace(true) {} |
1720 | 1717 |
1721 FX_TXTRUN::~FX_TXTRUN() {} | 1718 FX_TXTRUN::~FX_TXTRUN() {} |
1722 | 1719 |
1723 FX_TXTRUN::FX_TXTRUN(const FX_TXTRUN& other) = default; | 1720 FX_TXTRUN::FX_TXTRUN(const FX_TXTRUN& other) = default; |
1724 | 1721 |
1725 CFX_TxtPiece::CFX_TxtPiece() | 1722 CFX_TxtPiece::CFX_TxtPiece() |
1726 : m_dwStatus(FX_TXTBREAK_PieceBreak), | 1723 : m_dwStatus(FX_TXTBREAK_PieceBreak), |
1727 m_iStartPos(0), | 1724 m_iStartPos(0), |
1728 m_iWidth(-1), | 1725 m_iWidth(-1), |
1729 m_iStartChar(0), | 1726 m_iStartChar(0), |
1730 m_iChars(0), | 1727 m_iChars(0), |
1731 m_iBidiLevel(0), | 1728 m_iBidiLevel(0), |
1732 m_iBidiPos(0), | 1729 m_iBidiPos(0), |
1733 m_iHorizontalScale(100), | 1730 m_iHorizontalScale(100), |
1734 m_iVerticalScale(100), | 1731 m_iVerticalScale(100), |
1735 m_dwCharStyles(0), | 1732 m_dwCharStyles(0), |
1736 m_pChars(nullptr), | 1733 m_pChars(nullptr), |
1737 m_pUserData(nullptr) {} | 1734 m_pUserData(nullptr) {} |
1738 | 1735 |
1739 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) | 1736 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) |
1740 : m_pLineChars(new CFX_TxtCharArray), | 1737 : m_pLineChars(new CFX_TxtCharArray), |
1741 m_pLinePieces(new CFX_TxtPieceArray(16)), | 1738 m_pLinePieces(new CFX_TxtPieceArray(16)), |
1742 m_iStart(0), | 1739 m_iStart(0), |
1743 m_iWidth(0), | 1740 m_iWidth(0), |
1744 m_iArabicChars(0) {} | 1741 m_iArabicChars(0) {} |
1745 | 1742 |
1746 CFX_TxtLine::~CFX_TxtLine() { | 1743 CFX_TxtLine::~CFX_TxtLine() { |
1747 RemoveAll(); | 1744 RemoveAll(); |
1748 } | 1745 } |
OLD | NEW |