| 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 |
| 11 #include "core/fxcrt/include/fx_arabic.h" | 11 #include "core/fxcrt/include/fx_arabic.h" |
| 12 #include "core/fxcrt/include/fx_arb.h" | 12 #include "core/fxcrt/include/fx_arb.h" |
| 13 #include "core/fxcrt/include/fx_memory.h" | 13 #include "core/fxcrt/include/fx_memory.h" |
| 14 #include "xfa/fgas/font/fgas_gefont.h" | 14 #include "xfa/fgas/font/fgas_gefont.h" |
| 15 #include "xfa/fgas/layout/fgas_linebreak.h" | 15 #include "xfa/fgas/layout/fgas_linebreak.h" |
| 16 #include "xfa/fgas/layout/fgas_unicode.h" | 16 #include "xfa/fgas/layout/fgas_unicode.h" |
| 17 | 17 |
| 18 namespace { |
| 19 |
| 20 typedef uint32_t (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)( |
| 21 CFX_TxtChar* pCurChar, |
| 22 int32_t iRotation); |
| 23 const FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = { |
| 24 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Tab, |
| 25 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Control, |
| 26 &CFX_TxtBreak::AppendChar_Combination, &CFX_TxtBreak::AppendChar_Others, |
| 27 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Arabic, |
| 28 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Arabic, |
| 29 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Arabic, |
| 30 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Others, |
| 31 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Others, |
| 32 }; |
| 33 |
| 34 } // namespace |
| 35 |
| 18 CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies) | 36 CFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies) |
| 19 : m_dwPolicies(dwPolicies), | 37 : m_dwPolicies(dwPolicies), |
| 20 m_iLineWidth(2000000), | 38 m_iLineWidth(2000000), |
| 21 m_dwLayoutStyles(0), | 39 m_dwLayoutStyles(0), |
| 22 m_bVertical(FALSE), | 40 m_bVertical(FALSE), |
| 23 m_bArabicContext(FALSE), | 41 m_bArabicContext(FALSE), |
| 24 m_bArabicShapes(FALSE), | 42 m_bArabicShapes(FALSE), |
| 25 m_bRTL(FALSE), | 43 m_bRTL(FALSE), |
| 26 m_bSingleLine(FALSE), | 44 m_bSingleLine(FALSE), |
| 27 m_bCombText(FALSE), | 45 m_bCombText(FALSE), |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 m_pUserData = pUserData; | 223 m_pUserData = pUserData; |
| 206 } | 224 } |
| 207 void CFX_TxtBreak::SetBreakStatus() { | 225 void CFX_TxtBreak::SetBreakStatus() { |
| 208 if (m_bPagination) { | 226 if (m_bPagination) { |
| 209 return; | 227 return; |
| 210 } | 228 } |
| 211 int32_t iCount = m_pCurLine->CountChars(); | 229 int32_t iCount = m_pCurLine->CountChars(); |
| 212 if (iCount < 1) { | 230 if (iCount < 1) { |
| 213 return; | 231 return; |
| 214 } | 232 } |
| 215 CFX_TxtChar* pTC = (CFX_TxtChar*)m_pCurLine->GetCharPtr(iCount - 1); | 233 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); |
| 216 if (pTC->m_dwStatus == 0) { | 234 if (pTC->m_dwStatus == 0) { |
| 217 pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; | 235 pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; |
| 218 } | 236 } |
| 219 } | 237 } |
| 220 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { | 238 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { |
| 221 if (iScale < 0) { | 239 if (iScale < 0) { |
| 222 iScale = 0; | 240 iScale = 0; |
| 223 } | 241 } |
| 224 if (iScale == m_iHorScale) { | 242 if (iScale == m_iHorScale) { |
| 225 return; | 243 return; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 if (m_bRTL) { | 322 if (m_bRTL) { |
| 305 m_bArabicNumber = m_iArabicContext >= 1; | 323 m_bArabicNumber = m_iArabicContext >= 1; |
| 306 } else { | 324 } else { |
| 307 m_bArabicNumber = m_iArabicContext > 1; | 325 m_bArabicNumber = m_iArabicContext > 1; |
| 308 } | 326 } |
| 309 m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; | 327 m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; |
| 310 } | 328 } |
| 311 m_bArabicComma = m_bArabicNumber; | 329 m_bArabicComma = m_bArabicNumber; |
| 312 ResetContextCharStyles(); | 330 ResetContextCharStyles(); |
| 313 } | 331 } |
| 314 void CFX_TxtBreak::AppendChar_PageLoad(CFX_Char* pCurChar, uint32_t dwProps) { | 332 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, |
| 333 uint32_t dwProps) { |
| 315 if (!m_bPagination) { | 334 if (!m_bPagination) { |
| 316 ((CFX_TxtChar*)pCurChar)->m_dwStatus = 0; | 335 pCurChar->m_dwStatus = 0; |
| 317 ((CFX_TxtChar*)pCurChar)->m_pUserData = m_pUserData; | 336 pCurChar->m_pUserData = m_pUserData; |
| 318 } | 337 } |
| 319 if (m_bArabicContext || m_bArabicShapes) { | 338 if (m_bArabicContext || m_bArabicShapes) { |
| 320 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; | 339 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; |
| 321 int32_t iArabicContext = | 340 int32_t iArabicContext = |
| 322 (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) | 341 (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) |
| 323 ? 2 | 342 ? 2 |
| 324 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 | 343 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 |
| 325 : 1); | 344 : 1); |
| 326 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { | 345 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { |
| 327 m_iArabicContext = iArabicContext; | 346 m_iArabicContext = iArabicContext; |
| 328 if (m_iCurArabicContext == 1) { | 347 if (m_iCurArabicContext == 1) { |
| 329 m_iCurArabicContext = iArabicContext; | 348 m_iCurArabicContext = iArabicContext; |
| 330 } | 349 } |
| 331 ResetArabicContext(); | 350 ResetArabicContext(); |
| 332 if (!m_bPagination) { | 351 if (!m_bPagination) { |
| 333 CFX_TxtChar* pLastChar = (CFX_TxtChar*)GetLastChar(1, FALSE); | 352 CFX_TxtChar* pLastChar = GetLastChar(1, FALSE); |
| 334 if (pLastChar != NULL && pLastChar->m_dwStatus < 1) { | 353 if (pLastChar != NULL && pLastChar->m_dwStatus < 1) { |
| 335 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; | 354 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; |
| 336 } | 355 } |
| 337 } | 356 } |
| 338 } | 357 } |
| 339 } | 358 } |
| 340 pCurChar->m_dwCharStyles = m_dwContextCharStyles; | 359 pCurChar->m_dwCharStyles = m_dwContextCharStyles; |
| 341 } | 360 } |
| 342 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_Char* pCurChar, | 361 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, |
| 343 int32_t iRotation) { | 362 int32_t iRotation) { |
| 344 ASSERT(pCurChar != NULL); | |
| 345 FX_WCHAR wch = pCurChar->m_wCharCode; | 363 FX_WCHAR wch = pCurChar->m_wCharCode; |
| 346 FX_WCHAR wForm; | 364 FX_WCHAR wForm; |
| 347 int32_t iCharWidth = 0; | 365 int32_t iCharWidth = 0; |
| 348 CFX_Char* pLastChar; | |
| 349 pCurChar->m_iCharWidth = -1; | 366 pCurChar->m_iCharWidth = -1; |
| 350 if (m_bCombText) { | 367 if (m_bCombText) { |
| 351 iCharWidth = m_iCombWidth; | 368 iCharWidth = m_iCombWidth; |
| 352 } else { | 369 } else { |
| 353 if (m_bVertical != FX_IsOdd(iRotation)) { | 370 if (m_bVertical != FX_IsOdd(iRotation)) { |
| 354 iCharWidth = 1000; | 371 iCharWidth = 1000; |
| 355 } else { | 372 } else { |
| 356 wForm = wch; | 373 wForm = wch; |
| 357 if (!m_bPagination) { | 374 if (!m_bPagination) { |
| 358 pLastChar = GetLastChar(0, FALSE); | 375 CFX_TxtChar* pLastChar = GetLastChar(0, FALSE); |
| 359 if (pLastChar != NULL && | 376 if (pLastChar && |
| 360 (((CFX_TxtChar*)pLastChar)->m_dwCharStyles & | 377 (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { |
| 361 FX_TXTCHARSTYLE_ArabicShadda) == 0) { | |
| 362 FX_BOOL bShadda = FALSE; | 378 FX_BOOL bShadda = FALSE; |
| 363 if (wch == 0x0651) { | 379 if (wch == 0x0651) { |
| 364 FX_WCHAR wLast = pLastChar->m_wCharCode; | 380 FX_WCHAR wLast = pLastChar->m_wCharCode; |
| 365 if (wLast >= 0x064C && wLast <= 0x0650) { | 381 if (wLast >= 0x064C && wLast <= 0x0650) { |
| 366 wForm = FX_GetArabicFromShaddaTable(wLast); | 382 wForm = FX_GetArabicFromShaddaTable(wLast); |
| 367 bShadda = TRUE; | 383 bShadda = TRUE; |
| 368 } | 384 } |
| 369 } else if (wch >= 0x064C && wch <= 0x0650) { | 385 } else if (wch >= 0x064C && wch <= 0x0650) { |
| 370 if (pLastChar->m_wCharCode == 0x0651) { | 386 if (pLastChar->m_wCharCode == 0x0651) { |
| 371 wForm = FX_GetArabicFromShaddaTable(wch); | 387 wForm = FX_GetArabicFromShaddaTable(wch); |
| 372 bShadda = TRUE; | 388 bShadda = TRUE; |
| 373 } | 389 } |
| 374 } | 390 } |
| 375 if (bShadda) { | 391 if (bShadda) { |
| 376 ((CFX_TxtChar*)pLastChar)->m_dwCharStyles |= | 392 pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; |
| 377 FX_TXTCHARSTYLE_ArabicShadda; | 393 pLastChar->m_iCharWidth = 0; |
| 378 ((CFX_TxtChar*)pLastChar)->m_iCharWidth = 0; | 394 pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; |
| 379 ((CFX_TxtChar*)pCurChar)->m_dwCharStyles |= | |
| 380 FX_TXTCHARSTYLE_ArabicShadda; | |
| 381 } | 395 } |
| 382 } | 396 } |
| 383 } | 397 } |
| 384 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { | 398 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { |
| 385 iCharWidth = 0; | 399 iCharWidth = 0; |
| 386 } | 400 } |
| 387 } | 401 } |
| 388 iCharWidth *= m_iFontSize; | 402 iCharWidth *= m_iFontSize; |
| 389 iCharWidth = iCharWidth * m_iHorScale / 100; | 403 iCharWidth = iCharWidth * m_iHorScale / 100; |
| 390 } | 404 } |
| 391 pCurChar->m_iCharWidth = -iCharWidth; | 405 pCurChar->m_iCharWidth = -iCharWidth; |
| 392 return FX_TXTBREAK_None; | 406 return FX_TXTBREAK_None; |
| 393 } | 407 } |
| 394 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_Char* pCurChar, int32_t iRotation) { | 408 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar, |
| 409 int32_t iRotation) { |
| 395 m_eCharType = FX_CHARTYPE_Tab; | 410 m_eCharType = FX_CHARTYPE_Tab; |
| 396 if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { | 411 if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { |
| 397 return FX_TXTBREAK_None; | 412 return FX_TXTBREAK_None; |
| 398 } | 413 } |
| 399 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 414 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 400 int32_t iCharWidth; | 415 int32_t iCharWidth; |
| 401 if (m_bCombText) { | 416 if (m_bCombText) { |
| 402 iCharWidth = m_iCombWidth; | 417 iCharWidth = m_iCombWidth; |
| 403 } else { | 418 } else { |
| 404 if (m_bEquidistant) { | 419 if (m_bEquidistant) { |
| 405 iCharWidth = iLineWidth; | 420 iCharWidth = iLineWidth; |
| 406 iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; | 421 iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; |
| 407 if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { | 422 if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { |
| 408 iCharWidth += m_iTabWidth; | 423 iCharWidth += m_iTabWidth; |
| 409 } | 424 } |
| 410 } else { | 425 } else { |
| 411 iCharWidth = m_iTabWidth; | 426 iCharWidth = m_iTabWidth; |
| 412 } | 427 } |
| 413 } | 428 } |
| 414 pCurChar->m_iCharWidth = iCharWidth; | 429 pCurChar->m_iCharWidth = iCharWidth; |
| 415 iLineWidth += iCharWidth; | 430 iLineWidth += iCharWidth; |
| 416 if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { | 431 if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { |
| 417 return EndBreak(FX_TXTBREAK_LineBreak); | 432 return EndBreak(FX_TXTBREAK_LineBreak); |
| 418 } | 433 } |
| 419 return FX_TXTBREAK_None; | 434 return FX_TXTBREAK_None; |
| 420 } | 435 } |
| 421 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_Char* pCurChar, | 436 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar, |
| 422 int32_t iRotation) { | 437 int32_t iRotation) { |
| 423 m_eCharType = FX_CHARTYPE_Control; | 438 m_eCharType = FX_CHARTYPE_Control; |
| 424 uint32_t dwRet = FX_TXTBREAK_None; | 439 uint32_t dwRet = FX_TXTBREAK_None; |
| 425 if (!m_bSingleLine) { | 440 if (!m_bSingleLine) { |
| 426 FX_WCHAR wch = pCurChar->m_wCharCode; | 441 FX_WCHAR wch = pCurChar->m_wCharCode; |
| 427 switch (wch) { | 442 switch (wch) { |
| 428 case L'\v': | 443 case L'\v': |
| 429 case 0x2028: | 444 case 0x2028: |
| 430 dwRet = FX_TXTBREAK_LineBreak; | 445 dwRet = FX_TXTBREAK_LineBreak; |
| 431 break; | 446 break; |
| 432 case L'\f': | 447 case L'\f': |
| 433 dwRet = FX_TXTBREAK_PageBreak; | 448 dwRet = FX_TXTBREAK_PageBreak; |
| 434 break; | 449 break; |
| 435 case 0x2029: | 450 case 0x2029: |
| 436 dwRet = FX_TXTBREAK_ParagraphBreak; | 451 dwRet = FX_TXTBREAK_ParagraphBreak; |
| 437 break; | 452 break; |
| 438 default: | 453 default: |
| 439 if (wch == m_wParagBreakChar) { | 454 if (wch == m_wParagBreakChar) { |
| 440 dwRet = FX_TXTBREAK_ParagraphBreak; | 455 dwRet = FX_TXTBREAK_ParagraphBreak; |
| 441 } | 456 } |
| 442 break; | 457 break; |
| 443 } | 458 } |
| 444 if (dwRet != FX_TXTBREAK_None) { | 459 if (dwRet != FX_TXTBREAK_None) { |
| 445 dwRet = EndBreak(dwRet); | 460 dwRet = EndBreak(dwRet); |
| 446 } | 461 } |
| 447 } | 462 } |
| 448 return dwRet; | 463 return dwRet; |
| 449 } | 464 } |
| 450 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_Char* pCurChar, | 465 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, |
| 451 int32_t iRotation) { | 466 int32_t iRotation) { |
| 452 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 467 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
| 453 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 468 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 454 FX_WCHAR wForm; | 469 FX_WCHAR wForm; |
| 455 int32_t iCharWidth = 0; | 470 int32_t iCharWidth = 0; |
| 456 CFX_Char* pLastChar = NULL; | 471 CFX_Char* pLastChar = NULL; |
| 457 FX_BOOL bAlef = FALSE; | 472 FX_BOOL bAlef = FALSE; |
| 458 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && | 473 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && |
| 459 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { | 474 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { |
| 460 pLastChar = GetLastChar(1); | 475 pLastChar = GetLastChar(1); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 iCharWidth = iCharWidth * m_iHorScale / 100; | 518 iCharWidth = iCharWidth * m_iHorScale / 100; |
| 504 } | 519 } |
| 505 pCurChar->m_iCharWidth = iCharWidth; | 520 pCurChar->m_iCharWidth = iCharWidth; |
| 506 iLineWidth += iCharWidth; | 521 iLineWidth += iCharWidth; |
| 507 m_pCurLine->m_iArabicChars++; | 522 m_pCurLine->m_iArabicChars++; |
| 508 if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { | 523 if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { |
| 509 return EndBreak(FX_TXTBREAK_LineBreak); | 524 return EndBreak(FX_TXTBREAK_LineBreak); |
| 510 } | 525 } |
| 511 return FX_TXTBREAK_None; | 526 return FX_TXTBREAK_None; |
| 512 } | 527 } |
| 513 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_Char* pCurChar, | 528 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar, |
| 514 int32_t iRotation) { | 529 int32_t iRotation) { |
| 515 uint32_t dwProps = pCurChar->m_dwCharProps; | 530 uint32_t dwProps = pCurChar->m_dwCharProps; |
| 516 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 531 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
| 517 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 532 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 518 int32_t iCharWidth = 0; | 533 int32_t iCharWidth = 0; |
| 519 m_eCharType = chartype; | 534 m_eCharType = chartype; |
| 520 FX_WCHAR wch = pCurChar->m_wCharCode; | 535 FX_WCHAR wch = pCurChar->m_wCharCode; |
| 521 FX_WCHAR wForm = wch; | 536 FX_WCHAR wForm = wch; |
| 522 if (chartype == FX_CHARTYPE_Numeric) { | 537 if (chartype == FX_CHARTYPE_Numeric) { |
| 523 if (m_bArabicNumber) { | 538 if (m_bArabicNumber) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 546 iCharWidth += m_iCharSpace; | 561 iCharWidth += m_iCharSpace; |
| 547 pCurChar->m_iCharWidth = iCharWidth; | 562 pCurChar->m_iCharWidth = iCharWidth; |
| 548 iLineWidth += iCharWidth; | 563 iLineWidth += iCharWidth; |
| 549 FX_BOOL bBreak = (chartype != FX_CHARTYPE_Space || | 564 FX_BOOL bBreak = (chartype != FX_CHARTYPE_Space || |
| 550 (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0); | 565 (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0); |
| 551 if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) { | 566 if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) { |
| 552 return EndBreak(FX_TXTBREAK_LineBreak); | 567 return EndBreak(FX_TXTBREAK_LineBreak); |
| 553 } | 568 } |
| 554 return FX_TXTBREAK_None; | 569 return FX_TXTBREAK_None; |
| 555 } | 570 } |
| 556 typedef uint32_t (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)(CFX_Char* pCurChar, | 571 |
| 557 int32_t iRotation); | |
| 558 static const FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = { | |
| 559 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Tab, | |
| 560 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Control, | |
| 561 &CFX_TxtBreak::AppendChar_Combination, &CFX_TxtBreak::AppendChar_Others, | |
| 562 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Arabic, | |
| 563 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Arabic, | |
| 564 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Arabic, | |
| 565 &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Others, | |
| 566 &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Others, | |
| 567 }; | |
| 568 uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) { | 572 uint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) { |
| 569 uint32_t dwProps = kTextLayoutCodeProperties[(uint16_t)wch]; | 573 uint32_t dwProps = kTextLayoutCodeProperties[(uint16_t)wch]; |
| 570 FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); | 574 FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); |
| 571 CFX_TxtChar* pCurChar = m_pCurLine->m_pLineChars->AddSpace(); | 575 CFX_TxtChar* pCurChar = m_pCurLine->m_pLineChars->AddSpace(); |
| 572 pCurChar->m_wCharCode = (uint16_t)wch; | 576 pCurChar->m_wCharCode = (uint16_t)wch; |
| 573 pCurChar->m_nRotation = m_iCharRotation; | 577 pCurChar->m_nRotation = m_iCharRotation; |
| 574 pCurChar->m_dwCharProps = dwProps; | 578 pCurChar->m_dwCharProps = dwProps; |
| 575 pCurChar->m_dwCharStyles = 0; | 579 pCurChar->m_dwCharStyles = 0; |
| 576 pCurChar->m_iCharWidth = 0; | 580 pCurChar->m_iCharWidth = 0; |
| 577 pCurChar->m_iHorizontalScale = m_iHorScale; | 581 pCurChar->m_iHorizontalScale = m_iHorScale; |
| (...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1653 rtBBoxF.height = fHeight; | 1657 rtBBoxF.height = fHeight; |
| 1654 rtBBoxF.top = std::max(rtBBoxF.top, 0.0f); | 1658 rtBBoxF.top = std::max(rtBBoxF.top, 0.0f); |
| 1655 } | 1659 } |
| 1656 rtArray.SetAt(i, rtBBoxF); | 1660 rtArray.SetAt(i, rtBBoxF); |
| 1657 continue; | 1661 continue; |
| 1658 } | 1662 } |
| 1659 rtArray.SetAt(i, rect); | 1663 rtArray.SetAt(i, rect); |
| 1660 } | 1664 } |
| 1661 return iLength; | 1665 return iLength; |
| 1662 } | 1666 } |
| OLD | NEW |