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;