Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fgas/layout/fgas_textbreak.h" | 7 #include "xfa/fgas/layout/fgas_textbreak.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 m_eCharType(FX_CHARTYPE_Unknown), | 62 m_eCharType(FX_CHARTYPE_Unknown), |
| 63 m_bArabicNumber(FALSE), | 63 m_bArabicNumber(FALSE), |
| 64 m_bArabicComma(FALSE), | 64 m_bArabicComma(FALSE), |
| 65 m_pCurLine(nullptr), | 65 m_pCurLine(nullptr), |
| 66 m_iReady(0), | 66 m_iReady(0), |
| 67 m_iTolerance(0), | 67 m_iTolerance(0), |
| 68 m_iHorScale(100), | 68 m_iHorScale(100), |
| 69 m_iVerScale(100), | 69 m_iVerScale(100), |
| 70 m_iCharSpace(0) { | 70 m_iCharSpace(0) { |
| 71 m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0; | 71 m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0; |
| 72 if (m_bPagination) { | 72 if (m_bPagination) { |
|
Lei Zhang
2016/08/04 18:49:31
int32_t iSize = m_bPagination ? sizeof(CFX_Char) :
Wei Li
2016/08/04 22:16:04
Done.
| |
| 73 m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_Char)); | 73 m_pTxtLine1.reset(new CFX_TxtLine(sizeof(CFX_Char))); |
| 74 m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_Char)); | 74 m_pTxtLine2.reset(new CFX_TxtLine(sizeof(CFX_Char))); |
| 75 } else { | 75 } else { |
| 76 m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_TxtChar)); | 76 m_pTxtLine1.reset(new CFX_TxtLine(sizeof(CFX_TxtChar))); |
| 77 m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_TxtChar)); | 77 m_pTxtLine2.reset(new CFX_TxtLine(sizeof(CFX_TxtChar))); |
| 78 } | 78 } |
| 79 m_pCurLine = m_pTxtLine1; | 79 m_pCurLine = m_pTxtLine1.get(); |
| 80 ResetArabicContext(); | 80 ResetArabicContext(); |
| 81 } | 81 } |
| 82 | |
| 82 CFX_TxtBreak::~CFX_TxtBreak() { | 83 CFX_TxtBreak::~CFX_TxtBreak() { |
| 83 Reset(); | 84 Reset(); |
| 84 delete m_pTxtLine1; | |
| 85 delete m_pTxtLine2; | |
| 86 } | 85 } |
| 86 | |
| 87 void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) { | 87 void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) { |
| 88 m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f); | 88 m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f); |
| 89 ASSERT(m_iLineWidth >= 20000); | 89 ASSERT(m_iLineWidth >= 20000); |
| 90 } | 90 } |
| 91 | |
| 91 void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) { | 92 void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) { |
| 92 int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); | 93 int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); |
| 93 if (iLinePos < 0) { | 94 if (iLinePos < 0) { |
| 94 iLinePos = 0; | 95 iLinePos = 0; |
| 95 } | 96 } |
| 96 if (iLinePos > m_iLineWidth) { | 97 if (iLinePos > m_iLineWidth) { |
| 97 iLinePos = m_iLineWidth; | 98 iLinePos = m_iLineWidth; |
| 98 } | 99 } |
| 99 m_pCurLine->m_iStart = iLinePos; | 100 m_pCurLine->m_iStart = iLinePos; |
| 100 m_pCurLine->m_iWidth += iLinePos; | 101 m_pCurLine->m_iWidth += iLinePos; |
| 101 } | 102 } |
| 103 | |
| 102 void CFX_TxtBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { | 104 void CFX_TxtBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { |
| 103 m_dwLayoutStyles = dwLayoutStyles; | 105 m_dwLayoutStyles = dwLayoutStyles; |
| 104 m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; | 106 m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0; |
| 105 m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0; | 107 m_bArabicContext = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicContext) != 0; |
| 106 m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0; | 108 m_bArabicShapes = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ArabicShapes) != 0; |
| 107 m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0; | 109 m_bRTL = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_RTLReadingOrder) != 0; |
| 108 m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; | 110 m_bSingleLine = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_SingleLine) != 0; |
| 109 m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; | 111 m_bCombText = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; |
| 110 ResetArabicContext(); | 112 ResetArabicContext(); |
| 111 m_iLineRotation = GetLineRotation(m_dwLayoutStyles); | 113 m_iLineRotation = GetLineRotation(m_dwLayoutStyles); |
| 112 m_iRotation = m_iLineRotation + m_iCharRotation; | 114 m_iRotation = m_iLineRotation + m_iCharRotation; |
| 113 m_iRotation %= 4; | 115 m_iRotation %= 4; |
| 114 } | 116 } |
| 117 | |
| 115 void CFX_TxtBreak::SetFont(CFGAS_GEFont* pFont) { | 118 void CFX_TxtBreak::SetFont(CFGAS_GEFont* pFont) { |
| 116 if (!pFont) { | 119 if (!pFont) { |
| 117 return; | 120 return; |
| 118 } | 121 } |
| 119 if (m_pFont == pFont) { | 122 if (m_pFont == pFont) { |
| 120 return; | 123 return; |
| 121 } | 124 } |
| 122 SetBreakStatus(); | 125 SetBreakStatus(); |
| 123 m_pFont = pFont; | 126 m_pFont = pFont; |
| 124 m_iDefChar = 0; | 127 m_iDefChar = 0; |
| 125 if (m_wDefChar != 0xFEFF && m_pFont) { | 128 if (m_wDefChar != 0xFEFF && m_pFont) { |
| 126 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 129 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
| 127 m_iDefChar *= m_iFontSize; | 130 m_iDefChar *= m_iFontSize; |
| 128 } | 131 } |
| 129 } | 132 } |
| 133 | |
| 130 void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) { | 134 void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) { |
| 131 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 135 int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |
| 132 if (m_iFontSize == iFontSize) { | 136 if (m_iFontSize == iFontSize) { |
| 133 return; | 137 return; |
| 134 } | 138 } |
| 135 SetBreakStatus(); | 139 SetBreakStatus(); |
| 136 m_iFontSize = iFontSize; | 140 m_iFontSize = iFontSize; |
| 137 m_iDefChar = 0; | 141 m_iDefChar = 0; |
| 138 if (m_wDefChar != 0xFEFF && m_pFont) { | 142 if (m_wDefChar != 0xFEFF && m_pFont) { |
| 139 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 143 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
| 140 m_iDefChar *= m_iFontSize; | 144 m_iDefChar *= m_iFontSize; |
| 141 } | 145 } |
| 142 } | 146 } |
| 147 | |
| 143 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) { | 148 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) { |
| 144 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); | 149 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); |
| 145 if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { | 150 if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) { |
| 146 m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; | 151 m_iTabWidth = FX_TXTBREAK_MinimumTabWidth; |
| 147 } | 152 } |
| 148 m_bEquidistant = bEquidistant; | 153 m_bEquidistant = bEquidistant; |
| 149 } | 154 } |
| 155 | |
| 150 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { | 156 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) { |
| 151 m_wDefChar = wch; | 157 m_wDefChar = wch; |
| 152 m_iDefChar = 0; | 158 m_iDefChar = 0; |
| 153 if (m_wDefChar != 0xFEFF && m_pFont) { | 159 if (m_wDefChar != 0xFEFF && m_pFont) { |
| 154 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 160 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
| 155 if (m_iDefChar < 0) { | 161 if (m_iDefChar < 0) { |
| 156 m_iDefChar = 0; | 162 m_iDefChar = 0; |
| 157 } else { | 163 } else { |
| 158 m_iDefChar *= m_iFontSize; | 164 m_iDefChar *= m_iFontSize; |
| 159 } | 165 } |
| 160 } | 166 } |
| 161 } | 167 } |
| 168 | |
| 162 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { | 169 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) { |
| 163 if (wch != L'\r' && wch != L'\n') { | 170 if (wch != L'\r' && wch != L'\n') { |
| 164 return; | 171 return; |
| 165 } | 172 } |
| 166 m_wParagBreakChar = wch; | 173 m_wParagBreakChar = wch; |
| 167 } | 174 } |
| 175 | |
| 168 void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) { | 176 void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) { |
| 169 m_iTolerance = FXSYS_round(fTolerance * 20000.0f); | 177 m_iTolerance = FXSYS_round(fTolerance * 20000.0f); |
| 170 } | 178 } |
| 179 | |
| 171 void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) { | 180 void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) { |
| 172 if (iCharRotation < 0) { | 181 if (iCharRotation < 0) { |
| 173 iCharRotation += (-iCharRotation / 4 + 1) * 4; | 182 iCharRotation += (-iCharRotation / 4 + 1) * 4; |
| 174 } else if (iCharRotation > 3) { | 183 } else if (iCharRotation > 3) { |
| 175 iCharRotation -= (iCharRotation / 4) * 4; | 184 iCharRotation -= (iCharRotation / 4) * 4; |
| 176 } | 185 } |
| 177 if (m_iCharRotation == iCharRotation) { | 186 if (m_iCharRotation == iCharRotation) { |
| 178 return; | 187 return; |
| 179 } | 188 } |
| 180 SetBreakStatus(); | 189 SetBreakStatus(); |
| 181 m_iCharRotation = iCharRotation; | 190 m_iCharRotation = iCharRotation; |
| 182 m_iRotation = m_iLineRotation + m_iCharRotation; | 191 m_iRotation = m_iLineRotation + m_iCharRotation; |
| 183 m_iRotation %= 4; | 192 m_iRotation %= 4; |
| 184 } | 193 } |
| 194 | |
| 185 void CFX_TxtBreak::SetAlignment(int32_t iAlignment) { | 195 void CFX_TxtBreak::SetAlignment(int32_t iAlignment) { |
| 186 ASSERT(iAlignment >= FX_TXTLINEALIGNMENT_Left && | 196 ASSERT(iAlignment >= FX_TXTLINEALIGNMENT_Left && |
| 187 iAlignment <= FX_TXTLINEALIGNMENT_Distributed); | 197 iAlignment <= FX_TXTLINEALIGNMENT_Distributed); |
| 188 m_iAlignment = iAlignment; | 198 m_iAlignment = iAlignment; |
| 189 ResetArabicContext(); | 199 ResetArabicContext(); |
| 190 } | 200 } |
| 201 | |
| 191 void CFX_TxtBreak::ResetContextCharStyles() { | 202 void CFX_TxtBreak::ResetContextCharStyles() { |
| 192 m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment; | 203 m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment; |
| 193 if (m_bArabicNumber) { | 204 if (m_bArabicNumber) { |
| 194 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber; | 205 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicNumber; |
| 195 } | 206 } |
| 196 if (m_bArabicComma) { | 207 if (m_bArabicComma) { |
| 197 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma; | 208 m_dwContextCharStyles |= FX_TXTCHARSTYLE_ArabicComma; |
| 198 } | 209 } |
| 199 if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) { | 210 if ((m_bArabicContext && m_bCurRTL) || (!m_bArabicContext && m_bRTL)) { |
| 200 m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder; | 211 m_dwContextCharStyles |= FX_TXTCHARSTYLE_RTLReadingOrder; |
| 201 } | 212 } |
| 202 m_dwContextCharStyles |= (m_iArabicContext << 8); | 213 m_dwContextCharStyles |= (m_iArabicContext << 8); |
| 203 } | 214 } |
| 215 | |
| 204 uint32_t CFX_TxtBreak::GetContextCharStyles() const { | 216 uint32_t CFX_TxtBreak::GetContextCharStyles() const { |
| 205 return m_dwContextCharStyles; | 217 return m_dwContextCharStyles; |
| 206 } | 218 } |
| 219 | |
| 207 void CFX_TxtBreak::SetContextCharStyles(uint32_t dwCharStyles) { | 220 void CFX_TxtBreak::SetContextCharStyles(uint32_t dwCharStyles) { |
| 208 m_iCurAlignment = dwCharStyles & 0x0F; | 221 m_iCurAlignment = dwCharStyles & 0x0F; |
| 209 m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; | 222 m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0; |
| 210 m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; | 223 m_bArabicComma = (dwCharStyles & FX_TXTCHARSTYLE_ArabicComma) != 0; |
| 211 m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0; | 224 m_bCurRTL = (dwCharStyles & FX_TXTCHARSTYLE_RTLReadingOrder) != 0; |
| 212 m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8); | 225 m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8); |
| 213 ResetContextCharStyles(); | 226 ResetContextCharStyles(); |
| 214 } | 227 } |
| 228 | |
| 215 void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) { | 229 void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) { |
| 216 m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); | 230 m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f); |
| 217 } | 231 } |
| 232 | |
| 218 void CFX_TxtBreak::SetUserData(void* pUserData) { | 233 void CFX_TxtBreak::SetUserData(void* pUserData) { |
| 219 if (m_pUserData == pUserData) { | 234 if (m_pUserData == pUserData) { |
| 220 return; | 235 return; |
| 221 } | 236 } |
| 222 SetBreakStatus(); | 237 SetBreakStatus(); |
| 223 m_pUserData = pUserData; | 238 m_pUserData = pUserData; |
| 224 } | 239 } |
| 240 | |
| 225 void CFX_TxtBreak::SetBreakStatus() { | 241 void CFX_TxtBreak::SetBreakStatus() { |
| 226 if (m_bPagination) { | 242 if (m_bPagination) { |
| 227 return; | 243 return; |
| 228 } | 244 } |
| 229 int32_t iCount = m_pCurLine->CountChars(); | 245 int32_t iCount = m_pCurLine->CountChars(); |
| 230 if (iCount < 1) { | 246 if (iCount < 1) { |
| 231 return; | 247 return; |
| 232 } | 248 } |
| 233 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); | 249 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); |
| 234 if (pTC->m_dwStatus == 0) { | 250 if (pTC->m_dwStatus == 0) { |
| 235 pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; | 251 pTC->m_dwStatus = FX_TXTBREAK_PieceBreak; |
| 236 } | 252 } |
| 237 } | 253 } |
| 254 | |
| 238 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { | 255 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) { |
| 239 if (iScale < 0) { | 256 if (iScale < 0) { |
| 240 iScale = 0; | 257 iScale = 0; |
| 241 } | 258 } |
| 242 if (iScale == m_iHorScale) { | 259 if (iScale == m_iHorScale) { |
| 243 return; | 260 return; |
| 244 } | 261 } |
| 245 SetBreakStatus(); | 262 SetBreakStatus(); |
| 246 m_iHorScale = iScale; | 263 m_iHorScale = iScale; |
| 247 } | 264 } |
| 265 | |
| 248 void CFX_TxtBreak::SetVerticalScale(int32_t iScale) { | 266 void CFX_TxtBreak::SetVerticalScale(int32_t iScale) { |
| 249 if (iScale < 0) { | 267 if (iScale < 0) { |
| 250 iScale = 0; | 268 iScale = 0; |
| 251 } | 269 } |
| 252 if (iScale == m_iHorScale) { | 270 if (iScale == m_iHorScale) { |
| 253 return; | 271 return; |
| 254 } | 272 } |
| 255 SetBreakStatus(); | 273 SetBreakStatus(); |
| 256 m_iVerScale = iScale; | 274 m_iVerScale = iScale; |
| 257 } | 275 } |
| 276 | |
| 258 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { | 277 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) { |
| 259 m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); | 278 m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); |
| 260 } | 279 } |
| 280 | |
| 261 static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; | 281 static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2}; |
| 262 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { | 282 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const { |
| 263 return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; | 283 return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1]; |
| 264 } | 284 } |
| 285 | |
| 265 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const { | 286 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const { |
| 266 CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars; | 287 CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars.get(); |
| 267 int32_t iCount = ca.GetSize(); | 288 int32_t iCount = ca.GetSize(); |
| 268 if (index < 0 || index >= iCount) { | 289 if (index < 0 || index >= iCount) { |
| 269 return nullptr; | 290 return nullptr; |
| 270 } | 291 } |
| 271 CFX_TxtChar* pTC; | 292 CFX_TxtChar* pTC; |
| 272 int32_t iStart = iCount - 1; | 293 int32_t iStart = iCount - 1; |
| 273 while (iStart > -1) { | 294 while (iStart > -1) { |
| 274 pTC = ca.GetDataPtr(iStart--); | 295 pTC = ca.GetDataPtr(iStart--); |
| 275 if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { | 296 if (bOmitChar && pTC->GetCharType() == FX_CHARTYPE_Combination) { |
| 276 continue; | 297 continue; |
| 277 } | 298 } |
| 278 if (--index < 0) { | 299 if (--index < 0) { |
| 279 return pTC; | 300 return pTC; |
| 280 } | 301 } |
| 281 } | 302 } |
| 282 return nullptr; | 303 return nullptr; |
| 283 } | 304 } |
| 305 | |
| 284 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const { | 306 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const { |
| 285 if (!bReady) | 307 if (!bReady) |
| 286 return m_pCurLine; | 308 return m_pCurLine; |
| 287 if (m_iReady == 1) | 309 if (m_iReady == 1) |
| 288 return m_pTxtLine1; | 310 return m_pTxtLine1.get(); |
| 289 if (m_iReady == 2) | 311 if (m_iReady == 2) |
| 290 return m_pTxtLine2; | 312 return m_pTxtLine2.get(); |
| 291 return nullptr; | 313 return nullptr; |
| 292 } | 314 } |
| 315 | |
| 293 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const { | 316 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const { |
| 294 CFX_TxtLine* pTxtLine = GetTxtLine(bReady); | 317 CFX_TxtLine* pTxtLine = GetTxtLine(bReady); |
| 295 if (!pTxtLine) { | 318 if (!pTxtLine) { |
| 296 return nullptr; | 319 return nullptr; |
| 297 } | 320 } |
| 298 return pTxtLine->m_pLinePieces; | 321 return pTxtLine->m_pLinePieces.get(); |
| 299 } | 322 } |
| 323 | |
| 300 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( | 324 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType( |
| 301 FX_CHARTYPE chartype) const { | 325 FX_CHARTYPE chartype) const { |
| 302 return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; | 326 return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; |
| 303 } | 327 } |
| 328 | |
| 304 void CFX_TxtBreak::ResetArabicContext() { | 329 void CFX_TxtBreak::ResetArabicContext() { |
| 305 if (m_bArabicContext) { | 330 if (m_bArabicContext) { |
| 306 m_bCurRTL = m_iCurArabicContext > 1; | 331 m_bCurRTL = m_iCurArabicContext > 1; |
| 307 m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right | 332 m_iCurAlignment = m_iCurArabicContext > 1 ? FX_TXTLINEALIGNMENT_Right |
| 308 : FX_TXTLINEALIGNMENT_Left; | 333 : FX_TXTLINEALIGNMENT_Left; |
| 309 m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); | 334 m_iCurAlignment |= (m_iAlignment & FX_TXTLINEALIGNMENT_HigherMask); |
| 310 m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; | 335 m_bArabicNumber = m_iArabicContext >= 1 && m_bArabicShapes; |
| 311 } else { | 336 } else { |
| 312 if (m_bPagination) { | 337 if (m_bPagination) { |
| 313 m_bCurRTL = FALSE; | 338 m_bCurRTL = FALSE; |
| 314 m_iCurAlignment = 0; | 339 m_iCurAlignment = 0; |
| 315 } else { | 340 } else { |
| 316 m_bCurRTL = m_bRTL; | 341 m_bCurRTL = m_bRTL; |
| 317 m_iCurAlignment = m_iAlignment; | 342 m_iCurAlignment = m_iAlignment; |
| 318 } | 343 } |
| 319 if (m_bRTL) { | 344 if (m_bRTL) { |
| 320 m_bArabicNumber = m_iArabicContext >= 1; | 345 m_bArabicNumber = m_iArabicContext >= 1; |
| 321 } else { | 346 } else { |
| 322 m_bArabicNumber = m_iArabicContext > 1; | 347 m_bArabicNumber = m_iArabicContext > 1; |
| 323 } | 348 } |
| 324 m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; | 349 m_bArabicNumber = m_bArabicNumber && m_bArabicShapes; |
| 325 } | 350 } |
| 326 m_bArabicComma = m_bArabicNumber; | 351 m_bArabicComma = m_bArabicNumber; |
| 327 ResetContextCharStyles(); | 352 ResetContextCharStyles(); |
| 328 } | 353 } |
| 354 | |
| 329 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, | 355 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar, |
| 330 uint32_t dwProps) { | 356 uint32_t dwProps) { |
| 331 if (!m_bPagination) { | 357 if (!m_bPagination) { |
| 332 pCurChar->m_dwStatus = 0; | 358 pCurChar->m_dwStatus = 0; |
| 333 pCurChar->m_pUserData = m_pUserData; | 359 pCurChar->m_pUserData = m_pUserData; |
| 334 } | 360 } |
| 335 if (m_bArabicContext || m_bArabicShapes) { | 361 if (m_bArabicContext || m_bArabicShapes) { |
| 336 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; | 362 int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; |
| 337 int32_t iArabicContext = | 363 int32_t iArabicContext = |
| 338 (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) | 364 (iBidiCls == FX_BIDICLASS_R || iBidiCls == FX_BIDICLASS_AL) |
| 339 ? 2 | 365 ? 2 |
| 340 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 | 366 : ((iBidiCls == FX_BIDICLASS_L || iBidiCls == FX_BIDICLASS_S) ? 0 |
| 341 : 1); | 367 : 1); |
| 342 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { | 368 if (iArabicContext != m_iArabicContext && iArabicContext != 1) { |
| 343 m_iArabicContext = iArabicContext; | 369 m_iArabicContext = iArabicContext; |
| 344 if (m_iCurArabicContext == 1) { | 370 if (m_iCurArabicContext == 1) { |
| 345 m_iCurArabicContext = iArabicContext; | 371 m_iCurArabicContext = iArabicContext; |
| 346 } | 372 } |
| 347 ResetArabicContext(); | 373 ResetArabicContext(); |
| 348 if (!m_bPagination) { | 374 if (!m_bPagination) { |
| 349 CFX_TxtChar* pLastChar = GetLastChar(1, FALSE); | 375 CFX_TxtChar* pLastChar = GetLastChar(1, FALSE); |
| 350 if (pLastChar && pLastChar->m_dwStatus < 1) { | 376 if (pLastChar && pLastChar->m_dwStatus < 1) { |
| 351 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; | 377 pLastChar->m_dwStatus = FX_TXTBREAK_PieceBreak; |
| 352 } | 378 } |
| 353 } | 379 } |
| 354 } | 380 } |
| 355 } | 381 } |
| 356 pCurChar->m_dwCharStyles = m_dwContextCharStyles; | 382 pCurChar->m_dwCharStyles = m_dwContextCharStyles; |
| 357 } | 383 } |
| 384 | |
| 358 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, | 385 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar, |
| 359 int32_t iRotation) { | 386 int32_t iRotation) { |
| 360 FX_WCHAR wch = pCurChar->m_wCharCode; | 387 FX_WCHAR wch = pCurChar->m_wCharCode; |
| 361 FX_WCHAR wForm; | 388 FX_WCHAR wForm; |
| 362 int32_t iCharWidth = 0; | 389 int32_t iCharWidth = 0; |
| 363 pCurChar->m_iCharWidth = -1; | 390 pCurChar->m_iCharWidth = -1; |
| 364 if (m_bCombText) { | 391 if (m_bCombText) { |
| 365 iCharWidth = m_iCombWidth; | 392 iCharWidth = m_iCombWidth; |
| 366 } else { | 393 } else { |
| 367 if (m_bVertical != FX_IsOdd(iRotation)) { | 394 if (m_bVertical != FX_IsOdd(iRotation)) { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 395 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { | 422 if (!m_pFont->GetCharWidth(wForm, iCharWidth, FALSE)) { |
| 396 iCharWidth = 0; | 423 iCharWidth = 0; |
| 397 } | 424 } |
| 398 } | 425 } |
| 399 iCharWidth *= m_iFontSize; | 426 iCharWidth *= m_iFontSize; |
| 400 iCharWidth = iCharWidth * m_iHorScale / 100; | 427 iCharWidth = iCharWidth * m_iHorScale / 100; |
| 401 } | 428 } |
| 402 pCurChar->m_iCharWidth = -iCharWidth; | 429 pCurChar->m_iCharWidth = -iCharWidth; |
| 403 return FX_TXTBREAK_None; | 430 return FX_TXTBREAK_None; |
| 404 } | 431 } |
| 432 | |
| 405 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar, | 433 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar, |
| 406 int32_t iRotation) { | 434 int32_t iRotation) { |
| 407 m_eCharType = FX_CHARTYPE_Tab; | 435 m_eCharType = FX_CHARTYPE_Tab; |
| 408 if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { | 436 if ((m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_ExpandTab) == 0) { |
| 409 return FX_TXTBREAK_None; | 437 return FX_TXTBREAK_None; |
| 410 } | 438 } |
| 411 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 439 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 412 int32_t iCharWidth; | 440 int32_t iCharWidth; |
| 413 if (m_bCombText) { | 441 if (m_bCombText) { |
| 414 iCharWidth = m_iCombWidth; | 442 iCharWidth = m_iCombWidth; |
| 415 } else { | 443 } else { |
| 416 if (m_bEquidistant) { | 444 if (m_bEquidistant) { |
| 417 iCharWidth = iLineWidth; | 445 iCharWidth = iLineWidth; |
| 418 iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; | 446 iCharWidth = m_iTabWidth * (iCharWidth / m_iTabWidth + 1) - iCharWidth; |
| 419 if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { | 447 if (iCharWidth < FX_TXTBREAK_MinimumTabWidth) { |
| 420 iCharWidth += m_iTabWidth; | 448 iCharWidth += m_iTabWidth; |
| 421 } | 449 } |
| 422 } else { | 450 } else { |
| 423 iCharWidth = m_iTabWidth; | 451 iCharWidth = m_iTabWidth; |
| 424 } | 452 } |
| 425 } | 453 } |
| 426 pCurChar->m_iCharWidth = iCharWidth; | 454 pCurChar->m_iCharWidth = iCharWidth; |
| 427 iLineWidth += iCharWidth; | 455 iLineWidth += iCharWidth; |
| 428 if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { | 456 if (!m_bSingleLine && iLineWidth >= m_iLineWidth + m_iTolerance) { |
| 429 return EndBreak(FX_TXTBREAK_LineBreak); | 457 return EndBreak(FX_TXTBREAK_LineBreak); |
| 430 } | 458 } |
| 431 return FX_TXTBREAK_None; | 459 return FX_TXTBREAK_None; |
| 432 } | 460 } |
| 461 | |
| 433 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar, | 462 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar, |
| 434 int32_t iRotation) { | 463 int32_t iRotation) { |
| 435 m_eCharType = FX_CHARTYPE_Control; | 464 m_eCharType = FX_CHARTYPE_Control; |
| 436 uint32_t dwRet = FX_TXTBREAK_None; | 465 uint32_t dwRet = FX_TXTBREAK_None; |
| 437 if (!m_bSingleLine) { | 466 if (!m_bSingleLine) { |
| 438 FX_WCHAR wch = pCurChar->m_wCharCode; | 467 FX_WCHAR wch = pCurChar->m_wCharCode; |
| 439 switch (wch) { | 468 switch (wch) { |
| 440 case L'\v': | 469 case L'\v': |
| 441 case 0x2028: | 470 case 0x2028: |
| 442 dwRet = FX_TXTBREAK_LineBreak; | 471 dwRet = FX_TXTBREAK_LineBreak; |
| 443 break; | 472 break; |
| 444 case L'\f': | 473 case L'\f': |
| 445 dwRet = FX_TXTBREAK_PageBreak; | 474 dwRet = FX_TXTBREAK_PageBreak; |
| 446 break; | 475 break; |
| 447 case 0x2029: | 476 case 0x2029: |
| 448 dwRet = FX_TXTBREAK_ParagraphBreak; | 477 dwRet = FX_TXTBREAK_ParagraphBreak; |
| 449 break; | 478 break; |
| 450 default: | 479 default: |
| 451 if (wch == m_wParagBreakChar) { | 480 if (wch == m_wParagBreakChar) { |
| 452 dwRet = FX_TXTBREAK_ParagraphBreak; | 481 dwRet = FX_TXTBREAK_ParagraphBreak; |
| 453 } | 482 } |
| 454 break; | 483 break; |
| 455 } | 484 } |
| 456 if (dwRet != FX_TXTBREAK_None) { | 485 if (dwRet != FX_TXTBREAK_None) { |
| 457 dwRet = EndBreak(dwRet); | 486 dwRet = EndBreak(dwRet); |
| 458 } | 487 } |
| 459 } | 488 } |
| 460 return dwRet; | 489 return dwRet; |
| 461 } | 490 } |
| 491 | |
| 462 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, | 492 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar, |
| 463 int32_t iRotation) { | 493 int32_t iRotation) { |
| 464 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 494 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
| 465 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 495 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 466 FX_WCHAR wForm; | 496 FX_WCHAR wForm; |
| 467 int32_t iCharWidth = 0; | 497 int32_t iCharWidth = 0; |
| 468 CFX_Char* pLastChar = nullptr; | 498 CFX_Char* pLastChar = nullptr; |
| 469 FX_BOOL bAlef = FALSE; | 499 FX_BOOL bAlef = FALSE; |
| 470 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && | 500 if (!m_bCombText && m_eCharType >= FX_CHARTYPE_ArabicAlef && |
| 471 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { | 501 m_eCharType <= FX_CHARTYPE_ArabicDistortion) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 516 iCharWidth = iCharWidth * m_iHorScale / 100; | 546 iCharWidth = iCharWidth * m_iHorScale / 100; |
| 517 } | 547 } |
| 518 pCurChar->m_iCharWidth = iCharWidth; | 548 pCurChar->m_iCharWidth = iCharWidth; |
| 519 iLineWidth += iCharWidth; | 549 iLineWidth += iCharWidth; |
| 520 m_pCurLine->m_iArabicChars++; | 550 m_pCurLine->m_iArabicChars++; |
| 521 if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { | 551 if (!m_bSingleLine && iLineWidth > m_iLineWidth + m_iTolerance) { |
| 522 return EndBreak(FX_TXTBREAK_LineBreak); | 552 return EndBreak(FX_TXTBREAK_LineBreak); |
| 523 } | 553 } |
| 524 return FX_TXTBREAK_None; | 554 return FX_TXTBREAK_None; |
| 525 } | 555 } |
| 556 | |
| 526 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar, | 557 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar, |
| 527 int32_t iRotation) { | 558 int32_t iRotation) { |
| 528 uint32_t dwProps = pCurChar->m_dwCharProps; | 559 uint32_t dwProps = pCurChar->m_dwCharProps; |
| 529 FX_CHARTYPE chartype = pCurChar->GetCharType(); | 560 FX_CHARTYPE chartype = pCurChar->GetCharType(); |
| 530 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 561 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 531 int32_t iCharWidth = 0; | 562 int32_t iCharWidth = 0; |
| 532 m_eCharType = chartype; | 563 m_eCharType = chartype; |
| 533 FX_WCHAR wch = pCurChar->m_wCharCode; | 564 FX_WCHAR wch = pCurChar->m_wCharCode; |
| 534 FX_WCHAR wForm = wch; | 565 FX_WCHAR wForm = wch; |
| 535 if (chartype == FX_CHARTYPE_Numeric) { | 566 if (chartype == FX_CHARTYPE_Numeric) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 601 } | 632 } |
| 602 int32_t iRotation = m_iRotation; | 633 int32_t iRotation = m_iRotation; |
| 603 if (m_bVertical && (dwProps & 0x8000) != 0) { | 634 if (m_bVertical && (dwProps & 0x8000) != 0) { |
| 604 iRotation = (iRotation + 1) % 4; | 635 iRotation = (iRotation + 1) % 4; |
| 605 } | 636 } |
| 606 uint32_t dwRet2 = | 637 uint32_t dwRet2 = |
| 607 (this->*g_FX_TxtBreak_lpfAppendChar[chartype >> FX_CHARTYPEBITS])( | 638 (this->*g_FX_TxtBreak_lpfAppendChar[chartype >> FX_CHARTYPEBITS])( |
| 608 pCurChar, iRotation); | 639 pCurChar, iRotation); |
| 609 return std::max(dwRet1, dwRet2); | 640 return std::max(dwRet1, dwRet2); |
| 610 } | 641 } |
| 642 | |
| 611 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() { | 643 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() { |
| 612 ASSERT(m_bArabicShapes); | 644 ASSERT(m_bArabicShapes); |
| 613 int32_t iCount = m_pCurLine->CountChars(); | 645 int32_t iCount = m_pCurLine->CountChars(); |
| 614 if (iCount < 2) { | 646 if (iCount < 2) { |
| 615 return; | 647 return; |
| 616 } | 648 } |
| 617 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 649 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
| 618 CFX_Char *pCur, *pNext; | 650 CFX_Char *pCur, *pNext; |
| 619 pCur = m_pCurLine->GetCharPtr(0); | 651 pCur = m_pCurLine->GetCharPtr(0); |
| 620 FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 652 FX_BOOL bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 652 iCharWidth = iCharWidth * m_iHorScale / 100; | 684 iCharWidth = iCharWidth * m_iHorScale / 100; |
| 653 } | 685 } |
| 654 pCur->m_iCharWidth = iCharWidth; | 686 pCur->m_iCharWidth = iCharWidth; |
| 655 iLineWidth += iCharWidth; | 687 iLineWidth += iCharWidth; |
| 656 } | 688 } |
| 657 } | 689 } |
| 658 bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; | 690 bPrevNum = (pCur->m_dwCharStyles & FX_TXTCHARSTYLE_ArabicIndic) != 0; |
| 659 pCur = pNext; | 691 pCur = pNext; |
| 660 } while (i < iCount); | 692 } while (i < iCount); |
| 661 } | 693 } |
| 694 | |
| 662 FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, | 695 FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine, |
| 663 FX_BOOL bAllChars, | 696 FX_BOOL bAllChars, |
| 664 uint32_t dwStatus) { | 697 uint32_t dwStatus) { |
| 665 int32_t iCount = m_pCurLine->CountChars(); | 698 int32_t iCount = m_pCurLine->CountChars(); |
| 666 FX_BOOL bDone = FALSE; | 699 FX_BOOL bDone = FALSE; |
| 667 CFX_Char* pTC; | 700 CFX_Char* pTC; |
| 668 if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { | 701 if (!m_bSingleLine && m_pCurLine->m_iWidth > m_iLineWidth + m_iTolerance) { |
| 669 pTC = m_pCurLine->GetCharPtr(iCount - 1); | 702 pTC = m_pCurLine->GetCharPtr(iCount - 1); |
| 670 switch (pTC->GetCharType()) { | 703 switch (pTC->GetCharType()) { |
| 671 case FX_CHARTYPE_Tab: | 704 case FX_CHARTYPE_Tab: |
| 672 case FX_CHARTYPE_Control: | 705 case FX_CHARTYPE_Control: |
| 673 break; | 706 break; |
| 674 case FX_CHARTYPE_Space: | 707 case FX_CHARTYPE_Space: |
| 675 if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { | 708 if ((m_dwPolicies & FX_TXTBREAKPOLICY_SpaceBreak) != 0) { |
| 676 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 709 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
| 677 bDone = TRUE; | 710 bDone = TRUE; |
| 678 } | 711 } |
| 679 break; | 712 break; |
| 680 default: | 713 default: |
| 681 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 714 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
| 682 bDone = TRUE; | 715 bDone = TRUE; |
| 683 break; | 716 break; |
| 684 } | 717 } |
| 685 } | 718 } |
| 686 iCount = m_pCurLine->CountChars(); | 719 iCount = m_pCurLine->CountChars(); |
| 687 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 720 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
| 688 CFX_TxtPiece tp; | 721 CFX_TxtPiece tp; |
| 689 if (m_bPagination) { | 722 if (m_bPagination) { |
| 690 tp.m_dwStatus = dwStatus; | 723 tp.m_dwStatus = dwStatus; |
| 691 tp.m_iStartPos = m_pCurLine->m_iStart; | 724 tp.m_iStartPos = m_pCurLine->m_iStart; |
| 692 tp.m_iWidth = m_pCurLine->m_iWidth; | 725 tp.m_iWidth = m_pCurLine->m_iWidth; |
| 693 tp.m_iStartChar = 0; | 726 tp.m_iStartChar = 0; |
| 694 tp.m_iChars = iCount; | 727 tp.m_iChars = iCount; |
| 695 tp.m_pChars = m_pCurLine->m_pLineChars; | 728 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
| 696 tp.m_pUserData = m_pUserData; | 729 tp.m_pUserData = m_pUserData; |
| 697 pTC = m_pCurLine->GetCharPtr(0); | 730 pTC = m_pCurLine->GetCharPtr(0); |
| 698 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 731 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
| 699 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 732 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |
| 700 tp.m_iVerticalScale = pTC->m_iVertialScale; | 733 tp.m_iVerticalScale = pTC->m_iVertialScale; |
| 701 pCurPieces->Add(tp); | 734 pCurPieces->Add(tp); |
| 702 m_pCurLine = pNextLine; | 735 m_pCurLine = pNextLine; |
| 703 m_eCharType = FX_CHARTYPE_Unknown; | 736 m_eCharType = FX_CHARTYPE_Unknown; |
| 704 return TRUE; | 737 return TRUE; |
| 705 } | 738 } |
| 706 if (bAllChars && !bDone) { | 739 if (bAllChars && !bDone) { |
| 707 int32_t iEndPos = m_pCurLine->m_iWidth; | 740 int32_t iEndPos = m_pCurLine->m_iWidth; |
| 708 GetBreakPos(*m_pCurLine->m_pLineChars, iEndPos, bAllChars, TRUE); | 741 GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, TRUE); |
| 709 } | 742 } |
| 710 return FALSE; | 743 return FALSE; |
| 711 } | 744 } |
| 745 | |
| 712 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { | 746 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { |
| 713 CFX_TxtPiece tp; | 747 CFX_TxtPiece tp; |
| 714 FX_TPO tpo; | 748 FX_TPO tpo; |
| 715 CFX_TxtChar* pTC; | 749 CFX_TxtChar* pTC; |
| 716 int32_t i, j; | 750 int32_t i, j; |
| 717 CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars; | 751 CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars.get(); |
| 718 int32_t iCount = m_pCurLine->CountChars(); | 752 int32_t iCount = m_pCurLine->CountChars(); |
| 719 FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); | 753 FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL); |
| 720 if (!m_bPagination && bDone) { | 754 if (!m_bPagination && bDone) { |
| 721 int32_t iBidiNum = 0; | 755 int32_t iBidiNum = 0; |
| 722 for (i = 0; i < iCount; i++) { | 756 for (i = 0; i < iCount; i++) { |
| 723 pTC = chars.GetDataPtr(i); | 757 pTC = chars.GetDataPtr(i); |
| 724 pTC->m_iBidiPos = i; | 758 pTC->m_iBidiPos = i; |
| 725 if (pTC->GetCharType() != FX_CHARTYPE_Control) { | 759 if (pTC->GetCharType() != FX_CHARTYPE_Control) { |
| 726 iBidiNum = i; | 760 iBidiNum = i; |
| 727 } | 761 } |
| 728 if (i == 0) { | 762 if (i == 0) { |
| 729 pTC->m_iBidiLevel = 1; | 763 pTC->m_iBidiLevel = 1; |
| 730 } | 764 } |
| 731 } | 765 } |
| 732 FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0); | 766 FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0); |
| 733 } | 767 } |
| 734 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 768 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
| 735 if (!m_bPagination && | 769 if (!m_bPagination && |
| 736 (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) { | 770 (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) { |
| 737 tp.m_dwStatus = FX_TXTBREAK_PieceBreak; | 771 tp.m_dwStatus = FX_TXTBREAK_PieceBreak; |
| 738 tp.m_iStartPos = m_pCurLine->m_iStart; | 772 tp.m_iStartPos = m_pCurLine->m_iStart; |
| 739 tp.m_pChars = m_pCurLine->m_pLineChars; | 773 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
| 740 int32_t iBidiLevel = -1, iCharWidth; | 774 int32_t iBidiLevel = -1, iCharWidth; |
| 741 i = 0, j = -1; | 775 i = 0, j = -1; |
| 742 while (i < iCount) { | 776 while (i < iCount) { |
| 743 pTC = chars.GetDataPtr(i); | 777 pTC = chars.GetDataPtr(i); |
| 744 if (iBidiLevel < 0) { | 778 if (iBidiLevel < 0) { |
| 745 iBidiLevel = pTC->m_iBidiLevel; | 779 iBidiLevel = pTC->m_iBidiLevel; |
| 746 tp.m_iWidth = 0; | 780 tp.m_iWidth = 0; |
| 747 tp.m_iBidiLevel = iBidiLevel; | 781 tp.m_iBidiLevel = iBidiLevel; |
| 748 tp.m_iBidiPos = pTC->m_iBidiOrder; | 782 tp.m_iBidiPos = pTC->m_iBidiOrder; |
| 749 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 783 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 798 } | 832 } |
| 799 CFX_TxtPiece& ttp = pCurPieces->GetAt(j); | 833 CFX_TxtPiece& ttp = pCurPieces->GetAt(j); |
| 800 ttp.m_dwStatus = dwStatus; | 834 ttp.m_dwStatus = dwStatus; |
| 801 } | 835 } |
| 802 } else { | 836 } else { |
| 803 tp.m_dwStatus = dwStatus; | 837 tp.m_dwStatus = dwStatus; |
| 804 tp.m_iStartPos = m_pCurLine->m_iStart; | 838 tp.m_iStartPos = m_pCurLine->m_iStart; |
| 805 tp.m_iWidth = m_pCurLine->m_iWidth; | 839 tp.m_iWidth = m_pCurLine->m_iWidth; |
| 806 tp.m_iStartChar = 0; | 840 tp.m_iStartChar = 0; |
| 807 tp.m_iChars = iCount; | 841 tp.m_iChars = iCount; |
| 808 tp.m_pChars = m_pCurLine->m_pLineChars; | 842 tp.m_pChars = m_pCurLine->m_pLineChars.get(); |
| 809 tp.m_pUserData = m_pUserData; | 843 tp.m_pUserData = m_pUserData; |
| 810 pTC = chars.GetDataPtr(0); | 844 pTC = chars.GetDataPtr(0); |
| 811 tp.m_dwCharStyles = pTC->m_dwCharStyles; | 845 tp.m_dwCharStyles = pTC->m_dwCharStyles; |
| 812 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 846 tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |
| 813 tp.m_iVerticalScale = pTC->m_iVertialScale; | 847 tp.m_iVerticalScale = pTC->m_iVertialScale; |
| 814 pCurPieces->Add(tp); | 848 pCurPieces->Add(tp); |
| 815 tpo.index = 0; | 849 tpo.index = 0; |
| 816 tpo.pos = 0; | 850 tpo.pos = 0; |
| 817 tpos.Add(tpo); | 851 tpos.Add(tpo); |
| 818 } | 852 } |
| 819 } | 853 } |
| 854 | |
| 820 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos, | 855 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos, |
| 821 FX_BOOL bAllChars, | 856 FX_BOOL bAllChars, |
| 822 uint32_t dwStatus) { | 857 uint32_t dwStatus) { |
| 823 int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; | 858 int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; |
| 824 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 859 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
| 825 int32_t i, j, iCount = pCurPieces->GetSize(); | 860 int32_t i, j, iCount = pCurPieces->GetSize(); |
| 826 FX_BOOL bFind = FALSE; | 861 FX_BOOL bFind = FALSE; |
| 827 FX_TPO tpo; | 862 FX_TPO tpo; |
| 828 CFX_TxtChar* pTC; | 863 CFX_TxtChar* pTC; |
| 829 FX_CHARTYPE chartype; | 864 FX_CHARTYPE chartype; |
| 830 for (i = iCount - 1; i > -1; i--) { | 865 for (i = iCount - 1; i > -1; i--) { |
| 831 tpo = tpos.GetAt(i); | 866 tpo = tpos.GetAt(i); |
| 832 CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); | 867 CFX_TxtPiece& ttp = pCurPieces->GetAt(tpo.index); |
| 833 if (!bFind) { | 868 if (!bFind) { |
| 834 iNetWidth = ttp.GetEndPos(); | 869 iNetWidth = ttp.GetEndPos(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 899 iOffset /= 2; | 934 iOffset /= 2; |
| 900 } | 935 } |
| 901 if (iOffset > 0) { | 936 if (iOffset > 0) { |
| 902 for (i = 0; i < iCount; i++) { | 937 for (i = 0; i < iCount; i++) { |
| 903 CFX_TxtPiece& ttp = pCurPieces->GetAt(i); | 938 CFX_TxtPiece& ttp = pCurPieces->GetAt(i); |
| 904 ttp.m_iStartPos += iOffset; | 939 ttp.m_iStartPos += iOffset; |
| 905 } | 940 } |
| 906 } | 941 } |
| 907 } | 942 } |
| 908 } | 943 } |
| 944 | |
| 909 uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) { | 945 uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) { |
| 910 ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak && | 946 ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak && |
| 911 dwStatus <= FX_TXTBREAK_PageBreak); | 947 dwStatus <= FX_TXTBREAK_PageBreak); |
| 912 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces; | 948 CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get(); |
| 913 int32_t iCount = pCurPieces->GetSize(); | 949 int32_t iCount = pCurPieces->GetSize(); |
| 914 if (iCount > 0) { | 950 if (iCount > 0) { |
| 915 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); | 951 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); |
| 916 if (dwStatus > FX_TXTBREAK_PieceBreak) { | 952 if (dwStatus > FX_TXTBREAK_PieceBreak) { |
| 917 pLastPiece->m_dwStatus = dwStatus; | 953 pLastPiece->m_dwStatus = dwStatus; |
| 918 } else { | 954 } else { |
| 919 dwStatus = pLastPiece->m_dwStatus; | 955 dwStatus = pLastPiece->m_dwStatus; |
| 920 } | 956 } |
| 921 return dwStatus; | 957 return dwStatus; |
| 922 } else { | 958 } else { |
| 923 CFX_TxtLine* pLastLine = GetTxtLine(TRUE); | 959 CFX_TxtLine* pLastLine = GetTxtLine(TRUE); |
| 924 if (pLastLine) { | 960 if (pLastLine) { |
| 925 pCurPieces = pLastLine->m_pLinePieces; | 961 pCurPieces = pLastLine->m_pLinePieces.get(); |
| 926 iCount = pCurPieces->GetSize(); | 962 iCount = pCurPieces->GetSize(); |
| 927 if (iCount-- > 0) { | 963 if (iCount-- > 0) { |
| 928 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); | 964 CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); |
| 929 if (dwStatus > FX_TXTBREAK_PieceBreak) { | 965 if (dwStatus > FX_TXTBREAK_PieceBreak) { |
| 930 pLastPiece->m_dwStatus = dwStatus; | 966 pLastPiece->m_dwStatus = dwStatus; |
| 931 } else { | 967 } else { |
| 932 dwStatus = pLastPiece->m_dwStatus; | 968 dwStatus = pLastPiece->m_dwStatus; |
| 933 } | 969 } |
| 934 return dwStatus; | 970 return dwStatus; |
| 935 } | 971 } |
| 936 return FX_TXTBREAK_None; | 972 return FX_TXTBREAK_None; |
| 937 } | 973 } |
| 938 iCount = m_pCurLine->CountChars(); | 974 iCount = m_pCurLine->CountChars(); |
| 939 if (iCount < 1) { | 975 if (iCount < 1) { |
| 940 return FX_TXTBREAK_None; | 976 return FX_TXTBREAK_None; |
| 941 } | 977 } |
| 942 if (!m_bPagination) { | 978 if (!m_bPagination) { |
| 943 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); | 979 CFX_TxtChar* pTC = m_pCurLine->GetCharPtr(iCount - 1); |
| 944 pTC->m_dwStatus = dwStatus; | 980 pTC->m_dwStatus = dwStatus; |
| 945 } | 981 } |
| 946 if (dwStatus <= FX_TXTBREAK_PieceBreak) { | 982 if (dwStatus <= FX_TXTBREAK_PieceBreak) { |
| 947 return dwStatus; | 983 return dwStatus; |
| 948 } | 984 } |
| 949 } | 985 } |
| 950 m_iReady = (m_pCurLine == m_pTxtLine1) ? 1 : 2; | 986 m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2; |
| 951 CFX_TxtLine* pNextLine = | 987 CFX_TxtLine* pNextLine = |
| 952 (m_pCurLine == m_pTxtLine1) ? m_pTxtLine2 : m_pTxtLine1; | 988 (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get(); |
| 953 FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); | 989 FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right); |
| 954 CFX_TPOArray tpos(100); | 990 CFX_TPOArray tpos(100); |
| 955 CFX_Char* pTC; | 991 CFX_Char* pTC; |
| 956 if (m_bArabicShapes) { | 992 if (m_bArabicShapes) { |
| 957 EndBreak_UpdateArabicShapes(); | 993 EndBreak_UpdateArabicShapes(); |
| 958 } | 994 } |
| 959 if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { | 995 if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { |
| 960 goto EndBreak_Ret; | 996 goto EndBreak_Ret; |
| 961 } | 997 } |
| 962 EndBreak_BidiLine(tpos, dwStatus); | 998 EndBreak_BidiLine(tpos, dwStatus); |
| 963 if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { | 999 if (!m_bPagination && m_iCurAlignment > FX_TXTLINEALIGNMENT_Left) { |
| 964 EndBreak_Alignment(tpos, bAllChars, dwStatus); | 1000 EndBreak_Alignment(tpos, bAllChars, dwStatus); |
| 965 } | 1001 } |
| 966 EndBreak_Ret: | 1002 EndBreak_Ret: |
| 967 m_pCurLine = pNextLine; | 1003 m_pCurLine = pNextLine; |
| 968 pTC = GetLastChar(0, FALSE); | 1004 pTC = GetLastChar(0, FALSE); |
| 969 m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; | 1005 m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; |
| 970 if (dwStatus == FX_TXTBREAK_ParagraphBreak) { | 1006 if (dwStatus == FX_TXTBREAK_ParagraphBreak) { |
| 971 m_iArabicContext = m_iCurArabicContext = 1; | 1007 m_iArabicContext = m_iCurArabicContext = 1; |
| 972 ResetArabicContext(); | 1008 ResetArabicContext(); |
| 973 } | 1009 } |
| 974 return dwStatus; | 1010 return dwStatus; |
| 975 } | 1011 } |
| 1012 | |
| 976 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca, | 1013 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca, |
| 977 int32_t& iEndPos, | 1014 int32_t& iEndPos, |
| 978 FX_BOOL bAllChars, | 1015 FX_BOOL bAllChars, |
| 979 FX_BOOL bOnlyBrk) { | 1016 FX_BOOL bOnlyBrk) { |
| 980 int32_t iLength = ca.GetSize() - 1; | 1017 int32_t iLength = ca.GetSize() - 1; |
| 981 if (iLength < 1) { | 1018 if (iLength < 1) { |
| 982 return iLength; | 1019 return iLength; |
| 983 } | 1020 } |
| 984 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, | 1021 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, |
| 985 iLast = -1, iLastPos = -1; | 1022 iLast = -1, iLastPos = -1; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1062 if (iIndirect > -1) { | 1099 if (iIndirect > -1) { |
| 1063 iEndPos = iIndirectPos; | 1100 iEndPos = iIndirectPos; |
| 1064 return iIndirect; | 1101 return iIndirect; |
| 1065 } | 1102 } |
| 1066 if (iLast > -1) { | 1103 if (iLast > -1) { |
| 1067 iEndPos = iLastPos; | 1104 iEndPos = iLastPos; |
| 1068 return iLast; | 1105 return iLast; |
| 1069 } | 1106 } |
| 1070 return 0; | 1107 return 0; |
| 1071 } | 1108 } |
| 1109 | |
| 1072 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, | 1110 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine, |
| 1073 CFX_TxtLine* pNextLine, | 1111 CFX_TxtLine* pNextLine, |
| 1074 FX_BOOL bAllChars) { | 1112 FX_BOOL bAllChars) { |
| 1075 ASSERT(pCurLine && pNextLine); | 1113 ASSERT(pCurLine && pNextLine); |
| 1076 int32_t iCount = pCurLine->CountChars(); | 1114 int32_t iCount = pCurLine->CountChars(); |
| 1077 if (iCount < 2) { | 1115 if (iCount < 2) { |
| 1078 return; | 1116 return; |
| 1079 } | 1117 } |
| 1080 int32_t iEndPos = pCurLine->m_iWidth; | 1118 int32_t iEndPos = pCurLine->m_iWidth; |
| 1081 CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars; | 1119 CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars.get(); |
| 1082 int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); | 1120 int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); |
| 1083 if (iCharPos < 0) { | 1121 if (iCharPos < 0) { |
| 1084 iCharPos = 0; | 1122 iCharPos = 0; |
| 1085 } | 1123 } |
| 1086 iCharPos++; | 1124 iCharPos++; |
| 1087 if (iCharPos >= iCount) { | 1125 if (iCharPos >= iCount) { |
| 1088 pNextLine->RemoveAll(TRUE); | 1126 pNextLine->RemoveAll(TRUE); |
| 1089 CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); | 1127 CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); |
| 1090 pTC->m_nBreakType = FX_LBT_UNKNOWN; | 1128 pTC->m_nBreakType = FX_LBT_UNKNOWN; |
| 1091 return; | 1129 return; |
| 1092 } | 1130 } |
| 1093 CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars; | 1131 CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars.get(); |
| 1094 int cur_size = curChars.GetSize(); | 1132 int cur_size = curChars.GetSize(); |
| 1095 nextChars.SetSize(cur_size - iCharPos); | 1133 nextChars.SetSize(cur_size - iCharPos); |
| 1096 FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), | 1134 FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), |
| 1097 (cur_size - iCharPos) * sizeof(CFX_TxtChar)); | 1135 (cur_size - iCharPos) * sizeof(CFX_TxtChar)); |
| 1098 iCount -= iCharPos; | 1136 iCount -= iCharPos; |
| 1099 cur_size = curChars.GetSize(); | 1137 cur_size = curChars.GetSize(); |
| 1100 curChars.RemoveAt(cur_size - iCount, iCount); | 1138 curChars.RemoveAt(cur_size - iCount, iCount); |
| 1101 pCurLine->m_iWidth = iEndPos; | 1139 pCurLine->m_iWidth = iEndPos; |
| 1102 CFX_TxtChar* pTC = curChars.GetDataPtr(iCharPos - 1); | 1140 CFX_TxtChar* pTC = curChars.GetDataPtr(iCharPos - 1); |
| 1103 pTC->m_nBreakType = FX_LBT_UNKNOWN; | 1141 pTC->m_nBreakType = FX_LBT_UNKNOWN; |
| 1104 iCount = nextChars.GetSize(); | 1142 iCount = nextChars.GetSize(); |
| 1105 int32_t iCharWidth, iWidth = 0; | 1143 int32_t iCharWidth, iWidth = 0; |
| 1106 for (int32_t i = 0; i < iCount; i++) { | 1144 for (int32_t i = 0; i < iCount; i++) { |
| 1107 pTC = nextChars.GetDataPtr(i); | 1145 pTC = nextChars.GetDataPtr(i); |
| 1108 if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) { | 1146 if (pTC->GetCharType() >= FX_CHARTYPE_ArabicAlef) { |
| 1109 pCurLine->m_iArabicChars--; | 1147 pCurLine->m_iArabicChars--; |
| 1110 pNextLine->m_iArabicChars++; | 1148 pNextLine->m_iArabicChars++; |
| 1111 } | 1149 } |
| 1112 iCharWidth = pTC->m_iCharWidth; | 1150 iCharWidth = pTC->m_iCharWidth; |
| 1113 if (iCharWidth > 0) { | 1151 if (iCharWidth > 0) { |
| 1114 iWidth += iCharWidth; | 1152 iWidth += iCharWidth; |
| 1115 } | 1153 } |
| 1116 if (m_bPagination) { | 1154 if (m_bPagination) { |
| 1117 continue; | 1155 continue; |
| 1118 } | 1156 } |
| 1119 pTC->m_dwStatus = 0; | 1157 pTC->m_dwStatus = 0; |
| 1120 } | 1158 } |
| 1121 pNextLine->m_iWidth = iWidth; | 1159 pNextLine->m_iWidth = iWidth; |
| 1122 } | 1160 } |
| 1161 | |
| 1123 int32_t CFX_TxtBreak::CountBreakChars() const { | 1162 int32_t CFX_TxtBreak::CountBreakChars() const { |
| 1124 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); | 1163 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); |
| 1125 return pTxtLine ? pTxtLine->CountChars() : 0; | 1164 return pTxtLine ? pTxtLine->CountChars() : 0; |
| 1126 } | 1165 } |
| 1166 | |
| 1127 int32_t CFX_TxtBreak::CountBreakPieces() const { | 1167 int32_t CFX_TxtBreak::CountBreakPieces() const { |
| 1128 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); | 1168 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); |
| 1129 return pTxtPieces ? pTxtPieces->GetSize() : 0; | 1169 return pTxtPieces ? pTxtPieces->GetSize() : 0; |
| 1130 } | 1170 } |
| 1171 | |
| 1131 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { | 1172 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const { |
| 1132 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); | 1173 CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE); |
| 1133 if (!pTxtPieces) { | 1174 if (!pTxtPieces) { |
| 1134 return nullptr; | 1175 return nullptr; |
| 1135 } | 1176 } |
| 1136 if (index < 0 || index >= pTxtPieces->GetSize()) { | 1177 if (index < 0 || index >= pTxtPieces->GetSize()) { |
| 1137 return nullptr; | 1178 return nullptr; |
| 1138 } | 1179 } |
| 1139 return pTxtPieces->GetPtrAt(index); | 1180 return pTxtPieces->GetPtrAt(index); |
| 1140 } | 1181 } |
| 1182 | |
| 1141 void CFX_TxtBreak::ClearBreakPieces() { | 1183 void CFX_TxtBreak::ClearBreakPieces() { |
| 1142 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); | 1184 CFX_TxtLine* pTxtLine = GetTxtLine(TRUE); |
| 1143 if (pTxtLine) { | 1185 if (pTxtLine) { |
| 1144 pTxtLine->RemoveAll(TRUE); | 1186 pTxtLine->RemoveAll(TRUE); |
| 1145 } | 1187 } |
| 1146 m_iReady = 0; | 1188 m_iReady = 0; |
| 1147 } | 1189 } |
| 1190 | |
| 1148 void CFX_TxtBreak::Reset() { | 1191 void CFX_TxtBreak::Reset() { |
| 1149 m_eCharType = FX_CHARTYPE_Unknown; | 1192 m_eCharType = FX_CHARTYPE_Unknown; |
| 1150 m_iArabicContext = m_iCurArabicContext = 1; | 1193 m_iArabicContext = m_iCurArabicContext = 1; |
| 1151 ResetArabicContext(); | 1194 ResetArabicContext(); |
| 1152 m_pTxtLine1->RemoveAll(TRUE); | 1195 m_pTxtLine1->RemoveAll(TRUE); |
| 1153 m_pTxtLine2->RemoveAll(TRUE); | 1196 m_pTxtLine2->RemoveAll(TRUE); |
| 1154 } | 1197 } |
| 1155 | 1198 |
| 1156 struct FX_FORMCHAR { | 1199 struct FX_FORMCHAR { |
| 1157 uint16_t wch; | 1200 uint16_t wch; |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1541 pCharPos++; | 1584 pCharPos++; |
| 1542 } | 1585 } |
| 1543 } | 1586 } |
| 1544 if (iWidth > 0) { | 1587 if (iWidth > 0) { |
| 1545 wPrev = (FX_WCHAR)formChars[0].wch; | 1588 wPrev = (FX_WCHAR)formChars[0].wch; |
| 1546 } | 1589 } |
| 1547 wLast = wch; | 1590 wLast = wch; |
| 1548 } | 1591 } |
| 1549 return iCount; | 1592 return iCount; |
| 1550 } | 1593 } |
| 1594 | |
| 1551 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, | 1595 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun, |
| 1552 CFX_RectFArray& rtArray, | 1596 CFX_RectFArray& rtArray, |
| 1553 FX_BOOL bCharBBox) const { | 1597 FX_BOOL bCharBBox) const { |
| 1554 if (!pTxtRun || pTxtRun->iLength < 1) { | 1598 if (!pTxtRun || pTxtRun->iLength < 1) { |
| 1555 return 0; | 1599 return 0; |
| 1556 } | 1600 } |
| 1557 IFX_TxtAccess* pAccess = pTxtRun->pAccess; | 1601 IFX_TxtAccess* pAccess = pTxtRun->pAccess; |
| 1558 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; | 1602 const FDE_TEXTEDITPIECE* pIdentity = pTxtRun->pIdentity; |
| 1559 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); | 1603 const FX_WCHAR* pStr = pTxtRun->wsStr.c_str(); |
| 1560 int32_t* pWidths = pTxtRun->pWidths; | 1604 int32_t* pWidths = pTxtRun->pWidths; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1688 m_iChars(0), | 1732 m_iChars(0), |
| 1689 m_iBidiLevel(0), | 1733 m_iBidiLevel(0), |
| 1690 m_iBidiPos(0), | 1734 m_iBidiPos(0), |
| 1691 m_iHorizontalScale(100), | 1735 m_iHorizontalScale(100), |
| 1692 m_iVerticalScale(100), | 1736 m_iVerticalScale(100), |
| 1693 m_dwCharStyles(0), | 1737 m_dwCharStyles(0), |
| 1694 m_pChars(nullptr), | 1738 m_pChars(nullptr), |
| 1695 m_pUserData(nullptr) {} | 1739 m_pUserData(nullptr) {} |
| 1696 | 1740 |
| 1697 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) | 1741 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize) |
| 1698 : m_iStart(0), m_iWidth(0), m_iArabicChars(0) { | 1742 : m_pLineChars(new CFX_TxtCharArray), |
| 1699 m_pLineChars = new CFX_TxtCharArray; | 1743 m_pLinePieces(new CFX_TxtPieceArray(16)), |
| 1700 m_pLinePieces = new CFX_TxtPieceArray(16); | 1744 m_iStart(0), |
| 1701 } | 1745 m_iWidth(0), |
| 1746 m_iArabicChars(0) {} | |
| 1702 | 1747 |
| 1703 CFX_TxtLine::~CFX_TxtLine() { | 1748 CFX_TxtLine::~CFX_TxtLine() { |
| 1704 RemoveAll(); | 1749 RemoveAll(); |
| 1705 delete m_pLineChars; | |
| 1706 delete m_pLinePieces; | |
| 1707 } | 1750 } |
| OLD | NEW |