Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: xfa/fxfa/app/xfa_textlayout.cpp

Issue 2467203003: Remove FX_BOOL from xfa. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fxfa/app/xfa_textlayout.h ('k') | xfa/fxfa/cxfa_eventparam.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/fx_ext.h" 11 #include "core/fxcrt/fx_ext.h"
12 #include "xfa/fde/cfde_path.h" 12 #include "xfa/fde/cfde_path.h"
13 #include "xfa/fde/css/fde_csscache.h" 13 #include "xfa/fde/css/fde_csscache.h"
14 #include "xfa/fde/css/fde_cssstyleselector.h" 14 #include "xfa/fde/css/fde_cssstyleselector.h"
15 #include "xfa/fde/fde_gedevice.h" 15 #include "xfa/fde/fde_gedevice.h"
16 #include "xfa/fde/fde_object.h" 16 #include "xfa/fde/fde_object.h"
17 #include "xfa/fde/xml/fde_xml_imp.h" 17 #include "xfa/fde/xml/fde_xml_imp.h"
18 #include "xfa/fgas/crt/fgas_codepage.h" 18 #include "xfa/fgas/crt/fgas_codepage.h"
19 #include "xfa/fxfa/app/xfa_ffwidgetacc.h" 19 #include "xfa/fxfa/app/xfa_ffwidgetacc.h"
20 #include "xfa/fxfa/parser/cxfa_measurement.h" 20 #include "xfa/fxfa/parser/cxfa_measurement.h"
21 #include "xfa/fxfa/xfa_ffapp.h" 21 #include "xfa/fxfa/xfa_ffapp.h"
22 #include "xfa/fxfa/xfa_ffdoc.h" 22 #include "xfa/fxfa/xfa_ffdoc.h"
23 #include "xfa/fxfa/xfa_fontmgr.h" 23 #include "xfa/fxfa/xfa_fontmgr.h"
24 24
25 CXFA_CSSTagProvider::CXFA_CSSTagProvider() 25 CXFA_CSSTagProvider::CXFA_CSSTagProvider()
26 : m_bTagAvailable(FALSE), m_bContent(FALSE) {} 26 : m_bTagAvailable(false), m_bContent(false) {}
27 27
28 CXFA_CSSTagProvider::~CXFA_CSSTagProvider() {} 28 CXFA_CSSTagProvider::~CXFA_CSSTagProvider() {}
29 29
30 XFA_TextPiece::XFA_TextPiece() 30 XFA_TextPiece::XFA_TextPiece()
31 : pszText(nullptr), pFont(nullptr), pLinkData(nullptr) {} 31 : pszText(nullptr), pFont(nullptr), pLinkData(nullptr) {}
32 32
33 XFA_TextPiece::~XFA_TextPiece() { 33 XFA_TextPiece::~XFA_TextPiece() {
34 if (pLinkData) 34 if (pLinkData)
35 pLinkData->Release(); 35 pLinkData->Release();
36 } 36 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 m_pSelector->SetDefFontSize(fFontSize); 105 m_pSelector->SetDefFontSize(fFontSize);
106 } 106 }
107 if (!m_pUASheet) { 107 if (!m_pUASheet) {
108 m_pUASheet = LoadDefaultSheetStyle(); 108 m_pUASheet = LoadDefaultSheetStyle();
109 m_pSelector->SetStyleSheet(FDE_CSSSTYLESHEETGROUP_UserAgent, m_pUASheet); 109 m_pSelector->SetStyleSheet(FDE_CSSSTYLESHEETGROUP_UserAgent, m_pUASheet);
110 m_pSelector->UpdateStyleIndex(FDE_CSSMEDIATYPE_ALL); 110 m_pSelector->UpdateStyleIndex(FDE_CSSMEDIATYPE_ALL);
111 } 111 }
112 } 112 }
113 113
114 CXFA_LoaderContext::CXFA_LoaderContext() 114 CXFA_LoaderContext::CXFA_LoaderContext()
115 : m_bSaveLineHeight(FALSE), 115 : m_bSaveLineHeight(false),
116 m_fWidth(0), 116 m_fWidth(0),
117 m_fHeight(0), 117 m_fHeight(0),
118 m_fLastPos(0), 118 m_fLastPos(0),
119 m_fStartLineOffset(0), 119 m_fStartLineOffset(0),
120 m_iChar(0), 120 m_iChar(0),
121 m_iTotalLines(-1), 121 m_iTotalLines(-1),
122 m_pXMLNode(nullptr), 122 m_pXMLNode(nullptr),
123 m_pNode(nullptr), 123 m_pNode(nullptr),
124 m_pParentStyle(nullptr), 124 m_pParentStyle(nullptr),
125 m_dwFlags(0) {} 125 m_dwFlags(0) {}
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 pXMLElement->GetLocalTagName(wsName); 334 pXMLElement->GetLocalTagName(wsName);
335 tagProvider.SetTagNameObj(wsName); 335 tagProvider.SetTagNameObj(wsName);
336 tagProvider.m_bTagAvailable = TagValidate(wsName); 336 tagProvider.m_bTagAvailable = TagValidate(wsName);
337 337
338 CFX_WideString wsValue; 338 CFX_WideString wsValue;
339 pXMLElement->GetString(L"style", wsValue); 339 pXMLElement->GetString(L"style", wsValue);
340 if (!wsValue.IsEmpty()) { 340 if (!wsValue.IsEmpty()) {
341 tagProvider.SetAttribute(L"style", wsValue); 341 tagProvider.SetAttribute(L"style", wsValue);
342 } 342 }
343 } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) { 343 } else if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
344 tagProvider.m_bTagAvailable = TRUE; 344 tagProvider.m_bTagAvailable = true;
345 tagProvider.m_bContent = TRUE; 345 tagProvider.m_bContent = true;
346 } 346 }
347 } 347 }
348 348
349 int32_t CXFA_TextParser::GetVAlign(CXFA_TextProvider* pTextProvider) const { 349 int32_t CXFA_TextParser::GetVAlign(CXFA_TextProvider* pTextProvider) const {
350 CXFA_Para para = pTextProvider->GetParaNode(); 350 CXFA_Para para = pTextProvider->GetParaNode();
351 return para ? para.GetVerticalAlign() : XFA_ATTRIBUTEENUM_Top; 351 return para ? para.GetVerticalAlign() : XFA_ATTRIBUTEENUM_Top;
352 } 352 }
353 353
354 FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle* pStyle) const { 354 FX_FLOAT CXFA_TextParser::GetTabInterval(IFDE_CSSComputedStyle* pStyle) const {
355 CFX_WideString wsValue; 355 CFX_WideString wsValue;
356 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue)) 356 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"tab-interval"), wsValue))
357 return CXFA_Measurement(wsValue.AsStringC()).ToUnit(XFA_UNIT_Pt); 357 return CXFA_Measurement(wsValue.AsStringC()).ToUnit(XFA_UNIT_Pt);
358 return 36; 358 return 36;
359 } 359 }
360 360
361 int32_t CXFA_TextParser::CountTabs(IFDE_CSSComputedStyle* pStyle) const { 361 int32_t CXFA_TextParser::CountTabs(IFDE_CSSComputedStyle* pStyle) const {
362 CFX_WideString wsValue; 362 CFX_WideString wsValue;
363 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-count"), wsValue)) 363 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-count"), wsValue))
364 return wsValue.GetInteger(); 364 return wsValue.GetInteger();
365 return 0; 365 return 0;
366 } 366 }
367 367
368 FX_BOOL CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const { 368 bool CXFA_TextParser::IsSpaceRun(IFDE_CSSComputedStyle* pStyle) const {
369 CFX_WideString wsValue; 369 CFX_WideString wsValue;
370 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) { 370 if (pStyle && pStyle->GetCustomStyle(FX_WSTRC(L"xfa-spacerun"), wsValue)) {
371 wsValue.MakeLower(); 371 wsValue.MakeLower();
372 return wsValue == FX_WSTRC(L"yes"); 372 return wsValue == FX_WSTRC(L"yes");
373 } 373 }
374 return FALSE; 374 return false;
375 } 375 }
376 CFGAS_GEFont* CXFA_TextParser::GetFont(CXFA_TextProvider* pTextProvider, 376 CFGAS_GEFont* CXFA_TextParser::GetFont(CXFA_TextProvider* pTextProvider,
377 IFDE_CSSComputedStyle* pStyle) const { 377 IFDE_CSSComputedStyle* pStyle) const {
378 CFX_WideStringC wsFamily = FX_WSTRC(L"Courier"); 378 CFX_WideStringC wsFamily = FX_WSTRC(L"Courier");
379 uint32_t dwStyle = 0; 379 uint32_t dwStyle = 0;
380 CXFA_Font font = pTextProvider->GetFontNode(); 380 CXFA_Font font = pTextProvider->GetFontNode();
381 if (font) { 381 if (font) {
382 font.GetTypeface(wsFamily); 382 font.GetTypeface(wsFamily);
383 if (font.IsBold()) { 383 if (font.IsBold()) {
384 dwStyle |= FX_FONTSTYLE_Bold; 384 dwStyle |= FX_FONTSTYLE_Bold;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) { 513 if (pParaStyle->GetVerticalAlign() == FDE_CSSVERTICALALIGN_Number) {
514 return pParaStyle->GetNumberVerticalAlign(); 514 return pParaStyle->GetNumberVerticalAlign();
515 } 515 }
516 } else if (CXFA_Font font = pTextProvider->GetFontNode()) { 516 } else if (CXFA_Font font = pTextProvider->GetFontNode()) {
517 return font.GetBaselineShift(); 517 return font.GetBaselineShift();
518 } 518 }
519 return 0; 519 return 0;
520 } 520 }
521 FX_FLOAT CXFA_TextParser::GetLineHeight(CXFA_TextProvider* pTextProvider, 521 FX_FLOAT CXFA_TextParser::GetLineHeight(CXFA_TextProvider* pTextProvider,
522 IFDE_CSSComputedStyle* pStyle, 522 IFDE_CSSComputedStyle* pStyle,
523 FX_BOOL bFirst, 523 bool bFirst,
524 FX_FLOAT fVerScale) const { 524 FX_FLOAT fVerScale) const {
525 FX_FLOAT fLineHeight = 0; 525 FX_FLOAT fLineHeight = 0;
526 if (pStyle) { 526 if (pStyle) {
527 fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight(); 527 fLineHeight = pStyle->GetParagraphStyles()->GetLineHeight();
528 } else if (CXFA_Para para = pTextProvider->GetParaNode()) { 528 } else if (CXFA_Para para = pTextProvider->GetParaNode()) {
529 fLineHeight = para.GetLineHeight(); 529 fLineHeight = para.GetLineHeight();
530 } 530 }
531 if (bFirst) { 531 if (bFirst) {
532 FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle); 532 FX_FLOAT fFontSize = GetFontSize(pTextProvider, pStyle);
533 if (fLineHeight < 0.1f) { 533 if (fLineHeight < 0.1f) {
534 fLineHeight = fFontSize; 534 fLineHeight = fFontSize;
535 } else { 535 } else {
536 fLineHeight = std::min(fLineHeight, fFontSize); 536 fLineHeight = std::min(fLineHeight, fFontSize);
537 } 537 }
538 } else if (fLineHeight < 0.1f) { 538 } else if (fLineHeight < 0.1f) {
539 fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f; 539 fLineHeight = GetFontSize(pTextProvider, pStyle) * 1.2f;
540 } 540 }
541 fLineHeight *= fVerScale; 541 fLineHeight *= fVerScale;
542 return fLineHeight; 542 return fLineHeight;
543 } 543 }
544 FX_BOOL CXFA_TextParser::GetEmbbedObj(CXFA_TextProvider* pTextProvider, 544 bool CXFA_TextParser::GetEmbbedObj(CXFA_TextProvider* pTextProvider,
545 CFDE_XMLNode* pXMLNode, 545 CFDE_XMLNode* pXMLNode,
546 CFX_WideString& wsValue) { 546 CFX_WideString& wsValue) {
547 wsValue.clear(); 547 wsValue.clear();
548 if (!pXMLNode) { 548 if (!pXMLNode) {
549 return FALSE; 549 return false;
550 } 550 }
551 FX_BOOL bRet = FALSE; 551 bool bRet = false;
552 if (pXMLNode->GetType() == FDE_XMLNODE_Element) { 552 if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
553 CFDE_XMLElement* pElement = static_cast<CFDE_XMLElement*>(pXMLNode); 553 CFDE_XMLElement* pElement = static_cast<CFDE_XMLElement*>(pXMLNode);
554 CFX_WideString wsAttr; 554 CFX_WideString wsAttr;
555 pElement->GetString(L"xfa:embed", wsAttr); 555 pElement->GetString(L"xfa:embed", wsAttr);
556 if (wsAttr.IsEmpty()) { 556 if (wsAttr.IsEmpty()) {
557 return FALSE; 557 return false;
558 } 558 }
559 if (wsAttr.GetAt(0) == L'#') { 559 if (wsAttr.GetAt(0) == L'#') {
560 wsAttr.Delete(0); 560 wsAttr.Delete(0);
561 } 561 }
562 CFX_WideString ws; 562 CFX_WideString ws;
563 pElement->GetString(L"xfa:embedType", ws); 563 pElement->GetString(L"xfa:embedType", ws);
564 if (ws.IsEmpty()) { 564 if (ws.IsEmpty()) {
565 ws = L"som"; 565 ws = L"som";
566 } else { 566 } else {
567 ws.MakeLower(); 567 ws.MakeLower();
568 } 568 }
569 FX_BOOL bURI = (ws == FX_WSTRC(L"uri")); 569 bool bURI = (ws == FX_WSTRC(L"uri"));
570 if (!bURI && ws != FX_WSTRC(L"som")) { 570 if (!bURI && ws != FX_WSTRC(L"som")) {
571 return FALSE; 571 return false;
572 } 572 }
573 ws.clear(); 573 ws.clear();
574 pElement->GetString(L"xfa:embedMode", ws); 574 pElement->GetString(L"xfa:embedMode", ws);
575 if (ws.IsEmpty()) { 575 if (ws.IsEmpty()) {
576 ws = L"formatted"; 576 ws = L"formatted";
577 } else { 577 } else {
578 ws.MakeLower(); 578 ws.MakeLower();
579 } 579 }
580 FX_BOOL bRaw = (ws == FX_WSTRC(L"raw")); 580 bool bRaw = (ws == FX_WSTRC(L"raw"));
581 if (!bRaw && ws != FX_WSTRC(L"formatted")) { 581 if (!bRaw && ws != FX_WSTRC(L"formatted")) {
582 return FALSE; 582 return false;
583 } 583 }
584 bRet = pTextProvider->GetEmbbedObj(bURI, bRaw, wsAttr, wsValue); 584 bRet = pTextProvider->GetEmbbedObj(bURI, bRaw, wsAttr, wsValue);
585 } 585 }
586 return bRet; 586 return bRet;
587 } 587 }
588 CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap( 588 CXFA_TextParseContext* CXFA_TextParser::GetParseContextFromMap(
589 CFDE_XMLNode* pXMLNode) { 589 CFDE_XMLNode* pXMLNode) {
590 return (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt( 590 return (CXFA_TextParseContext*)m_mapXMLNodeToParseContext.GetValueAt(
591 pXMLNode); 591 pXMLNode);
592 } 592 }
593 enum XFA_TABSTOPSSTATUS { 593 enum XFA_TABSTOPSSTATUS {
594 XFA_TABSTOPSSTATUS_Error, 594 XFA_TABSTOPSSTATUS_Error,
595 XFA_TABSTOPSSTATUS_EOS, 595 XFA_TABSTOPSSTATUS_EOS,
596 XFA_TABSTOPSSTATUS_None, 596 XFA_TABSTOPSSTATUS_None,
597 XFA_TABSTOPSSTATUS_Alignment, 597 XFA_TABSTOPSSTATUS_Alignment,
598 XFA_TABSTOPSSTATUS_StartLeader, 598 XFA_TABSTOPSSTATUS_StartLeader,
599 XFA_TABSTOPSSTATUS_Leader, 599 XFA_TABSTOPSSTATUS_Leader,
600 XFA_TABSTOPSSTATUS_Location, 600 XFA_TABSTOPSSTATUS_Location,
601 }; 601 };
602 FX_BOOL CXFA_TextParser::GetTabstops( 602 bool CXFA_TextParser::GetTabstops(IFDE_CSSComputedStyle* pStyle,
603 IFDE_CSSComputedStyle* pStyle, 603 CXFA_TextTabstopsContext* pTabstopContext) {
604 CXFA_TextTabstopsContext* pTabstopContext) {
605 if (!pStyle || !pTabstopContext) { 604 if (!pStyle || !pTabstopContext) {
606 return FALSE; 605 return false;
607 } 606 }
608 CFX_WideString wsValue; 607 CFX_WideString wsValue;
609 if (!pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-stops"), wsValue) && 608 if (!pStyle->GetCustomStyle(FX_WSTRC(L"xfa-tab-stops"), wsValue) &&
610 !pStyle->GetCustomStyle(FX_WSTRC(L"tab-stops"), wsValue)) { 609 !pStyle->GetCustomStyle(FX_WSTRC(L"tab-stops"), wsValue)) {
611 return FALSE; 610 return false;
612 } 611 }
613 int32_t iLength = wsValue.GetLength(); 612 int32_t iLength = wsValue.GetLength();
614 const FX_WCHAR* pTabStops = wsValue.c_str(); 613 const FX_WCHAR* pTabStops = wsValue.c_str();
615 int32_t iCur = 0; 614 int32_t iCur = 0;
616 int32_t iLast = 0; 615 int32_t iLast = 0;
617 CFX_WideString wsAlign; 616 CFX_WideString wsAlign;
618 XFA_TABSTOPSSTATUS eStatus = XFA_TABSTOPSSTATUS_None; 617 XFA_TABSTOPSSTATUS eStatus = XFA_TABSTOPSSTATUS_None;
619 FX_WCHAR ch; 618 FX_WCHAR ch;
620 while (iCur < iLength) { 619 while (iCur < iLength) {
621 ch = pTabStops[iCur]; 620 ch = pTabStops[iCur];
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 default: 678 default:
680 break; 679 break;
681 } 680 }
682 } 681 }
683 if (!wsAlign.IsEmpty()) { 682 if (!wsAlign.IsEmpty()) {
684 uint32_t dwHashCode = FX_HashCode_GetW(wsAlign.AsStringC(), true); 683 uint32_t dwHashCode = FX_HashCode_GetW(wsAlign.AsStringC(), true);
685 CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast)); 684 CXFA_Measurement ms(CFX_WideStringC(pTabStops + iLast, iCur - iLast));
686 FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt); 685 FX_FLOAT fPos = ms.ToUnit(XFA_UNIT_Pt);
687 pTabstopContext->Append(dwHashCode, fPos); 686 pTabstopContext->Append(dwHashCode, fPos);
688 } 687 }
689 return TRUE; 688 return true;
690 } 689 }
691 690
692 CXFA_TextLayout::CXFA_TextLayout(CXFA_TextProvider* pTextProvider) 691 CXFA_TextLayout::CXFA_TextLayout(CXFA_TextProvider* pTextProvider)
693 : m_bHasBlock(FALSE), 692 : m_bHasBlock(false),
694 m_pTextProvider(pTextProvider), 693 m_pTextProvider(pTextProvider),
695 m_pTextDataNode(nullptr), 694 m_pTextDataNode(nullptr),
696 m_bRichText(FALSE), 695 m_bRichText(false),
697 m_iLines(0), 696 m_iLines(0),
698 m_fMaxWidth(0), 697 m_fMaxWidth(0),
699 m_bBlockContinue(TRUE) { 698 m_bBlockContinue(true) {
700 ASSERT(m_pTextProvider); 699 ASSERT(m_pTextProvider);
701 } 700 }
702 701
703 CXFA_TextLayout::~CXFA_TextLayout() { 702 CXFA_TextLayout::~CXFA_TextLayout() {
704 m_textParser.Reset(); 703 m_textParser.Reset();
705 Unload(); 704 Unload();
706 } 705 }
707 706
708 void CXFA_TextLayout::Unload() { 707 void CXFA_TextLayout::Unload() {
709 for (int32_t i = 0; i < m_pieceLines.GetSize(); i++) { 708 for (int32_t i = 0; i < m_pieceLines.GetSize(); i++) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 pXMLElement->GetLocalTagName(wsTag); 755 pXMLElement->GetLocalTagName(wsTag);
757 if (wsTag == FX_WSTRC(L"body") || wsTag == FX_WSTRC(L"html")) { 756 if (wsTag == FX_WSTRC(L"body") || wsTag == FX_WSTRC(L"html")) {
758 pXMLContainer = pXMLChild; 757 pXMLContainer = pXMLChild;
759 break; 758 break;
760 } 759 }
761 } 760 }
762 } 761 }
763 } 762 }
764 return pXMLContainer; 763 return pXMLContainer;
765 } 764 }
766 CFX_RTFBreak* CXFA_TextLayout::CreateBreak(FX_BOOL bDefault) { 765 CFX_RTFBreak* CXFA_TextLayout::CreateBreak(bool bDefault) {
767 uint32_t dwStyle = FX_RTFLAYOUTSTYLE_ExpandTab; 766 uint32_t dwStyle = FX_RTFLAYOUTSTYLE_ExpandTab;
768 if (!bDefault) { 767 if (!bDefault) {
769 dwStyle |= FX_RTFLAYOUTSTYLE_Pagination; 768 dwStyle |= FX_RTFLAYOUTSTYLE_Pagination;
770 } 769 }
771 CFX_RTFBreak* pBreak = new CFX_RTFBreak(0); 770 CFX_RTFBreak* pBreak = new CFX_RTFBreak(0);
772 pBreak->SetLayoutStyles(dwStyle); 771 pBreak->SetLayoutStyles(dwStyle);
773 pBreak->SetLineBreakChar(L'\n'); 772 pBreak->SetLineBreakChar(L'\n');
774 pBreak->SetLineBreakTolerance(1); 773 pBreak->SetLineBreakTolerance(1);
775 pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, nullptr)); 774 pBreak->SetFont(m_textParser.GetFont(m_pTextProvider, nullptr));
776 pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, nullptr)); 775 pBreak->SetFontSize(m_textParser.GetFontSize(m_pTextProvider, nullptr));
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 return wsText.GetLength(); 921 return wsText.GetLength();
923 } 922 }
924 FX_FLOAT CXFA_TextLayout::GetLayoutHeight() { 923 FX_FLOAT CXFA_TextLayout::GetLayoutHeight() {
925 if (!m_pLoader) { 924 if (!m_pLoader) {
926 return 0; 925 return 0;
927 } 926 }
928 int32_t iCount = m_pLoader->m_lineHeights.GetSize(); 927 int32_t iCount = m_pLoader->m_lineHeights.GetSize();
929 if (iCount == 0 && m_pLoader->m_fWidth > 0) { 928 if (iCount == 0 && m_pLoader->m_fWidth > 0) {
930 CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight); 929 CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
931 CFX_SizeF szDef; 930 CFX_SizeF szDef;
932 m_pLoader->m_bSaveLineHeight = TRUE; 931 m_pLoader->m_bSaveLineHeight = true;
933 m_pLoader->m_fLastPos = 0; 932 m_pLoader->m_fLastPos = 0;
934 CalcSize(szMax, szMax, szDef); 933 CalcSize(szMax, szMax, szDef);
935 m_pLoader->m_bSaveLineHeight = FALSE; 934 m_pLoader->m_bSaveLineHeight = false;
936 return szDef.y; 935 return szDef.y;
937 } 936 }
938 FX_FLOAT fHeight = m_pLoader->m_fHeight; 937 FX_FLOAT fHeight = m_pLoader->m_fHeight;
939 if (fHeight < 0.1f) { 938 if (fHeight < 0.1f) {
940 fHeight = 0; 939 fHeight = 0;
941 for (int32_t i = 0; i < iCount; i++) { 940 for (int32_t i = 0; i < iCount; i++) {
942 fHeight += m_pLoader->m_lineHeights.ElementAt(i); 941 fHeight += m_pLoader->m_lineHeights.ElementAt(i);
943 } 942 }
944 } 943 }
945 return fHeight; 944 return fHeight;
946 } 945 }
947 FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) { 946 FX_FLOAT CXFA_TextLayout::StartLayout(FX_FLOAT fWidth) {
948 if (!m_pLoader) 947 if (!m_pLoader)
949 m_pLoader.reset(new CXFA_LoaderContext); 948 m_pLoader.reset(new CXFA_LoaderContext);
950 949
951 if (fWidth < 0 || (m_pLoader->m_fWidth > -1 && 950 if (fWidth < 0 || (m_pLoader->m_fWidth > -1 &&
952 FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) { 951 FXSYS_fabs(fWidth - m_pLoader->m_fWidth) > 0)) {
953 m_pLoader->m_lineHeights.RemoveAll(); 952 m_pLoader->m_lineHeights.RemoveAll();
954 m_Blocks.RemoveAll(); 953 m_Blocks.RemoveAll();
955 Unload(); 954 Unload();
956 m_pLoader->m_fStartLineOffset = 0; 955 m_pLoader->m_fStartLineOffset = 0;
957 } 956 }
958 m_pLoader->m_fWidth = fWidth; 957 m_pLoader->m_fWidth = fWidth;
959 if (fWidth < 0) { 958 if (fWidth < 0) {
960 CFX_SizeF szMax; 959 CFX_SizeF szMax;
961 CFX_SizeF szDef; 960 CFX_SizeF szDef;
962 m_pLoader->m_bSaveLineHeight = TRUE; 961 m_pLoader->m_bSaveLineHeight = true;
963 m_pLoader->m_fLastPos = 0; 962 m_pLoader->m_fLastPos = 0;
964 CalcSize(szMax, szMax, szDef); 963 CalcSize(szMax, szMax, szDef);
965 m_pLoader->m_bSaveLineHeight = FALSE; 964 m_pLoader->m_bSaveLineHeight = false;
966 fWidth = szDef.x; 965 fWidth = szDef.x;
967 } 966 }
968 return fWidth; 967 return fWidth;
969 } 968 }
970 FX_BOOL CXFA_TextLayout::DoLayout(int32_t iBlockIndex, 969 bool CXFA_TextLayout::DoLayout(int32_t iBlockIndex,
971 FX_FLOAT& fCalcHeight, 970 FX_FLOAT& fCalcHeight,
972 FX_FLOAT fContentAreaHeight, 971 FX_FLOAT fContentAreaHeight,
973 FX_FLOAT fTextHeight) { 972 FX_FLOAT fTextHeight) {
974 if (!m_pLoader) { 973 if (!m_pLoader) {
975 return FALSE; 974 return false;
976 } 975 }
977 int32_t iBlockCount = m_Blocks.GetSize(); 976 int32_t iBlockCount = m_Blocks.GetSize();
978 FX_FLOAT fHeight = fTextHeight; 977 FX_FLOAT fHeight = fTextHeight;
979 if (fHeight < 0) { 978 if (fHeight < 0) {
980 fHeight = GetLayoutHeight(); 979 fHeight = GetLayoutHeight();
981 } 980 }
982 m_pLoader->m_fHeight = fHeight; 981 m_pLoader->m_fHeight = fHeight;
983 if (fContentAreaHeight < 0) { 982 if (fContentAreaHeight < 0) {
984 return FALSE; 983 return false;
985 } 984 }
986 m_bHasBlock = TRUE; 985 m_bHasBlock = true;
987 if (iBlockCount == 0 && fHeight > 0) { 986 if (iBlockCount == 0 && fHeight > 0) {
988 fHeight = fTextHeight - GetLayoutHeight(); 987 fHeight = fTextHeight - GetLayoutHeight();
989 if (fHeight > 0) { 988 if (fHeight > 0) {
990 int32_t iAlign = m_textParser.GetVAlign(m_pTextProvider); 989 int32_t iAlign = m_textParser.GetVAlign(m_pTextProvider);
991 if (iAlign == XFA_ATTRIBUTEENUM_Middle) { 990 if (iAlign == XFA_ATTRIBUTEENUM_Middle) {
992 fHeight /= 2.0f; 991 fHeight /= 2.0f;
993 } else if (iAlign != XFA_ATTRIBUTEENUM_Bottom) { 992 } else if (iAlign != XFA_ATTRIBUTEENUM_Bottom) {
994 fHeight = 0; 993 fHeight = 0;
995 } 994 }
996 m_pLoader->m_fStartLineOffset = fHeight; 995 m_pLoader->m_fStartLineOffset = fHeight;
(...skipping 13 matching lines...) Expand all
1010 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); 1009 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
1011 } 1010 }
1012 } 1011 }
1013 } 1012 }
1014 int32_t iCount = m_pLoader->m_lineHeights.GetSize(); 1013 int32_t iCount = m_pLoader->m_lineHeights.GetSize();
1015 int32_t i = 0; 1014 int32_t i = 0;
1016 for (i = iLineIndex; i < iCount; i++) { 1015 for (i = iLineIndex; i < iCount; i++) {
1017 FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i); 1016 FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i);
1018 if ((i == iLineIndex) && (fLineHeight - fContentAreaHeight > 0.001)) { 1017 if ((i == iLineIndex) && (fLineHeight - fContentAreaHeight > 0.001)) {
1019 fCalcHeight = 0; 1018 fCalcHeight = 0;
1020 return TRUE; 1019 return true;
1021 } 1020 }
1022 if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) { 1021 if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) {
1023 if (iBlockCount >= (iBlockIndex + 1) * 2) { 1022 if (iBlockCount >= (iBlockIndex + 1) * 2) {
1024 m_Blocks.SetAt(iBlockIndex * 2, iLineIndex); 1023 m_Blocks.SetAt(iBlockIndex * 2, iLineIndex);
1025 m_Blocks.SetAt(iBlockIndex * 2 + 1, i - iLineIndex); 1024 m_Blocks.SetAt(iBlockIndex * 2 + 1, i - iLineIndex);
1026 } else { 1025 } else {
1027 m_Blocks.Add(iLineIndex); 1026 m_Blocks.Add(iLineIndex);
1028 m_Blocks.Add(i - iLineIndex); 1027 m_Blocks.Add(i - iLineIndex);
1029 } 1028 }
1030 if (i == iLineIndex) { 1029 if (i == iLineIndex) {
1031 if (fCalcHeight <= fLinePos) { 1030 if (fCalcHeight <= fLinePos) {
1032 if (m_pLoader->m_BlocksHeight.GetSize() > iBlockIndex * 2 && 1031 if (m_pLoader->m_BlocksHeight.GetSize() > iBlockIndex * 2 &&
1033 (m_pLoader->m_BlocksHeight.GetAt(iBlockIndex * 2) == 1032 (m_pLoader->m_BlocksHeight.GetAt(iBlockIndex * 2) ==
1034 iBlockIndex)) { 1033 iBlockIndex)) {
1035 m_pLoader->m_BlocksHeight.SetAt(iBlockIndex * 2 + 1, fCalcHeight); 1034 m_pLoader->m_BlocksHeight.SetAt(iBlockIndex * 2 + 1, fCalcHeight);
1036 } else { 1035 } else {
1037 m_pLoader->m_BlocksHeight.Add((FX_FLOAT)iBlockIndex); 1036 m_pLoader->m_BlocksHeight.Add((FX_FLOAT)iBlockIndex);
1038 m_pLoader->m_BlocksHeight.Add(fCalcHeight); 1037 m_pLoader->m_BlocksHeight.Add(fCalcHeight);
1039 } 1038 }
1040 } 1039 }
1041 return TRUE; 1040 return true;
1042 } 1041 }
1043 fCalcHeight = fLinePos; 1042 fCalcHeight = fLinePos;
1044 return TRUE; 1043 return true;
1045 } 1044 }
1046 fLinePos += fLineHeight; 1045 fLinePos += fLineHeight;
1047 } 1046 }
1048 return FALSE; 1047 return false;
1049 } 1048 }
1050 int32_t CXFA_TextLayout::CountBlocks() const { 1049 int32_t CXFA_TextLayout::CountBlocks() const {
1051 int32_t iCount = m_Blocks.GetSize() / 2; 1050 int32_t iCount = m_Blocks.GetSize() / 2;
1052 return iCount > 0 ? iCount : 1; 1051 return iCount > 0 ? iCount : 1;
1053 } 1052 }
1054 1053
1055 FX_BOOL CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize, 1054 bool CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize,
1056 const CFX_SizeF& maxSize, 1055 const CFX_SizeF& maxSize,
1057 CFX_SizeF& defaultSize) { 1056 CFX_SizeF& defaultSize) {
1058 defaultSize.x = maxSize.x; 1057 defaultSize.x = maxSize.x;
1059 if (defaultSize.x < 1) 1058 if (defaultSize.x < 1)
1060 defaultSize.x = 0xFFFF; 1059 defaultSize.x = 0xFFFF;
1061 1060
1062 m_pBreak.reset(CreateBreak(FALSE)); 1061 m_pBreak.reset(CreateBreak(false));
1063 FX_FLOAT fLinePos = 0; 1062 FX_FLOAT fLinePos = 0;
1064 m_iLines = 0; 1063 m_iLines = 0;
1065 m_fMaxWidth = 0; 1064 m_fMaxWidth = 0;
1066 Loader(defaultSize, fLinePos, FALSE); 1065 Loader(defaultSize, fLinePos, false);
1067 if (fLinePos < 0.1f) 1066 if (fLinePos < 0.1f)
1068 fLinePos = m_textParser.GetFontSize(m_pTextProvider, nullptr); 1067 fLinePos = m_textParser.GetFontSize(m_pTextProvider, nullptr);
1069 1068
1070 m_pTabstopContext.reset(); 1069 m_pTabstopContext.reset();
1071 defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos); 1070 defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos);
1072 return TRUE; 1071 return true;
1073 } 1072 }
1074 1073
1075 FX_BOOL CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) { 1074 bool CXFA_TextLayout::Layout(const CFX_SizeF& size, FX_FLOAT* fHeight) {
1076 if (size.x < 1) 1075 if (size.x < 1)
1077 return FALSE; 1076 return false;
1078 1077
1079 Unload(); 1078 Unload();
1080 m_pBreak.reset(CreateBreak(TRUE)); 1079 m_pBreak.reset(CreateBreak(true));
1081 if (m_pLoader) { 1080 if (m_pLoader) {
1082 m_pLoader->m_iTotalLines = -1; 1081 m_pLoader->m_iTotalLines = -1;
1083 m_pLoader->m_iChar = 0; 1082 m_pLoader->m_iChar = 0;
1084 } 1083 }
1085 m_iLines = 0; 1084 m_iLines = 0;
1086 FX_FLOAT fLinePos = 0; 1085 FX_FLOAT fLinePos = 0;
1087 Loader(size, fLinePos, TRUE); 1086 Loader(size, fLinePos, true);
1088 UpdateAlign(size.y, fLinePos); 1087 UpdateAlign(size.y, fLinePos);
1089 m_pTabstopContext.reset(); 1088 m_pTabstopContext.reset();
1090 if (fHeight) 1089 if (fHeight)
1091 *fHeight = fLinePos; 1090 *fHeight = fLinePos;
1092 return TRUE; 1091 return true;
1093 } 1092 }
1094 1093
1095 FX_BOOL CXFA_TextLayout::Layout(int32_t iBlock) { 1094 bool CXFA_TextLayout::Layout(int32_t iBlock) {
1096 if (!m_pLoader || iBlock < 0 || iBlock >= CountBlocks()) 1095 if (!m_pLoader || iBlock < 0 || iBlock >= CountBlocks())
1097 return FALSE; 1096 return false;
1098 if (m_pLoader->m_fWidth < 1) 1097 if (m_pLoader->m_fWidth < 1)
1099 return FALSE; 1098 return false;
1100 1099
1101 m_pLoader->m_iTotalLines = -1; 1100 m_pLoader->m_iTotalLines = -1;
1102 m_iLines = 0; 1101 m_iLines = 0;
1103 FX_FLOAT fLinePos = 0; 1102 FX_FLOAT fLinePos = 0;
1104 CXFA_Node* pNode = nullptr; 1103 CXFA_Node* pNode = nullptr;
1105 CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight); 1104 CFX_SizeF szText(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
1106 int32_t iCount = m_Blocks.GetSize(); 1105 int32_t iCount = m_Blocks.GetSize();
1107 int32_t iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize(); 1106 int32_t iBlocksHeightCount = m_pLoader->m_BlocksHeight.GetSize();
1108 iBlocksHeightCount /= 2; 1107 iBlocksHeightCount /= 2;
1109 if (iBlock < iBlocksHeightCount) 1108 if (iBlock < iBlocksHeightCount)
1110 return TRUE; 1109 return true;
1111 if (iBlock == iBlocksHeightCount) { 1110 if (iBlock == iBlocksHeightCount) {
1112 Unload(); 1111 Unload();
1113 m_pBreak.reset(CreateBreak(TRUE)); 1112 m_pBreak.reset(CreateBreak(true));
1114 fLinePos = m_pLoader->m_fStartLineOffset; 1113 fLinePos = m_pLoader->m_fStartLineOffset;
1115 for (int32_t i = 0; i < iBlocksHeightCount; i++) { 1114 for (int32_t i = 0; i < iBlocksHeightCount; i++) {
1116 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); 1115 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
1117 } 1116 }
1118 m_pLoader->m_iChar = 0; 1117 m_pLoader->m_iChar = 0;
1119 if (iCount > 1) 1118 if (iCount > 1)
1120 m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1); 1119 m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock * 2 + 1);
1121 Loader(szText, fLinePos, TRUE); 1120 Loader(szText, fLinePos, true);
1122 if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f) 1121 if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f)
1123 UpdateAlign(szText.y, fLinePos); 1122 UpdateAlign(szText.y, fLinePos);
1124 } else if (m_pTextDataNode) { 1123 } else if (m_pTextDataNode) {
1125 iBlock *= 2; 1124 iBlock *= 2;
1126 if (iBlock < iCount - 2) 1125 if (iBlock < iCount - 2)
1127 m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock + 1); 1126 m_pLoader->m_iTotalLines = m_Blocks.ElementAt(iBlock + 1);
1128 m_pBreak->Reset(); 1127 m_pBreak->Reset();
1129 if (m_bRichText) { 1128 if (m_bRichText) {
1130 CFDE_XMLNode* pContainerNode = GetXMLContainerNode(); 1129 CFDE_XMLNode* pContainerNode = GetXMLContainerNode();
1131 if (!pContainerNode) { 1130 if (!pContainerNode) {
1132 return TRUE; 1131 return true;
1133 } 1132 }
1134 CFDE_XMLNode* pXMLNode = m_pLoader->m_pXMLNode; 1133 CFDE_XMLNode* pXMLNode = m_pLoader->m_pXMLNode;
1135 if (!pXMLNode) 1134 if (!pXMLNode)
1136 return TRUE; 1135 return true;
1137 CFDE_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode; 1136 CFDE_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode;
1138 for (; pXMLNode; 1137 for (; pXMLNode;
1139 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling)) { 1138 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling)) {
1140 if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, 1139 if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle,
1141 TRUE)) { 1140 true)) {
1142 break; 1141 break;
1143 } 1142 }
1144 } 1143 }
1145 while (!pXMLNode) { 1144 while (!pXMLNode) {
1146 pXMLNode = pSaveXMLNode->GetNodeItem(CFDE_XMLNode::Parent); 1145 pXMLNode = pSaveXMLNode->GetNodeItem(CFDE_XMLNode::Parent);
1147 if (pXMLNode == pContainerNode) 1146 if (pXMLNode == pContainerNode)
1148 break; 1147 break;
1149 if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle, 1148 if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle,
1150 TRUE, nullptr, FALSE)) { 1149 true, nullptr, false)) {
1151 break; 1150 break;
1152 } 1151 }
1153 pSaveXMLNode = pXMLNode; 1152 pSaveXMLNode = pXMLNode;
1154 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling); 1153 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling);
1155 if (!pXMLNode) 1154 if (!pXMLNode)
1156 continue; 1155 continue;
1157 for (; pXMLNode; 1156 for (; pXMLNode;
1158 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling)) { 1157 pXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling)) {
1159 if (!LoadRichText(pXMLNode, szText, fLinePos, 1158 if (!LoadRichText(pXMLNode, szText, fLinePos,
1160 m_pLoader->m_pParentStyle, TRUE)) { 1159 m_pLoader->m_pParentStyle, true)) {
1161 break; 1160 break;
1162 } 1161 }
1163 } 1162 }
1164 } 1163 }
1165 } else { 1164 } else {
1166 pNode = m_pLoader->m_pNode; 1165 pNode = m_pLoader->m_pNode;
1167 if (!pNode) 1166 if (!pNode)
1168 return TRUE; 1167 return true;
1169 LoadText(pNode, szText, fLinePos, TRUE); 1168 LoadText(pNode, szText, fLinePos, true);
1170 } 1169 }
1171 } 1170 }
1172 if (iBlock == iCount) { 1171 if (iBlock == iCount) {
1173 m_pTabstopContext.reset(); 1172 m_pTabstopContext.reset();
1174 m_pLoader.reset(); 1173 m_pLoader.reset();
1175 } 1174 }
1176 return TRUE; 1175 return true;
1177 } 1176 }
1178 void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) { 1177 void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) {
1179 if (!m_pLoader) { 1178 if (!m_pLoader) {
1180 return; 1179 return;
1181 } 1180 }
1182 int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize(); 1181 int32_t iCountHeight = m_pLoader->m_lineHeights.GetSize();
1183 if (iCountHeight == 0) { 1182 if (iCountHeight == 0) {
1184 return; 1183 return;
1185 } 1184 }
1186 FX_BOOL bEndItem = TRUE; 1185 bool bEndItem = true;
1187 int32_t iBlockCount = m_Blocks.GetSize(); 1186 int32_t iBlockCount = m_Blocks.GetSize();
1188 FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset; 1187 FX_FLOAT fLinePos = m_pLoader->m_fStartLineOffset;
1189 int32_t iLineIndex = 0; 1188 int32_t iLineIndex = 0;
1190 if (iBlockIndex > 0) { 1189 if (iBlockIndex > 0) {
1191 int32_t iBlockHeightCount = m_pLoader->m_BlocksHeight.GetSize(); 1190 int32_t iBlockHeightCount = m_pLoader->m_BlocksHeight.GetSize();
1192 iBlockHeightCount /= 2; 1191 iBlockHeightCount /= 2;
1193 if (iBlockHeightCount >= iBlockIndex) { 1192 if (iBlockHeightCount >= iBlockIndex) {
1194 for (int32_t i = 0; i < iBlockIndex; i++) { 1193 for (int32_t i = 0; i < iBlockIndex; i++) {
1195 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1); 1194 fLinePos -= m_pLoader->m_BlocksHeight.ElementAt(i * 2 + 1);
1196 } 1195 }
1197 } else { 1196 } else {
1198 fLinePos = 0; 1197 fLinePos = 0;
1199 } 1198 }
1200 iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) + 1199 iLineIndex = m_Blocks.ElementAt(iBlockCount - 1) +
1201 m_Blocks.ElementAt(iBlockCount - 2); 1200 m_Blocks.ElementAt(iBlockCount - 2);
1202 } 1201 }
1203 int32_t i = 0; 1202 int32_t i = 0;
1204 for (i = iLineIndex; i < iCountHeight; i++) { 1203 for (i = iLineIndex; i < iCountHeight; i++) {
1205 FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i); 1204 FX_FLOAT fLineHeight = m_pLoader->m_lineHeights.ElementAt(i);
1206 if (fLinePos + fLineHeight - rtText.height > 0.001) { 1205 if (fLinePos + fLineHeight - rtText.height > 0.001) {
1207 m_Blocks.Add(iLineIndex); 1206 m_Blocks.Add(iLineIndex);
1208 m_Blocks.Add(i - iLineIndex); 1207 m_Blocks.Add(i - iLineIndex);
1209 bEndItem = FALSE; 1208 bEndItem = false;
1210 break; 1209 break;
1211 } 1210 }
1212 fLinePos += fLineHeight; 1211 fLinePos += fLineHeight;
1213 } 1212 }
1214 if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) { 1213 if (iCountHeight > 0 && (i - iLineIndex) > 0 && bEndItem) {
1215 m_Blocks.Add(iLineIndex); 1214 m_Blocks.Add(iLineIndex);
1216 m_Blocks.Add(i - iLineIndex); 1215 m_Blocks.Add(i - iLineIndex);
1217 } 1216 }
1218 } 1217 }
1219 FX_BOOL CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice, 1218 bool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
1220 const CFX_Matrix& tmDoc2Device, 1219 const CFX_Matrix& tmDoc2Device,
1221 const CFX_RectF& rtClip, 1220 const CFX_RectF& rtClip,
1222 int32_t iBlock) { 1221 int32_t iBlock) {
1223 if (!pFxDevice) 1222 if (!pFxDevice)
1224 return FALSE; 1223 return false;
1225 1224
1226 std::unique_ptr<CFDE_RenderDevice> pDevice( 1225 std::unique_ptr<CFDE_RenderDevice> pDevice(
1227 new CFDE_RenderDevice(pFxDevice, FALSE)); 1226 new CFDE_RenderDevice(pFxDevice, false));
1228 pDevice->SaveState(); 1227 pDevice->SaveState();
1229 pDevice->SetClipRect(rtClip); 1228 pDevice->SetClipRect(rtClip);
1230 1229
1231 std::unique_ptr<CFDE_Brush> pSolidBrush(new CFDE_Brush); 1230 std::unique_ptr<CFDE_Brush> pSolidBrush(new CFDE_Brush);
1232 std::unique_ptr<CFDE_Pen> pPen(new CFDE_Pen); 1231 std::unique_ptr<CFDE_Pen> pPen(new CFDE_Pen);
1233 if (m_pieceLines.GetSize() == 0) { 1232 if (m_pieceLines.GetSize() == 0) {
1234 int32_t iBlockCount = CountBlocks(); 1233 int32_t iBlockCount = CountBlocks();
1235 for (int32_t i = 0; i < iBlockCount; i++) { 1234 for (int32_t i = 0; i < iBlockCount; i++) {
1236 Layout(i); 1235 Layout(i);
1237 } 1236 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 for (int32_t i = 0; i < iCount; i++) { 1295 for (int32_t i = 0; i < iCount; i++) {
1297 CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i); 1296 CXFA_PieceLine* pPieceLine = m_pieceLines.GetAt(i);
1298 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); 1297 int32_t iPieces = pPieceLine->m_textPieces.GetSize();
1299 for (int32_t j = 0; j < iPieces; j++) { 1298 for (int32_t j = 0; j < iPieces; j++) {
1300 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j); 1299 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(j);
1301 CFX_RectF& rect = pPiece->rtPiece; 1300 CFX_RectF& rect = pPiece->rtPiece;
1302 rect.top += fHeight; 1301 rect.top += fHeight;
1303 } 1302 }
1304 } 1303 }
1305 } 1304 }
1306 FX_BOOL CXFA_TextLayout::Loader(const CFX_SizeF& szText, 1305 bool CXFA_TextLayout::Loader(const CFX_SizeF& szText,
1307 FX_FLOAT& fLinePos, 1306 FX_FLOAT& fLinePos,
1308 FX_BOOL bSavePieces) { 1307 bool bSavePieces) {
1309 if (!m_pAllocator) { 1308 if (!m_pAllocator) {
1310 m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0); 1309 m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0);
1311 } 1310 }
1312 GetTextDataNode(); 1311 GetTextDataNode();
1313 if (!m_pTextDataNode) 1312 if (!m_pTextDataNode)
1314 return TRUE; 1313 return true;
1315 1314
1316 if (m_bRichText) { 1315 if (m_bRichText) {
1317 CFDE_XMLNode* pXMLContainer = GetXMLContainerNode(); 1316 CFDE_XMLNode* pXMLContainer = GetXMLContainerNode();
1318 if (pXMLContainer) { 1317 if (pXMLContainer) {
1319 if (!m_textParser.IsParsed()) { 1318 if (!m_textParser.IsParsed()) {
1320 m_textParser.DoParse(pXMLContainer, m_pTextProvider); 1319 m_textParser.DoParse(pXMLContainer, m_pTextProvider);
1321 } 1320 }
1322 IFDE_CSSComputedStyle* pRootStyle = 1321 IFDE_CSSComputedStyle* pRootStyle =
1323 m_textParser.CreateRootStyle(m_pTextProvider); 1322 m_textParser.CreateRootStyle(m_pTextProvider);
1324 LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces); 1323 LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces);
1325 pRootStyle->Release(); 1324 pRootStyle->Release();
1326 } 1325 }
1327 } else { 1326 } else {
1328 LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces); 1327 LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces);
1329 } 1328 }
1330 return TRUE; 1329 return true;
1331 } 1330 }
1332 void CXFA_TextLayout::LoadText(CXFA_Node* pNode, 1331 void CXFA_TextLayout::LoadText(CXFA_Node* pNode,
1333 const CFX_SizeF& szText, 1332 const CFX_SizeF& szText,
1334 FX_FLOAT& fLinePos, 1333 FX_FLOAT& fLinePos,
1335 FX_BOOL bSavePieces) { 1334 bool bSavePieces) {
1336 InitBreak(szText.x); 1335 InitBreak(szText.x);
1337 CXFA_Para para = m_pTextProvider->GetParaNode(); 1336 CXFA_Para para = m_pTextProvider->GetParaNode();
1338 FX_FLOAT fSpaceAbove = 0; 1337 FX_FLOAT fSpaceAbove = 0;
1339 if (para) { 1338 if (para) {
1340 fSpaceAbove = para.GetSpaceAbove(); 1339 fSpaceAbove = para.GetSpaceAbove();
1341 if (fSpaceAbove < 0.1f) { 1340 if (fSpaceAbove < 0.1f) {
1342 fSpaceAbove = 0; 1341 fSpaceAbove = 0;
1343 } 1342 }
1344 int32_t verAlign = para.GetVerticalAlign(); 1343 int32_t verAlign = para.GetVerticalAlign();
1345 switch (verAlign) { 1344 switch (verAlign) {
1346 case XFA_ATTRIBUTEENUM_Top: 1345 case XFA_ATTRIBUTEENUM_Top:
1347 case XFA_ATTRIBUTEENUM_Middle: 1346 case XFA_ATTRIBUTEENUM_Middle:
1348 case XFA_ATTRIBUTEENUM_Bottom: { 1347 case XFA_ATTRIBUTEENUM_Bottom: {
1349 fLinePos += fSpaceAbove; 1348 fLinePos += fSpaceAbove;
1350 break; 1349 break;
1351 } 1350 }
1352 } 1351 }
1353 } 1352 }
1354 CFX_WideString wsText = pNode->GetContent(); 1353 CFX_WideString wsText = pNode->GetContent();
1355 wsText.TrimRight(L" "); 1354 wsText.TrimRight(L" ");
1356 FX_BOOL bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces); 1355 bool bRet = AppendChar(wsText, fLinePos, fSpaceAbove, bSavePieces);
1357 if (bRet && m_pLoader) { 1356 if (bRet && m_pLoader) {
1358 m_pLoader->m_pNode = pNode; 1357 m_pLoader->m_pNode = pNode;
1359 } else { 1358 } else {
1360 EndBreak(FX_RTFBREAK_ParagraphBreak, fLinePos, bSavePieces); 1359 EndBreak(FX_RTFBREAK_ParagraphBreak, fLinePos, bSavePieces);
1361 } 1360 }
1362 } 1361 }
1363 FX_BOOL CXFA_TextLayout::LoadRichText(CFDE_XMLNode* pXMLNode, 1362 bool CXFA_TextLayout::LoadRichText(CFDE_XMLNode* pXMLNode,
1364 const CFX_SizeF& szText, 1363 const CFX_SizeF& szText,
1365 FX_FLOAT& fLinePos, 1364 FX_FLOAT& fLinePos,
1366 IFDE_CSSComputedStyle* pParentStyle, 1365 IFDE_CSSComputedStyle* pParentStyle,
1367 FX_BOOL bSavePieces, 1366 bool bSavePieces,
1368 CXFA_LinkUserData* pLinkData, 1367 CXFA_LinkUserData* pLinkData,
1369 FX_BOOL bEndBreak, 1368 bool bEndBreak,
1370 FX_BOOL bIsOl, 1369 bool bIsOl,
1371 int32_t iLiCount) { 1370 int32_t iLiCount) {
1372 if (!pXMLNode) { 1371 if (!pXMLNode) {
1373 return FALSE; 1372 return false;
1374 } 1373 }
1375 CXFA_TextParseContext* pContext = 1374 CXFA_TextParseContext* pContext =
1376 m_textParser.GetParseContextFromMap(pXMLNode); 1375 m_textParser.GetParseContextFromMap(pXMLNode);
1377 FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_None; 1376 FDE_CSSDISPLAY eDisplay = FDE_CSSDISPLAY_None;
1378 FX_BOOL bContentNode = FALSE; 1377 bool bContentNode = false;
1379 FX_FLOAT fSpaceBelow = 0; 1378 FX_FLOAT fSpaceBelow = 0;
1380 IFDE_CSSComputedStyle* pStyle = nullptr; 1379 IFDE_CSSComputedStyle* pStyle = nullptr;
1381 CFX_WideString wsName; 1380 CFX_WideString wsName;
1382 if (bEndBreak) { 1381 if (bEndBreak) {
1383 FX_BOOL bCurOl = FALSE; 1382 bool bCurOl = false;
1384 FX_BOOL bCurLi = FALSE; 1383 bool bCurLi = false;
1385 CFDE_XMLElement* pElement = nullptr; 1384 CFDE_XMLElement* pElement = nullptr;
1386 if (pContext) { 1385 if (pContext) {
1387 if (m_bBlockContinue || 1386 if (m_bBlockContinue ||
1388 (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) { 1387 (m_pLoader && pXMLNode == m_pLoader->m_pXMLNode)) {
1389 m_bBlockContinue = TRUE; 1388 m_bBlockContinue = true;
1390 } 1389 }
1391 if (pXMLNode->GetType() == FDE_XMLNODE_Text) { 1390 if (pXMLNode->GetType() == FDE_XMLNODE_Text) {
1392 bContentNode = TRUE; 1391 bContentNode = true;
1393 } else if (pXMLNode->GetType() == FDE_XMLNODE_Element) { 1392 } else if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
1394 pElement = static_cast<CFDE_XMLElement*>(pXMLNode); 1393 pElement = static_cast<CFDE_XMLElement*>(pXMLNode);
1395 pElement->GetLocalTagName(wsName); 1394 pElement->GetLocalTagName(wsName);
1396 } 1395 }
1397 if (wsName == FX_WSTRC(L"ol")) { 1396 if (wsName == FX_WSTRC(L"ol")) {
1398 bIsOl = TRUE; 1397 bIsOl = true;
1399 bCurOl = TRUE; 1398 bCurOl = true;
1400 } 1399 }
1401 if (m_bBlockContinue || bContentNode == FALSE) { 1400 if (m_bBlockContinue || bContentNode == false) {
1402 eDisplay = pContext->GetDisplay(); 1401 eDisplay = pContext->GetDisplay();
1403 if (eDisplay != FDE_CSSDISPLAY_Block && 1402 if (eDisplay != FDE_CSSDISPLAY_Block &&
1404 eDisplay != FDE_CSSDISPLAY_Inline && 1403 eDisplay != FDE_CSSDISPLAY_Inline &&
1405 eDisplay != FDE_CSSDISPLAY_ListItem) { 1404 eDisplay != FDE_CSSDISPLAY_ListItem) {
1406 return TRUE; 1405 return true;
1407 } 1406 }
1408 pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle); 1407 pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle);
1409 InitBreak(bContentNode ? pParentStyle : pStyle, eDisplay, szText.x, 1408 InitBreak(bContentNode ? pParentStyle : pStyle, eDisplay, szText.x,
1410 pXMLNode, pParentStyle); 1409 pXMLNode, pParentStyle);
1411 if ((eDisplay == FDE_CSSDISPLAY_Block || 1410 if ((eDisplay == FDE_CSSDISPLAY_Block ||
1412 eDisplay == FDE_CSSDISPLAY_ListItem) && 1411 eDisplay == FDE_CSSDISPLAY_ListItem) &&
1413 pStyle && 1412 pStyle &&
1414 (wsName.IsEmpty() || 1413 (wsName.IsEmpty() ||
1415 (wsName != FX_WSTRC(L"body") && wsName != FX_WSTRC(L"html") && 1414 (wsName != FX_WSTRC(L"body") && wsName != FX_WSTRC(L"html") &&
1416 wsName != FX_WSTRC(L"ol") && wsName != FX_WSTRC(L"ul")))) { 1415 wsName != FX_WSTRC(L"ol") && wsName != FX_WSTRC(L"ul")))) {
(...skipping 10 matching lines...) Expand all
1427 pElement->GetString(L"href", wsLinkContent); 1426 pElement->GetString(L"href", wsLinkContent);
1428 if (!wsLinkContent.IsEmpty()) { 1427 if (!wsLinkContent.IsEmpty()) {
1429 pLinkData = FXTARGET_NewWith(m_pAllocator.get()) CXFA_LinkUserData( 1428 pLinkData = FXTARGET_NewWith(m_pAllocator.get()) CXFA_LinkUserData(
1430 m_pAllocator.get(), 1429 m_pAllocator.get(),
1431 wsLinkContent.GetBuffer(wsLinkContent.GetLength())); 1430 wsLinkContent.GetBuffer(wsLinkContent.GetLength()));
1432 wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength()); 1431 wsLinkContent.ReleaseBuffer(wsLinkContent.GetLength());
1433 } 1432 }
1434 } 1433 }
1435 int32_t iTabCount = 1434 int32_t iTabCount =
1436 m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle); 1435 m_textParser.CountTabs(bContentNode ? pParentStyle : pStyle);
1437 FX_BOOL bSpaceRun = 1436 bool bSpaceRun =
1438 m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle); 1437 m_textParser.IsSpaceRun(bContentNode ? pParentStyle : pStyle);
1439 CFX_WideString wsText; 1438 CFX_WideString wsText;
1440 if (bContentNode && iTabCount == 0) { 1439 if (bContentNode && iTabCount == 0) {
1441 static_cast<CFDE_XMLText*>(pXMLNode)->GetText(wsText); 1440 static_cast<CFDE_XMLText*>(pXMLNode)->GetText(wsText);
1442 } else if (wsName == FX_WSTRC(L"br")) { 1441 } else if (wsName == FX_WSTRC(L"br")) {
1443 wsText = L'\n'; 1442 wsText = L'\n';
1444 } else if (wsName == FX_WSTRC(L"li")) { 1443 } else if (wsName == FX_WSTRC(L"li")) {
1445 bCurLi = TRUE; 1444 bCurLi = true;
1446 if (bIsOl) { 1445 if (bIsOl) {
1447 wsText.Format(L"%d. ", iLiCount); 1446 wsText.Format(L"%d. ", iLiCount);
1448 } else { 1447 } else {
1449 wsText = 0x00B7 + FX_WSTRC(L" "); 1448 wsText = 0x00B7 + FX_WSTRC(L" ");
1450 } 1449 }
1451 } else if (!bContentNode) { 1450 } else if (!bContentNode) {
1452 if (iTabCount > 0) { 1451 if (iTabCount > 0) {
1453 while (iTabCount-- > 0) 1452 while (iTabCount-- > 0)
1454 wsText += L'\t'; 1453 wsText += L'\t';
1455 } else { 1454 } else {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 if (m_pLoader) { 1491 if (m_pLoader) {
1493 m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE; 1492 m_pLoader->m_dwFlags &= ~XFA_LOADERCNTXTFLG_FILTERSPACE;
1494 } 1493 }
1495 if (IsEnd(bSavePieces)) { 1494 if (IsEnd(bSavePieces)) {
1496 if (m_pLoader && m_pLoader->m_iTotalLines > -1) { 1495 if (m_pLoader && m_pLoader->m_iTotalLines > -1) {
1497 m_pLoader->m_pXMLNode = pXMLNode; 1496 m_pLoader->m_pXMLNode = pXMLNode;
1498 m_pLoader->m_pParentStyle = pParentStyle; 1497 m_pLoader->m_pParentStyle = pParentStyle;
1499 } 1498 }
1500 if (pStyle) 1499 if (pStyle)
1501 pStyle->Release(); 1500 pStyle->Release();
1502 return FALSE; 1501 return false;
1503 } 1502 }
1504 return TRUE; 1503 return true;
1505 } 1504 }
1506 } 1505 }
1507 } 1506 }
1508 } 1507 }
1509 FX_BOOL ret = TRUE; 1508 bool ret = true;
1510 for (CFDE_XMLNode* pChildNode = 1509 for (CFDE_XMLNode* pChildNode =
1511 pXMLNode->GetNodeItem(CFDE_XMLNode::FirstChild); 1510 pXMLNode->GetNodeItem(CFDE_XMLNode::FirstChild);
1512 pChildNode; 1511 pChildNode;
1513 pChildNode = pChildNode->GetNodeItem(CFDE_XMLNode::NextSibling)) { 1512 pChildNode = pChildNode->GetNodeItem(CFDE_XMLNode::NextSibling)) {
1514 if (bCurOl) { 1513 if (bCurOl) {
1515 iLiCount++; 1514 iLiCount++;
1516 } 1515 }
1517 ret = LoadRichText(pChildNode, szText, fLinePos, 1516 ret = LoadRichText(pChildNode, szText, fLinePos,
1518 pContext ? pStyle : pParentStyle, bSavePieces, 1517 pContext ? pStyle : pParentStyle, bSavePieces,
1519 pLinkData, TRUE, bIsOl, iLiCount); 1518 pLinkData, true, bIsOl, iLiCount);
1520 if (ret == FALSE) { 1519 if (ret == false) {
1521 return FALSE; 1520 return false;
1522 } 1521 }
1523 } 1522 }
1524 if (m_pLoader) { 1523 if (m_pLoader) {
1525 if (FDE_CSSDISPLAY_Block == eDisplay) { 1524 if (FDE_CSSDISPLAY_Block == eDisplay) {
1526 m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE; 1525 m_pLoader->m_dwFlags |= XFA_LOADERCNTXTFLG_FILTERSPACE;
1527 } 1526 }
1528 } 1527 }
1529 if (bCurLi) { 1528 if (bCurLi) {
1530 EndBreak(FX_RTFBREAK_LineBreak, fLinePos, bSavePieces); 1529 EndBreak(FX_RTFBREAK_LineBreak, fLinePos, bSavePieces);
1531 } 1530 }
(...skipping 22 matching lines...) Expand all
1554 } 1553 }
1555 if (IsEnd(bSavePieces)) { 1554 if (IsEnd(bSavePieces)) {
1556 if (pStyle) { 1555 if (pStyle) {
1557 pStyle->Release(); 1556 pStyle->Release();
1558 } 1557 }
1559 if (m_pLoader && m_pLoader->m_iTotalLines > -1) { 1558 if (m_pLoader && m_pLoader->m_iTotalLines > -1) {
1560 m_pLoader->m_pXMLNode = 1559 m_pLoader->m_pXMLNode =
1561 pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling); 1560 pXMLNode->GetNodeItem(CFDE_XMLNode::NextSibling);
1562 m_pLoader->m_pParentStyle = pParentStyle; 1561 m_pLoader->m_pParentStyle = pParentStyle;
1563 } 1562 }
1564 return FALSE; 1563 return false;
1565 } 1564 }
1566 } 1565 }
1567 } 1566 }
1568 if (pStyle) 1567 if (pStyle)
1569 pStyle->Release(); 1568 pStyle->Release();
1570 return TRUE; 1569 return true;
1571 } 1570 }
1572 FX_BOOL CXFA_TextLayout::AppendChar(const CFX_WideString& wsText, 1571 bool CXFA_TextLayout::AppendChar(const CFX_WideString& wsText,
1573 FX_FLOAT& fLinePos, 1572 FX_FLOAT& fLinePos,
1574 FX_FLOAT fSpaceAbove, 1573 FX_FLOAT fSpaceAbove,
1575 FX_BOOL bSavePieces) { 1574 bool bSavePieces) {
1576 uint32_t dwStatus = 0; 1575 uint32_t dwStatus = 0;
1577 int32_t iChar = 0; 1576 int32_t iChar = 0;
1578 if (m_pLoader) { 1577 if (m_pLoader) {
1579 iChar = m_pLoader->m_iChar; 1578 iChar = m_pLoader->m_iChar;
1580 } 1579 }
1581 int32_t iLength = wsText.GetLength(); 1580 int32_t iLength = wsText.GetLength();
1582 for (int32_t i = iChar; i < iLength; i++) { 1581 for (int32_t i = iChar; i < iLength; i++) {
1583 FX_WCHAR wch = wsText.GetAt(i); 1582 FX_WCHAR wch = wsText.GetAt(i);
1584 if (wch == 0xA0) { 1583 if (wch == 0xA0) {
1585 wch = 0x20; 1584 wch = 0x20;
1586 } 1585 }
1587 if ((dwStatus = m_pBreak->AppendChar(wch)) > FX_RTFBREAK_PieceBreak) { 1586 if ((dwStatus = m_pBreak->AppendChar(wch)) > FX_RTFBREAK_PieceBreak) {
1588 AppendTextLine(dwStatus, fLinePos, bSavePieces); 1587 AppendTextLine(dwStatus, fLinePos, bSavePieces);
1589 if (IsEnd(bSavePieces)) { 1588 if (IsEnd(bSavePieces)) {
1590 if (m_pLoader) 1589 if (m_pLoader)
1591 m_pLoader->m_iChar = i; 1590 m_pLoader->m_iChar = i;
1592 return TRUE; 1591 return true;
1593 } 1592 }
1594 if (dwStatus == FX_RTFBREAK_ParagraphBreak && m_bRichText) { 1593 if (dwStatus == FX_RTFBREAK_ParagraphBreak && m_bRichText) {
1595 fLinePos += fSpaceAbove; 1594 fLinePos += fSpaceAbove;
1596 } 1595 }
1597 } 1596 }
1598 } 1597 }
1599 if (m_pLoader) { 1598 if (m_pLoader) {
1600 m_pLoader->m_iChar = 0; 1599 m_pLoader->m_iChar = 0;
1601 } 1600 }
1602 return FALSE; 1601 return false;
1603 } 1602 }
1604 FX_BOOL CXFA_TextLayout::IsEnd(FX_BOOL bSavePieces) { 1603 bool CXFA_TextLayout::IsEnd(bool bSavePieces) {
1605 if (!bSavePieces) { 1604 if (!bSavePieces) {
1606 return FALSE; 1605 return false;
1607 } 1606 }
1608 if (m_pLoader && m_pLoader->m_iTotalLines > 0) { 1607 if (m_pLoader && m_pLoader->m_iTotalLines > 0) {
1609 return m_iLines >= m_pLoader->m_iTotalLines; 1608 return m_iLines >= m_pLoader->m_iTotalLines;
1610 } 1609 }
1611 return FALSE; 1610 return false;
1612 } 1611 }
1613 void CXFA_TextLayout::ProcessText(CFX_WideString& wsText) { 1612 void CXFA_TextLayout::ProcessText(CFX_WideString& wsText) {
1614 int32_t iLen = wsText.GetLength(); 1613 int32_t iLen = wsText.GetLength();
1615 if (iLen == 0) { 1614 if (iLen == 0) {
1616 return; 1615 return;
1617 } 1616 }
1618 FX_WCHAR* psz = wsText.GetBuffer(iLen); 1617 FX_WCHAR* psz = wsText.GetBuffer(iLen);
1619 int32_t iTrimLeft = 0; 1618 int32_t iTrimLeft = 0;
1620 FX_WCHAR wch = 0, wPrev = 0; 1619 FX_WCHAR wch = 0, wPrev = 0;
1621 for (int32_t i = 0; i < iLen; i++) { 1620 for (int32_t i = 0; i < iLen; i++) {
1622 wch = psz[i]; 1621 wch = psz[i];
1623 if (wch < 0x20) { 1622 if (wch < 0x20) {
1624 wch = 0x20; 1623 wch = 0x20;
1625 } 1624 }
1626 if (wch == 0x20 && wPrev == 0x20) { 1625 if (wch == 0x20 && wPrev == 0x20) {
1627 continue; 1626 continue;
1628 } 1627 }
1629 wPrev = wch; 1628 wPrev = wch;
1630 psz[iTrimLeft++] = wch; 1629 psz[iTrimLeft++] = wch;
1631 } 1630 }
1632 wsText.ReleaseBuffer(iLen); 1631 wsText.ReleaseBuffer(iLen);
1633 wsText = wsText.Left(iTrimLeft); 1632 wsText = wsText.Left(iTrimLeft);
1634 } 1633 }
1635 void CXFA_TextLayout::EndBreak(uint32_t dwStatus, 1634 void CXFA_TextLayout::EndBreak(uint32_t dwStatus,
1636 FX_FLOAT& fLinePos, 1635 FX_FLOAT& fLinePos,
1637 FX_BOOL bSavePieces) { 1636 bool bSavePieces) {
1638 dwStatus = m_pBreak->EndBreak(dwStatus); 1637 dwStatus = m_pBreak->EndBreak(dwStatus);
1639 if (dwStatus > FX_RTFBREAK_PieceBreak) { 1638 if (dwStatus > FX_RTFBREAK_PieceBreak) {
1640 AppendTextLine(dwStatus, fLinePos, bSavePieces, TRUE); 1639 AppendTextLine(dwStatus, fLinePos, bSavePieces, true);
1641 } 1640 }
1642 } 1641 }
1643 void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle* pStyle, 1642 void CXFA_TextLayout::DoTabstops(IFDE_CSSComputedStyle* pStyle,
1644 CXFA_PieceLine* pPieceLine) { 1643 CXFA_PieceLine* pPieceLine) {
1645 if (!m_pTabstopContext || m_pTabstopContext->m_iTabCount == 0) { 1644 if (!m_pTabstopContext || m_pTabstopContext->m_iTabCount == 0) {
1646 return; 1645 return;
1647 } 1646 }
1648 if (!pStyle || !pPieceLine) { 1647 if (!pStyle || !pPieceLine) {
1649 return; 1648 return;
1650 } 1649 }
1651 int32_t iPieces = pPieceLine->m_textPieces.GetSize(); 1650 int32_t iPieces = pPieceLine->m_textPieces.GetSize();
1652 if (iPieces == 0) { 1651 if (iPieces == 0) {
1653 return; 1652 return;
1654 } 1653 }
1655 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1); 1654 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPieces - 1);
1656 int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex; 1655 int32_t& iTabstopsIndex = m_pTabstopContext->m_iTabIndex;
1657 int32_t iCount = m_textParser.CountTabs(pStyle); 1656 int32_t iCount = m_textParser.CountTabs(pStyle);
1658 if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) { 1657 if (iTabstopsIndex > m_pTabstopContext->m_iTabCount - 1) {
1659 return; 1658 return;
1660 } 1659 }
1661 if (iCount > 0) { 1660 if (iCount > 0) {
1662 iTabstopsIndex++; 1661 iTabstopsIndex++;
1663 m_pTabstopContext->m_bTabstops = TRUE; 1662 m_pTabstopContext->m_bTabstops = true;
1664 FX_FLOAT fRight = 0; 1663 FX_FLOAT fRight = 0;
1665 if (iPieces > 1) { 1664 if (iPieces > 1) {
1666 XFA_TextPiece* p = pPieceLine->m_textPieces.GetAt(iPieces - 2); 1665 XFA_TextPiece* p = pPieceLine->m_textPieces.GetAt(iPieces - 2);
1667 fRight = p->rtPiece.right(); 1666 fRight = p->rtPiece.right();
1668 } 1667 }
1669 m_pTabstopContext->m_fTabWidth = 1668 m_pTabstopContext->m_fTabWidth =
1670 pPiece->rtPiece.width + pPiece->rtPiece.left - fRight; 1669 pPiece->rtPiece.width + pPiece->rtPiece.left - fRight;
1671 } else if (iTabstopsIndex > -1) { 1670 } else if (iTabstopsIndex > -1) {
1672 FX_FLOAT fLeft = 0; 1671 FX_FLOAT fLeft = 0;
1673 if (m_pTabstopContext->m_bTabstops) { 1672 if (m_pTabstopContext->m_bTabstops) {
1674 XFA_TABSTOPS* pTabstops = 1673 XFA_TABSTOPS* pTabstops =
1675 m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex); 1674 m_pTabstopContext->m_tabstops.GetDataPtr(iTabstopsIndex);
1676 uint32_t dwAlign = pTabstops->dwAlign; 1675 uint32_t dwAlign = pTabstops->dwAlign;
1677 if (dwAlign == FX_HashCode_GetW(L"center", false)) { 1676 if (dwAlign == FX_HashCode_GetW(L"center", false)) {
1678 fLeft = pPiece->rtPiece.width / 2.0f; 1677 fLeft = pPiece->rtPiece.width / 2.0f;
1679 } else if (dwAlign == FX_HashCode_GetW(L"right", false) || 1678 } else if (dwAlign == FX_HashCode_GetW(L"right", false) ||
1680 dwAlign == FX_HashCode_GetW(L"before", false)) { 1679 dwAlign == FX_HashCode_GetW(L"before", false)) {
1681 fLeft = pPiece->rtPiece.width; 1680 fLeft = pPiece->rtPiece.width;
1682 } else if (dwAlign == FX_HashCode_GetW(L"decimal", false)) { 1681 } else if (dwAlign == FX_HashCode_GetW(L"decimal", false)) {
1683 int32_t iChars = pPiece->iChars; 1682 int32_t iChars = pPiece->iChars;
1684 for (int32_t i = 0; i < iChars; i++) { 1683 for (int32_t i = 0; i < iChars; i++) {
1685 if (pPiece->pszText[i] == L'.') { 1684 if (pPiece->pszText[i] == L'.') {
1686 break; 1685 break;
1687 } 1686 }
1688 fLeft += pPiece->pWidths[i] / 20000.0f; 1687 fLeft += pPiece->pWidths[i] / 20000.0f;
1689 } 1688 }
1690 } 1689 }
1691 m_pTabstopContext->m_fLeft = 1690 m_pTabstopContext->m_fLeft =
1692 std::min(fLeft, m_pTabstopContext->m_fTabWidth); 1691 std::min(fLeft, m_pTabstopContext->m_fTabWidth);
1693 m_pTabstopContext->m_bTabstops = FALSE; 1692 m_pTabstopContext->m_bTabstops = false;
1694 m_pTabstopContext->m_fTabWidth = 0; 1693 m_pTabstopContext->m_fTabWidth = 0;
1695 } 1694 }
1696 pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft; 1695 pPiece->rtPiece.left -= m_pTabstopContext->m_fLeft;
1697 } 1696 }
1698 } 1697 }
1699 void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus, 1698 void CXFA_TextLayout::AppendTextLine(uint32_t dwStatus,
1700 FX_FLOAT& fLinePos, 1699 FX_FLOAT& fLinePos,
1701 FX_BOOL bSavePieces, 1700 bool bSavePieces,
1702 FX_BOOL bEndBreak) { 1701 bool bEndBreak) {
1703 int32_t iPieces = m_pBreak->CountBreakPieces(); 1702 int32_t iPieces = m_pBreak->CountBreakPieces();
1704 if (iPieces < 1) { 1703 if (iPieces < 1) {
1705 return; 1704 return;
1706 } 1705 }
1707 IFDE_CSSComputedStyle* pStyle = nullptr; 1706 IFDE_CSSComputedStyle* pStyle = nullptr;
1708 if (bSavePieces) { 1707 if (bSavePieces) {
1709 CXFA_PieceLine* pPieceLine = 1708 CXFA_PieceLine* pPieceLine =
1710 FXTARGET_NewWith(m_pAllocator.get()) CXFA_PieceLine; 1709 FXTARGET_NewWith(m_pAllocator.get()) CXFA_PieceLine;
1711 m_pieceLines.Add(pPieceLine); 1710 m_pieceLines.Add(pPieceLine);
1712 if (m_pTabstopContext) { 1711 if (m_pTabstopContext) {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1858 pPieceLine->m_charCounts.Add(iCount); 1857 pPieceLine->m_charCounts.Add(iCount);
1859 } 1858 }
1860 1859
1861 void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice, 1860 void CXFA_TextLayout::RenderPath(CFDE_RenderDevice* pDevice,
1862 CFDE_Pen* pPen, 1861 CFDE_Pen* pPen,
1863 CXFA_PieceLine* pPieceLine, 1862 CXFA_PieceLine* pPieceLine,
1864 int32_t iPiece, 1863 int32_t iPiece,
1865 FXTEXT_CHARPOS* pCharPos, 1864 FXTEXT_CHARPOS* pCharPos,
1866 const CFX_Matrix& tmDoc2Device) { 1865 const CFX_Matrix& tmDoc2Device) {
1867 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece); 1866 XFA_TextPiece* pPiece = pPieceLine->m_textPieces.GetAt(iPiece);
1868 FX_BOOL bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2; 1867 bool bNoUnderline = pPiece->iUnderline < 1 || pPiece->iUnderline > 2;
1869 FX_BOOL bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2; 1868 bool bNoLineThrough = pPiece->iLineThrough < 1 || pPiece->iLineThrough > 2;
1870 if (bNoUnderline && bNoLineThrough) { 1869 if (bNoUnderline && bNoLineThrough) {
1871 return; 1870 return;
1872 } 1871 }
1873 pPen->SetColor(pPiece->dwColor); 1872 pPen->SetColor(pPiece->dwColor);
1874 std::unique_ptr<CFDE_Path> pPath(new CFDE_Path); 1873 std::unique_ptr<CFDE_Path> pPath(new CFDE_Path);
1875 int32_t iChars = GetDisplayPos(pPiece, pCharPos); 1874 int32_t iChars = GetDisplayPos(pPiece, pCharPos);
1876 if (iChars > 0) { 1875 if (iChars > 0) {
1877 CFX_PointF pt1, pt2; 1876 CFX_PointF pt1, pt2;
1878 FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f; 1877 FX_FLOAT fEndY = pCharPos[0].m_OriginY + 1.05f;
1879 if (pPiece->iPeriod == XFA_ATTRIBUTEENUM_Word) { 1878 if (pPiece->iPeriod == XFA_ATTRIBUTEENUM_Word) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1963 pt1.y = pt2.y = fEndY; 1962 pt1.y = pt2.y = fEndY;
1964 pPath->AddLine(pt1, pt2); 1963 pPath->AddLine(pt1, pt2);
1965 fEndY += 2.0f; 1964 fEndY += 2.0f;
1966 } 1965 }
1967 } 1966 }
1968 pDevice->DrawPath(pPen, 1, pPath.get(), &tmDoc2Device); 1967 pDevice->DrawPath(pPen, 1, pPath.get(), &tmDoc2Device);
1969 } 1968 }
1970 1969
1971 int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece, 1970 int32_t CXFA_TextLayout::GetDisplayPos(const XFA_TextPiece* pPiece,
1972 FXTEXT_CHARPOS* pCharPos, 1971 FXTEXT_CHARPOS* pCharPos,
1973 FX_BOOL bCharCode) { 1972 bool bCharCode) {
1974 if (!pPiece) { 1973 if (!pPiece) {
1975 return 0; 1974 return 0;
1976 } 1975 }
1977 FX_RTFTEXTOBJ tr; 1976 FX_RTFTEXTOBJ tr;
1978 if (!ToRun(pPiece, tr)) { 1977 if (!ToRun(pPiece, tr)) {
1979 return 0; 1978 return 0;
1980 } 1979 }
1981 return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode); 1980 return m_pBreak->GetDisplayPos(&tr, pCharPos, bCharCode);
1982 } 1981 }
1983 FX_BOOL CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr) { 1982 bool CXFA_TextLayout::ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr) {
1984 int32_t iLength = pPiece->iChars; 1983 int32_t iLength = pPiece->iChars;
1985 if (iLength < 1) { 1984 if (iLength < 1) {
1986 return FALSE; 1985 return false;
1987 } 1986 }
1988 tr.pStr = pPiece->pszText; 1987 tr.pStr = pPiece->pszText;
1989 tr.pFont = pPiece->pFont; 1988 tr.pFont = pPiece->pFont;
1990 tr.pRect = &pPiece->rtPiece; 1989 tr.pRect = &pPiece->rtPiece;
1991 tr.pWidths = pPiece->pWidths; 1990 tr.pWidths = pPiece->pWidths;
1992 tr.iLength = iLength; 1991 tr.iLength = iLength;
1993 tr.fFontSize = pPiece->fFontSize; 1992 tr.fFontSize = pPiece->fFontSize;
1994 tr.iBidiLevel = pPiece->iBidiLevel; 1993 tr.iBidiLevel = pPiece->iBidiLevel;
1995 tr.iCharRotation = 0; 1994 tr.iCharRotation = 0;
1996 tr.wLineBreakChar = L'\n'; 1995 tr.wLineBreakChar = L'\n';
1997 tr.iVerticalScale = pPiece->iVerScale; 1996 tr.iVerticalScale = pPiece->iVerScale;
1998 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab; 1997 tr.dwLayoutStyles = FX_RTFLAYOUTSTYLE_ExpandTab;
1999 tr.iHorizontalScale = pPiece->iHorScale; 1998 tr.iHorizontalScale = pPiece->iHorScale;
2000 return TRUE; 1999 return true;
2001 } 2000 }
2002 2001
2003 CXFA_LinkUserData::CXFA_LinkUserData(IFX_MemoryAllocator* pAllocator, 2002 CXFA_LinkUserData::CXFA_LinkUserData(IFX_MemoryAllocator* pAllocator,
2004 FX_WCHAR* pszText) 2003 FX_WCHAR* pszText)
2005 : m_pAllocator(pAllocator), m_dwRefCount(1), m_wsURLContent(pszText) {} 2004 : m_pAllocator(pAllocator), m_dwRefCount(1), m_wsURLContent(pszText) {}
2006 2005
2007 CXFA_LinkUserData::~CXFA_LinkUserData() {} 2006 CXFA_LinkUserData::~CXFA_LinkUserData() {}
2008 2007
2009 uint32_t CXFA_LinkUserData::Retain() { 2008 uint32_t CXFA_LinkUserData::Retain() {
2010 return ++m_dwRefCount; 2009 return ++m_dwRefCount;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2062 return dwRefCount; 2061 return dwRefCount;
2063 } 2062 }
2064 2063
2065 CXFA_PieceLine::CXFA_PieceLine() {} 2064 CXFA_PieceLine::CXFA_PieceLine() {}
2066 2065
2067 CXFA_PieceLine::~CXFA_PieceLine() {} 2066 CXFA_PieceLine::~CXFA_PieceLine() {}
2068 2067
2069 CXFA_TextTabstopsContext::CXFA_TextTabstopsContext() 2068 CXFA_TextTabstopsContext::CXFA_TextTabstopsContext()
2070 : m_iTabCount(0), 2069 : m_iTabCount(0),
2071 m_iTabIndex(-1), 2070 m_iTabIndex(-1),
2072 m_bTabstops(FALSE), 2071 m_bTabstops(false),
2073 m_fTabWidth(0), 2072 m_fTabWidth(0),
2074 m_fLeft(0) {} 2073 m_fLeft(0) {}
2075 2074
2076 CXFA_TextTabstopsContext::~CXFA_TextTabstopsContext() {} 2075 CXFA_TextTabstopsContext::~CXFA_TextTabstopsContext() {}
2077 2076
2078 void CXFA_TextTabstopsContext::Append(uint32_t dwAlign, FX_FLOAT fTabstops) { 2077 void CXFA_TextTabstopsContext::Append(uint32_t dwAlign, FX_FLOAT fTabstops) {
2079 int32_t i = 0; 2078 int32_t i = 0;
2080 for (i = 0; i < m_iTabCount; i++) { 2079 for (i = 0; i < m_iTabCount; i++) {
2081 XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i); 2080 XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
2082 if (fTabstops < pTabstop->fTabstops) { 2081 if (fTabstops < pTabstop->fTabstops) {
2083 break; 2082 break;
2084 } 2083 }
2085 } 2084 }
2086 m_tabstops.InsertSpaceAt(i, 1); 2085 m_tabstops.InsertSpaceAt(i, 1);
2087 XFA_TABSTOPS tabstop; 2086 XFA_TABSTOPS tabstop;
2088 tabstop.dwAlign = dwAlign; 2087 tabstop.dwAlign = dwAlign;
2089 tabstop.fTabstops = fTabstops; 2088 tabstop.fTabstops = fTabstops;
2090 m_tabstops.SetAt(i, tabstop); 2089 m_tabstops.SetAt(i, tabstop);
2091 m_iTabCount++; 2090 m_iTabCount++;
2092 } 2091 }
2093 2092
2094 void CXFA_TextTabstopsContext::RemoveAll() { 2093 void CXFA_TextTabstopsContext::RemoveAll() {
2095 m_tabstops.RemoveAll(); 2094 m_tabstops.RemoveAll();
2096 m_iTabCount = 0; 2095 m_iTabCount = 0;
2097 } 2096 }
2098 2097
2099 void CXFA_TextTabstopsContext::Reset() { 2098 void CXFA_TextTabstopsContext::Reset() {
2100 m_iTabIndex = -1; 2099 m_iTabIndex = -1;
2101 m_bTabstops = FALSE; 2100 m_bTabstops = false;
2102 m_fTabWidth = 0; 2101 m_fTabWidth = 0;
2103 m_fLeft = 0; 2102 m_fLeft = 0;
2104 } 2103 }
OLDNEW
« no previous file with comments | « xfa/fxfa/app/xfa_textlayout.h ('k') | xfa/fxfa/cxfa_eventparam.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698