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