Break off more parts of CXFA_LayoutPageMgr::FinishPaginatedPageSets().
Put a big portion of FinishPaginatedPageSets() into
ProcessSimplexOrDuplexPageSets(). Now FinishPaginatedPageSets() is just
a double for-loop that calls either ProcessSimplexOrDuplexPageSets() or
ProcessLastPageSet().
Change-Id: I2b9480810df7b5a87d6a01310c43e95048eb9e0e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/49414
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
index 79c889c..761d0ae 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -638,105 +638,15 @@
pPageSetLayoutItem->GetFormNode()->JSObject()->GetEnum(
XFA_Attribute::Relation);
switch (ePageRelation) {
- case XFA_AttributeValue::OrderedOccurrence:
- default: {
- ProcessLastPageSet();
- } break;
case XFA_AttributeValue::SimplexPaginated:
- case XFA_AttributeValue::DuplexPaginated: {
- CXFA_LayoutItem* pLastPageAreaLayoutItem = nullptr;
- int32_t nPageAreaCount = 0;
- for (CXFA_LayoutItem* pPageAreaLayoutItem =
- pPageSetLayoutItem->GetFirstChild();
- pPageAreaLayoutItem;
- pPageAreaLayoutItem = pPageAreaLayoutItem->GetNextSibling()) {
- if (pPageAreaLayoutItem->GetFormNode()->GetElementType() !=
- XFA_Element::PageArea) {
- continue;
- }
- nPageAreaCount++;
- pLastPageAreaLayoutItem = pPageAreaLayoutItem;
- }
- if (!pLastPageAreaLayoutItem)
- break;
-
- if (!FindPageAreaFromPageSet_SimplexDuplex(
- pPageSetLayoutItem->GetFormNode(), nullptr, nullptr, nullptr,
- true, true,
- nPageAreaCount == 1 ? XFA_AttributeValue::Only
- : XFA_AttributeValue::Last) &&
- (nPageAreaCount == 1 &&
- !FindPageAreaFromPageSet_SimplexDuplex(
- pPageSetLayoutItem->GetFormNode(), nullptr, nullptr, nullptr,
- true, true, XFA_AttributeValue::Last))) {
- break;
- }
- CXFA_Node* pNode = m_pCurPageArea;
- XFA_AttributeValue eCurChoice =
- pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition);
- if (eCurChoice == XFA_AttributeValue::Last) {
- XFA_AttributeValue eOddOrEven =
- pNode->JSObject()->GetEnum(XFA_Attribute::OddOrEven);
- XFA_AttributeValue eLastChoice =
- pLastPageAreaLayoutItem->GetFormNode()->JSObject()->GetEnum(
- XFA_Attribute::PagePosition);
- if (eLastChoice == XFA_AttributeValue::First &&
- (ePageRelation == XFA_AttributeValue::SimplexPaginated ||
- eOddOrEven != XFA_AttributeValue::Odd)) {
- CXFA_ContainerRecord* pRecord =
- CreateContainerRecord(nullptr, false);
- AddPageAreaLayoutItem(pRecord, pNode);
- break;
- }
- }
- bool bUsable = true;
- std::vector<float> rgUsedHeights =
- GetHeightsForContentAreas(pLastPageAreaLayoutItem);
- int32_t iCurContentAreaIndex = -1;
- for (CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
- pContentAreaNode;
- pContentAreaNode = pContentAreaNode->GetNextSibling()) {
- if (pContentAreaNode->GetElementType() !=
- XFA_Element::ContentArea) {
- continue;
- }
- iCurContentAreaIndex++;
- const float fHeight =
- pContentAreaNode->JSObject()->GetMeasureInUnit(XFA_Attribute::H,
- XFA_Unit::Pt) +
- kXFALayoutPrecision;
- if (rgUsedHeights[iCurContentAreaIndex] > fHeight) {
- bUsable = false;
- break;
- }
- }
- if (bUsable) {
- CXFA_LayoutItem* pChildLayoutItem =
- pLastPageAreaLayoutItem->GetFirstChild();
- CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
- pLastPageAreaLayoutItem->SetFormNode(pNode);
- while (pChildLayoutItem && pContentAreaNode) {
- if (pChildLayoutItem->GetFormNode()->GetElementType() !=
- XFA_Element::ContentArea) {
- pChildLayoutItem = pChildLayoutItem->GetNextSibling();
- continue;
- }
- if (pContentAreaNode->GetElementType() !=
- XFA_Element::ContentArea) {
- pContentAreaNode = pContentAreaNode->GetNextSibling();
- continue;
- }
- pChildLayoutItem->SetFormNode(pContentAreaNode);
- pChildLayoutItem = pChildLayoutItem->GetNextSibling();
- pContentAreaNode = pContentAreaNode->GetNextSibling();
- }
- } else if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
- XFA_AttributeValue::Last) {
- CXFA_ContainerRecord* pRecord =
- CreateContainerRecord(nullptr, false);
- AddPageAreaLayoutItem(pRecord, pNode);
- }
- } break;
+ case XFA_AttributeValue::DuplexPaginated:
+ ProcessSimplexOrDuplexPageSets(
+ pPageSetLayoutItem,
+ ePageRelation == XFA_AttributeValue::SimplexPaginated);
+ break;
+ default:
+ ProcessLastPageSet();
+ break;
}
}
}
@@ -2043,3 +1953,93 @@
}
m_pPageSetLayoutItemRoot = nullptr;
}
+
+void CXFA_LayoutPageMgr::ProcessSimplexOrDuplexPageSets(
+ CXFA_ContainerLayoutItem* pPageSetLayoutItem,
+ bool bIsSimplex) {
+ CXFA_LayoutItem* pLastPageAreaLayoutItem = nullptr;
+ int32_t nPageAreaCount = 0;
+ for (CXFA_LayoutItem* pPageAreaLayoutItem =
+ pPageSetLayoutItem->GetFirstChild();
+ pPageAreaLayoutItem;
+ pPageAreaLayoutItem = pPageAreaLayoutItem->GetNextSibling()) {
+ if (pPageAreaLayoutItem->GetFormNode()->GetElementType() !=
+ XFA_Element::PageArea) {
+ continue;
+ }
+ nPageAreaCount++;
+ pLastPageAreaLayoutItem = pPageAreaLayoutItem;
+ }
+ if (!pLastPageAreaLayoutItem)
+ return;
+
+ if (!FindPageAreaFromPageSet_SimplexDuplex(
+ pPageSetLayoutItem->GetFormNode(), nullptr, nullptr, nullptr, true,
+ true,
+ nPageAreaCount == 1 ? XFA_AttributeValue::Only
+ : XFA_AttributeValue::Last) &&
+ (nPageAreaCount == 1 &&
+ !FindPageAreaFromPageSet_SimplexDuplex(
+ pPageSetLayoutItem->GetFormNode(), nullptr, nullptr, nullptr, true,
+ true, XFA_AttributeValue::Last))) {
+ return;
+ }
+ CXFA_Node* pNode = m_pCurPageArea;
+ XFA_AttributeValue eCurChoice =
+ pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition);
+ if (eCurChoice == XFA_AttributeValue::Last) {
+ XFA_AttributeValue eOddOrEven =
+ pNode->JSObject()->GetEnum(XFA_Attribute::OddOrEven);
+ XFA_AttributeValue eLastChoice =
+ pLastPageAreaLayoutItem->GetFormNode()->JSObject()->GetEnum(
+ XFA_Attribute::PagePosition);
+ if (eLastChoice == XFA_AttributeValue::First &&
+ (bIsSimplex || eOddOrEven != XFA_AttributeValue::Odd)) {
+ CXFA_ContainerRecord* pRecord = CreateContainerRecord(nullptr, false);
+ AddPageAreaLayoutItem(pRecord, pNode);
+ return;
+ }
+ }
+ bool bUsable = true;
+ std::vector<float> rgUsedHeights =
+ GetHeightsForContentAreas(pLastPageAreaLayoutItem);
+ int32_t iCurContentAreaIndex = -1;
+ for (CXFA_Node* pContentAreaNode = pNode->GetFirstChild(); pContentAreaNode;
+ pContentAreaNode = pContentAreaNode->GetNextSibling()) {
+ if (pContentAreaNode->GetElementType() != XFA_Element::ContentArea) {
+ continue;
+ }
+ iCurContentAreaIndex++;
+ const float fHeight = pContentAreaNode->JSObject()->GetMeasureInUnit(
+ XFA_Attribute::H, XFA_Unit::Pt) +
+ kXFALayoutPrecision;
+ if (rgUsedHeights[iCurContentAreaIndex] > fHeight) {
+ bUsable = false;
+ break;
+ }
+ }
+ if (bUsable) {
+ CXFA_LayoutItem* pChildLayoutItem =
+ pLastPageAreaLayoutItem->GetFirstChild();
+ CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
+ pLastPageAreaLayoutItem->SetFormNode(pNode);
+ while (pChildLayoutItem && pContentAreaNode) {
+ if (pChildLayoutItem->GetFormNode()->GetElementType() !=
+ XFA_Element::ContentArea) {
+ pChildLayoutItem = pChildLayoutItem->GetNextSibling();
+ continue;
+ }
+ if (pContentAreaNode->GetElementType() != XFA_Element::ContentArea) {
+ pContentAreaNode = pContentAreaNode->GetNextSibling();
+ continue;
+ }
+ pChildLayoutItem->SetFormNode(pContentAreaNode);
+ pChildLayoutItem = pChildLayoutItem->GetNextSibling();
+ pContentAreaNode = pContentAreaNode->GetNextSibling();
+ }
+ } else if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
+ XFA_AttributeValue::Last) {
+ CXFA_ContainerRecord* pRecord = CreateContainerRecord(nullptr, false);
+ AddPageAreaLayoutItem(pRecord, pNode);
+ }
+}
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.h b/xfa/fxfa/layout/cxfa_layoutpagemgr.h
index 8cf6c9e..90ac7d9 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.h
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.h
@@ -128,6 +128,9 @@
void LayoutPageSetContents();
void PrepareLayout();
void SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem);
+ void ProcessSimplexOrDuplexPageSets(
+ CXFA_ContainerLayoutItem* pPageSetLayoutItem,
+ bool bIsSimplex);
CXFA_LayoutProcessor* m_pLayoutProcessor;
CXFA_Node* m_pTemplatePageSetRoot;