diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 8ff3c2b..adb8eb2 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -105,6 +105,16 @@
   PurgeNodes();
 }
 
+CXFA_LayoutProcessor* CXFA_Document::GetLayoutProcessor() {
+  if (!m_pLayoutProcessor)
+    m_pLayoutProcessor = new CXFA_LayoutProcessor(this);
+  return m_pLayoutProcessor;
+}
+
+CXFA_LayoutProcessor* CXFA_Document::GetDocLayout() {
+  return GetLayoutProcessor();
+}
+
 void CXFA_Document::ClearLayoutData() {
   delete m_pLayoutProcessor;
   m_pLayoutProcessor = nullptr;
diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
index 8e00407..1bd4836 100644
--- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
@@ -444,8 +444,8 @@
     m_bCreateOverFlowPage = false;
   }
 
-  if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
-    if (eStatus == XFA_ItemLayoutProcessorResult_PageFullBreak &&
+  if (eStatus != XFA_ItemLayoutProcessorResult::Done) {
+    if (eStatus == XFA_ItemLayoutProcessorResult::PageFullBreak &&
         m_CurrentContainerRecordIter == GetTailPosition()) {
       AppendNewPage();
     }
@@ -466,7 +466,7 @@
     return fAvailHeight;
   if (m_CurrentContainerRecordIter == m_ProposedContainerRecords.begin())
     return 0.0f;
-  return XFA_LAYOUT_FLOAT_MAX;
+  return FLT_MAX;
 }
 
 bool XFA_LayoutPageMgr_RunBreakTestScript(CXFA_Node* pTestScript) {
diff --git a/xfa/fxfa/parser/cxfa_layoutprocessor.cpp b/xfa/fxfa/parser/cxfa_layoutprocessor.cpp
index ea1064a..e179d38 100644
--- a/xfa/fxfa/parser/cxfa_layoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutprocessor.cpp
@@ -17,18 +17,6 @@
 #include "xfa/fxfa/parser/xfa_object.h"
 #include "xfa/fxfa/parser/xfa_utils.h"
 
-CXFA_LayoutProcessor* CXFA_Document::GetLayoutProcessor() {
-  if (!m_pLayoutProcessor) {
-    m_pLayoutProcessor = new CXFA_LayoutProcessor(this);
-    ASSERT(m_pLayoutProcessor);
-  }
-  return m_pLayoutProcessor;
-}
-
-CXFA_LayoutProcessor* CXFA_Document::GetDocLayout() {
-  return GetLayoutProcessor();
-}
-
 CXFA_LayoutProcessor::CXFA_LayoutProcessor(CXFA_Document* pDocument)
     : m_pDocument(pDocument),
       m_nProgressCounter(0),
@@ -80,9 +68,9 @@
   FX_FLOAT fPosY = pFormNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
   do {
     FX_FLOAT fAvailHeight = m_pLayoutPageMgr->GetAvailHeight();
-    eStatus =
-        m_pRootItemLayoutProcessor->DoLayout(true, fAvailHeight, fAvailHeight);
-    if (eStatus != XFA_ItemLayoutProcessorResult_Done)
+    eStatus = m_pRootItemLayoutProcessor->DoLayout(true, fAvailHeight,
+                                                   fAvailHeight, nullptr);
+    if (eStatus != XFA_ItemLayoutProcessorResult::Done)
       m_nProgressCounter++;
 
     CXFA_ContentLayoutItem* pLayoutItem =
@@ -91,16 +79,16 @@
       pLayoutItem->m_sPos = CFX_PointF(fPosX, fPosY);
 
     m_pLayoutPageMgr->SubmitContentItem(pLayoutItem, eStatus);
-  } while (eStatus != XFA_ItemLayoutProcessorResult_Done &&
+  } while (eStatus != XFA_ItemLayoutProcessorResult::Done &&
            (!pPause || !pPause->NeedToPauseNow()));
 
-  if (eStatus == XFA_ItemLayoutProcessorResult_Done) {
+  if (eStatus == XFA_ItemLayoutProcessorResult::Done) {
     m_pLayoutPageMgr->FinishPaginatedPageSets();
     m_pLayoutPageMgr->SyncLayoutData();
     m_bNeeLayout = false;
     m_rgChangedContainers.RemoveAll();
   }
-  return 100 * (eStatus == XFA_ItemLayoutProcessorResult_Done
+  return 100 * (eStatus == XFA_ItemLayoutProcessorResult::Done
                     ? m_nProgressCounter
                     : m_nProgressCounter - 1) /
          m_nProgressCounter;
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
index cd57d05..bc3c06c 100644
--- a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
@@ -174,7 +174,7 @@
   }
 
   FX_FLOAT fContentWidthLimit =
-      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
+      bContainerWidthAutoSize ? FLT_MAX
                               : fContainerWidth - fLeftInset - fRightInset;
   FX_FLOAT fContentCurrentHeight =
       pLayoutRow->m_sSize.y - fTopInset - fBottomInset;
@@ -262,7 +262,7 @@
 
   if (bContainerWidthAutoSize) {
     FX_FLOAT fChildSuppliedWidth = fCurrentColX;
-    if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
+    if (fContentWidthLimit < FLT_MAX &&
         fContentWidthLimit > fChildSuppliedWidth) {
       fChildSuppliedWidth = fContentWidthLimit;
     }
@@ -446,7 +446,7 @@
     auto pPendingProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
         pProcessor->m_PendingNodes.front(), nullptr);
     pProcessor->m_PendingNodes.pop_front();
-    pPendingProcessor->DoLayout(false, XFA_LAYOUT_FLOAT_MAX);
+    pPendingProcessor->DoLayout(false, FLT_MAX, FLT_MAX, nullptr);
     CXFA_ContentLayoutItem* pPendingLayoutItem =
         pPendingProcessor->HasLayoutItem()
             ? pPendingProcessor->ExtractLayoutItem()
@@ -535,7 +535,7 @@
       case XFA_Element::BreakBefore: {
         if (bBreakBefore) {
           pCurActionNode = pBreakNode;
-          nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore;
+          nCurStage = XFA_ItemLayoutProcessorStages::BreakBefore;
           bFindRs = true;
         }
         break;
@@ -543,7 +543,7 @@
       case XFA_Element::BreakAfter: {
         if (!bBreakBefore) {
           pCurActionNode = pBreakNode;
-          nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter;
+          nCurStage = XFA_ItemLayoutProcessorStages::BreakAfter;
           bFindRs = true;
         }
         break;
@@ -551,9 +551,9 @@
       case XFA_Element::Break:
         if (pBreakNode->GetEnum(eAttributeType) != XFA_ATTRIBUTEENUM_Auto) {
           pCurActionNode = pBreakNode;
-          nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore;
+          nCurStage = XFA_ItemLayoutProcessorStages::BreakBefore;
           if (!bBreakBefore)
-            nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter;
+            nCurStage = XFA_ItemLayoutProcessorStages::BreakAfter;
 
           bFindRs = true;
         }
@@ -618,8 +618,8 @@
     FX_FLOAT& fContentCurRowHeight,
     bool& bAddedItemInRow,
     bool& bForceEndPage,
-    CXFA_LayoutContext* pLayoutContext = nullptr,
-    bool bNewRow = false) {
+    CXFA_LayoutContext* pLayoutContext,
+    bool bNewRow) {
   bool bTakeSpace =
       XFA_ItemLayoutProcessor_IsTakingSpace(pProcessor->m_pFormNode);
   uint8_t uHAlign =
@@ -629,7 +629,7 @@
 
   if ((eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb && uHAlign < uCurHAlignState) ||
       (eFlowStrategy == XFA_ATTRIBUTEENUM_Rl_tb && uHAlign > uCurHAlignState)) {
-    return XFA_ItemLayoutProcessorResult_RowFullBreak;
+    return XFA_ItemLayoutProcessorResult::RowFullBreak;
   }
 
   uCurHAlignState = uHAlign;
@@ -662,18 +662,18 @@
     }
   }
 
-  XFA_ItemLayoutProcessorResult eRetValue = XFA_ItemLayoutProcessorResult_Done;
+  XFA_ItemLayoutProcessorResult eRetValue = XFA_ItemLayoutProcessorResult::Done;
   if (!bNewRow ||
-      pProcessor->m_ePreProcessRs == XFA_ItemLayoutProcessorResult_Done) {
+      pProcessor->m_ePreProcessRs == XFA_ItemLayoutProcessorResult::Done) {
     eRetValue = pProcessor->DoLayout(
         bTakeSpace ? bUseBreakControl : false,
-        bUseRealHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX,
-        bIsTransHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX,
+        bUseRealHeight ? fRealHeight - fContentCurRowY : FLT_MAX,
+        bIsTransHeight ? fRealHeight - fContentCurRowY : FLT_MAX,
         pLayoutContext);
     pProcessor->m_ePreProcessRs = eRetValue;
   } else {
     eRetValue = pProcessor->m_ePreProcessRs;
-    pProcessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult_Done;
+    pProcessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult::Done;
   }
   if (pProcessor->HasLayoutItem() == false)
     return eRetValue;
@@ -682,14 +682,14 @@
   FX_FLOAT fChildHeight;
   pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight);
   if (bUseRealHeight && fRealHeight < XFA_LAYOUT_FLOAT_PERCISION) {
-    fRealHeight = XFA_LAYOUT_FLOAT_MAX;
-    fAvailHeight = XFA_LAYOUT_FLOAT_MAX;
+    fRealHeight = FLT_MAX;
+    fAvailHeight = FLT_MAX;
   }
   if (bTakeSpace &&
       (fChildWidth > fContentCurRowAvailWidth + XFA_LAYOUT_FLOAT_PERCISION) &&
       (fContentWidthLimit - fContentCurRowAvailWidth >
        XFA_LAYOUT_FLOAT_PERCISION)) {
-    return XFA_ItemLayoutProcessorResult_RowFullBreak;
+    return XFA_ItemLayoutProcessorResult::RowFullBreak;
   }
 
   CXFA_Node* pOverflowLeaderNode = nullptr;
@@ -712,7 +712,7 @@
           auto pOverflowLeaderProcessor =
               pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pOverflowTrailerNode,
                                                            nullptr);
-          pOverflowLeaderProcessor->DoLayout(false, XFA_LAYOUT_FLOAT_MAX);
+          pOverflowLeaderProcessor->DoLayout(false, FLT_MAX, FLT_MAX, nullptr);
           pTrailerLayoutItem =
               pOverflowLeaderProcessor->HasLayoutItem()
                   ? pOverflowLeaderProcessor->ExtractLayoutItem()
@@ -737,7 +737,7 @@
       (!bContainerHeightAutoSize &&
        pThis->m_fUsedSize + fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION >=
            fContainerHeight)) {
-    if (!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult_Done) {
+    if (!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult::Done) {
       if (pProcessor->m_bUseInheriated) {
         if (pTrailerLayoutItem)
           AddTrailerBeforeSplit(pProcessor, fChildHeight, pTrailerLayoutItem,
@@ -770,10 +770,10 @@
         if (fContentCurRowHeight < fChildHeight)
           fContentCurRowHeight = fChildHeight;
       }
-      return XFA_ItemLayoutProcessorResult_Done;
+      return XFA_ItemLayoutProcessorResult::Done;
     }
 
-    if (eRetValue == XFA_ItemLayoutProcessorResult_PageFullBreak) {
+    if (eRetValue == XFA_ItemLayoutProcessorResult::PageFullBreak) {
       if (pProcessor->m_bUseInheriated) {
         if (pTrailerLayoutItem) {
           AddTrailerBeforeSplit(pProcessor, fChildHeight, pTrailerLayoutItem,
@@ -815,7 +815,7 @@
     XFA_ATTRIBUTEENUM eLayout =
         pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
     if (eLayout == XFA_ATTRIBUTEENUM_Tb &&
-        eRetValue == XFA_ItemLayoutProcessorResult_Done) {
+        eRetValue == XFA_ItemLayoutProcessorResult::Done) {
       pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
                                        pOverflowTrailerNode, pTrailerLayoutItem,
                                        pFormNode);
@@ -826,13 +826,13 @@
         if (fContentCurRowHeight < fChildHeight)
           fContentCurRowHeight = fChildHeight;
       }
-      return XFA_ItemLayoutProcessorResult_PageFullBreak;
+      return XFA_ItemLayoutProcessorResult::PageFullBreak;
     }
 
     CXFA_Node* pTempLeaderNode = nullptr;
     CXFA_Node* pTempTrailerNode = nullptr;
     if (pThis->m_pPageMgr && !pProcessor->m_bUseInheriated &&
-        eRetValue != XFA_ItemLayoutProcessorResult_PageFullBreak) {
+        eRetValue != XFA_ItemLayoutProcessorResult::PageFullBreak) {
       pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode,
                                          pTempTrailerNode, false, true);
     }
@@ -871,7 +871,7 @@
           fContentCurRowHeight = fChildHeight;
       }
     }
-    return XFA_ItemLayoutProcessorResult_PageFullBreak;
+    return XFA_ItemLayoutProcessorResult::PageFullBreak;
   }
 
   if (fContentCurRowY <= XFA_LAYOUT_FLOAT_PERCISION) {
@@ -892,7 +892,7 @@
                                          pTrailerLayoutItem, pFormNode);
         pThis->m_bUseInheriated = true;
       }
-      return XFA_ItemLayoutProcessorResult_PageFullBreak;
+      return XFA_ItemLayoutProcessorResult::PageFullBreak;
     }
 
     rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem());
@@ -902,7 +902,7 @@
       if (fContentCurRowHeight < fChildHeight)
         fContentCurRowHeight = fChildHeight;
     }
-    if (eRetValue == XFA_ItemLayoutProcessorResult_Done)
+    if (eRetValue == XFA_ItemLayoutProcessorResult::Done)
       bForceEndPage = false;
 
     return eRetValue;
@@ -921,11 +921,11 @@
     if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode))
       AddPendingNode(pProcessor, pOverflowLeaderNode, false);
 
-    return XFA_ItemLayoutProcessorResult_PageFullBreak;
+    return XFA_ItemLayoutProcessorResult::PageFullBreak;
   }
 
-  if (eRetValue != XFA_ItemLayoutProcessorResult_Done)
-    return XFA_ItemLayoutProcessorResult_PageFullBreak;
+  if (eRetValue != XFA_ItemLayoutProcessorResult::Done)
+    return XFA_ItemLayoutProcessorResult::PageFullBreak;
 
   if (!pFormNode && pLayoutContext)
     pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode;
@@ -938,74 +938,14 @@
                                      pTrailerLayoutItem, pFormNode);
     pThis->m_bUseInheriated = true;
   }
-  return XFA_ItemLayoutProcessorResult_PageFullBreak;
+  return XFA_ItemLayoutProcessorResult::PageFullBreak;
 }
 
-}  // namespace
-
-CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode,
-                                                   CXFA_LayoutPageMgr* pPageMgr)
-    : m_bKeepBreakFinish(false),
-      m_bIsProcessKeep(false),
-      m_pKeepHeadNode(nullptr),
-      m_pKeepTailNode(nullptr),
-      m_pFormNode(pNode),
-      m_pLayoutItem(nullptr),
-      m_pOldLayoutItem(nullptr),
-      m_pCurChildNode(XFA_LAYOUT_INVALIDNODE),
-      m_pCurChildPreprocessor(nullptr),
-      m_nCurChildNodeStage(XFA_ItemLayoutProcessorStages_None),
-      m_fUsedSize(0),
-      m_pPageMgr(pPageMgr),
-      m_bBreakPending(true),
-      m_fLastRowWidth(0),
-      m_fLastRowY(0),
-      m_fWidthLimite(0),
-      m_bUseInheriated(false),
-      m_ePreProcessRs(XFA_ItemLayoutProcessorResult_Done),
-      m_bHasAvailHeight(true) {
-  ASSERT(m_pFormNode && (m_pFormNode->IsContainerNode() ||
-                         m_pFormNode->GetElementType() == XFA_Element::Form));
-  m_pOldLayoutItem =
-      (CXFA_ContentLayoutItem*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
-}
-
-CXFA_ItemLayoutProcessor::~CXFA_ItemLayoutProcessor() {}
-
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
-    CXFA_Node* pFormNode) {
-  if (!pFormNode)
-    return nullptr;
-
-  CXFA_ContentLayoutItem* pLayoutItem = nullptr;
-  if (m_pOldLayoutItem) {
-    pLayoutItem = m_pOldLayoutItem;
-    m_pOldLayoutItem = m_pOldLayoutItem->m_pNext;
-    return pLayoutItem;
-  }
-  pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument()
-                    ->GetNotify()
-                    ->OnCreateLayoutItem(pFormNode);
-  CXFA_ContentLayoutItem* pPrevLayoutItem =
-      (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
-  if (pPrevLayoutItem) {
-    while (pPrevLayoutItem->m_pNext) {
-      pPrevLayoutItem = pPrevLayoutItem->m_pNext;
-    }
-    pPrevLayoutItem->m_pNext = pLayoutItem;
-    pLayoutItem->m_pPrev = pPrevLayoutItem;
-  } else {
-    pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem);
-  }
-  return pLayoutItem;
-}
-
-bool CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos(
-    CXFA_ContentLayoutItem* pLayoutItem,
-    FX_FLOAT fCurVerticalOffset,
-    FX_FLOAT& fProposedSplitPos,
-    bool& bAppChange,
-    bool bCalculateMargin) {
+bool FindLayoutItemSplitPos(CXFA_ContentLayoutItem* pLayoutItem,
+                            FX_FLOAT fCurVerticalOffset,
+                            FX_FLOAT& fProposedSplitPos,
+                            bool& bAppChange,
+                            bool bCalculateMargin) {
   CXFA_Node* pFormNode = pLayoutItem->m_pFormNode;
   if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION &&
       fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y -
@@ -1084,6 +1024,138 @@
   return false;
 }
 
+void CalculatePositionedContainerPos(CXFA_Node* pNode,
+                                     FX_FLOAT fWidth,
+                                     FX_FLOAT fHeight,
+                                     FX_FLOAT& fAbsoluteX,
+                                     FX_FLOAT& fAbsoluteY) {
+  XFA_ATTRIBUTEENUM eAnchorType = pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
+  int32_t nAnchorType = 0;
+  switch (eAnchorType) {
+    case XFA_ATTRIBUTEENUM_TopLeft:
+      nAnchorType = 0;
+      break;
+    case XFA_ATTRIBUTEENUM_TopCenter:
+      nAnchorType = 1;
+      break;
+    case XFA_ATTRIBUTEENUM_TopRight:
+      nAnchorType = 2;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleLeft:
+      nAnchorType = 3;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleCenter:
+      nAnchorType = 4;
+      break;
+    case XFA_ATTRIBUTEENUM_MiddleRight:
+      nAnchorType = 5;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomLeft:
+      nAnchorType = 6;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomCenter:
+      nAnchorType = 7;
+      break;
+    case XFA_ATTRIBUTEENUM_BottomRight:
+      nAnchorType = 8;
+      break;
+    default:
+      break;
+  }
+  static const uint8_t nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8},
+                                         {6, 3, 0, 7, 4, 1, 8, 5, 2},
+                                         {8, 7, 6, 5, 4, 3, 2, 1, 0},
+                                         {2, 5, 8, 1, 4, 7, 0, 3, 6}};
+
+  FX_FLOAT fAnchorX = pNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt);
+  FX_FLOAT fAnchorY = pNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
+  int32_t nRotate =
+      FXSYS_round(pNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue());
+  nRotate = XFA_MapRotation(nRotate) / 90;
+  int32_t nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType];
+  fAbsoluteX = fAnchorX;
+  fAbsoluteY = fAnchorY;
+  switch (nAbsoluteAnchorType / 3) {
+    case 1:
+      fAbsoluteY -= fHeight / 2;
+      break;
+    case 2:
+      fAbsoluteY -= fHeight;
+      break;
+    default:
+      break;
+  }
+  switch (nAbsoluteAnchorType % 3) {
+    case 1:
+      fAbsoluteX -= fWidth / 2;
+      break;
+    case 2:
+      fAbsoluteX -= fWidth;
+      break;
+    default:
+      break;
+  }
+}
+
+}  // namespace
+
+CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode,
+                                                   CXFA_LayoutPageMgr* pPageMgr)
+    : m_pFormNode(pNode),
+      m_pLayoutItem(nullptr),
+      m_pCurChildNode(XFA_LAYOUT_INVALIDNODE),
+      m_fUsedSize(0),
+      m_pPageMgr(pPageMgr),
+      m_bBreakPending(true),
+      m_fLastRowWidth(0),
+      m_fLastRowY(0),
+      m_bUseInheriated(false),
+      m_ePreProcessRs(XFA_ItemLayoutProcessorResult::Done),
+      m_bKeepBreakFinish(false),
+      m_bIsProcessKeep(false),
+      m_pKeepHeadNode(nullptr),
+      m_pKeepTailNode(nullptr),
+      m_pOldLayoutItem(nullptr),
+      m_pCurChildPreprocessor(nullptr),
+      m_nCurChildNodeStage(XFA_ItemLayoutProcessorStages::None),
+      m_fWidthLimite(0),
+      m_bHasAvailHeight(true) {
+  ASSERT(m_pFormNode && (m_pFormNode->IsContainerNode() ||
+                         m_pFormNode->GetElementType() == XFA_Element::Form));
+  m_pOldLayoutItem =
+      (CXFA_ContentLayoutItem*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
+}
+
+CXFA_ItemLayoutProcessor::~CXFA_ItemLayoutProcessor() {}
+
+CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
+    CXFA_Node* pFormNode) {
+  if (!pFormNode)
+    return nullptr;
+
+  CXFA_ContentLayoutItem* pLayoutItem = nullptr;
+  if (m_pOldLayoutItem) {
+    pLayoutItem = m_pOldLayoutItem;
+    m_pOldLayoutItem = m_pOldLayoutItem->m_pNext;
+    return pLayoutItem;
+  }
+  pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument()
+                    ->GetNotify()
+                    ->OnCreateLayoutItem(pFormNode);
+  CXFA_ContentLayoutItem* pPrevLayoutItem =
+      (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
+  if (pPrevLayoutItem) {
+    while (pPrevLayoutItem->m_pNext)
+      pPrevLayoutItem = pPrevLayoutItem->m_pNext;
+
+    pPrevLayoutItem->m_pNext = pLayoutItem;
+    pLayoutItem->m_pPrev = pPrevLayoutItem;
+  } else {
+    pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem);
+  }
+  return pLayoutItem;
+}
+
 FX_FLOAT CXFA_ItemLayoutProcessor::FindSplitPos(FX_FLOAT fProposedSplitPos) {
   ASSERT(m_pLayoutItem);
   XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout);
@@ -1188,6 +1260,7 @@
           pSecondLayoutItem->AddChild(pPreItem);
         }
       }
+
       pChildItem->m_sPos.y -= fSplitPos;
       pChildItem->m_sPos.y += lHeightForKeep;
       pChildItem->m_sPos.y += fAddMarginHeight;
@@ -1229,7 +1302,7 @@
     pLayoutItem->m_pNextSibling = nullptr;
   }
 
-  if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done ||
+  if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done ||
       !ToContentLayoutItem(m_pOldLayoutItem)) {
     return pLayoutItem;
   }
@@ -1263,13 +1336,13 @@
   CXFA_Node* pEntireContainer = pParentContainer;
   CXFA_Node* pChildContainer = XFA_LAYOUT_INVALIDNODE;
   switch (nCurStage) {
-    case XFA_ItemLayoutProcessorStages_BreakBefore:
-    case XFA_ItemLayoutProcessorStages_BreakAfter: {
+    case XFA_ItemLayoutProcessorStages::BreakBefore:
+    case XFA_ItemLayoutProcessorStages::BreakAfter: {
       pChildContainer = pCurActionNode->GetNodeItem(XFA_NODEITEM_Parent);
       break;
     }
-    case XFA_ItemLayoutProcessorStages_Keep:
-    case XFA_ItemLayoutProcessorStages_Container:
+    case XFA_ItemLayoutProcessorStages::Keep:
+    case XFA_ItemLayoutProcessorStages::Container:
       pChildContainer = pCurActionNode;
       break;
     default:
@@ -1278,7 +1351,7 @@
   }
 
   switch (nCurStage) {
-    case XFA_ItemLayoutProcessorStages_Keep: {
+    case XFA_ItemLayoutProcessorStages::Keep: {
       CXFA_Node* pBreakAfterNode =
           pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild);
       if (!m_bKeepBreakFinish &&
@@ -1287,9 +1360,9 @@
       }
       goto CheckNextChildContainer;
     }
-    case XFA_ItemLayoutProcessorStages_None: {
+    case XFA_ItemLayoutProcessorStages::None: {
       pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-      case XFA_ItemLayoutProcessorStages_BookendLeader:
+      case XFA_ItemLayoutProcessorStages::BookendLeader:
         for (CXFA_Node* pBookendNode =
                  pCurActionNode == XFA_LAYOUT_INVALIDNODE
                      ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild)
@@ -1300,7 +1373,7 @@
             case XFA_Element::Bookend:
             case XFA_Element::Break:
               pCurActionNode = pBookendNode;
-              nCurStage = XFA_ItemLayoutProcessorStages_BookendLeader;
+              nCurStage = XFA_ItemLayoutProcessorStages::BookendLeader;
               return;
             default:
               break;
@@ -1309,7 +1382,7 @@
     }
       {
         pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-        case XFA_ItemLayoutProcessorStages_BreakBefore:
+        case XFA_ItemLayoutProcessorStages::BreakBefore:
           if (pCurActionNode != XFA_LAYOUT_INVALIDNODE) {
             CXFA_Node* pBreakBeforeNode =
                 pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling);
@@ -1326,14 +1399,14 @@
               goto CheckNextChildContainer;
             }
             pCurActionNode = pChildContainer;
-            nCurStage = XFA_ItemLayoutProcessorStages_Container;
+            nCurStage = XFA_ItemLayoutProcessorStages::Container;
             return;
           }
           goto CheckNextChildContainer;
       }
-    case XFA_ItemLayoutProcessorStages_Container: {
+    case XFA_ItemLayoutProcessorStages::Container: {
       pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-      case XFA_ItemLayoutProcessorStages_BreakAfter: {
+      case XFA_ItemLayoutProcessorStages::BreakAfter: {
         if (pCurActionNode == XFA_LAYOUT_INVALIDNODE) {
           CXFA_Node* pBreakAfterNode =
               pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild);
@@ -1385,15 +1458,15 @@
       }
       pCurActionNode = pNextChildContainer;
       if (m_bIsProcessKeep)
-        nCurStage = XFA_ItemLayoutProcessorStages_Keep;
+        nCurStage = XFA_ItemLayoutProcessorStages::Keep;
       else
-        nCurStage = XFA_ItemLayoutProcessorStages_Container;
+        nCurStage = XFA_ItemLayoutProcessorStages::Container;
       return;
     }
 
     NoMoreChildContainer : {
       pCurActionNode = XFA_LAYOUT_INVALIDNODE;
-      case XFA_ItemLayoutProcessorStages_BookendTrailer:
+      case XFA_ItemLayoutProcessorStages::BookendTrailer:
         for (CXFA_Node* pBookendNode =
                  pCurActionNode == XFA_LAYOUT_INVALIDNODE
                      ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild)
@@ -1404,7 +1477,7 @@
             case XFA_Element::Bookend:
             case XFA_Element::Break:
               pCurActionNode = pBookendNode;
-              nCurStage = XFA_ItemLayoutProcessorStages_BookendTrailer;
+              nCurStage = XFA_ItemLayoutProcessorStages::BookendTrailer;
               return;
             default:
               break;
@@ -1413,7 +1486,7 @@
     }
     default:
       pCurActionNode = nullptr;
-      nCurStage = XFA_ItemLayoutProcessorStages_Done;
+      nCurStage = XFA_ItemLayoutProcessorStages::Done;
   }
 }
 
@@ -1467,7 +1540,7 @@
     m_pKeepHeadNode = nullptr;
     m_pKeepTailNode = nullptr;
     m_bIsProcessKeep = false;
-    nCurStage = XFA_ItemLayoutProcessorStages_Container;
+    nCurStage = XFA_ItemLayoutProcessorStages::Container;
     return true;
   }
 
@@ -1482,80 +1555,6 @@
          ePresence == XFA_ATTRIBUTEENUM_Invisible;
 }
 
-void CXFA_ItemLayoutProcessor::CalculatePositionedContainerPos(
-    CXFA_Node* pNode,
-    FX_FLOAT fWidth,
-    FX_FLOAT fHeight,
-    FX_FLOAT& fAbsoluteX,
-    FX_FLOAT& fAbsoluteY) {
-  XFA_ATTRIBUTEENUM eAnchorType = pNode->GetEnum(XFA_ATTRIBUTE_AnchorType);
-  int32_t nAnchorType = 0;
-  switch (eAnchorType) {
-    case XFA_ATTRIBUTEENUM_TopLeft:
-      nAnchorType = 0;
-      break;
-    case XFA_ATTRIBUTEENUM_TopCenter:
-      nAnchorType = 1;
-      break;
-    case XFA_ATTRIBUTEENUM_TopRight:
-      nAnchorType = 2;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleLeft:
-      nAnchorType = 3;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleCenter:
-      nAnchorType = 4;
-      break;
-    case XFA_ATTRIBUTEENUM_MiddleRight:
-      nAnchorType = 5;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomLeft:
-      nAnchorType = 6;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomCenter:
-      nAnchorType = 7;
-      break;
-    case XFA_ATTRIBUTEENUM_BottomRight:
-      nAnchorType = 8;
-      break;
-    default:
-      break;
-  }
-  static const uint8_t nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8},
-                                         {6, 3, 0, 7, 4, 1, 8, 5, 2},
-                                         {8, 7, 6, 5, 4, 3, 2, 1, 0},
-                                         {2, 5, 8, 1, 4, 7, 0, 3, 6}};
-
-  FX_FLOAT fAnchorX = pNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt);
-  FX_FLOAT fAnchorY = pNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt);
-  int32_t nRotate =
-      FXSYS_round(pNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue());
-  nRotate = XFA_MapRotation(nRotate) / 90;
-  int32_t nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType];
-  fAbsoluteX = fAnchorX;
-  fAbsoluteY = fAnchorY;
-  switch (nAbsoluteAnchorType / 3) {
-    case 1:
-      fAbsoluteY -= fHeight / 2;
-      break;
-    case 2:
-      fAbsoluteY -= fHeight;
-      break;
-    default:
-      break;
-  }
-  switch (nAbsoluteAnchorType % 3) {
-    case 1:
-      fAbsoluteX -= fWidth / 2;
-      break;
-    case 2:
-      fAbsoluteX -= fWidth;
-      break;
-    default:
-      break;
-  }
-}
-
 bool CXFA_ItemLayoutProcessor::IncrementRelayoutNode(
     CXFA_LayoutProcessor* pLayoutProcessor,
     CXFA_Node* pNode,
@@ -1568,20 +1567,20 @@
   CXFA_Node* pFormNode = pPageAreaLayoutItem->m_pFormNode;
   CXFA_Node* pCurChildNode = XFA_LAYOUT_INVALIDNODE;
   XFA_ItemLayoutProcessorStages nCurChildNodeStage =
-      XFA_ItemLayoutProcessorStages_None;
+      XFA_ItemLayoutProcessorStages::None;
   CXFA_LayoutItem* pBeforeItem = nullptr;
   for (GotoNextContainerNode(pCurChildNode, nCurChildNodeStage, pFormNode,
                              false);
        pCurChildNode; GotoNextContainerNode(pCurChildNode, nCurChildNodeStage,
                                             pFormNode, false)) {
-    if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container)
+    if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
       continue;
     if (pCurChildNode->GetElementType() == XFA_Element::Variables)
       continue;
 
     auto pProcessor =
         pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pCurChildNode, nullptr);
-    pProcessor->DoLayout(false, XFA_LAYOUT_FLOAT_MAX);
+    pProcessor->DoLayout(false, FLT_MAX, FLT_MAX, nullptr);
     if (!pProcessor->HasLayoutItem())
       continue;
 
@@ -1654,7 +1653,7 @@
   int32_t iColIndex = 0;
   for (; m_pCurChildNode; GotoNextContainerNode(
            m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, false)) {
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container)
+    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
       continue;
     if (m_pCurChildNode->GetElementType() == XFA_Element::Variables)
       continue;
@@ -1681,8 +1680,7 @@
       }
     }
 
-    pProcessor->DoLayout(false, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX,
-                         pContext);
+    pProcessor->DoLayout(false, FLT_MAX, FLT_MAX, pContext);
     if (!pProcessor->HasLayoutItem())
       continue;
 
@@ -1772,7 +1770,7 @@
   }
 
   FX_FLOAT fContentWidthLimit =
-      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
+      bContainerWidthAutoSize ? FLT_MAX
                               : fContainerWidth - fLeftInset - fRightInset;
   CFX_WideStringC wsColumnWidths;
   if (pLayoutNode->TryCData(XFA_ATTRIBUTE_ColumnWidths, wsColumnWidths)) {
@@ -1806,13 +1804,12 @@
            m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, false)) {
     layoutContext.m_bCurColumnWidthAvaiable = false;
     layoutContext.m_fCurColumnWidth = 0;
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container)
+    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
       continue;
 
     auto pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
         m_pCurChildNode, m_pPageMgr);
-    pProcessor->DoLayout(false, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX,
-                         pLayoutContext);
+    pProcessor->DoLayout(false, FLT_MAX, FLT_MAX, pLayoutContext);
     if (!pProcessor->HasLayoutItem())
       continue;
 
@@ -1882,15 +1879,12 @@
           continue;
 
         if (iColCount >= iSpecifiedColumnCount) {
-          for (int32_t j = 0,
-                       c = iColCount + 1 - m_rgSpecifiedColumnWidths.GetSize();
-               j < c; j++) {
+          int32_t c = iColCount + 1 - m_rgSpecifiedColumnWidths.GetSize();
+          for (int32_t j = 0; j < c; j++)
             m_rgSpecifiedColumnWidths.Add(0);
-          }
         }
-        if (m_rgSpecifiedColumnWidths[iColCount] < XFA_LAYOUT_FLOAT_PERCISION) {
+        if (m_rgSpecifiedColumnWidths[iColCount] < XFA_LAYOUT_FLOAT_PERCISION)
           bAutoCol = true;
-        }
         if (bAutoCol &&
             m_rgSpecifiedColumnWidths[iColCount] < rgRowItemsWidth[i]) {
           m_rgSpecifiedColumnWidths[iColCount] = rgRowItemsWidth[i];
@@ -1953,7 +1947,7 @@
     if (bContainerWidthAutoSize) {
       FX_FLOAT fChildSuppliedWidth =
           pLayoutChild->m_sPos.x + pLayoutChild->m_sSize.x;
-      if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
+      if (fContentWidthLimit < FLT_MAX &&
           fContentWidthLimit > fChildSuppliedWidth) {
         fChildSuppliedWidth = fContentWidthLimit;
       }
@@ -2038,7 +2032,7 @@
     }
     bAddedItemInRow = true;
     bForceEndPage = true;
-    result = XFA_ItemLayoutProcessorResult_PageFullBreak;
+    result = XFA_ItemLayoutProcessorResult::PageFullBreak;
     return true;
   }
 
@@ -2135,7 +2129,7 @@
   bool bIsManualBreak = false;
   if (m_pCurChildPreprocessor) {
     m_pCurChildPreprocessor->m_ePreProcessRs =
-        XFA_ItemLayoutProcessorResult_Done;
+        XFA_ItemLayoutProcessorResult::Done;
   }
 
   CalculateContainerSpecfiedSize(m_pFormNode, fContainerWidth, fContainerHeight,
@@ -2178,7 +2172,7 @@
         pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt);
   }
   FX_FLOAT fContentWidthLimit =
-      bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX
+      bContainerWidthAutoSize ? FLT_MAX
                               : fContainerWidth - fLeftInset - fRightInset;
   FX_FLOAT fContentCalculatedWidth = 0;
   FX_FLOAT fContentCalculatedHeight = 0;
@@ -2190,7 +2184,7 @@
   FX_FLOAT fContentCurRowY = 0;
   CXFA_ContentLayoutItem* pLayoutChild = nullptr;
   if (m_pLayoutItem) {
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done &&
+    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done &&
         eFlowStrategy != XFA_ATTRIBUTEENUM_Tb) {
       pLayoutChild = (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild;
       for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
@@ -2223,22 +2217,22 @@
   }
 
   fContentCurRowY += InsertKeepLayoutItems();
-  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_None) {
+  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::None) {
     GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode,
                           true);
   }
 
   fContentCurRowY += InsertPendingItems(this, m_pFormNode);
   if (m_pCurChildPreprocessor &&
-      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Container) {
+      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::Container) {
     if (ExistContainerKeep(m_pCurChildPreprocessor->GetFormNode(), false)) {
       m_pKeepHeadNode = m_pCurChildNode;
       m_bIsProcessKeep = true;
-      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Keep;
+      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Keep;
     }
   }
 
-  while (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done) {
+  while (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done) {
     FX_FLOAT fContentCurRowHeight = 0;
     FX_FLOAT fContentCurRowAvailWidth = fContentWidthLimit;
     m_fWidthLimite = fContentCurRowAvailWidth;
@@ -2304,10 +2298,10 @@
       bool bAddedItemInRow = false;
       fContentCurRowY += InsertPendingItems(this, m_pFormNode);
       switch (m_nCurChildNodeStage) {
-        case XFA_ItemLayoutProcessorStages_Keep:
-        case XFA_ItemLayoutProcessorStages_None:
+        case XFA_ItemLayoutProcessorStages::Keep:
+        case XFA_ItemLayoutProcessorStages::None:
           break;
-        case XFA_ItemLayoutProcessorStages_BreakBefore: {
+        case XFA_ItemLayoutProcessorStages::BreakBefore: {
           for (int32_t iIndex = 0; iIndex < m_arrayKeepItems.GetSize();
                iIndex++) {
             CXFA_ContentLayoutItem* pItem = m_arrayKeepItems.GetAt(iIndex);
@@ -2341,11 +2335,10 @@
               InsertFlowedItem(
                   this, pTempProcessor.get(), bContainerWidthAutoSize,
                   bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                  uCurHAlignState, rgCurLineLayoutItems, false,
-                  XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
-                  fContentWidthLimit, fContentCurRowAvailWidth,
-                  fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                  pContext);
+                  uCurHAlignState, rgCurLineLayoutItems, false, FLT_MAX,
+                  FLT_MAX, fContentCurRowY, fContentWidthLimit,
+                  fContentCurRowAvailWidth, fContentCurRowHeight,
+                  bAddedItemInRow, bForceEndPage, pContext, false);
             }
           }
           GotoNextContainerNode(m_pCurChildNode, m_nCurChildNodeStage,
@@ -2354,7 +2347,7 @@
           bIsManualBreak = true;
           goto SuspendAndCreateNewRow;
         }
-        case XFA_ItemLayoutProcessorStages_BreakAfter: {
+        case XFA_ItemLayoutProcessorStages::BreakAfter: {
           CXFA_Node* pLeaderNode = nullptr;
           CXFA_Node* pTrailerNode = nullptr;
           bool bCreatePage = false;
@@ -2369,13 +2362,13 @@
           if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) {
             auto pTempProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
                 pTrailerNode, nullptr);
-            InsertFlowedItem(
-                this, pTempProcessor.get(), bContainerWidthAutoSize,
-                bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                uCurHAlignState, rgCurLineLayoutItems, false,
-                XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
-                fContentWidthLimit, fContentCurRowAvailWidth,
-                fContentCurRowHeight, bAddedItemInRow, bForceEndPage, pContext);
+            InsertFlowedItem(this, pTempProcessor.get(),
+                             bContainerWidthAutoSize, bContainerHeightAutoSize,
+                             fContainerHeight, eFlowStrategy, uCurHAlignState,
+                             rgCurLineLayoutItems, false, FLT_MAX, FLT_MAX,
+                             fContentCurRowY, fContentWidthLimit,
+                             fContentCurRowAvailWidth, fContentCurRowHeight,
+                             bAddedItemInRow, bForceEndPage, pContext, false);
           }
           if (!bCreatePage) {
             if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
@@ -2383,7 +2376,7 @@
                   rgCurLineLayoutItems, eFlowStrategy, bContainerHeightAutoSize,
                   bContainerWidthAutoSize, fContentCalculatedWidth,
                   fContentCalculatedHeight, fContentCurRowY,
-                  fContentCurRowHeight, fContentWidthLimit);
+                  fContentCurRowHeight, fContentWidthLimit, false);
               rgCurLineLayoutItems->RemoveAll();
               auto pTempProcessor =
                   pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pLeaderNode,
@@ -2391,11 +2384,10 @@
               InsertFlowedItem(
                   this, pTempProcessor.get(), bContainerWidthAutoSize,
                   bContainerHeightAutoSize, fContainerHeight, eFlowStrategy,
-                  uCurHAlignState, rgCurLineLayoutItems, false,
-                  XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY,
-                  fContentWidthLimit, fContentCurRowAvailWidth,
-                  fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                  pContext);
+                  uCurHAlignState, rgCurLineLayoutItems, false, FLT_MAX,
+                  FLT_MAX, fContentCurRowY, fContentWidthLimit,
+                  fContentCurRowAvailWidth, fContentCurRowHeight,
+                  bAddedItemInRow, bForceEndPage, pContext, false);
             }
           } else {
             if (JudgeLeaderOrTrailerForOccur(pLeaderNode))
@@ -2407,12 +2399,12 @@
           if (bCreatePage) {
             bForceEndPage = true;
             bIsManualBreak = true;
-            if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done)
+            if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::Done)
               bBreakDone = true;
           }
           goto SuspendAndCreateNewRow;
         }
-        case XFA_ItemLayoutProcessorStages_BookendLeader: {
+        case XFA_ItemLayoutProcessorStages::BookendLeader: {
           CXFA_Node* pLeaderNode = nullptr;
           if (m_pCurChildPreprocessor) {
             pProcessor.reset(m_pCurChildPreprocessor);
@@ -2432,7 +2424,7 @@
                     fAvailHeight, fRealHeight, fContentCurRowY,
                     fContentWidthLimit, fContentCurRowAvailWidth,
                     fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext) != XFA_ItemLayoutProcessorResult_Done) {
+                    pContext, false) != XFA_ItemLayoutProcessorResult::Done) {
               goto SuspendAndCreateNewRow;
             } else {
               pProcessor.reset();
@@ -2440,7 +2432,7 @@
           }
           break;
         }
-        case XFA_ItemLayoutProcessorStages_BookendTrailer: {
+        case XFA_ItemLayoutProcessorStages::BookendTrailer: {
           CXFA_Node* pTrailerNode = nullptr;
           if (m_pCurChildPreprocessor) {
             pProcessor.reset(m_pCurChildPreprocessor);
@@ -2459,7 +2451,7 @@
                     fAvailHeight, fRealHeight, fContentCurRowY,
                     fContentWidthLimit, fContentCurRowAvailWidth,
                     fContentCurRowHeight, bAddedItemInRow, bForceEndPage,
-                    pContext) != XFA_ItemLayoutProcessorResult_Done) {
+                    pContext, false) != XFA_ItemLayoutProcessorResult::Done) {
               goto SuspendAndCreateNewRow;
             } else {
               pProcessor.reset();
@@ -2467,7 +2459,7 @@
           }
           break;
         }
-        case XFA_ItemLayoutProcessorStages_Container: {
+        case XFA_ItemLayoutProcessorStages::Container: {
           ASSERT(m_pCurChildNode->IsContainerNode());
           if (m_pCurChildNode->GetElementType() == XFA_Element::Variables)
             break;
@@ -2498,13 +2490,13 @@
               fContentCurRowAvailWidth, fContentCurRowHeight, bAddedItemInRow,
               bForceEndPage, pContext, bNewRow);
           switch (rs) {
-            case XFA_ItemLayoutProcessorResult_ManualBreak:
+            case XFA_ItemLayoutProcessorResult::ManualBreak:
               bIsManualBreak = true;
-            case XFA_ItemLayoutProcessorResult_PageFullBreak:
+            case XFA_ItemLayoutProcessorResult::PageFullBreak:
               bForceEndPage = true;
-            case XFA_ItemLayoutProcessorResult_RowFullBreak:
+            case XFA_ItemLayoutProcessorResult::RowFullBreak:
               goto SuspendAndCreateNewRow;
-            case XFA_ItemLayoutProcessorResult_Done:
+            case XFA_ItemLayoutProcessorResult::Done:
             default:
               fContentCurRowY +=
                   InsertPendingItems(pProcessor.get(), m_pCurChildNode);
@@ -2512,7 +2504,7 @@
           }
           break;
         }
-        case XFA_ItemLayoutProcessorStages_Done:
+        case XFA_ItemLayoutProcessorStages::Done:
           break;
         default:
           break;
@@ -2539,8 +2531,9 @@
       break;
   }
 
-  bool bRetValue = m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done &&
-                   m_PendingNodes.empty();
+  bool bRetValue =
+      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::Done &&
+      m_PendingNodes.empty();
   if (bBreakDone)
     bRetValue = false;
 
@@ -2564,9 +2557,9 @@
   }
 
   return bRetValue
-             ? XFA_ItemLayoutProcessorResult_Done
-             : (bIsManualBreak ? XFA_ItemLayoutProcessorResult_ManualBreak
-                               : XFA_ItemLayoutProcessorResult_PageFullBreak);
+             ? XFA_ItemLayoutProcessorResult::Done
+             : (bIsManualBreak ? XFA_ItemLayoutProcessorResult::ManualBreak
+                               : XFA_ItemLayoutProcessorResult::PageFullBreak);
 }
 
 bool CXFA_ItemLayoutProcessor::CalculateRowChildPosition(
@@ -2709,7 +2702,7 @@
   fContentCurRowY += fContentCurRowHeight;
   if (bContainerWidthAutoSize) {
     FX_FLOAT fChildSuppliedWidth = fGroupWidths[0];
-    if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX &&
+    if (fContentWidthLimit < FLT_MAX &&
         fContentWidthLimit > fChildSuppliedWidth) {
       fChildSuppliedWidth = fContentWidthLimit;
     }
@@ -2787,33 +2780,26 @@
         case XFA_ATTRIBUTEENUM_Rl_row:
         default:
           DoLayoutPositionedContainer(pContext);
-          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
-          return XFA_ItemLayoutProcessorResult_Done;
+          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Done;
+          return XFA_ItemLayoutProcessorResult::Done;
         case XFA_ATTRIBUTEENUM_Table:
           DoLayoutTableContainer(pLayoutNode);
-          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
-          return XFA_ItemLayoutProcessorResult_Done;
+          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Done;
+          return XFA_ItemLayoutProcessorResult::Done;
       }
     }
     case XFA_Element::Draw:
     case XFA_Element::Field:
       DoLayoutField();
-      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done;
-      return XFA_ItemLayoutProcessorResult_Done;
+      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Done;
+      return XFA_ItemLayoutProcessorResult::Done;
     case XFA_Element::ContentArea:
-      return XFA_ItemLayoutProcessorResult_Done;
+      return XFA_ItemLayoutProcessorResult::Done;
     default:
-      return XFA_ItemLayoutProcessorResult_Done;
+      return XFA_ItemLayoutProcessorResult::Done;
   }
 }
 
-void CXFA_ItemLayoutProcessor::GetCurrentComponentPos(FX_FLOAT& fAbsoluteX,
-                                                      FX_FLOAT& fAbsoluteY) {
-  ASSERT(m_pLayoutItem);
-  fAbsoluteX = m_pLayoutItem->m_sPos.x;
-  fAbsoluteY = m_pLayoutItem->m_sPos.y;
-}
-
 void CXFA_ItemLayoutProcessor::GetCurrentComponentSize(FX_FLOAT& fWidth,
                                                        FX_FLOAT& fHeight) {
   ASSERT(m_pLayoutItem);
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.h b/xfa/fxfa/parser/xfa_layout_itemlayout.h
index b18706b..b7b3512 100644
--- a/xfa/fxfa/parser/xfa_layout_itemlayout.h
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.h
@@ -17,7 +17,6 @@
 
 #define XFA_LAYOUT_INVALIDNODE ((CXFA_Node*)(intptr_t)-1)
 #define XFA_LAYOUT_FLOAT_PERCISION (0.0005f)
-#define XFA_LAYOUT_FLOAT_MAX FLT_MAX
 
 class CXFA_ContainerLayoutItem;
 class CXFA_ContentLayoutItem;
@@ -26,22 +25,22 @@
 class CXFA_LayoutProcessor;
 class CXFA_Node;
 
-enum XFA_ItemLayoutProcessorResult {
-  XFA_ItemLayoutProcessorResult_Done,
-  XFA_ItemLayoutProcessorResult_PageFullBreak,
-  XFA_ItemLayoutProcessorResult_RowFullBreak,
-  XFA_ItemLayoutProcessorResult_ManualBreak,
+enum class XFA_ItemLayoutProcessorResult {
+  Done,
+  PageFullBreak,
+  RowFullBreak,
+  ManualBreak,
 };
 
-enum XFA_ItemLayoutProcessorStages {
-  XFA_ItemLayoutProcessorStages_None,
-  XFA_ItemLayoutProcessorStages_BookendLeader,
-  XFA_ItemLayoutProcessorStages_BreakBefore,
-  XFA_ItemLayoutProcessorStages_Keep,
-  XFA_ItemLayoutProcessorStages_Container,
-  XFA_ItemLayoutProcessorStages_BreakAfter,
-  XFA_ItemLayoutProcessorStages_BookendTrailer,
-  XFA_ItemLayoutProcessorStages_Done,
+enum class XFA_ItemLayoutProcessorStages {
+  None,
+  BookendLeader,
+  BreakBefore,
+  Keep,
+  Container,
+  BreakAfter,
+  BookendTrailer,
+  Done,
 };
 
 class CXFA_LayoutContext {
@@ -52,7 +51,8 @@
         m_bCurColumnWidthAvaiable(false),
         m_pOverflowProcessor(nullptr),
         m_pOverflowNode(nullptr) {}
-  ~CXFA_LayoutContext() { m_pOverflowProcessor = nullptr; }
+  ~CXFA_LayoutContext() {}
+
   CFX_ArrayTemplate<FX_FLOAT>* m_prgSpecifiedColumnWidths;
   FX_FLOAT m_fCurColumnWidth;
   bool m_bCurColumnWidthAvaiable;
@@ -67,45 +67,25 @@
   static bool IncrementRelayoutNode(CXFA_LayoutProcessor* pLayoutProcessor,
                                     CXFA_Node* pNode,
                                     CXFA_Node* pParentNode);
-  static void CalculatePositionedContainerPos(CXFA_Node* pNode,
-                                              FX_FLOAT fWidth,
-                                              FX_FLOAT fHeight,
-                                              FX_FLOAT& fAbsoluteX,
-                                              FX_FLOAT& fAbsoluteY);
-  static bool FindLayoutItemSplitPos(CXFA_ContentLayoutItem* pLayoutItem,
-                                     FX_FLOAT fCurVerticalOffset,
-                                     FX_FLOAT& fProposedSplitPos,
-                                     bool& bAppChange,
-                                     bool bCalculateMargin);
 
   CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr);
   ~CXFA_ItemLayoutProcessor();
 
-  XFA_ItemLayoutProcessorResult DoLayout(
-      bool bUseBreakControl,
-      FX_FLOAT fHeightLimit,
-      FX_FLOAT fRealHeight = XFA_LAYOUT_FLOAT_MAX,
-      CXFA_LayoutContext* pContext = nullptr);
-
-  void GetCurrentComponentPos(FX_FLOAT& fAbsoluteX, FX_FLOAT& fAbsoluteY);
+  XFA_ItemLayoutProcessorResult DoLayout(bool bUseBreakControl,
+                                         FX_FLOAT fHeightLimit,
+                                         FX_FLOAT fRealHeight,
+                                         CXFA_LayoutContext* pContext);
+  void DoLayoutPageArea(CXFA_ContainerLayoutItem* pPageAreaLayoutItem);
 
   void GetCurrentComponentSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
 
-  void SetCurrentComponentPos(FX_FLOAT fAbsoluteX, FX_FLOAT fAbsoluteY);
-
-  void SetCurrentComponentSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
   CXFA_Node* GetFormNode() { return m_pFormNode; }
   bool HasLayoutItem() { return !!m_pLayoutItem; }
   CXFA_ContentLayoutItem* ExtractLayoutItem();
+  void SplitLayoutItem(FX_FLOAT fSplitPos);
 
   FX_FLOAT FindSplitPos(FX_FLOAT fProposedSplitPos);
-  void SplitLayoutItem(CXFA_ContentLayoutItem* pLayoutItem,
-                       CXFA_ContentLayoutItem* pSecondParent,
-                       FX_FLOAT fSplitPos);
-  void SplitLayoutItem(FX_FLOAT fSplitPos);
-  bool JudgePutNextPage(CXFA_ContentLayoutItem* pParentLayoutItem,
-                        FX_FLOAT fChildHeight,
-                        CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems);
+
   bool ProcessKeepForSplite(
       CXFA_ItemLayoutProcessor* pParentProcessor,
       CXFA_ItemLayoutProcessor* pChildProcessor,
@@ -117,8 +97,37 @@
       bool& bAddedItemInRow,
       bool& bForceEndPage,
       XFA_ItemLayoutProcessorResult& result);
+  void ProcessUnUseOverFlow(CXFA_Node* pLeaderNode,
+                            CXFA_Node* pTrailerNode,
+                            CXFA_ContentLayoutItem* pTrailerItem,
+                            CXFA_Node* pFormNode);
+  bool IsAddNewRowForTrailer(CXFA_ContentLayoutItem* pTrailerItem);
+  bool JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode);
+
+  CXFA_ContentLayoutItem* CreateContentLayoutItem(CXFA_Node* pFormNode);
+
+  CXFA_Node* m_pFormNode;
+  CXFA_ContentLayoutItem* m_pLayoutItem;
+  CXFA_Node* m_pCurChildNode;
+  FX_FLOAT m_fUsedSize;
+  CXFA_LayoutPageMgr* m_pPageMgr;
+  std::list<CXFA_Node*> m_PendingNodes;
+  bool m_bBreakPending;
+  CFX_ArrayTemplate<FX_FLOAT> m_rgSpecifiedColumnWidths;
+  CFX_ArrayTemplate<CXFA_ContentLayoutItem*> m_arrayKeepItems;
+  FX_FLOAT m_fLastRowWidth;
+  FX_FLOAT m_fLastRowY;
+  bool m_bUseInheriated;
+  XFA_ItemLayoutProcessorResult m_ePreProcessRs;
+
+ private:
+  void SetCurrentComponentPos(FX_FLOAT fAbsoluteX, FX_FLOAT fAbsoluteY);
+  void SetCurrentComponentSize(FX_FLOAT fWidth, FX_FLOAT fHeight);
+
+  void SplitLayoutItem(CXFA_ContentLayoutItem* pLayoutItem,
+                       CXFA_ContentLayoutItem* pSecondParent,
+                       FX_FLOAT fSplitPos);
   FX_FLOAT InsertKeepLayoutItems();
-  void DoLayoutPageArea(CXFA_ContainerLayoutItem* pPageAreaLayoutItem);
   bool CalculateRowChildPosition(
       CFX_ArrayTemplate<CXFA_ContentLayoutItem*> (&rgCurLineLayoutItems)[3],
       XFA_ATTRIBUTEENUM eFlowStrategy,
@@ -129,28 +138,23 @@
       FX_FLOAT& fContentCurRowY,
       FX_FLOAT fContentCurRowHeight,
       FX_FLOAT fContentWidthLimit,
-      bool bRootForceTb = false);
-
-  void ProcessUnUseOverFlow(CXFA_Node* pLeaderNode,
-                            CXFA_Node* pTrailerNode,
-                            CXFA_ContentLayoutItem* pTrailerItem,
-                            CXFA_Node* pFormNode);
+      bool bRootForceTb);
   void ProcessUnUseBinds(CXFA_Node* pFormNode);
-  bool IsAddNewRowForTrailer(CXFA_ContentLayoutItem* pTrailerItem);
-  bool JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode);
-  CXFA_ContentLayoutItem* CreateContentLayoutItem(CXFA_Node* pFormNode);
+  bool JudgePutNextPage(CXFA_ContentLayoutItem* pParentLayoutItem,
+                        FX_FLOAT fChildHeight,
+                        CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems);
 
- private:
-  void DoLayoutPositionedContainer(CXFA_LayoutContext* pContext = nullptr);
+  void DoLayoutPositionedContainer(CXFA_LayoutContext* pContext);
   void DoLayoutTableContainer(CXFA_Node* pLayoutNode);
   XFA_ItemLayoutProcessorResult DoLayoutFlowedContainer(
       bool bUseBreakControl,
       XFA_ATTRIBUTEENUM eFlowStrategy,
       FX_FLOAT fHeightLimit,
       FX_FLOAT fRealHeight,
-      CXFA_LayoutContext* pContext = nullptr,
-      bool bRootForceTb = false);
+      CXFA_LayoutContext* pContext,
+      bool bRootForceTb);
   void DoLayoutField();
+
   void GotoNextContainerNode(CXFA_Node*& pCurActionNode,
                              XFA_ItemLayoutProcessorStages& nCurStage,
                              CXFA_Node* pParentContainer,
@@ -167,29 +171,15 @@
 
   CXFA_Node* GetSubformSetParent(CXFA_Node* pSubformSet);
 
- public:
   bool m_bKeepBreakFinish;
   bool m_bIsProcessKeep;
   CXFA_Node* m_pKeepHeadNode;
   CXFA_Node* m_pKeepTailNode;
-  CXFA_Node* m_pFormNode;
-  CXFA_ContentLayoutItem* m_pLayoutItem;
   CXFA_ContentLayoutItem* m_pOldLayoutItem;
-  CXFA_Node* m_pCurChildNode;
   CXFA_ItemLayoutProcessor* m_pCurChildPreprocessor;
   XFA_ItemLayoutProcessorStages m_nCurChildNodeStage;
-  FX_FLOAT m_fUsedSize;
-  CXFA_LayoutPageMgr* m_pPageMgr;
-  std::list<CXFA_Node*> m_PendingNodes;
-  bool m_bBreakPending;
-  CFX_ArrayTemplate<FX_FLOAT> m_rgSpecifiedColumnWidths;
-  CFX_ArrayTemplate<CXFA_ContentLayoutItem*> m_arrayKeepItems;
   std::map<CXFA_Node*, int32_t> m_PendingNodesCount;
-  FX_FLOAT m_fLastRowWidth;
-  FX_FLOAT m_fLastRowY;
   FX_FLOAT m_fWidthLimite;
-  bool m_bUseInheriated;
-  XFA_ItemLayoutProcessorResult m_ePreProcessRs;
   bool m_bHasAvailHeight;
 };
 
