| 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/fxfa/app/xfa_textlayout.h" | 7 #include "xfa/fxfa/app/xfa_textlayout.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "core/fxcrt/include/fx_ext.h" | 11 #include "core/fxcrt/include/fx_ext.h" |
| 12 #include "xfa/fde/fde_pen.h" | 12 #include "xfa/fde/fde_pen.h" |
| 13 #include "xfa/fde/xml/fde_xml_imp.h" | 13 #include "xfa/fde/xml/fde_xml_imp.h" |
| 14 #include "xfa/fgas/crt/fgas_algorithm.h" | 14 #include "xfa/fgas/crt/fgas_algorithm.h" |
| 15 #include "xfa/fgas/crt/fgas_codepage.h" | 15 #include "xfa/fgas/crt/fgas_codepage.h" |
| 16 #include "xfa/fxfa/app/xfa_ffapp.h" | 16 #include "xfa/fxfa/app/xfa_ffwidgetacc.h" |
| 17 #include "xfa/fxfa/app/xfa_ffdoc.h" | 17 #include "xfa/include/fxfa/xfa_ffapp.h" |
| 18 #include "xfa/fxfa/app/xfa_fontmgr.h" | 18 #include "xfa/include/fxfa/xfa_ffdoc.h" |
| 19 #include "xfa/include/fxfa/xfa_fontmgr.h" |
| 19 | 20 |
| 20 CXFA_CSSTagProvider::~CXFA_CSSTagProvider() { | 21 CXFA_CSSTagProvider::~CXFA_CSSTagProvider() { |
| 21 FX_POSITION pos = m_Attributes.GetStartPosition(); | 22 FX_POSITION pos = m_Attributes.GetStartPosition(); |
| 22 while (pos) { | 23 while (pos) { |
| 23 CFX_WideString *pName = NULL, *pValue = NULL; | 24 CFX_WideString *pName = NULL, *pValue = NULL; |
| 24 m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue); | 25 m_Attributes.GetNextAssoc(pos, (void*&)pName, (void*&)pValue); |
| 25 delete pName; | 26 delete pName; |
| 26 delete pValue; | 27 delete pValue; |
| 27 } | 28 } |
| 28 } | 29 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); | 82 m_mapXMLNodeToParseContext.GetNextAssoc(ps, pXMLNode, pParseContext); |
| 82 if (pParseContext) | 83 if (pParseContext) |
| 83 FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext); | 84 FXTARGET_DeleteWith(CXFA_TextParseContext, m_pAllocator, pParseContext); |
| 84 } | 85 } |
| 85 m_mapXMLNodeToParseContext.RemoveAll(); | 86 m_mapXMLNodeToParseContext.RemoveAll(); |
| 86 if (m_pAllocator) { | 87 if (m_pAllocator) { |
| 87 m_pAllocator->Release(); | 88 m_pAllocator->Release(); |
| 88 m_pAllocator = NULL; | 89 m_pAllocator = NULL; |
| 89 } | 90 } |
| 90 } | 91 } |
| 91 void CXFA_TextParser::InitCSSData(IXFA_TextProvider* pTextProvider) { | 92 void CXFA_TextParser::InitCSSData(CXFA_TextProvider* pTextProvider) { |
| 92 if (pTextProvider == NULL) { | 93 if (pTextProvider == NULL) { |
| 93 return; | 94 return; |
| 94 } | 95 } |
| 95 if (m_pSelector == NULL) { | 96 if (m_pSelector == NULL) { |
| 96 CXFA_FFDoc* pDoc = pTextProvider->GetDocNode(); | 97 CXFA_FFDoc* pDoc = pTextProvider->GetDocNode(); |
| 97 IFX_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr(); | 98 IFX_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr(); |
| 98 FXSYS_assert(pFontMgr); | 99 FXSYS_assert(pFontMgr); |
| 99 m_pSelector = IFDE_CSSStyleSelector::Create(); | 100 m_pSelector = IFDE_CSSStyleSelector::Create(); |
| 100 m_pSelector->SetFontMgr(pFontMgr); | 101 m_pSelector->SetFontMgr(pFontMgr); |
| 101 FX_FLOAT fFontSize = 10; | 102 FX_FLOAT fFontSize = 10; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 118 L"ol,ul{padding-left:33px}ol{list-style-type:decimal}ol,ul{margin-top:0;" | 119 L"ol,ul{padding-left:33px}ol{list-style-type:decimal}ol,ul{margin-top:0;" |
| 119 L"margin-bottom:0}ul,ol{margin:1.12em 0}" | 120 L"margin-bottom:0}ul,ol{margin:1.12em 0}" |
| 120 L"a{color:#0000ff;text-decoration:underline}b{font-weight:bolder}i{font-" | 121 L"a{color:#0000ff;text-decoration:underline}b{font-weight:bolder}i{font-" |
| 121 L"style:italic}" | 122 L"style:italic}" |
| 122 L"sup{vertical-align:+15em;font-size:.66em}sub{vertical-align:-15em;font-" | 123 L"sup{vertical-align:+15em;font-size:.66em}sub{vertical-align:-15em;font-" |
| 123 L"size:.66em}"; | 124 L"size:.66em}"; |
| 124 return IFDE_CSSStyleSheet::LoadFromBuffer( | 125 return IFDE_CSSStyleSheet::LoadFromBuffer( |
| 125 CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8); | 126 CFX_WideString(), s_pStyle, FXSYS_wcslen(s_pStyle), FX_CODEPAGE_UTF8); |
| 126 } | 127 } |
| 127 IFDE_CSSComputedStyle* CXFA_TextParser::CreateRootStyle( | 128 IFDE_CSSComputedStyle* CXFA_TextParser::CreateRootStyle( |
| 128 IXFA_TextProvider* pTextProvider) { | 129 CXFA_TextProvider* pTextProvider) { |
| 129 CXFA_Font font = pTextProvider->GetFontNode(); | 130 CXFA_Font font = pTextProvider->GetFontNode(); |
| 130 CXFA_Para para = pTextProvider->GetParaNode(); | 131 CXFA_Para para = pTextProvider->GetParaNode(); |
| 131 IFDE_CSSComputedStyle* pStyle = m_pSelector->CreateComputedStyle(NULL); | 132 IFDE_CSSComputedStyle* pStyle = m_pSelector->CreateComputedStyle(NULL); |
| 132 IFDE_CSSFontStyle* pFontStyle = pStyle->GetFontStyles(); | 133 IFDE_CSSFontStyle* pFontStyle = pStyle->GetFontStyles(); |
| 133 IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles(); | 134 IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles(); |
| 134 FX_FLOAT fLineHeight = 0, fFontSize = 10; | 135 FX_FLOAT fLineHeight = 0, fFontSize = 10; |
| 135 if (para) { | 136 if (para) { |
| 136 fLineHeight = para.GetLineHeight(); | 137 fLineHeight = para.GetLineHeight(); |
| 137 FDE_CSSLENGTH indent; | 138 FDE_CSSLENGTH indent; |
| 138 indent.Set(FDE_CSSLENGTHUNIT_Point, para.GetTextIndent()); | 139 indent.Set(FDE_CSSLENGTHUNIT_Point, para.GetTextIndent()); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 return nullptr; | 226 return nullptr; |
| 226 IFDE_CSSComputedStyle* pStyle = CreateStyle(pParentStyle); | 227 IFDE_CSSComputedStyle* pStyle = CreateStyle(pParentStyle); |
| 227 IFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator(); | 228 IFDE_CSSAccelerator* pCSSAccel = m_pSelector->InitAccelerator(); |
| 228 pCSSAccel->OnEnterTag(&tagProvider); | 229 pCSSAccel->OnEnterTag(&tagProvider); |
| 229 m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(), | 230 m_pSelector->ComputeStyle(&tagProvider, pContext->GetDecls(), |
| 230 pContext->CountDecls(), pStyle); | 231 pContext->CountDecls(), pStyle); |
| 231 pCSSAccel->OnLeaveTag(&tagProvider); | 232 pCSSAccel->OnLeaveTag(&tagProvider); |
| 232 return pStyle; | 233 return pStyle; |
| 233 } | 234 } |
| 234 void CXFA_TextParser::DoParse(CFDE_XMLNode* pXMLContainer, | 235 void CXFA_TextParser::DoParse(CFDE_XMLNode* pXMLContainer, |
| 235 IXFA_TextProvider* pTextProvider) { | 236 CXFA_TextProvider* pTextProvider) { |
| 236 if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator) { | 237 if (pXMLContainer == NULL || pTextProvider == NULL || m_pAllocator) { |
| 237 return; | 238 return; |
| 238 } | 239 } |
| 239 m_pAllocator = | 240 m_pAllocator = |
| 240 FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 32, sizeof(CXFA_CSSTagProvider)); | 241 FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 32, sizeof(CXFA_CSSTagProvider)); |
| 241 InitCSSData(pTextProvider); | 242 InitCSSData(pTextProvider); |
| 242 IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider); | 243 IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider); |
| 243 ParseRichText(pXMLContainer, pRootStyle); | 244 ParseRichText(pXMLContainer, pRootStyle); |
| 244 pRootStyle->Release(); | 245 pRootStyle->Release(); |
| 245 } | 246 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 CFX_WideString wsValue; | 310 CFX_WideString wsValue; |
| 310 pXMLElement->GetString(FX_WSTRC(L"style").GetPtr(), wsValue); | 311 pXMLElement->GetString(FX_WSTRC(L"style").GetPtr(), wsValue); |
| 311 if (!wsValue.IsEmpty()) { | 312 if (!wsValue.IsEmpty()) { |
| 312 tagProvider.SetAttribute(FX_WSTRC(L"style"), wsValue); | 313 tagProvider.SetAttribute(FX_WSTRC(L"style"), wsValue); |
| 313 } | 314 } |
| 314 } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) { | 315 } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) { |
| 315 tagProvider.m_bTagAviliable = TRUE; | 316 tagProvider.m_bTagAviliable = TRUE; |
| 316 tagProvider.m_bContent = TRUE; | 317 tagProvider.m_bContent = TRUE; |
| 317 } | 318 } |
| 318 } | 319 } |
| 319 int32_t CXFA_TextParser::GetVAlgin(IXFA_TextProvider* pTextProvider) const { | 320 int32_t CXFA_TextParser::GetVAlgin(CXFA_TextProvider* pTextProvider) const { |
| 320 int32_t iAlign = XFA_ATTRIBUTEENUM_Top; | 321 int32_t iAlign = XFA_ATTRIBUTEENUM_Top; |
| 321 CXFA_Para para = pTextProvider->GetParaNode(); | 322 CXFA_Para para = pTextProvider->GetParaNode(); |
| 322 if (para) { | 323 if (para) { |
| 323 iAlign = para.GetVerticalAlign(); | 324 iAlign = para.GetVerticalAlign(); |
| 324 } | 325 } |
| 325 return iAlign; | 326 return iAlign; |
| 326 } | 327 } |
| 327 FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle* pStyle) const { | 328 FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle* pStyle) const { |
| 328 CFX_WideString wsValue; | 329 CFX_WideString wsValue; |
| 329 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue)) { | 330 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue)) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 340 return 0; | 341 return 0; |
| 341 } | 342 } |
| 342 FX_BOOL CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const { | 343 FX_BOOL CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const { |
| 343 CFX_WideString wsValue; | 344 CFX_WideString wsValue; |
| 344 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) { | 345 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) { |
| 345 wsValue.MakeLower(); | 346 wsValue.MakeLower(); |
| 346 return wsValue == FX_WSTRC(L"yes"); | 347 return wsValue == FX_WSTRC(L"yes"); |
| 347 } | 348 } |
| 348 return FALSE; | 349 return FALSE; |
| 349 } | 350 } |
| 350 IFX_Font* CXFA_TextParser::GetFont(IXFA_TextProvider* pTextProvider, | 351 IFX_Font* CXFA_TextParser::GetFont(CXFA_TextProvider* pTextProvider, |
| 351 IFDE_CSSComputedStyle* pStyle) const { | 352 IFDE_CSSComputedStyle* pStyle) const { |
| 352 CFX_WideStringC wsFamily = FX_WSTRC(L"Courier"); | 353 CFX_WideStringC wsFamily = FX_WSTRC(L"Courier"); |
| 353 uint32_t dwStyle = 0; | 354 uint32_t dwStyle = 0; |
| 354 CXFA_Font font = pTextProvider->GetFontNode(); | 355 CXFA_Font font = pTextProvider->GetFontNode(); |
| 355 if (font) { | 356 if (font) { |
| 356 font.GetTypeface(wsFamily); | 357 font.GetTypeface(wsFamily); |
| 357 if (font.IsBold()) { | 358 if (font.IsBold()) { |
| 358 dwStyle |= FX_FONTSTYLE_Bold; | 359 dwStyle |= FX_FONTSTYLE_Bold; |
| 359 } | 360 } |
| 360 if (font.IsItalic()) { | 361 if (font.IsItalic()) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 372 dwStyle |= FX_FONTSTYLE_Bold; | 373 dwStyle |= FX_FONTSTYLE_Bold; |
| 373 } | 374 } |
| 374 if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) { | 375 if (pFontStyle->GetFontStyle() == FDE_CSSFONTSTYLE_Italic) { |
| 375 dwStyle |= FX_FONTSTYLE_Italic; | 376 dwStyle |= FX_FONTSTYLE_Italic; |
| 376 } | 377 } |
| 377 } | 378 } |
| 378 CXFA_FFDoc* pDoc = pTextProvider->GetDocNode(); | 379 CXFA_FFDoc* pDoc = pTextProvider->GetDocNode(); |
| 379 CXFA_FontMgr* pFontMgr = pDoc->GetApp()->GetXFAFontMgr(); | 380 CXFA_FontMgr* pFontMgr = pDoc->GetApp()->GetXFAFontMgr(); |
| 380 return pFontMgr->GetFont(pDoc, wsFamily, dwStyle); | 381 return pFontMgr->GetFont(pDoc, wsFamily, dwStyle); |
| 381 } | 382 } |
| 382 FX_FLOAT CXFA_TextParser::GetFontSize(IXFA_TextProvider* pTextProvider, | 383 FX_FLOAT CXFA_TextParser::GetFontSize(CXFA_TextProvider* pTextProvider, |
| 383 IFDE_CSSComputedStyle* pStyle) const { | 384 IFDE_CSSComputedStyle* pStyle) const { |
| 384 if (pStyle) | 385 if (pStyle) |
| 385 return pStyle->GetFontStyles()->GetFontSize(); | 386 return pStyle->GetFontStyles()->GetFontSize(); |
| 386 | 387 |
| 387 CXFA_Font font = pTextProvider->GetFontNode(); | 388 CXFA_Font font = pTextProvider->GetFontNode(); |
| 388 if (font) { | 389 if (font) { |
| 389 return font.GetFontSize(); | 390 return font.GetFontSize(); |
| 390 } | 391 } |
| 391 return 10; | 392 return 10; |
| 392 } | 393 } |
| 393 int32_t CXFA_TextParser::GetHorScale(IXFA_TextProvider* pTextProvider, | 394 int32_t CXFA_TextParser::GetHorScale(CXFA_TextProvider* pTextProvider, |
| 394 IFDE_CSSComputedStyle* pStyle, | 395 IFDE_CSSComputedStyle* pStyle, |
| 395 CFDE_XMLNode* pXMLNode) const { | 396 CFDE_XMLNode* pXMLNode) const { |
| 396 if (pStyle) { | 397 if (pStyle) { |
| 397 CFX_WideString wsValue; | 398 CFX_WideString wsValue; |
| 398 if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"), | 399 if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-horizontal-scale"), |
| 399 wsValue)) { | 400 wsValue)) { |
| 400 return wsValue.GetInteger(); | 401 return wsValue.GetInteger(); |
| 401 } | 402 } |
| 402 while (pXMLNode) { | 403 while (pXMLNode) { |
| 403 CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>( | 404 CXFA_TextParseContext* pContext = static_cast<CXFA_TextParseContext*>( |
| 404 m_mapXMLNodeToParseContext.GetValueAt(pXMLNode)); | 405 m_mapXMLNodeToParseContext.GetValueAt(pXMLNode)); |
| 405 if (pContext && pContext->m_pParentStyle && | 406 if (pContext && pContext->m_pParentStyle && |
| 406 pContext->m_pParentStyle->GetCustomStyle( | 407 pContext->m_pParentStyle->GetCustomStyle( |
| 407 FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) { | 408 FX_WSTRC(L"xfa-font-horizontal-scale"), wsValue)) { |
| 408 return wsValue.GetInteger(); | 409 return wsValue.GetInteger(); |
| 409 } | 410 } |
| 410 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::Parent); | 411 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::Parent); |
| 411 } | 412 } |
| 412 } | 413 } |
| 413 if (CXFA_Font font = pTextProvider->GetFontNode()) { | 414 if (CXFA_Font font = pTextProvider->GetFontNode()) { |
| 414 return static_cast<int32_t>(font.GetHorizontalScale()); | 415 return static_cast<int32_t>(font.GetHorizontalScale()); |
| 415 } | 416 } |
| 416 return 100; | 417 return 100; |
| 417 } | 418 } |
| 418 int32_t CXFA_TextParser::GetVerScale(IXFA_TextProvider* pTextProvider, | 419 int32_t CXFA_TextParser::GetVerScale(CXFA_TextProvider* pTextProvider, |
| 419 IFDE_CSSComputedStyle* pStyle) const { | 420 IFDE_CSSComputedStyle* pStyle) const { |
| 420 if (pStyle) { | 421 if (pStyle) { |
| 421 CFX_WideString wsValue; | 422 CFX_WideString wsValue; |
| 422 if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-vertical-scale"), wsValue)) { | 423 if (pStyle->GetCustomStyle(FX_WSTRC(L"xfa-font-vertical-scale"), wsValue)) { |
| 423 return wsValue.GetInteger(); | 424 return wsValue.GetInteger(); |
| 424 } | 425 } |
| 425 } | 426 } |
| 426 if (CXFA_Font font = pTextProvider->GetFontNode()) { | 427 if (CXFA_Font font = pTextProvider->GetFontNode()) { |
| 427 return (int32_t)font.GetVerticalScale(); | 428 return (int32_t)font.GetVerticalScale(); |
| 428 } | 429 } |
| 429 return 100; | 430 return 100; |
| 430 } | 431 } |
| 431 void CXFA_TextParser::GetUnderline(IXFA_TextProvider* pTextProvider, | 432 void CXFA_TextParser::GetUnderline(CXFA_TextProvider* pTextProvider, |
| 432 IFDE_CSSComputedStyle* pStyle, | 433 IFDE_CSSComputedStyle* pStyle, |
| 433 int32_t& iUnderline, | 434 int32_t& iUnderline, |
| 434 int32_t& iPeriod) const { | 435 int32_t& iPeriod) const { |
| 435 iUnderline = 0; | 436 iUnderline = 0; |
| 436 iPeriod = XFA_ATTRIBUTEENUM_All; | 437 iPeriod = XFA_ATTRIBUTEENUM_All; |
| 437 if (pStyle) { | 438 if (pStyle) { |
| 438 uint32_t dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration(); | 439 uint32_t dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration(); |
| 439 if (dwDecoration & FDE_CSSTEXTDECORATION_Double) { | 440 if (dwDecoration & FDE_CSSTEXTDECORATION_Double) { |
| 440 iUnderline = 2; | 441 iUnderline = 2; |
| 441 } else if (dwDecoration & FDE_CSSTEXTDECORATION_Underline) { | 442 } else if (dwDecoration & FDE_CSSTEXTDECORATION_Underline) { |
| 442 iUnderline = 1; | 443 iUnderline = 1; |
| 443 } | 444 } |
| 444 CFX_WideString wsValue; | 445 CFX_WideString wsValue; |
| 445 if (pStyle->GetCustomStyle(FX_WSTRC(L"underlinePeriod"), wsValue)) { | 446 if (pStyle->GetCustomStyle(FX_WSTRC(L"underlinePeriod"), wsValue)) { |
| 446 if (wsValue == FX_WSTRC(L"word")) { | 447 if (wsValue == FX_WSTRC(L"word")) { |
| 447 iPeriod = XFA_ATTRIBUTEENUM_Word; | 448 iPeriod = XFA_ATTRIBUTEENUM_Word; |
| 448 } | 449 } |
| 449 } else if (CXFA_Font font = pTextProvider->GetFontNode()) { | 450 } else if (CXFA_Font font = pTextProvider->GetFontNode()) { |
| 450 iPeriod = font.GetUnderlinePeriod(); | 451 iPeriod = font.GetUnderlinePeriod(); |
| 451 } | 452 } |
| 452 } else { | 453 } else { |
| 453 CXFA_Font font = pTextProvider->GetFontNode(); | 454 CXFA_Font font = pTextProvider->GetFontNode(); |
| 454 if (font) { | 455 if (font) { |
| 455 iUnderline = font.GetUnderline(); | 456 iUnderline = font.GetUnderline(); |
| 456 iPeriod = font.GetUnderlinePeriod(); | 457 iPeriod = font.GetUnderlinePeriod(); |
| 457 } | 458 } |
| 458 } | 459 } |
| 459 } | 460 } |
| 460 void CXFA_TextParser::GetLinethrough(IXFA_TextProvider* pTextProvider, | 461 void CXFA_TextParser::GetLinethrough(CXFA_TextProvider* pTextProvider, |
| 461 IFDE_CSSComputedStyle* pStyle, | 462 IFDE_CSSComputedStyle* pStyle, |
| 462 int32_t& iLinethrough) const { | 463 int32_t& iLinethrough) const { |
| 463 if (pStyle) { | 464 if (pStyle) { |
| 464 uint32_t dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration(); | 465 uint32_t dwDecoration = pStyle->GetParagraphStyles()->GetTextDecoration(); |
| 465 iLinethrough = (dwDecoration & FDE_CSSTEXTDECORATION_LineThrough) ? 1 : 0; | 466 iLinethrough = (dwDecoration & FDE_CSSTEXTDECORATION_LineThrough) ? 1 : 0; |
| 466 } else { | 467 } else { |
| 467 CXFA_Font font = pTextProvider->GetFontNode(); | 468 CXFA_Font font = pTextProvider->GetFontNode(); |
| 468 if (font) { | 469 if (font) { |
| 469 iLinethrough = font.GetLineThrough(); | 470 iLinethrough = font.GetLineThrough(); |
| 470 } | 471 } |
| 471 } | 472 } |
| 472 } | 473 } |
| 473 FX_ARGB CXFA_TextParser::GetColor(IXFA_TextProvider* pTextProvider, | 474 FX_ARGB CXFA_TextParser::GetColor(CXFA_TextProvider* pTextProvider, |
| 474 IFDE_CSSComputedStyle* pStyle) const { | 475 IFDE_CSSComputedStyle* pStyle) const { |
| 475 if (pStyle) | 476 if (pStyle) |
| 476 return pStyle->GetFontStyles()->GetColor(); | 477 return pStyle->GetFontStyles()->GetColor(); |
| 477 | 478 |
| 478 if (CXFA_Font font = pTextProvider->GetFontNode()) | 479 if (CXFA_Font font = pTextProvider->GetFontNode()) |
| 479 return font.GetColor(); | 480 return font.GetColor(); |
| 480 | 481 |
| 481 return 0xFF000000; | 482 return 0xFF000000; |
| 482 } | 483 } |
| 483 FX_FLOAT CXFA_TextParser::GetBaseline(IXFA_TextProvider* pTextProvider, | 484 FX_FLOAT CXFA_TextParser::GetBaseline(CXFA_TextProvider* pTextProvider, |
| 484 IFDE_CSSComputedStyle* pStyle) const { | 485 IFDE_CSSComputedStyle* pStyle) const { |
| 485 if (pStyle) { | 486 if (pStyle) { |
| 486 IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles(); | 487 IFDE_CSSParagraphStyle* pParaStyle = pStyle->GetParagraphStyles(); |
| 487 if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) { | 488 if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) { |
| 488 return pParaStyle->GetNumberVerticalAlign(); | 489 return pParaStyle->GetNumberVerticalAlign(); |
| 489 } | 490 } |
| 490 } else if (CXFA_Font font = pTextProvider->GetFontNode()) { | 491 } else if (CXFA_Font font = pTextProvider->GetFontNode()) { |
| 491 return font.GetBaselineShift(); | 492 return font.GetBaselineShift(); |
| 492 } | 493 } |
| 493 return 0; | 494 return 0; |
| 494 } | 495 } |
| 495 FX_FLOAT CXFA_TextParser::GetLineHeight(IXFA_TextProvider* pTextProvider, | 496 FX_FLOAT CXFA_TextParser::GetLineHeight(CXFA_TextProvider* pTextProvider, |
| 496 IFDE_CSSComputedStyle* pStyle, | 497 IFDE_CSSComputedStyle* pStyle, |
| 497 FX_BOOL bFirst, | 498 FX_BOOL bFirst, |
| 498 FX_FLOAT fVerScale) const { | 499 FX_FLOAT fVerScale) const { |
| 499 FX_FLOAT fLineHeight = 0; | 500 FX_FLOAT fLineHeight = 0; |
| 500 if (pStyle) { | 501 if (pStyle) { |
| 501 fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight(); | 502 fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight(); |
| 502 } else if (CXFA_Para para = pTextProvider->GetParaNode()) { | 503 } else if (CXFA_Para para = pTextProvider->GetParaNode()) { |
| 503 fLineHeight = para.GetLineHeight(); | 504 fLineHeight = para.GetLineHeight(); |
| 504 } | 505 } |
| 505 if (bFirst) { | 506 if (bFirst) { |
| 506 FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle); | 507 FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle); |
| 507 if (fLineHeight < 0.1f) { | 508 if (fLineHeight < 0.1f) { |
| 508 fLineHeight = fFontSize; | 509 fLineHeight = fFontSize; |
| 509 } else { | 510 } else { |
| 510 fLineHeight = std::min(fLineHeight, fFontSize); | 511 fLineHeight = std::min(fLineHeight, fFontSize); |
| 511 } | 512 } |
| 512 } else if (fLineHeight < 0.1f) { | 513 } else if (fLineHeight < 0.1f) { |
| 513 fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f; | 514 fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f; |
| 514 } | 515 } |
| 515 fLineHeight *= fVerScale; | 516 fLineHeight *= fVerScale; |
| 516 return fLineHeight; | 517 return fLineHeight; |
| 517 } | 518 } |
| 518 FX_BOOL CXFA_TextParser::GetEmbbedObj(IXFA_TextProvider* pTextProvider, | 519 FX_BOOL CXFA_TextParser::GetEmbbedObj(CXFA_TextProvider* pTextProvider, |
| 519 CFDE_XMLNode* pXMLNode, | 520 CFDE_XMLNode* pXMLNode, |
| 520 CFX_WideString& wsValue) { | 521 CFX_WideString& wsValue) { |
| 521 wsValue.Empty(); | 522 wsValue.Empty(); |
| 522 if (pXMLNode == NULL) { | 523 if (pXMLNode == NULL) { |
| 523 return FALSE; | 524 return FALSE; |
| 524 } | 525 } |
| 525 FX_BOOL bRet = FALSE; | 526 FX_BOOL bRet = FALSE; |
| 526 if (pXMLNode->GetType() == FDE_XMLNODE_Element) { | 527 if (pXMLNode->GetType() == FDE_XMLNODE_Element) { |
| 527 CFDE_XMLElement* pElement = static_cast<CFDE_XMLElement*>(pXMLNode); | 528 CFDE_XMLElement* pElement = static_cast<CFDE_XMLElement*>(pXMLNode); |
| 528 CFX_WideString wsAttr; | 529 CFX_WideString wsAttr; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 } | 658 } |
| 658 if (!wsAlign.IsEmpty()) { | 659 if (!wsAlign.IsEmpty()) { |
| 659 uint32_t dwHashCode = | 660 uint32_t dwHashCode = |
| 660 FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE); | 661 FX_HashCode_String_GetW(wsAlign, wsAlign.GetLength(), TRUE); |
| 661 CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast)); | 662 CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast)); |
| 662 FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt); | 663 FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt); |
| 663 pTabstopContext->Append(dwHashCode, fPos); | 664 pTabstopContext->Append(dwHashCode, fPos); |
| 664 } | 665 } |
| 665 return TRUE; | 666 return TRUE; |
| 666 } | 667 } |
| 667 CXFA_TextLayout::CXFA_TextLayout(IXFA_TextProvider* pTextProvider) | 668 CXFA_TextLayout::CXFA_TextLayout(CXFA_TextProvider* pTextProvider) |
| 668 : m_bHasBlock(FALSE), | 669 : m_bHasBlock(FALSE), |
| 669 m_pTextProvider(pTextProvider), | 670 m_pTextProvider(pTextProvider), |
| 670 m_pTextDataNode(nullptr), | 671 m_pTextDataNode(nullptr), |
| 671 m_bRichText(FALSE), | 672 m_bRichText(FALSE), |
| 672 m_pAllocator(nullptr), | 673 m_pAllocator(nullptr), |
| 673 m_pBreak(nullptr), | 674 m_pBreak(nullptr), |
| 674 m_pLoader(nullptr), | 675 m_pLoader(nullptr), |
| 675 m_iLines(0), | 676 m_iLines(0), |
| 676 m_fMaxWidth(0), | 677 m_fMaxWidth(0), |
| 677 m_pTabstopContext(nullptr), | 678 m_pTabstopContext(nullptr), |
| (...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1993 tr.iLength = iLength; | 1994 tr.iLength = iLength; |
| 1994 tr.fFontSize = pPiece->fFontSize; | 1995 tr.fFontSize = pPiece->fFontSize; |
| 1995 tr.iBidiLevel = pPiece->iBidiLevel; | 1996 tr.iBidiLevel = pPiece->iBidiLevel; |
| 1996 tr.iCharRotation = 0; | 1997 tr.iCharRotation = 0; |
| 1997 tr.wLineBreakChar = L'\n'; | 1998 tr.wLineBreakChar = L'\n'; |
| 1998 tr.iVerticalScale = pPiece->iVerScale; | 1999 tr.iVerticalScale = pPiece->iVerScale; |
| 1999 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; | 2000 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; |
| 2000 tr.iHorizontalScale = pPiece->iHorScale; | 2001 tr.iHorizontalScale = pPiece->iHorScale; |
| 2001 return TRUE; | 2002 return TRUE; |
| 2002 } | 2003 } |
| OLD | NEW |