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