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