Break off part of CXFA_LayoutPageMgr::PrepareLayout().
Move part of the code into helper functions.
Change-Id: I85f56adbb41b5280ebb4375ce00a852c5601b806
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/49415
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 761d0ae..8188544 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -6,6 +6,8 @@
#include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
+#include <utility>
+
#include "fxjs/xfa/cfxjse_engine.h"
#include "fxjs/xfa/cjx_object.h"
#include "third_party/base/stl_util.h"
@@ -272,6 +274,44 @@
return heights;
}
+std::pair<size_t, CXFA_LayoutItem*> GetPageAreaCountAndLastPageAreaFromPageSet(
+ CXFA_ContainerLayoutItem* pPageSetLayoutItem) {
+ size_t nCount = 0;
+ CXFA_LayoutItem* pLast = nullptr;
+ for (CXFA_LayoutItem* pPageAreaLayoutItem =
+ pPageSetLayoutItem->GetFirstChild();
+ pPageAreaLayoutItem;
+ pPageAreaLayoutItem = pPageAreaLayoutItem->GetNextSibling()) {
+ if (pPageAreaLayoutItem->GetFormNode()->GetElementType() !=
+ XFA_Element::PageArea) {
+ continue;
+ }
+ ++nCount;
+ pLast = pPageAreaLayoutItem;
+ }
+ return {nCount, pLast};
+}
+
+bool ContentAreasFitInPageAreas(const CXFA_Node* pNode,
+ const std::vector<float>& rgUsedHeights) {
+ size_t iCurContentAreaIndex = 0;
+ for (const CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
+ pContentAreaNode;
+ pContentAreaNode = pContentAreaNode->GetNextSibling()) {
+ if (pContentAreaNode->GetElementType() != XFA_Element::ContentArea)
+ continue;
+
+ const float fHeight = pContentAreaNode->JSObject()->GetMeasureInUnit(
+ XFA_Attribute::H, XFA_Unit::Pt) +
+ kXFALayoutPrecision;
+ if (rgUsedHeights[iCurContentAreaIndex] > fHeight)
+ return false;
+
+ ++iCurContentAreaIndex;
+ }
+ return true;
+}
+
} // namespace
class CXFA_ContainerRecord {
@@ -1957,19 +1997,10 @@
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;
- }
+ size_t nPageAreaCount;
+ CXFA_LayoutItem* pLastPageAreaLayoutItem;
+ std::tie(nPageAreaCount, pLastPageAreaLayoutItem) =
+ GetPageAreaCountAndLastPageAreaFromPageSet(pPageSetLayoutItem);
if (!pLastPageAreaLayoutItem)
return;
@@ -1984,6 +2015,7 @@
true, XFA_AttributeValue::Last))) {
return;
}
+
CXFA_Node* pNode = m_pCurPageArea;
XFA_AttributeValue eCurChoice =
pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition);
@@ -2000,25 +2032,10 @@
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) {
+ if (ContentAreasFitInPageAreas(pNode, rgUsedHeights)) {
CXFA_LayoutItem* pChildLayoutItem =
pLastPageAreaLayoutItem->GetFirstChild();
CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
@@ -2037,8 +2054,11 @@
pChildLayoutItem = pChildLayoutItem->GetNextSibling();
pContentAreaNode = pContentAreaNode->GetNextSibling();
}
- } else if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
- XFA_AttributeValue::Last) {
+ return;
+ }
+
+ if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
+ XFA_AttributeValue::Last) {
CXFA_ContainerRecord* pRecord = CreateContainerRecord(nullptr, false);
AddPageAreaLayoutItem(pRecord, pNode);
}