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