1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm>
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/include/fx_lbk.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/fgas_base.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/layout/fx_unicode.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/layout/fx_rtfbreak.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_RTFBreak* IFX_RTFBreak::Create(FX_DWORD dwPolicies) {
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CFX_RTFBreak(dwPolicies);
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_RTFBreak::CFX_RTFBreak(FX_DWORD dwPolicies)
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_dwPolicies(dwPolicies),
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pArabicChar(NULL),
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iBoundaryStart(0),
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iBoundaryEnd(2000000),
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwLayoutStyles(0),
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bPagination(FALSE),
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bVertical(FALSE),
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bSingleLine(FALSE),
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bCharCode(FALSE),
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pFont(NULL),
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iFontHeight(240),
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iFontSize(240),
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iTabWidth(720000),
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_PositionedTabs(),
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bOrphanLine(FALSE),
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wDefChar(0xFEFF),
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iDefChar(0),
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wLineBreakChar(L'\n'),
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iHorizontalScale(100),
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iVerticalScale(100),
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iLineRotation(0),
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCharRotation(0),
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iRotation(0),
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iCharSpace(0),
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bWordSpace(FALSE),
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iWordSpace(0),
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bRTL(FALSE),
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iAlignment(FX_RTFLINEALIGNMENT_Left),
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pUserData(NULL),
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwCharType(0),
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwIdentity(0),
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_RTFLine1(),
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_RTFLine2(),
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurLine(NULL),
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iReady(0),
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iTolerance(0) {
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pArabicChar = IFX_ArabicChar::Create();
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine = &m_RTFLine1;
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_RTFBreak::~CFX_RTFBreak() {
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Reset();
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PositionedTabs.RemoveAll();
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pArabicChar->Release();
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pUserData != NULL) {
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pUserData->Release();
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) {
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (fLineStart > fLineEnd)
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iBoundaryStart = FXSYS_round(fLineStart * 20000.0f);
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iBoundaryEnd = FXSYS_round(fLineEnd * 20000.0f);
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iBoundaryEnd);
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iBoundaryStart);
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetLineStartPos(FX_FLOAT fLinePos) {
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f);
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLinePos = std::min(iLinePos, m_iBoundaryEnd);
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLinePos = std::max(iLinePos, m_iBoundaryStart);
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iStart = iLinePos;
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) {
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwLayoutStyles == dwLayoutStyles) {
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwLayoutStyles = dwLayoutStyles;
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0;
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bVertical = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0;
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bSingleLine = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0;
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bCharCode = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iLineRotation = GetLineRotation(m_dwLayoutStyles);
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRotation = m_iLineRotation + m_iCharRotation;
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRotation %= 4;
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetFont(IFX_Font* pFont) {
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFont == NULL) {
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFont == pFont) {
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFont = pFont;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iDefChar = 0;
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFont != NULL) {
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iFontHeight = m_iFontSize;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_wDefChar != 0xFEFF) {
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iDefChar *= m_iFontSize;
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetFontSize(FX_FLOAT fFontSize) {
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iFontSize == iFontSize) {
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iFontSize = iFontSize;
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iDefChar = 0;
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFont != NULL) {
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iFontHeight = m_iFontSize;
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_wDefChar != 0xFEFF) {
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iDefChar *= m_iFontSize;
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) {
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f);
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) {
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLineEnd = m_iBoundaryEnd;
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart;
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iTabPos > iLineEnd) {
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iTabPos = iLineEnd;
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PositionedTabs.Find(iTabPos, 0) > -1) {
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = m_PositionedTabs.GetSize();
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iFind = 0;
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (; iFind < iCount; iFind++) {
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_PositionedTabs[iFind] > iTabPos) {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PositionedTabs.InsertAt(iFind, iTabPos);
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) {
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bOrphanLine = GetLastPositionedTab() >= iLineEnd;
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bOrphanLine = FALSE;
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) {
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PositionedTabs.RemoveAll();
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = tabs.GetSize();
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PositionedTabs.SetSize(iCount);
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLineEnd = m_iBoundaryEnd;
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iTabPos;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < iCount; i++) {
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iBoundaryStart;
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iTabPos > iLineEnd) {
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iTabPos = iLineEnd;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_PositionedTabs[i] = iTabPos;
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) {
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bOrphanLine = GetLastPositionedTab() >= iLineEnd;
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bOrphanLine = FALSE;
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::ClearPositionedTabs() {
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PositionedTabs.RemoveAll();
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bOrphanLine = FALSE;
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetDefaultChar(FX_WCHAR wch) {
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_wDefChar = wch;
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iDefChar = 0;
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_wDefChar != 0xFEFF && m_pFont != NULL) {
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE);
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_iDefChar < 0) {
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iDefChar = 0;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iDefChar *= m_iFontSize;
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetLineBreakChar(FX_WCHAR wch) {
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (wch != L'\r' && wch != L'\n') {
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_wLineBreakChar = wch;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iTolerance = FXSYS_round(fTolerance * 20000.0f);
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetHorizontalScale(int32_t iScale) {
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iScale < 0) {
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iScale = 0;
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iHorizontalScale == iScale) {
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iHorizontalScale = iScale;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetVerticalScale(int32_t iScale) {
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iScale < 0) {
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iScale = 0;
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iVerticalScale == iScale) {
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iVerticalScale = iScale;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetCharRotation(int32_t iCharRotation) {
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCharRotation < 0) {
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharRotation += (-iCharRotation / 4 + 1) * 4;
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (iCharRotation > 3) {
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharRotation -= (iCharRotation / 4) * 4;
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iCharRotation == iCharRotation) {
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iCharRotation = iCharRotation;
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRotation = m_iLineRotation + m_iCharRotation;
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRotation %= 4;
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetCharSpace(FX_FLOAT fCharSpace) {
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f);
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) {
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bWordSpace = !bDefault;
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iWordSpace = FXSYS_round(fWordSpace * 20000.0f);
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetReadingOrder(FX_BOOL bRTL) {
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bRTL = bRTL;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetAlignment(int32_t iAlignment) {
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(iAlignment >= FX_RTFLINEALIGNMENT_Left &&
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               iAlignment <= FX_RTFLINEALIGNMENT_Distributed);
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iAlignment = iAlignment;
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetUserData(IFX_Unknown* pUserData) {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pUserData == pUserData) {
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetBreakStatus();
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pUserData != NULL) {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pUserData->Release();
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pUserData = pUserData;
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pUserData != NULL) {
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pUserData->AddRef();
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const int32_t gs_FX_RTFLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2};
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_RTFBreak::GetLineRotation(FX_DWORD dwStyles) const {
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return gs_FX_RTFLineRotations[(dwStyles & 0x0E) >> 1];
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SetBreakStatus() {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwIdentity++;
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = m_pCurLine->CountChars();
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCount < 1) {
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1);
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (tc.m_dwStatus == 0) {
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tc.m_dwStatus = FX_RTFBREAK_PieceBreak;
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_RTFChar* CFX_RTFBreak::GetLastChar(int32_t index) const {
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = tca.GetSize();
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0 || index >= iCount) {
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pTC;
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = iCount - 1;
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (iStart > -1) {
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pTC = tca.GetDataPtr(iStart--);
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pTC->m_iCharWidth >= 0 ||
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pTC->GetCharType() != FX_CHARTYPE_Combination) {
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (--index < 0) {
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return pTC;
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_RTFLine* CFX_RTFBreak::GetRTFLine(FX_BOOL bReady) const {
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bReady) {
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_iReady == 1) {
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (CFX_RTFLine*)&m_RTFLine1;
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (m_iReady == 2) {
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (CFX_RTFLine*)&m_RTFLine2;
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pCurLine != NULL);
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCurLine;
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_RTFPieceArray* CFX_RTFBreak::GetRTFPieces(FX_BOOL bReady) const {
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFLine* pRTFLine = GetRTFLine(bReady);
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRTFLine == NULL) {
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return &pRTFLine->m_LinePieces;
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanninline FX_DWORD CFX_RTFBreak::GetUnifiedCharType(FX_DWORD dwType) const {
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType;
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_RTFBreak::GetLastPositionedTab() const {
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = m_PositionedTabs.GetSize();
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCount < 1) {
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_iBoundaryStart;
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_PositionedTabs[iCount - 1];
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const {
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = m_PositionedTabs.GetSize();
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < iCount; i++) {
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_PositionedTabs[i] > iTabPos) {
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iTabPos = m_PositionedTabs[i];
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanntypedef FX_DWORD (CFX_RTFBreak::*FX_RTFBreak_LPFAppendChar)(
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFChar* pCurChar,
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iRotation);
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = {
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Tab,
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Control,
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Combination, &CFX_RTFBreak::AppendChar_Others,
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Arabic,
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic,
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic,
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Others,
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Others,
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar(FX_WCHAR wch) {
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL && m_pArabicChar != NULL);
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bCharCode) {
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return AppendChar_CharCode(wch);
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch];
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwType = (dwProps & FX_CHARTYPEBITSMASK);
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pCurChar = tca.AddSpace();
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwStatus = 0;
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_wCharCode = wch;
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwCharProps = dwProps;
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwCharStyles = 0;
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwLayoutStyles = 0;
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iFontSize = m_iFontSize;
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iFontHeight = m_iFontHeight;
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iHorizontalScale = m_iHorizontalScale;
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iVertialScale = m_iVerticalScale;
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_nRotation = m_iCharRotation;
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iCharWidth = 0;
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwIdentity = m_dwIdentity;
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pUserData != NULL) {
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pUserData->AddRef();
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_pUserData = m_pUserData;
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwRet1 = FX_RTFBREAK_None;
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwType != FX_CHARTYPE_Combination &&
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) {
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_bSingleLine && !m_bOrphanLine && m_dwCharType > 0 &&
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) {
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwRet1 = EndBreak(FX_RTFBREAK_LineBreak);
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int32_t iCount = m_pCurLine->CountChars();
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iCount > 0) {
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCurChar = m_pCurLine->m_LineChars.GetDataPtr(iCount - 1);
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iRotation = m_iRotation;
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bVertical && (dwProps & 0x8000) != 0) {
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iRotation = (iRotation + 1) % 4;
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwRet2 =
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (this->*g_FX_RTFBreak_lpfAppendChar[dwType >> FX_CHARTYPEBITS])(
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCurChar, iRotation);
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwCharType = dwType;
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return std::max(dwRet1, dwRet2);
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) {
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pFont != NULL && m_pCurLine != NULL);
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_bCharCode);
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iMBCSChars++;
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFCharArray& tca = m_pCurLine->m_LineChars;
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pCurChar = tca.AddSpace();
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwStatus = 0;
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_wCharCode = wch;
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwCharProps = 0;
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwCharStyles = 0;
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwLayoutStyles = m_dwLayoutStyles;
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iFontSize = m_iFontSize;
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iFontHeight = m_iFontHeight;
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iHorizontalScale = m_iHorizontalScale;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iVertialScale = m_iVerticalScale;
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_nRotation = m_iCharRotation;
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iCharWidth = 0;
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_dwIdentity = m_dwIdentity;
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pUserData != NULL) {
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pUserData->AddRef();
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_pUserData = m_pUserData;
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharWidth = 0;
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bVertical != FX_IsOdd(m_iRotation)) {
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharWidth = 1000;
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) {
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = m_iDefChar;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth *= m_iFontSize;
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth += m_iCharSpace;
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iCharWidth = iCharWidth;
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iWidth += iCharWidth;
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwCharType = 0;
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bSingleLine &&
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return EndBreak(FX_RTFBREAK_LineBreak);
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_RTFBREAK_None;
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar,
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              int32_t iRotation) {
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharWidth = 0;
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bVertical != FX_IsOdd(iRotation)) {
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharWidth = 1000;
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth,
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               m_bCharCode)) {
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = 0;
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth *= m_iFontSize;
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pLastChar = GetLastChar(0);
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pLastChar != NULL && pLastChar->GetCharType() > FX_CHARTYPE_Combination) {
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharWidth = -iCharWidth;
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwCharType = FX_CHARTYPE_Combination;
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iCharWidth = iCharWidth;
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCharWidth > 0) {
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurLine->m_iWidth += iCharWidth;
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_RTFBREAK_None;
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar,
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t iRotation) {
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) {
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bBreak = FALSE;
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) {
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bBreak = (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance);
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t& iLineWidth = m_pCurLine->m_iWidth;
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iCharWidth = iLineWidth;
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetPositionedTab(iCharWidth)) {
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth -= iLineWidth;
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth;
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCurChar->m_iCharWidth = iCharWidth;
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iLineWidth += iCharWidth;
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_bSingleLine && !m_bOrphanLine && bBreak) {
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return EndBreak(FX_RTFBREAK_LineBreak);
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_RTFBREAK_None;
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar_Control(CFX_RTFChar* pCurChar,
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          int32_t iRotation) {
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwRet2 = FX_RTFBREAK_None;
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bSingleLine) {
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (pCurChar->m_wCharCode) {
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case L'\v':
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 0x2028:
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwRet2 = FX_RTFBREAK_LineBreak;
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case L'\f':
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwRet2 = FX_RTFBREAK_PageBreak;
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case 0x2029:
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwRet2 = FX_RTFBREAK_ParagraphBreak;
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      default:
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pCurChar->m_wCharCode == m_wLineBreakChar) {
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          dwRet2 = FX_RTFBREAK_ParagraphBreak;
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwRet2 != FX_RTFBREAK_None) {
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwRet2 = EndBreak(dwRet2);
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return dwRet2;
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar,
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t iRotation) {
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pLastChar = NULL;
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t& iLineWidth = m_pCurLine->m_iWidth;
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharWidth = 0;
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR wForm;
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bAlef = FALSE;
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwCharType >= FX_CHARTYPE_ArabicAlef &&
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwCharType <= FX_CHARTYPE_ArabicDistortion) {
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pLastChar = GetLastChar(1);
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pLastChar != NULL) {
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iLineWidth -= pLastChar->m_iCharWidth;
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_RTFChar* pPrevChar = GetLastChar(2);
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wForm = m_pArabicChar->GetFormChar(pLastChar, pPrevChar, pCurChar);
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bAlef = (wForm == 0xFEFF &&
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef);
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation;
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_bVertical && (pLastChar->m_dwCharProps & 0x8000) != 0) {
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iLastRotation++;
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_bVertical != FX_IsOdd(iLastRotation)) {
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCharWidth = 1000;
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode))
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!m_pFont->GetCharWidth(pLastChar->m_wCharCode, iCharWidth,
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     m_bCharCode)) {
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            iCharWidth = m_iDefChar;
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth *= m_iFontSize;
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = iCharWidth * m_iHorizontalScale / 100;
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pLastChar->m_iCharWidth = iCharWidth;
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iLineWidth += iCharWidth;
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = 0;
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  wForm =
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pArabicChar->GetFormChar(pCurChar, (bAlef ? NULL : pLastChar), NULL);
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bVertical != FX_IsOdd(iRotation)) {
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharWidth = 1000;
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode))
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!m_pFont->GetCharWidth(pCurChar->m_wCharCode, iCharWidth,
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 m_bCharCode)) {
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCharWidth = m_iDefChar;
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth *= m_iFontSize;
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iCharWidth = iCharWidth;
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLineWidth += iCharWidth;
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iArabicChars++;
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bSingleLine && !m_bOrphanLine &&
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return EndBreak(FX_RTFBREAK_LineBreak);
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_RTFBREAK_None;
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar,
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t iRotation) {
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK);
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR wForm;
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwType == FX_CHARTYPE_Numeric) {
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) {
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wForm = pCurChar->m_wCharCode + 0x0630;
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wForm = pCurChar->m_wCharCode;
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_bRTL || m_bVertical) {
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wForm = FX_GetMirrorChar(pCurChar->m_wCharCode, pCurChar->m_dwCharProps,
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             m_bRTL, m_bVertical);
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wForm = pCurChar->m_wCharCode;
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharWidth = 0;
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bVertical != FX_IsOdd(iRotation)) {
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharWidth = 1000;
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) {
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = m_iDefChar;
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth *= m_iFontSize;
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth = iCharWidth * m_iHorizontalScale / 100;
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharWidth += m_iCharSpace;
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwType == FX_CHARTYPE_Space && m_bWordSpace) {
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharWidth += m_iWordSpace;
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurChar->m_iCharWidth = iCharWidth;
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iWidth += iCharWidth;
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space ||
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0);
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bSingleLine && !m_bOrphanLine && bBreak &&
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return EndBreak(FX_RTFBREAK_LineBreak);
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_RTFBREAK_None;
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_RTFBreak::EndBreak(FX_DWORD dwStatus) {
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(dwStatus >= FX_RTFBREAK_PieceBreak &&
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               dwStatus <= FX_RTFBREAK_PageBreak);
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwIdentity++;
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = pCurPieces->GetSize();
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCount > 0) {
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwStatus > FX_RTFBREAK_PieceBreak) {
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pLastPiece->m_dwStatus = dwStatus;
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwStatus = pLastPiece->m_dwStatus;
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return dwStatus;
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFLine* pLastLine = GetRTFLine(TRUE);
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pLastLine != NULL) {
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCurPieces = &pLastLine->m_LinePieces;
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCount = pCurPieces->GetSize();
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCount-- > 0) {
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (dwStatus > FX_RTFBREAK_PieceBreak) {
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pLastPiece->m_dwStatus = dwStatus;
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          dwStatus = pLastPiece->m_dwStatus;
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return dwStatus;
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FX_RTFBREAK_None;
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCount = m_pCurLine->CountChars();
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iCount < 1) {
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FX_RTFBREAK_None;
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1);
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tc.m_dwStatus = dwStatus;
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwStatus <= FX_RTFBREAK_PieceBreak) {
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return dwStatus;
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2;
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFLine* pNextLine =
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1;
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right);
653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_TPOArray tpos;
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) {
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    goto EndBreak_Ret;
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bCharCode) {
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    EndBreak_BidiLine(tpos, dwStatus);
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) {
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    EndBreak_Alignment(tpos, bAllChars, dwStatus);
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannEndBreak_Ret:
664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine = pNextLine;
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurLine->m_iStart = m_iBoundaryStart;
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pTC = GetLastChar(0);
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType();
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return dwStatus;
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine,
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_BOOL bAllChars,
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_DWORD dwStatus) {
673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bDone = FALSE;
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bSingleLine && !m_bOrphanLine &&
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) {
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1);
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (tc.GetCharType()) {
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case FX_CHARTYPE_Tab:
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) {
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          bDone = TRUE;
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case FX_CHARTYPE_Control:
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case FX_CHARTYPE_Space:
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if ((m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0) {
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          bDone = TRUE;
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      default:
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars);
694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bDone = TRUE;
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bPagination || m_pCurLine->m_iMBCSChars > 0) {
699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_RTFChar* pCurChars = m_pCurLine->m_LineChars.GetData();
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_RTFChar* pTC;
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFPiece tp;
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tp.m_pChars = &m_pCurLine->m_LineChars;
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bNew = TRUE;
705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dwIdentity = (FX_DWORD)-1;
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iLast = m_pCurLine->CountChars() - 1, j = 0;
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int32_t i = 0; i <= iLast;) {
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC = pCurChars + i;
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNew) {
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iStartChar = i;
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iStartPos += tp.m_iWidth;
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iWidth = 0;
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_dwStatus = pTC->m_dwStatus;
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iFontSize = pTC->m_iFontSize;
715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iFontHeight = pTC->m_iFontHeight;
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iVerticalScale = pTC->m_iVertialScale;
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_dwLayoutStyles = pTC->m_dwLayoutStyles;
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwIdentity = pTC->m_dwIdentity;
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_dwIdentity = dwIdentity;
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_pUserData = pTC->m_pUserData;
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        j = i;
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bNew = FALSE;
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (i == iLast || pTC->m_dwStatus != FX_RTFBREAK_None ||
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pTC->m_dwIdentity != dwIdentity) {
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iChars = i - j;
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pTC->m_dwIdentity == dwIdentity) {
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          tp.m_dwStatus = pTC->m_dwStatus;
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          tp.m_iWidth += pTC->m_iCharWidth;
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          tp.m_iChars += 1;
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          i++;
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCurPieces->Add(tp);
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bNew = TRUE;
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iWidth += pTC->m_iCharWidth;
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        i++;
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bAllChars && !bDone) {
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iEndPos = m_pCurLine->GetLineEnd();
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, TRUE);
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, FX_DWORD dwStatus) {
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_TPO tpo;
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPiece tp;
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pTC;
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i, j;
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFCharArray& chars = m_pCurLine->m_LineChars;
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = m_pCurLine->CountChars();
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bDone = (!m_bPagination && !m_bCharCode &&
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   (m_pCurLine->m_iArabicChars > 0 || m_bRTL));
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bDone) {
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iBidiNum = 0;
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (i = 0; i < iCount; i++) {
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC = chars.GetDataPtr(i);
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC->m_iBidiPos = i;
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pTC->GetCharType() != FX_CHARTYPE_Control) {
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iBidiNum = i;
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (i == 0) {
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pTC->m_iBidiLevel = 1;
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BidiLine(chars, iBidiNum + 1, m_bRTL ? 1 : 0);
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (i = 0; i < iCount; i++) {
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC = chars.GetDataPtr(i);
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC->m_iBidiLevel = 0;
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC->m_iBidiPos = 0;
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pTC->m_iBidiOrder = 0;
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tp.m_dwStatus = FX_RTFBREAK_PieceBreak;
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tp.m_iStartPos = m_pCurLine->m_iStart;
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tp.m_pChars = &chars;
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iBidiLevel = -1, iCharWidth;
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwIdentity = (FX_DWORD)-1;
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  i = j = 0;
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i < iCount) {
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pTC = chars.GetDataPtr(i);
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iBidiLevel < 0) {
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iBidiLevel = pTC->m_iBidiLevel;
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = pTC->m_iCharWidth;
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCharWidth < 1) {
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iWidth = 0;
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iWidth = iCharWidth;
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iBidiLevel = iBidiLevel;
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iBidiPos = pTC->m_iBidiOrder;
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iFontSize = pTC->m_iFontSize;
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iFontHeight = pTC->m_iFontHeight;
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iHorizontalScale = pTC->m_iHorizontalScale;
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iVerticalScale = pTC->m_iVertialScale;
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwIdentity = pTC->m_dwIdentity;
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_dwIdentity = dwIdentity;
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_pUserData = pTC->m_pUserData;
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_dwStatus = FX_RTFBREAK_PieceBreak;
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      i++;
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (iBidiLevel != pTC->m_iBidiLevel ||
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               pTC->m_dwIdentity != dwIdentity) {
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iChars = i - tp.m_iStartChar;
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCurPieces->Add(tp);
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iStartPos += tp.m_iWidth;
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tp.m_iStartChar = i;
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tpo.index = j++;
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tpo.pos = tp.m_iBidiPos;
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tpos.Add(tpo);
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iBidiLevel = -1;
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = pTC->m_iCharWidth;
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCharWidth > 0) {
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tp.m_iWidth += iCharWidth;
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      i++;
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i > tp.m_iStartChar) {
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tp.m_dwStatus = dwStatus;
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tp.m_iChars = i - tp.m_iStartChar;
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCurPieces->Add(tp);
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tpo.index = j;
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tpo.pos = tp.m_iBidiPos;
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tpos.Add(tpo);
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bCharCode) {
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    j = tpos.GetSize() - 1;
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_TEXTLAYOUT_PieceSort(tpos, 0, j);
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iStartPos = m_pCurLine->m_iStart;
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (i = 0; i <= j; i++) {
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tpo = tpos.GetAt(i);
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ttp.m_iStartPos = iStartPos;
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStartPos += ttp.m_iWidth;
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray& tpos,
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL bAllChars,
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_DWORD dwStatus) {
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces;
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth;
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = pCurPieces->GetSize();
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bFind = FALSE;
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwCharType;
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i, j;
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_TPO tpo;
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = iCount - 1; i > -1; i--) {
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tpo = tpos.GetAt(i);
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bFind) {
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iNetWidth = ttp.GetEndPos();
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel);
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    j = bArabic ? 0 : ttp.m_iChars - 1;
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (j > -1 && j < ttp.m_iChars) {
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CFX_RTFChar& tc = ttp.GetChar(j);
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) {
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iGapChars++;
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!bFind || !bAllChars) {
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        dwCharType = tc.GetCharType();
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (dwCharType == FX_CHARTYPE_Space ||
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            dwCharType == FX_CHARTYPE_Control) {
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!bFind) {
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            iCharWidth = tc.m_iCharWidth;
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (bAllChars && iCharWidth > 0) {
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              iNetWidth -= iCharWidth;
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          bFind = TRUE;
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!bAllChars) {
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            break;
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      j += bArabic ? 1 : -1;
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bAllChars && bFind) {
888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iOffset = m_iBoundaryEnd - iNetWidth;
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLowerAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_LowerMask);
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iHigherAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_HigherMask);
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iGapChars > 0 && (iHigherAlignment == FX_RTFLINEALIGNMENT_Distributed ||
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        (iHigherAlignment == FX_RTFLINEALIGNMENT_Justified &&
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         dwStatus != FX_RTFBREAK_ParagraphBreak))) {
897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iStart = -1;
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (i = 0; i < iCount; i++) {
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      tpo = tpos.GetAt(i);
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index);
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iStart < 0) {
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iStart = ttp.m_iStartPos;
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ttp.m_iStartPos = iStart;
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t k;
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (j = 0; j < ttp.m_iChars; j++) {
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RTFChar& tc = ttp.GetChar(j);
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (tc.m_nBreakType != FX_LBT_DIRECT_BRK || tc.m_iCharWidth < 0) {
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        k = iOffset / iGapChars;
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        tc.m_iCharWidth += k;
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ttp.m_iWidth += k;
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iOffset -= k;
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iGapChars--;
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iGapChars < 1) {
918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart += ttp.m_iWidth;
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (iLowerAlignment > FX_RTFLINEALIGNMENT_Left) {
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iLowerAlignment == FX_RTFLINEALIGNMENT_Center) {
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iOffset /= 2;
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iOffset > 0) {
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (i = 0; i < iCount; i++) {
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RTFPiece& ttp = pCurPieces->GetAt(i);
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ttp.m_iStartPos += iOffset;
931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca,
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  int32_t& iEndPos,
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  FX_BOOL bAllChars,
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  FX_BOOL bOnlyBrk) {
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = tca.GetSize() - 1;
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength < 1) {
941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return iLength;
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1,
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iLast = -1, iLastPos = -1;
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) {
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bAllChars || m_bCharCode) {
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return iLength;
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iBreak = iLength;
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iBreakPos = iEndPos;
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pCharArray = tca.GetData();
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bCharCode) {
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_RTFChar* pChar;
955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iCharWidth;
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (iLength > 0) {
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iEndPos <= m_iBoundaryEnd) {
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pChar = pCharArray + iLength--;
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = pChar->m_iCharWidth;
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCharWidth > 0) {
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iEndPos -= iCharWidth;
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return iLength;
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bSpaceBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0;
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bTabBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0;
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bNumberBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_NumberBreak) != 0;
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bInfixBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_InfixBreak) != 0;
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_LINEBREAKTYPE eType;
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD nCodeProp, nCur, nNext;
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pCur = pCharArray + iLength--;
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bAllChars) {
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCur->m_nBreakType = FX_LBT_UNKNOWN;
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nCodeProp = pCur->m_dwCharProps;
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nNext = nCodeProp & 0x003F;
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharWidth = pCur->m_iCharWidth;
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCharWidth > 0) {
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iEndPos -= iCharWidth;
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (iLength >= 0) {
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCur = pCharArray + iLength;
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nCodeProp = pCur->m_dwCharProps;
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nCur = nCodeProp & 0x003F;
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bNeedBreak = FALSE;
989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nCur == FX_CBP_SP) {
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bNeedBreak = !bSpaceBreak;
991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nNext == FX_CBP_SP) {
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  (nCur << 5) + nNext);
996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (nCur == FX_CBP_TB) {
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bNeedBreak = !bTabBreak;
999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nNext == FX_CBP_TB) {
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        eType = bTabBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK;
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  (nCur << 5) + nNext);
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) {
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      eType = FX_LBT_DIRECT_BRK;
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (bInfixBreak && nCur == FX_CBP_IS && nNext == FX_CBP_IS) {
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      eType = FX_LBT_DIRECT_BRK;
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nNext == FX_CBP_SP) {
1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        eType = FX_LBT_PROHIBITED_BRK;
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        eType = *((const FX_LINEBREAKTYPE*)gs_FX_LineBreak_PairTable +
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  (nCur << 5) + nNext);
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bAllChars) {
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCur->m_nBreakType = eType;
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bOnlyBrk) {
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = pCur->m_iCharWidth;
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_BOOL bBreak = FALSE;
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nCur == FX_CBP_TB && bTabBreak) {
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iBoundaryEnd;
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bBreak = iEndPos <= m_iBoundaryEnd;
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) {
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) {
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iBreak = iLength;
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iBreakPos = iEndPos;
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!bAllChars) {
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            return iLength;
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) {
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iIndirect = iLength;
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iIndirectPos = iEndPos;
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iLast < 0) {
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iLast = iLength;
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iLastPos = iEndPos;
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCharWidth > 0) {
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iEndPos -= iCharWidth;
1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nNext = nCodeProp & 0x003F;
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iLength--;
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bOnlyBrk) {
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iBreak > -1) {
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iEndPos = iBreakPos;
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return iBreak;
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iIndirect > -1) {
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iEndPos = iIndirectPos;
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return iIndirect;
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLast > -1) {
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iEndPos = iLastPos;
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return iLast;
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine,
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 CFX_RTFLine* pNextLine,
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_BOOL bAllChars) {
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pCurLine != NULL && pNextLine != NULL);
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = pCurLine->CountChars();
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCount < 2) {
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iEndPos = pCurLine->GetLineEnd();
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFCharArray& curChars = pCurLine->m_LineChars;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE);
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCharPos < 0) {
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharPos = 0;
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCharPos++;
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCharPos >= iCount) {
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNextLine->RemoveAll(TRUE);
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1);
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pTC->m_nBreakType = FX_LBT_UNKNOWN;
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFCharArray& nextChars = pNextLine->m_LineChars;
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int cur_size = curChars.GetSize();
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nextChars.SetSize(cur_size - iCharPos);
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos),
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               (cur_size - iCharPos) * sizeof(CFX_RTFChar));
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCount -= iCharPos;
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cur_size = curChars.GetSize();
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  curChars.RemoveAt(cur_size - iCount, iCount);
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pNextLine->m_iStart = pCurLine->m_iStart;
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pNextLine->m_iWidth = pCurLine->GetLineEnd() - iEndPos;
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCurLine->m_iWidth = iEndPos;
1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* tc = curChars.GetDataPtr(iCharPos - 1);
1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tc->m_nBreakType = FX_LBT_UNKNOWN;
1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCount = nextChars.GetSize();
1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFChar* pNextChars = nextChars.GetData();
1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < iCount; i++) {
1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_RTFChar* tc = pNextChars + i;
1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (tc->GetCharType() >= FX_CHARTYPE_ArabicAlef) {
1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCurLine->m_iArabicChars--;
1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pNextLine->m_iArabicChars++;
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (tc->m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) {
1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCurLine->m_iMBCSChars--;
1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pNextLine->m_iMBCSChars++;
1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    tc->m_dwStatus = 0;
1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_RTFBreak::CountBreakPieces() const {
1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE);
1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRTFPieces == NULL) {
1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pRTFPieces->GetSize();
1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const {
1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE);
1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRTFPieces == NULL) {
1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0 || index >= pRTFPieces->GetSize()) {
1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pRTFPieces->GetPtrAt(index);
1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const {
1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.top = 0;
1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFLine* pRTFLine = GetRTFLine(TRUE);
1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRTFLine == NULL) {
1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.left = ((FX_FLOAT)m_iBoundaryStart) / 20000.0f;
1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.width = rect.height = 0;
1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f;
1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f;
1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces;
1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = rtfPieces.GetSize();
1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCount < 1) {
1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.width = 0;
1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFPiece* pBreakPiece;
1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLineHeight = 0, iMax;
1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < iCount; i++) {
1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pBreakPiece = rtfPieces.GetPtrAt(i);
1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iFontHeight = FXSYS_round(pBreakPiece->m_iFontHeight *
1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      pBreakPiece->m_iVerticalScale / 100.0f);
1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iMax = std::max(pBreakPiece->m_iFontSize, iFontHeight);
1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (i == 0) {
1158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iLineHeight = iMax;
1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (iLineHeight < iMax) {
1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iLineHeight = iMax;
1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.height = ((FX_FLOAT)iLineHeight) / 20.0f;
1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::ClearBreakPieces() {
1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RTFLine* pRTFLine = GetRTFLine(TRUE);
1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRTFLine != NULL) {
1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pRTFLine->RemoveAll(TRUE);
1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iReady = 0;
1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_RTFBreak::Reset() {
1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwCharType = 0;
1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_RTFLine1.RemoveAll(TRUE);
1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_RTFLine2.RemoveAll(TRUE);
1176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_RTFBreak::GetDisplayPos(FX_LPCRTFTEXTOBJ pText,
1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FXTEXT_CHARPOS* pCharPos,
1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_BOOL bCharCode,
1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    CFX_WideString* pWSForms,
1181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_AdjustCharDisplayPos pAdjustPos) const {
1182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pText == NULL || pText->iLength < 1) {
1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL &&
1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               pText->pFont != NULL && pText->pRect != NULL);
1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_WCHAR* pStr = pText->pStr;
1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t* pWidths = pText->pWidths;
1189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = pText->iLength - 1;
1190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_Font* pFont = pText->pFont;
1191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwStyles = pText->dwLayoutStyles;
1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RectF rtText(*pText->pRect);
1193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel);
1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFontSize = pText->fFontSize;
1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iAscent = pFont->GetAscent();
1197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iDescent = pFont->GetDescent();
1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iMaxHeight = iAscent - iDescent;
1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFontHeight = fFontSize;
1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight;
1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight;
1202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bVerticalDoc = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0;
1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bVerticalChar = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0;
1204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bArabicNumber = (dwStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) != 0;
1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0;
1206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iRotation = GetLineRotation(dwStyles) + pText->iCharRotation;
1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharRotation;
1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm;
1209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iWidth, iCharWidth, iCharHeight;
1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fX, fY, fCharWidth, fCharHeight;
1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iHorScale = pText->iHorizontalScale;
1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iVerScale = pText->iVerticalScale;
1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bEmptyChar;
1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwProps, dwCharType;
1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fX = rtText.left;
1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fY = rtText.top;
1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bVerticalDoc) {
1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fX += (rtText.width - fFontSize) / 2.0f;
1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bRTLPiece) {
1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fY = rtText.bottom();
1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bRTLPiece) {
1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fX = rtText.right();
1225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fY += fAscent;
1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = 0;
1229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i <= iLength; i++) {
1230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wch = *pStr++;
1231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iWidth = *pWidths++;
1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bMBCSCode) {
1233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwProps = FX_GetUnicodeProperties(wch);
1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
1236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        wPrev = 0xFEFF;
1237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
1238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwProps = 0;
1241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwCharType = 0;
1242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iWidth != 0) {
1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharWidth = iWidth;
1245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCharWidth < 0) {
1246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCharWidth = -iCharWidth;
1247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!bMBCSCode) {
1249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab &&
1250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                      dwCharType <= FX_CHARTYPE_Control);
1251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bEmptyChar = FALSE;
1253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!bEmptyChar) {
1255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCount++;
1256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pCharPos != NULL) {
1258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCharWidth /= iFontSize;
1259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        wForm = wch;
1260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bMBCSCode) {
1261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (dwCharType >= FX_CHARTYPE_ArabicAlef) {
1262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (i < iLength) {
1263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              wNext = *pStr;
1264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              if (*pWidths < 0) {
1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                if (i + 1 < iLength) {
1266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  wNext = pStr[1];
1267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                }
1268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              }
1269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else {
1270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              wNext = 0xFEFF;
1271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
1272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            wForm = m_pArabicChar->GetFormChar(wch, wPrev, wNext);
1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else if (bRTLPiece || bVerticalChar) {
1274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            wForm = FX_GetMirrorChar(wch, dwProps, bRTLPiece, bVerticalChar);
1275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else if (dwCharType == FX_CHARTYPE_Numeric && bArabicNumber) {
1276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            wForm = wch + 0x0630;
1277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          dwProps = FX_GetUnicodeProperties(wForm);
1279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCharRotation = iRotation;
1281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bMBCSCode && bVerticalChar && (dwProps & 0x8000) != 0) {
1282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iCharRotation++;
1283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iCharRotation %= 4;
1284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bEmptyChar) {
1286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (bCharCode) {
1287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pCharPos->m_GlyphIndex = wch;
1288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
1289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wForm, bMBCSCode);
1290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (pCharPos->m_GlyphIndex == 0xFFFF) {
1291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wch, bMBCSCode);
1292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
1293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCharPos->m_ExtGID = pCharPos->m_GlyphIndex;
1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCharPos->m_FontCharWidth = iCharWidth;
1296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (pWSForms) {
1297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            *pWSForms += wForm;
1298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bVerticalDoc) {
1301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iCharHeight = iCharWidth;
1302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iCharWidth = 1000;
1303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
1304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iCharHeight = 1000;
1305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fCharWidth = fFontSize * iCharWidth / 1000.0f;
1307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fCharHeight = fFontSize * iCharHeight / 1000.0f;
1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bMBCSCode && bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
1309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (bVerticalDoc) {
1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            fY -= fCharHeight;
1311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
1312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            fX -= fCharWidth;
1313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bEmptyChar) {
1316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CFX_PointF ptOffset;
1317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ptOffset.Reset();
1318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_BOOL bAdjusted = FALSE;
1319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (pAdjustPos) {
1320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bAdjusted = pAdjustPos(wForm, bMBCSCode, pFont, fFontSize,
1321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   bVerticalChar, ptOffset);
1322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!pAdjustPos && bVerticalChar && (dwProps & 0x00010000) != 0) {
1324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CFX_Rect rtBBox;
1325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rtBBox.Reset();
1326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (pFont->GetCharBBox(wForm, rtBBox, bMBCSCode)) {
1327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              ptOffset.x = fFontSize * (850 - rtBBox.right()) / 1000.0f;
1328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              ptOffset.y = fFontSize * (1000 - rtBBox.height) / 2000.0f;
1329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
1330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCharPos->m_OriginX = fX + ptOffset.x;
1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCharPos->m_OriginY = fY - ptOffset.y;
1333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) {
1335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (bVerticalDoc) {
1336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            fY += fCharHeight;
1337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
1338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            fX += fCharWidth;
1339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!bEmptyChar) {
1342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCharPos->m_bGlyphAdjust = TRUE;
1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (bVerticalDoc) {
1344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (iCharRotation == 0) {
1345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = -1;
1346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = 0;
1347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = 0;
1348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = 1;
1349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginY += fAscent * iVerScale / 100.0f;
1350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else if (iCharRotation == 1) {
1351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = 0;
1352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = -1;
1353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = -1;
1354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = 0;
1355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginX -=
1356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  fDescent + fAscent * iVerScale / 100.0f - fAscent;
1357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else if (iCharRotation == 2) {
1358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = 1;
1359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = 0;
1360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = 0;
1361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = -1;
1362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginX += fCharWidth;
1363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginY += fAscent;
1364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else {
1365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = 0;
1366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = 1;
1367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = 1;
1368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = 0;
1369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginX += fAscent;
1370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginY += fCharWidth;
1371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
1372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
1373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (iCharRotation == 0) {
1374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = -1;
1375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = 0;
1376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = 0;
1377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = 1;
1378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginY += fAscent * iVerScale / 100.0f - fAscent;
1379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else if (iCharRotation == 1) {
1380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = 0;
1381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = -1;
1382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = -1;
1383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = 0;
1384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginX -= fDescent;
1385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginY -= fAscent + fDescent;
1386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else if (iCharRotation == 2) {
1387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = 1;
1388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = 0;
1389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = 0;
1390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = -1;
1391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginX += fCharWidth;
1392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginY -= fAscent;
1393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            } else {
1394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[0] = 0;
1395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[1] = 1;
1396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[2] = 1;
1397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_AdjustMatrix[3] = 0;
1398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              pCharPos->m_OriginX += fAscent * iVerScale / 100.0f;
1399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
1400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (iHorScale != 100 || iVerScale != 100) {
1402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pCharPos->m_AdjustMatrix[0] =
1403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                pCharPos->m_AdjustMatrix[0] * iHorScale / 100.0f;
1404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pCharPos->m_AdjustMatrix[1] =
1405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                pCharPos->m_AdjustMatrix[1] * iHorScale / 100.0f;
1406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pCharPos->m_AdjustMatrix[2] =
1407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                pCharPos->m_AdjustMatrix[2] * iVerScale / 100.0f;
1408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pCharPos->m_AdjustMatrix[3] =
1409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f;
1410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCharPos++;
1412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iWidth > 0) {
1416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wPrev = wch;
1417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iCount;
1420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_RTFBreak::GetCharRects(FX_LPCRTFTEXTOBJ pText,
1422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   CFX_RectFArray& rtArray,
1423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_BOOL bCharBBox) const {
1424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pText == NULL || pText->iLength < 1) {
1425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pText->pStr != NULL && pText->pWidths != NULL &&
1428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               pText->pFont != NULL && pText->pRect != NULL);
1429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_WCHAR* pStr = pText->pStr;
1430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t* pWidths = pText->pWidths;
1431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = pText->iLength;
1432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RectF rect(*pText->pRect);
1433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel);
1434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFontSize = pText->fFontSize;
1435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
1436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fScale = fFontSize / 1000.0f;
1437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_Font* pFont = pText->pFont;
1438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFont == NULL) {
1439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bCharBBox = FALSE;
1440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Rect bbox;
1442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bbox.Set(0, 0, 0, 0);
1443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bCharBBox) {
1444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bCharBBox = pFont->GetBBox(bbox);
1445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale);
1447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale);
1448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtArray.RemoveAll();
1449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rtArray.SetSize(iLength);
1450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwStyles = pText->dwLayoutStyles;
1451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bVertical = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0;
1452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bSingleLine = (dwStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0;
1453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bCombText = (dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0;
1454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR wch, wLineBreakChar = pText->wLineBreakChar;
1455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCharSize;
1456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fCharSize, fStart;
1457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bVertical) {
1458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fStart = bRTLPiece ? rect.bottom() : rect.top;
1459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fStart = bRTLPiece ? rect.right() : rect.left;
1461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < iLength; i++) {
1463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wch = *pStr++;
1464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iCharSize = *pWidths++;
1465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fCharSize = (FX_FLOAT)iCharSize / 20000.0f;
1466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch));
1467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 ||
1468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) {
1469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bRet = FALSE;
1470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bRet) {
1472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iCharSize = iFontSize * 500;
1473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fCharSize = fFontSize / 2.0f;
1474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bVertical) {
1476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect.top = fStart;
1477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bRTLPiece) {
1478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.top -= fCharSize;
1479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fStart -= fCharSize;
1480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fStart += fCharSize;
1482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect.height = fCharSize;
1484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect.left = fStart;
1486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bRTLPiece) {
1487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.left -= fCharSize;
1488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fStart -= fCharSize;
1489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fStart += fCharSize;
1491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect.width = fCharSize;
1493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bCharBBox && !bRet) {
1495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t iCharWidth = 1000;
1496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pFont->GetCharWidth(wch, iCharWidth);
1497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_FLOAT fRTLeft = 0, fCharWidth = 0;
1498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCharWidth > 0) {
1499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fCharWidth = iCharWidth * fScale;
1500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fRTLeft = fLeft;
1501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bCombText) {
1502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fRTLeft = (rect.width - fCharWidth) / 2.0f;
1503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_RectF rtBBoxF;
1506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bVertical) {
1507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.top = rect.left + fRTLeft;
1508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.left = rect.top + (rect.height - fHeight) / 2.0f;
1509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.height = fCharWidth;
1510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.width = fHeight;
1511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.left = std::max(rtBBoxF.left, 0.0f);
1512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.left = rect.left + fRTLeft;
1514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.top = rect.top + (rect.height - fHeight) / 2.0f;
1515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.width = fCharWidth;
1516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.height = fHeight;
1517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtBBoxF.top = std::max(rtBBoxF.top, 0.0f);
1518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rtArray.SetAt(i, rtBBoxF);
1520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
1521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rtArray.SetAt(i, rect);
1523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLength;
1525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1526