14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fgas/layout/fgas_textbreak.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_arabic.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_arb.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_memory.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fgas/font/cfgas_gefont.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fgas/layout/fgas_linebreak.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntypedef uint32_t (CFX_TxtBreak::*FX_TxtBreak_LPFAppendChar)( 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pCurChar, 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation); 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FX_TxtBreak_LPFAppendChar g_FX_TxtBreak_lpfAppendChar[16] = { 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Tab, 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Control, 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Combination, &CFX_TxtBreak::AppendChar_Others, 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Arabic, 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Arabic, 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Arabic, 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Arabic, &CFX_TxtBreak::AppendChar_Others, 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &CFX_TxtBreak::AppendChar_Others, &CFX_TxtBreak::AppendChar_Others, 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_TxtBreak::CFX_TxtBreak(uint32_t dwPolicies) 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_dwPolicies(dwPolicies), 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLineWidth(2000000), 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwLayoutStyles(0), 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bVertical(false), 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicContext(false), 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicShapes(false), 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bRTL(false), 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bSingleLine(false), 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bCombText(false), 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iArabicContext(1), 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurArabicContext(1), 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pFont(nullptr), 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iFontSize(240), 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bEquidistant(true), 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iTabWidth(720000), 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_wDefChar(0xFEFF), 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_wParagBreakChar(L'\n'), 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iDefChar(0), 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLineRotation(0), 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCharRotation(0), 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iRotation(0), 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iAlignment(FX_TXTLINEALIGNMENT_Left), 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwContextCharStyles(0), 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCombWidth(360000), 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pUserData(nullptr), 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType(FX_CHARTYPE_Unknown), 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicNumber(false), 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicComma(false), 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine(nullptr), 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iReady(0), 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iTolerance(0), 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iHorScale(100), 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCharSpace(0) { 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0; 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar); 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTxtLine1 = pdfium::MakeUnique<CFX_TxtLine>(iSize); 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTxtLine2 = pdfium::MakeUnique<CFX_TxtLine>(iSize); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine = m_pTxtLine1.get(); 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetArabicContext(); 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_TxtBreak::~CFX_TxtBreak() { 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Reset(); 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) { 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f); 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_iLineWidth >= 20000); 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) { 885ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iLinePos = 895ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::min(std::max(FXSYS_round(fLinePos * 20000.0f), 0), m_iLineWidth); 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine->m_iStart = iLinePos; 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine->m_iWidth += iLinePos; 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwLayoutStyles = dwLayoutStyles; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0; 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0; 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetArabicContext(); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iLineRotation = GetLineRotation(m_dwLayoutStyles); 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iRotation = m_iLineRotation + m_iCharRotation; 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iRotation %= 4; 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont) { 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFont || pFont == m_pFont) 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SetBreakStatus(); 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pFont = pFont; 1145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FontChanged(); 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) { 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); 1195ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_iFontSize == iFontSize) 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SetBreakStatus(); 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iFontSize = iFontSize; 1245ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FontChanged(); 1255ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann} 1265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1275ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CFX_TxtBreak::FontChanged() { 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iDefChar = 0; 1295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_wDefChar == 0xFEFF || !m_pFont) 1305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return; 1315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); 1335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_iDefChar *= m_iFontSize; 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, bool bEquidistant) { 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); 1385ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; 1405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bEquidistant = bEquidistant; 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_wDefChar = wch; 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iDefChar = 0; 1475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_wDefChar == 0xFEFF || !m_pFont) 1485ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return; 1495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1505ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); 1515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_iDefChar < 0) 1525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_iDefChar = 0; 1535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 1545ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_iDefChar *= m_iFontSize; 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { 1585ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wch != L'\r' && wch != L'\n') 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_wParagBreakChar = wch; 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) { 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iTolerance = FXSYS_round(fTolerance * 20000.0f); 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) { 1685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharRotation < 0) 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharRotation += (-iCharRotation / 4 + 1) * 4; 1705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else if (iCharRotation > 3) 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharRotation -= (iCharRotation / 4) * 4; 1725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_iCharRotation == iCharRotation) 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SetBreakStatus(); 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCharRotation = iCharRotation; 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iRotation = m_iLineRotation + m_iCharRotation; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iRotation %= 4; 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetAlignment(int32_t iAlignment) { 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iAlignment >= FX_TXTLINEALIGNMENT_Left && 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iAlignment <= FX_TXTLINEALIGNMENT_Distributed); 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iAlignment = iAlignment; 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetArabicContext(); 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::ResetContextCharStyles() { 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment; 1915ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bArabicNumber) 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber; 1935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bArabicComma) 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma; 1955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder; 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwContextCharStyles |= (m_iArabicContext << 8); 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) { 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetUserData(void* pUserData) { 2055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_pUserData == pUserData) 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2075ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SetBreakStatus(); 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pUserData = pUserData; 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetBreakStatus() { 2135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bPagination) 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2155ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_pCurLine->CountChars(); 2175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCount < 1) 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2195ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); 2215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pTC->m_dwStatus == 0) 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { 2265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iScale < 0) 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iScale = 0; 2285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iScale == m_iHorScale) 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SetBreakStatus(); 2325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_iHorScale = iScale; 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; 2405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, bool bOmitChar) const { 2465ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::vector<CFX_TxtChar>& ca = *m_pCurLine->m_pLineChars.get(); 2475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iCount = pdfium::CollectionSize<int32_t>(ca); 2485ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (index < 0 || index >= iCount) 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2505ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStart = iCount - 1; 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iStart > -1) { 2535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pTC = &ca[iStart--]; 2545ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 2565ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (--index < 0) 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pTC; 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2625ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. MoltmannCFX_TxtLine* CFX_TxtBreak::GetTxtLine() const { 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_iReady == 1) 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pTxtLine1.get(); 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_iReady == 2) 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pTxtLine2.get(); 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. MoltmannCFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces() const { 2715ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtLine* pTxtLine = GetTxtLine(); 2725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return pTxtLine ? pTxtLine->m_pLinePieces.get() : nullptr; 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE chartype) const { 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::ResetArabicContext() { 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bArabicContext) { 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bCurRTL = m_iCurArabicContext > 1; 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : FX_TXTLINEALIGNMENT_Left; 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bPagination) { 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bCurRTL = false; 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurAlignment = 0; 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bCurRTL = m_bRTL; 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurAlignment = m_iAlignment; 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bRTL) 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicNumber = m_iArabicContext >= 1; 2975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicNumber = m_iArabicContext > 1; 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bArabicComma = m_bArabicNumber; 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetContextCharStyles(); 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwProps) { 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bPagination) { 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwStatus = 0; 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_pUserData = m_pUserData; 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bArabicContext || m_bArabicShapes) { 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iArabicContext = 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? 2 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : 1); 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iArabicContext != m_iArabicContext && iArabicContext != 1) { 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iArabicContext = iArabicContext; 3205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_iCurArabicContext == 1) 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iCurArabicContext = iArabicContext; 3225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetArabicContext(); 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bPagination) { 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pLastChar = GetLastChar(1, false); 3265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pLastChar && pLastChar->m_dwStatus < 1) 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwCharStyles = m_dwContextCharStyles; 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation) { 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch = pCurChar->m_wCharCode; 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wForm; 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth = 0; 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iCharWidth = -1; 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bCombText) { 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iCombWidth; 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bVertical != FX_IsOdd(iRotation)) { 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 1000; 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch; 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bPagination) { 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pLastChar = GetLastChar(0, false); 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pLastChar && 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (pLastChar->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicShadda) == 0) { 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bShadda = false; 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == 0x0651) { 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wLast = pLastChar->m_wCharCode; 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wLast >= 0x064C && wLast <= 0x0650) { 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = FX_GetArabicFromShaddaTable(wLast); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = true; 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wch >= 0x064C && wch <= 0x0650) { 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pLastChar->m_wCharCode == 0x0651) { 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = FX_GetArabicFromShaddaTable(wch); 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = true; 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bShadda) { 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastChar->m_iCharWidth = 0; 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicShadda; 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3715ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!m_pFont->GetCharWidth(wForm, iCharWidth, false)) 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 0; 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth *= m_iFontSize; 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = iCharWidth * m_iHorScale / 100; 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iCharWidth = -iCharWidth; 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar, 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation) { 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = FX_CHARTYPE_Tab; 3845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 3865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iLineWidth = m_pCurLine->m_iWidth; 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth; 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bCombText) { 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iCombWidth; 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bEquidistant) { 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = iLineWidth; 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; 3955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth += m_iTabWidth; 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iTabWidth; 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iCharWidth = iCharWidth; 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth += iCharWidth; 4045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EndBreak(FX_TXTBREAK_LineBreak); 4065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar, 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation) { 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = FX_CHARTYPE_Control; 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwRet = FX_TXTBREAK_None; 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bSingleLine) { 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch = pCurChar->m_wCharCode; 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (wch) { 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case L'\v': 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 0x2028: 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwRet = FX_TXTBREAK_LineBreak; 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case L'\f': 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwRet = FX_TXTBREAK_PageBreak; 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 0x2029: 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwRet = FX_TXTBREAK_ParagraphBreak; 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 4285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wch == m_wParagBreakChar) 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwRet = FX_TXTBREAK_ParagraphBreak; 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwRet != FX_TXTBREAK_None) 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwRet = EndBreak(dwRet); 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return dwRet; 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation) { 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE chartype = pCurChar->GetCharType(); 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iLineWidth = m_pCurLine->m_iWidth; 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wForm; 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth = 0; 4445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pLastChar = nullptr; 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAlef = false; 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType <= FX_CHARTYPE_ArabicDistortion) { 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastChar = GetLastChar(1); 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pLastChar) { 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = pLastChar->m_iCharWidth; 4515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth > 0) 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth -= iCharWidth; 4535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Char* pPrevChar = GetLastChar(2); 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bAlef = (wForm == 0xFEFF && 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation; 4595ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLastRotation++; 4615ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical != FX_IsOdd(iLastRotation)) 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 1000; 4635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pFont->GetCharWidth(wForm, iCharWidth, false); 4655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wForm == 0xFEFF) 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iDefChar; 4685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth *= m_iFontSize; 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = iCharWidth * m_iHorScale / 100; 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastChar->m_iCharWidth = iCharWidth; 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth += iCharWidth; 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 0; 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = chartype; 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = pdfium::arabic::GetFormChar(pCurChar, bAlef ? nullptr : pLastChar, 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bCombText) { 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iCombWidth; 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 4835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical != FX_IsOdd(iRotation)) 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 1000; 4855ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pFont->GetCharWidth(wForm, iCharWidth, false); 4875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4885ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wForm == 0xFEFF) 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iDefChar; 4905ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth *= m_iFontSize; 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = iCharWidth * m_iHorScale / 100; 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iCharWidth = iCharWidth; 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth += iCharWidth; 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine->m_iArabicChars++; 4975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EndBreak(FX_TXTBREAK_LineBreak); 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar, 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation) { 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwProps = pCurChar->m_dwCharProps; 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE chartype = pCurChar->GetCharType(); 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iLineWidth = m_pCurLine->m_iWidth; 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth = 0; 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = chartype; 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch = pCurChar->m_wCharCode; 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wForm = wch; 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (chartype == FX_CHARTYPE_Numeric) { 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bArabicNumber) { 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch + 0x0630; 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicIndic; 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wch == L',') { 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bArabicShapes && m_iCurArabicContext > 0) { 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = 0x060C; 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwCharStyles |= FX_TXTCHARSTYLE_ArabicComma; 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (m_bCurRTL || m_bVertical) { 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = FX_GetMirrorChar(wch, dwProps, m_bCurRTL, m_bVertical); 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5245ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bCombText) { 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iCombWidth; 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical != FX_IsOdd(iRotation)) 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 1000; 5305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else if (!m_pFont->GetCharWidth(wForm, iCharWidth, false)) 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iDefChar; 5325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth *= m_iFontSize; 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = iCharWidth * m_iHorScale / 100; 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5365ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth += m_iCharSpace; 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iCharWidth = iCharWidth; 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth += iCharWidth; 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bBreak = (chartype != FX_CHARTYPE_Space || 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0); 5425ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!m_bSingleLine && bBreak && iLineWidth > m_iLineWidth + m_iTolerance) 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EndBreak(FX_TXTBREAK_LineBreak); 5445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::AppendChar(FX_WCHAR wch) { 5495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann uint32_t dwProps = kTextLayoutCodeProperties[static_cast<uint16_t>(wch)]; 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); 5515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pCurLine->m_pLineChars->emplace_back(); 5525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pCurChar = &m_pCurLine->m_pLineChars->back(); 5545ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCurChar->m_wCharCode = static_cast<uint16_t>(wch); 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_nRotation = m_iCharRotation; 5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwCharProps = dwProps; 5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwCharStyles = 0; 5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iCharWidth = 0; 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iHorizontalScale = m_iHorScale; 5605ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCurChar->m_iVerticalScale = 100; 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_dwStatus = 0; 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iBidiClass = 0; 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iBidiLevel = 0; 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iBidiPos = 0; 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_iBidiOrder = 0; 5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar->m_pUserData = nullptr; 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AppendChar_PageLoad(pCurChar, dwProps); 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwRet1 = FX_TXTBREAK_None; 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (chartype != FX_CHARTYPE_Combination && 5705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann GetUnifiedCharType(m_eCharType) != GetUnifiedCharType(chartype) && 5715ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_eCharType != FX_CHARTYPE_Unknown && 5725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance && !m_bSingleLine && 5735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann (m_eCharType != FX_CHARTYPE_Space || chartype != FX_CHARTYPE_Control)) { 5745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann dwRet1 = EndBreak(FX_TXTBREAK_LineBreak); 5755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iCount = m_pCurLine->CountChars(); 5765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCount > 0) 5775ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCurChar = &(*m_pCurLine->m_pLineChars)[iCount - 1]; 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5795ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation = m_iRotation; 5815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical && (dwProps & 0x8000) != 0) 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iRotation = (iRotation + 1) % 4; 5835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwRet2 = 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (this->*g_FX_TxtBreak_lpfAppendChar[chartype >> FX_CHARTYPEBITS])( 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurChar, iRotation); 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return std::max(dwRet1, dwRet2); 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::EndBreak_UpdateArabicShapes() { 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(m_bArabicShapes); 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_pCurLine->CountChars(); 5935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCount < 2) 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 5955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iLineWidth = m_pCurLine->m_iWidth; 5975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pCur = m_pCurLine->GetCharPtr(0); 5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; 5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCur = m_pCurLine->GetCharPtr(1); 6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch, wForm; 6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNextNum; 6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 1; 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth; 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation; 6055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pNext; 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann do { 6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i < iCount) { 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNext = m_pCurLine->GetCharPtr(i); 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNextNum = (pNext->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; 6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNext = nullptr; 6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bNextNum = false; 6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6155ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = pCur->m_wCharCode; 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == L'.') { 6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bPrevNum && bNextNum) { 6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iRotation = m_iRotation; 6205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical && (pCur->m_dwCharProps & 0x8000) != 0) 6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iRotation = ((iRotation + 1) & 0x03); 6225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch == L'.' ? 0x066B : 0x066C; 6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth -= pCur->m_iCharWidth; 6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bCombText) { 6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iCombWidth; 6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 6285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bVertical != FX_IsOdd(iRotation)) 6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 1000; 6305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else if (!m_pFont->GetCharWidth(wForm, iCharWidth, false)) 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = m_iDefChar; 6325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth *= m_iFontSize; 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = iCharWidth * m_iHorScale / 100; 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCur->m_iCharWidth = iCharWidth; 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLineWidth += iCharWidth; 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; 6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCur = pNext; 6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } while (i < iCount); 6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, 6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllChars, 6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStatus) { 6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_pCurLine->CountChars(); 6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bDone = false; 6505ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pTC; 6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { 6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC = m_pCurLine->GetCharPtr(iCount - 1); 6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (pTC->GetCharType()) { 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FX_CHARTYPE_Tab: 6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FX_CHARTYPE_Control: 6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case FX_CHARTYPE_Space: 6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { 6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); 6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bDone = true; 6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); 6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bDone = true; 6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = m_pCurLine->CountChars(); 6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); 6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece tp; 6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bPagination) { 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwStatus = dwStatus; 6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartPos = m_pCurLine->m_iStart; 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iWidth = m_pCurLine->m_iWidth; 6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartChar = 0; 6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iChars = iCount; 6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_pChars = m_pCurLine->m_pLineChars.get(); 6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_pUserData = m_pUserData; 6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC = m_pCurLine->GetCharPtr(0); 6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwCharStyles = pTC->m_dwCharStyles; 6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iHorizontalScale = pTC->m_iHorizontalScale; 6845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tp.m_iVerticalScale = pTC->m_iVerticalScale; 6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurPieces->Add(tp); 6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine = pNextLine; 6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = FX_CHARTYPE_Unknown; 6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bAllChars && !bDone) { 6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iEndPos = m_pCurLine->m_iWidth; 6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, true); 6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CFX_TxtBreak::EndBreak_BidiLine(std::deque<FX_TPO>* tpos, 6985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann uint32_t dwStatus) { 6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece tp; 7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_TPO tpo; 7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pTC; 7025ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t i; 7035ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t j; 7045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::vector<CFX_TxtChar>& chars = *m_pCurLine->m_pLineChars.get(); 7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = m_pCurLine->CountChars(); 7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); 7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bPagination && bDone) { 7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBidiNum = 0; 7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < iCount; i++) { 7105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTC = &chars[i]; 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_iBidiPos = i; 7125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pTC->GetCharType() != FX_CHARTYPE_Control) 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBidiNum = i; 7145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (i == 0) 7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_iBidiLevel = 1; 7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0); 7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7195ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); 7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bPagination && 7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) { 7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwStatus = FX_TXTBREAK_PieceBreak; 7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartPos = m_pCurLine->m_iStart; 7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_pChars = m_pCurLine->m_pLineChars.get(); 7265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iBidiLevel = -1; 7275ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iCharWidth; 7285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann i = 0; 7295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann j = -1; 7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iCount) { 7315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTC = &chars[i]; 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBidiLevel < 0) { 7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBidiLevel = pTC->m_iBidiLevel; 7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iWidth = 0; 7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iBidiLevel = iBidiLevel; 7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iBidiPos = pTC->m_iBidiOrder; 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwCharStyles = pTC->m_dwCharStyles; 7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_pUserData = pTC->m_pUserData; 7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iHorizontalScale = pTC->m_iHorizontalScale; 7405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tp.m_iVerticalScale = pTC->m_iVerticalScale; 7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwStatus = FX_TXTBREAK_PieceBreak; 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBidiLevel != pTC->m_iBidiLevel || pTC->m_dwStatus != 0) { 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBidiLevel == pTC->m_iBidiLevel) { 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwStatus = pTC->m_dwStatus; 7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = pTC->m_iCharWidth; 7475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth > 0) 7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iWidth += iCharWidth; 7495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iChars = i - tp.m_iStartChar; 7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurPieces->Add(tp); 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartPos += tp.m_iWidth; 7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartChar = i; 7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tpo.index = ++j; 7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tpo.pos = tp.m_iBidiPos; 7585ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tpos->push_back(tpo); 7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBidiLevel = -1; 7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = pTC->m_iCharWidth; 7625ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth > 0) 7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iWidth += iCharWidth; 7645ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i > tp.m_iStartChar) { 7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwStatus = dwStatus; 7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iChars = i - tp.m_iStartChar; 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurPieces->Add(tp); 7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tpo.index = ++j; 7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tpo.pos = tp.m_iBidiPos; 7745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tpos->push_back(tpo); 7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (j > -1) { 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (j > 0) { 7785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::sort(tpos->begin(), tpos->end()); 7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStartPos = 0; 7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i <= j; i++) { 7815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tpo = (*tpos)[i]; 7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); 7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ttp.m_iStartPos = iStartPos; 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStartPos += ttp.m_iWidth; 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece& ttp = pCurPieces->GetAt(j); 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ttp.m_dwStatus = dwStatus; 7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwStatus = dwStatus; 7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartPos = m_pCurLine->m_iStart; 7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iWidth = m_pCurLine->m_iWidth; 7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iStartChar = 0; 7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iChars = iCount; 7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_pChars = m_pCurLine->m_pLineChars.get(); 7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_pUserData = m_pUserData; 7985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pTC = &chars[0]; 7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_dwCharStyles = pTC->m_dwCharStyles; 8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tp.m_iHorizontalScale = pTC->m_iHorizontalScale; 8015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tp.m_iVerticalScale = pTC->m_iVerticalScale; 8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurPieces->Add(tp); 8035ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tpos->push_back({0, 0}); 8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8075ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CFX_TxtBreak::EndBreak_Alignment(const std::deque<FX_TPO>& tpos, 8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllChars, 8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStatus) { 8105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iNetWidth = m_pCurLine->m_iWidth; 8115ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iGapChars = 0; 8125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iCharWidth; 8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); 8145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t i; 8155ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t j; 8165ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iCount = pCurPieces->GetSize(); 8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFind = false; 8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_TPO tpo; 8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pTC; 8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE chartype; 8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = iCount - 1; i > -1; i--) { 8225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tpo = tpos[i]; 8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); 8245ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!bFind) 8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNetWidth = ttp.GetEndPos(); 8265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bArabic = FX_IsOdd(ttp.m_iBidiLevel); 8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = bArabic ? 0 : ttp.m_iChars - 1; 8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (j > -1 && j < ttp.m_iChars) { 8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC = ttp.GetCharPtr(j); 8315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pTC->m_nBreakType == FX_LBT_DIRECT_BRK) 8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iGapChars++; 8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bFind || !bAllChars) { 8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann chartype = pTC->GetCharType(); 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (chartype == FX_CHARTYPE_Space || chartype == FX_CHARTYPE_Control) { 8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bFind) { 8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = pTC->m_iCharWidth; 8385ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bAllChars && iCharWidth > 0) 8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNetWidth -= iCharWidth; 8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bFind = true; 8435ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!bAllChars) 8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j += bArabic ? 1 : -1; 8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!bAllChars && bFind) 8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iOffset = m_iLineWidth - iNetWidth; 8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLowerAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_LowerMask); 8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iHigherAlignment = (m_iCurAlignment & FX_TXTLINEALIGNMENT_HigherMask); 8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iGapChars > 0 && (iHigherAlignment == FX_TXTLINEALIGNMENT_Distributed || 8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (iHigherAlignment == FX_TXTLINEALIGNMENT_Justified && 8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStatus != FX_TXTBREAK_ParagraphBreak))) { 8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStart = -1; 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < iCount; i++) { 8615ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann tpo = tpos[i]; 8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); 8635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iStart < -1) 8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStart = ttp.m_iStartPos; 8655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ttp.m_iStartPos = iStart; 8675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (j = 0; j < ttp.m_iChars; j++) { 8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC = ttp.GetCharPtr(j); 8705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pTC->m_nBreakType != FX_LBT_DIRECT_BRK || pTC->m_iCharWidth < 0) 8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 8725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 8735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t k = iOffset / iGapChars; 8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_iCharWidth += k; 8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ttp.m_iWidth += k; 8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iOffset -= k; 8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iGapChars--; 8785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iGapChars < 1) 8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStart += ttp.m_iWidth; 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iLowerAlignment > FX_TXTLINEALIGNMENT_Left) { 8845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iLowerAlignment == FX_TXTLINEALIGNMENT_Center) 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iOffset /= 2; 8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iOffset > 0) { 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < iCount; i++) { 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece& ttp = pCurPieces->GetAt(i); 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ttp.m_iStartPos += iOffset; 8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) { 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak && 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStatus <= FX_TXTBREAK_PageBreak); 8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = pCurPieces->GetSize(); 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount > 0) { 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); 9025ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus > FX_TXTBREAK_PieceBreak) 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastPiece->m_dwStatus = dwStatus; 9045ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStatus = pLastPiece->m_dwStatus; 9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return dwStatus; 9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 9085ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtLine* pLastLine = GetTxtLine(); 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pLastLine) { 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurPieces = pLastLine->m_pLinePieces.get(); 9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = pCurPieces->GetSize(); 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCount-- > 0) { 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); 9145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus > FX_TXTBREAK_PieceBreak) 9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLastPiece->m_dwStatus = dwStatus; 9165ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStatus = pLastPiece->m_dwStatus; 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return dwStatus; 9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = m_pCurLine->CountChars(); 9245ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCount < 1) 9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_TXTBREAK_None; 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bPagination) { 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); 9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_dwStatus = dwStatus; 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (dwStatus <= FX_TXTBREAK_PieceBreak) 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return dwStatus; 9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2; 9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtLine* pNextLine = 9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get(); 9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); 9385ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bArabicShapes) 9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EndBreak_UpdateArabicShapes(); 9405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9415ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { 9425ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::deque<FX_TPO> tpos; 9435ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann EndBreak_BidiLine(&tpos, dwStatus); 9445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) 9455ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann EndBreak_Alignment(tpos, bAllChars, dwStatus); 9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurLine = pNextLine; 9495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_Char* pTC = GetLastChar(0, false); 9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; 9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dwStatus == FX_TXTBREAK_ParagraphBreak) { 9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iArabicContext = m_iCurArabicContext = 1; 9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetArabicContext(); 9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return dwStatus; 9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9585ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannint32_t CFX_TxtBreak::GetBreakPos(std::vector<CFX_TxtChar>& ca, 9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iEndPos, 9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllChars, 9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bOnlyBrk) { 9625ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iLength = pdfium::CollectionSize<int32_t>(ca) - 1; 9635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iLength < 1) 9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iLength; 9655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iBreak = -1; 9675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iBreakPos = -1; 9685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iIndirect = -1; 9695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iIndirectPos = -1; 9705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iLast = -1; 9715ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iLastPos = -1; 9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bSingleLine || iEndPos <= m_iLineWidth) { 9735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!bAllChars) 9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iLength; 9755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBreak = iLength; 9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBreakPos = iEndPos; 9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9795ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSpaceBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0; 9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNumberBreak = (m_dwPolicies & FX_TXTBREAKPOLICY_NumberBreak) != 0; 9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_LINEBREAKTYPE eType; 9835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann uint32_t nCodeProp; 9845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann uint32_t nCur; 9855ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann uint32_t nNext; 9865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_Char* pCur = &ca[iLength--]; 9875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bAllChars) 9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCur->m_nBreakType = FX_LBT_UNKNOWN; 9895ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCodeProp = pCur->m_dwCharProps; 9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nNext = nCodeProp & 0x003F; 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth = pCur->m_iCharWidth; 9935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth > 0) 9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEndPos -= iCharWidth; 9955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iLength >= 0) { 9975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCur = &ca[iLength]; 9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCodeProp = pCur->m_dwCharProps; 9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCur = nCodeProp & 0x003F; 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nCur == FX_CBP_SP) { 10015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (nNext == FX_CBP_SP) 10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; 10035ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eType = gs_FX_LineBreak_PairTable[nCur][nNext]; 10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) { 10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eType = FX_LBT_DIRECT_BRK; 10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 10085ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (nNext == FX_CBP_SP) 10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eType = FX_LBT_PROHIBITED_BRK; 10105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eType = gs_FX_LineBreak_PairTable[nCur][nNext]; 10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bAllChars) 10145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCur->m_nBreakType = static_cast<uint8_t>(eType); 10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bOnlyBrk) { 10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bSingleLine || iEndPos <= m_iLineWidth || 10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (nCur == FX_CBP_SP && !bSpaceBreak)) { 10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { 10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBreak = iLength; 10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iBreakPos = iEndPos; 10215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!bAllChars) 10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iLength; 10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) { 10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndirect = iLength; 10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndirectPos = iEndPos; 10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLast < 0) { 10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLast = iLength; 10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLastPos = iEndPos; 10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = pCur->m_iCharWidth; 10335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth > 0) 10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEndPos -= iCharWidth; 10354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nNext = nCodeProp & 0x003F; 10374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength--; 10384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10395ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bOnlyBrk) 10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iBreak > -1) { 10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEndPos = iBreakPos; 10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iBreak; 10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndirect > -1) { 10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEndPos = iIndirectPos; 10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iIndirect; 10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLast > -1) { 10504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEndPos = iLastPos; 10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iLast; 10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, 10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_TxtLine* pNextLine, 10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllChars) { 10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pCurLine && pNextLine); 10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = pCurLine->CountChars(); 10615ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCount < 2) 10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iEndPos = pCurLine->m_iWidth; 10655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::vector<CFX_TxtChar>& curChars = *pCurLine->m_pLineChars; 10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false); 10675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharPos < 0) 10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharPos = 0; 10695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharPos++; 10714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharPos >= iCount) { 10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNextLine->RemoveAll(true); 10735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_Char* pTC = &curChars[iCharPos - 1]; 10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_nBreakType = FX_LBT_UNKNOWN; 10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10775ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 10785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann // m_pLineChars is a unique_ptr<vector>. Assign the ref into nextChars 10795ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann // so we can change the m_pLineChars vector ... 10805ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::vector<CFX_TxtChar>& nextChars = *pNextLine->m_pLineChars; 10815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann nextChars = 10825ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::vector<CFX_TxtChar>(curChars.begin() + iCharPos, curChars.end()); 10835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann curChars.erase(curChars.begin() + iCharPos, curChars.end()); 10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurLine->m_iWidth = iEndPos; 10855ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtChar* pTC = &curChars[iCharPos - 1]; 10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTC->m_nBreakType = FX_LBT_UNKNOWN; 10875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann iCount = pdfium::CollectionSize<int>(nextChars); 10885ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iWidth = 0; 10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iCount; i++) { 10905ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (nextChars[i].GetCharType() >= FX_CHARTYPE_ArabicAlef) { 10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurLine->m_iArabicChars--; 10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNextLine->m_iArabicChars++; 10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10945ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann int32_t iCharWidth = nextChars[i].m_iCharWidth; 10955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth > 0) 10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iWidth += iCharWidth; 10975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (m_bPagination) 10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 10995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 11005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann nextChars[i].m_dwStatus = 0; 11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNextLine->m_iWidth = iWidth; 11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CFX_TxtBreak::CountBreakPieces() const { 11065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(); 11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pTxtPieces ? pTxtPieces->GetSize() : 0; 11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { 11115ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(); 11125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!pTxtPieces) 11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 11145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (index < 0 || index >= pTxtPieces->GetSize()) 11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pTxtPieces->GetPtrAt(index); 11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::ClearBreakPieces() { 11205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_TxtLine* pTxtLine = GetTxtLine(); 11215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pTxtLine) 11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTxtLine->RemoveAll(true); 11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iReady = 0; 11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_TxtBreak::Reset() { 11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_eCharType = FX_CHARTYPE_Unknown; 11285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_iArabicContext = 1; 11295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann m_iCurArabicContext = 1; 11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetArabicContext(); 11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTxtLine1->RemoveAll(true); 11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pTxtLine2->RemoveAll(true); 11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct FX_FORMCHAR { 11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wch; 11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wForm; 11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iWidth; 11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun, 11424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXTEXT_CHARPOS* pCharPos, 11434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bCharCode, 11445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann CFX_WideString* pWSForms) const { 11455ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (!pTxtRun || pTxtRun->iLength < 1) 11464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 11475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IFX_TxtAccess* pAccess = pTxtRun->pAccess; 11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; 11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); 11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t* pWidths = pTxtRun->pWidths; 11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = pTxtRun->iLength - 1; 11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<CFGAS_GEFont> pFont = pTxtRun->pFont; 11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStyles = pTxtRun->dwStyles; 11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RectF rtText(*pTxtRun->pRect); 11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bRTLPiece = (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0; 11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bArabicNumber = 11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; 11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bArabicComma = 11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; 11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fFontSize = pTxtRun->fFontSize; 11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); 11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iAscent = pFont->GetAscent(); 11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iDescent = pFont->GetDescent(); 11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMaxHeight = iAscent - iDescent; 11664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fFontHeight = fFontSize; 11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; 11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; 11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bVerticalDoc = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout) != 0; 11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bVerticalChar = (dwStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; 11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iRotation = GetLineRotation(dwStyles) + pTxtRun->iCharRotation; 11725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fX = rtText.left; 11735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fY; 11745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fCharWidth; 11755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fCharHeight; 11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iHorScale = pTxtRun->iHorizontalScale; 11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iVerScale = pTxtRun->iVerticalScale; 11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSkipSpace = pTxtRun->bSkipSpace; 11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FORMCHAR formChars[3]; 11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fYBase; 11815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bVerticalDoc) { 11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fX += (rtText.width - fFontSize) / 2.0f; 11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fYBase = bRTLPiece ? rtText.bottom() : rtText.top; 11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fY = fYBase; 11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 11875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bRTLPiece) 11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fX = rtText.right(); 11895ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fYBase = rtText.top + (rtText.height - fFontSize) / 2.0f; 11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fY = fYBase + fAscent; 11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = 0; 11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iNext = 0; 11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wPrev = 0xFEFF; 11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wNext = 0xFEFF; 11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wForm = 0xFEFF; 11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wLast = 0xFEFF; 12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bShadda = false; 12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bLam = false; 12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i <= iLength; i++) { 12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iWidth; 12044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR wch; 12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAccess) { 12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = pAccess->GetChar(pIdentity, i); 12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iWidth = pAccess->GetWidth(pIdentity, i); 12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = *pStr++; 12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iWidth = *pWidths++; 12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12125ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwProps = FX_GetUnicodeProperties(wch); 12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); 12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (chartype == FX_CHARTYPE_ArabicAlef && iWidth == 0) { 12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wPrev = 0xFEFF; 12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wLast = wch; 12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (chartype >= FX_CHARTYPE_ArabicAlef) { 12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i < iLength) { 12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAccess) { 12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNext = i + 1; 12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iNext <= iLength) { 12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = pAccess->GetChar(pIdentity, iNext); 12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwProps = FX_GetUnicodeProperties(wNext); 12285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if ((dwProps & FX_CHARTYPEBITSMASK) != FX_CHARTYPE_Combination) 12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 12305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNext++; 12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iNext > iLength) 12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = 0xFEFF; 12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t j = -1; 12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann do { 12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 12395ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (i + j >= iLength) 12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 12415ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = pStr[j]; 12434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwProps = FX_GetUnicodeProperties(wNext); 12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } while ((dwProps & FX_CHARTYPEBITSMASK) == FX_CHARTYPE_Combination); 12455ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (i + j >= iLength) 12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = 0xFEFF; 12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = 0xFEFF; 12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 12524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = pdfium::arabic::GetFormChar(wch, wPrev, wNext); 12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bLam = (wPrev == 0x0644 && wch == 0x0644 && wNext == 0x0647); 12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (chartype == FX_CHARTYPE_Combination) { 12554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch; 12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch >= 0x064C && wch <= 0x0651) { 12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bShadda) { 12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = 0xFEFF; 12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = false; 12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = 0xFEFF; 12624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAccess) { 12634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNext = i + 1; 12645ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iNext <= iLength) 12654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = pAccess->GetChar(pIdentity, iNext); 12664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (i < iLength) 12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = *pStr; 12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wch == 0x0651) { 12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wNext >= 0x064C && wNext <= 0x0650) { 12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = FX_GetArabicFromShaddaTable(wNext); 12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = true; 12744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wNext == 0x0651) { 12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = FX_GetArabicFromShaddaTable(wch); 12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = true; 12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = false; 12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (chartype == FX_CHARTYPE_Numeric) { 12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch; 12875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bArabicNumber) 12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm += 0x0630; 12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wch == L'.') { 12904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch; 12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bArabicNumber) { 12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = 0xFEFF; 12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAccess) { 12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNext = i + 1; 12955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iNext <= iLength) 12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = pAccess->GetChar(pIdentity, iNext); 12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 12985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (i < iLength) 12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wNext = *pStr; 13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wNext >= L'0' && wNext <= L'9') 13024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = 0x066B; 13034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (wch == L',') { 13054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch; 13065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bArabicComma) 13074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = 0x060C; 13084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (bRTLPiece || bVerticalChar) { 13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar); 13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = wch; 13124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (chartype != FX_CHARTYPE_Combination) 13144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bShadda = false; 13155ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (chartype < FX_CHARTYPE_ArabicAlef) 13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bLam = false; 13175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwProps = FX_GetUnicodeProperties(wForm); 13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharRotation = iRotation; 13205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bVerticalChar && (dwProps & 0x8000) != 0) 13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharRotation++; 13225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharRotation %= 4; 13244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEmptyChar = 13254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (chartype >= FX_CHARTYPE_Tab && chartype <= FX_CHARTYPE_Control); 13265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (wForm == 0xFEFF) 13274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bEmptyChar = true; 13285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iForms = bLam ? 3 : 1; 13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount += (bEmptyChar && bSkipSpace) ? 0 : iForms; 13314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pCharPos) { 13325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iWidth > 0) 13334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wPrev = wch; 13344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wLast = wch; 13354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 13364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13375ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth = iWidth; 13395ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iCharWidth < 0) 13404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = -iCharWidth; 13415ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth /= iFontSize; 13434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[0].wch = wch; 13444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[0].wForm = wForm; 13454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[0].iWidth = iCharWidth; 13464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bLam) { 13474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[1].wForm = 0x0651; 13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 0; 13494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFont->GetCharWidth(0x0651, iCharWidth, false); 13504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[1].iWidth = iCharWidth; 13514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[2].wForm = 0x0670; 13524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 0; 13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFont->GetCharWidth(0x0670, iCharWidth, false); 13544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formChars[2].iWidth = iCharWidth; 13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13565ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 0; j < iForms; j++) { 13584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wForm = (FX_WCHAR)formChars[j].wForm; 13594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = formChars[j].iWidth; 13604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (j > 0) { 13614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann chartype = FX_CHARTYPE_Combination; 13624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = wForm; 13634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wLast = (FX_WCHAR)formChars[j - 1].wForm; 13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { 13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_GlyphIndex = 13674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCharCode ? wch : pFont->GetGlyphIndex(wForm, false); 13684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 13694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_ExtGID = pCharPos->m_GlyphIndex; 13704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 13714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_FontCharWidth = iCharWidth; 13725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pWSForms) 13734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *pWSForms += wForm; 13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharHeight; 13774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bVerticalDoc) { 13784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharHeight = iCharWidth; 13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharWidth = 1000; 13804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharHeight = 1000; 13824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fCharWidth = fFontSize * iCharWidth / 1000.0f; 13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fCharHeight = fFontSize * iCharHeight / 1000.0f; 13864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRTLPiece && chartype != FX_CHARTYPE_Combination) { 13875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bVerticalDoc) 13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fY -= fCharHeight; 13895ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fX -= fCharWidth; 13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { 13935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin = CFX_PointF(fX, fY); 13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0) { 13954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iFormWidth = iCharWidth; 13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFont->GetCharWidth(wForm, iFormWidth, false); 13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f; 13985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bVerticalDoc) 13995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y += fOffset; 14005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 14015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x += fOffset; 14024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14035ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (chartype == FX_CHARTYPE_Combination) { 14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Rect rtBBox; 14064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFont->GetCharBBox(wForm, &rtBBox, false)) { 14075ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y = 14084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fYBase + fFontSize - 14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fFontSize * (FX_FLOAT)rtBBox.height / (FX_FLOAT)iMaxHeight; 14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wForm == wch && wLast != 0xFEFF) { 14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwLastProps = FX_GetUnicodeProperties(wLast); 14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((dwLastProps & FX_CHARTYPEBITSMASK) == 14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHARTYPE_Combination) { 14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Rect rtBox; 14165ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (pFont->GetCharBBox(wLast, &rtBox, false)) 14175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y -= fFontSize * rtBox.height / iMaxHeight; 14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_PointF ptOffset; 14225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bVerticalChar && (dwProps & 0x00010000) != 0) { 14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Rect rtBBox; 14244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFont->GetCharBBox(wForm, &rtBBox, false)) { 14254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ptOffset.x = fFontSize * (850 - rtBBox.right()) / iMaxHeight; 14264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ptOffset.y = fFontSize * (iAscent - rtBBox.top - 150) / iMaxHeight; 14274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x += ptOffset.x; 14305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y -= ptOffset.y; 14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bRTLPiece && chartype != FX_CHARTYPE_Combination) { 14335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bVerticalDoc) 14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fY += fCharHeight; 14355ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fX += fCharWidth; 14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14385ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 14394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) { 14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_bGlyphAdjust = true; 14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bVerticalDoc) { 14424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharRotation == 0) { 14434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = -1; 14444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 0; 14454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 0; 14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 1; 14475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y += fAscent; 14484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iCharRotation == 1) { 14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 0; 14504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = -1; 14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = -1; 14524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 0; 14535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x -= fDescent; 14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iCharRotation == 2) { 14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 1; 14564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 0; 14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 0; 14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = -1; 14595ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x += fCharWidth; 14605ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y += fAscent; 14614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 0; 14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 1; 14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 1; 14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 0; 14665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x += fAscent; 14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharRotation == 0) { 14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = -1; 14714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 0; 14724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 0; 14734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 1; 14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iCharRotation == 1) { 14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 0; 14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = -1; 14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = -1; 14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 0; 14795ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x -= fDescent; 14805ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y -= fAscent + fDescent; 14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iCharRotation == 2) { 14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 1; 14834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 0; 14844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 0; 14854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = -1; 14865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x += fCharWidth; 14875ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.y -= fAscent; 14884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 0; 14904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 1; 14914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 1; 14924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 0; 14935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann pCharPos->m_Origin.x += fAscent; 14944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iHorScale != 100 || iVerScale != 100) { 14974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] = 14984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f; 14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] = 15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f; 15014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] = 15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f; 15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] = 15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f; 15054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCharPos++; 15074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15095ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (iWidth > 0) 15105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann wPrev = static_cast<FX_WCHAR>(formChars[0].wch); 15114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wLast = wch; 15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iCount; 15144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15165ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannstd::vector<CFX_RectF> CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, 15175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bCharBBox) const { 15184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pTxtRun || pTxtRun->iLength < 1) 15195ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return std::vector<CFX_RectF>(); 15204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IFX_TxtAccess* pAccess = pTxtRun->pAccess; 15224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; 15234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); 15244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t* pWidths = pTxtRun->pWidths; 15254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = pTxtRun->iLength; 15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RectF rect(*pTxtRun->pRect); 15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fFontSize = pTxtRun->fFontSize; 15284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); 15294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fScale = fFontSize / 1000.0f; 15304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RetainPtr<CFGAS_GEFont> pFont = pTxtRun->pFont; 15314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFont) 15324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCharBBox = false; 15334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Rect bbox; 15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bCharBBox) 15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bCharBBox = pFont->GetBBox(&bbox); 15374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale); 15394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); 15405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bRTLPiece = !!(pTxtRun->dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel); 15415ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bVertical = !!(pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_VerticalLayout); 15425ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bSingleLine = !!(pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_SingleLine); 15435ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann bool bCombText = !!(pTxtRun->dwStyles & FX_TXTLAYOUTSTYLE_CombText); 15445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_WCHAR wch; 15455ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_WCHAR wLineBreakChar = pTxtRun->wLineBreakChar; 15464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharSize; 15475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fCharSize; 15485ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann FX_FLOAT fStart; 15495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bVertical) 15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = bRTLPiece ? rect.bottom() : rect.top; 15515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann else 15524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart = bRTLPiece ? rect.right() : rect.left; 15535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 15545ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann std::vector<CFX_RectF> rtArray(iLength); 15554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLength; i++) { 15564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pAccess) { 15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = pAccess->GetChar(pIdentity, i); 15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharSize = pAccess->GetWidth(pIdentity, i); 15594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 15604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wch = *pStr++; 15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharSize = *pWidths++; 15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann fCharSize = static_cast<FX_FLOAT>(iCharSize) / 20000.0f; 15644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bRet = (!bSingleLine && FX_IsCtrlCode(wch)); 15654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || 15664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { 15674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bRet = false; 15684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRet) { 15704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharSize = iFontSize * 500; 15714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fCharSize = fFontSize / 2.0f; 15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bVertical) { 15744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rect.top = fStart; 15754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRTLPiece) { 15764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rect.top -= fCharSize; 15774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart -= fCharSize; 15784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 15794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += fCharSize; 15804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rect.height = fCharSize; 15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rect.left = fStart; 15844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRTLPiece) { 15854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rect.left -= fCharSize; 15864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart -= fCharSize; 15874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 15884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStart += fCharSize; 15894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rect.width = fCharSize; 15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15925ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann 15934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bCharBBox && !bRet) { 15944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCharWidth = 1000; 15954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFont->GetCharWidth(wch, iCharWidth, false); 15964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_FLOAT fRTLeft = 0, fCharWidth = 0; 15974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCharWidth > 0) { 15984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fCharWidth = iCharWidth * fScale; 15994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fRTLeft = fLeft; 16005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann if (bCombText) 16014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fRTLeft = (rect.width - fCharWidth) / 2.0f; 16024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RectF rtBBoxF; 16044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bVertical) { 16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.top = rect.left + fRTLeft; 16064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f; 16074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.height = fCharWidth; 16084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.width = fHeight; 16094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.left = std::max(rtBBoxF.left, 0.0f); 16104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 16114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.left = rect.left + fRTLeft; 16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f; 16134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.width = fCharWidth; 16144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.height = fHeight; 16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rtBBoxF.top = std::max(rtBBoxF.top, 0.0f); 16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann rtArray[i] = rtBBoxF; 16184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 16194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann rtArray[i] = rect; 16214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann return rtArray; 16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_TXTRUN::FX_TXTRUN() 16264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : pAccess(nullptr), 16274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pIdentity(nullptr), 16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pWidths(nullptr), 16294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength(0), 16304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFont(nullptr), 16314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fFontSize(12), 16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStyles(0), 16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHorizontalScale(100), 16344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iVerticalScale(100), 16354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCharRotation(0), 16364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwCharStyles(0), 16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pRect(nullptr), 16384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wLineBreakChar(L'\n'), 16394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSkipSpace(true) {} 16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_TXTRUN::~FX_TXTRUN() {} 16424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_TXTRUN::FX_TXTRUN(const FX_TXTRUN& other) = default; 16444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_TxtPiece::CFX_TxtPiece() 16464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_dwStatus(FX_TXTBREAK_PieceBreak), 16474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iStartPos(0), 16484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iWidth(-1), 16494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iStartChar(0), 16504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iChars(0), 16514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iBidiLevel(0), 16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iBidiPos(0), 16534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iHorizontalScale(100), 16544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iVerticalScale(100), 16554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_dwCharStyles(0), 16564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pChars(nullptr), 16574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pUserData(nullptr) {} 16584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) 16605ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann : m_pLineChars(new std::vector<CFX_TxtChar>), 16614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLinePieces(new CFX_TxtPieceArray(16)), 16624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iStart(0), 16634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iWidth(0), 16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iArabicChars(0) {} 16654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_TxtLine::~CFX_TxtLine() { 16674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann RemoveAll(); 16684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1669