diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 6028059..727ee00 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -424,7 +424,7 @@
                const std::unique_ptr<CXFA_TabParam>& arg2) {
               const CFX_RectF& rt1 = arg1->GetWidget()->GetWidgetRect();
               const CFX_RectF& rt2 = arg2->GetWidget()->GetWidgetRect();
-              if (rt1.top - rt2.top >= XFA_FLOAT_PERCISION)
+              if (rt1.top - rt2.top >= kXFAWidgetPrecision)
                 return rt1.top < rt2.top;
               return rt1.left < rt2.left;
             });
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index 13942ad..ecb8acd 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -32,7 +32,7 @@
   return fPx * 72.0f / fDpi;
 }
 
-#define XFA_FLOAT_PERCISION 0.001f
+constexpr float kXFAWidgetPrecision = 0.001f;
 
 void XFA_DrawImage(CXFA_Graphics* pGS,
                    const CFX_RectF& rtImage,
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index f30f843..e622469 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -68,9 +68,9 @@
     case XFA_Element::Area:
     case XFA_Element::ExclGroup:
     case XFA_Element::SubformSet: {
-      if (*pWidth < -XFA_LAYOUT_FLOAT_PERCISION)
+      if (*pWidth < -kXFALayoutPrecision)
         *pWidth = pLayoutItem->m_sSize.width;
-      if (*pHeight < -XFA_LAYOUT_FLOAT_PERCISION)
+      if (*pHeight < -kXFALayoutPrecision)
         *pHeight = pLayoutItem->m_sSize.height;
       break;
     }
@@ -97,14 +97,14 @@
   if (eType == XFA_Element::Subform || eType == XFA_Element::ExclGroup) {
     Optional<CXFA_Measurement> wValue =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::W, false);
-    if (wValue && wValue->GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    if (wValue && wValue->GetValue() > kXFALayoutPrecision) {
       containerSize.width = wValue->ToUnit(XFA_Unit::Pt);
       *bContainerWidthAutoSize = false;
     }
 
     Optional<CXFA_Measurement> hValue =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::H, false);
-    if (hValue && hValue->GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    if (hValue && hValue->GetValue() > kXFALayoutPrecision) {
       containerSize.height = hValue->ToUnit(XFA_Unit::Pt);
       *bContainerHeightAutoSize = false;
     }
@@ -113,14 +113,14 @@
   if (*bContainerWidthAutoSize && eType == XFA_Element::Subform) {
     Optional<CXFA_Measurement> maxW =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::MaxW, false);
-    if (maxW && maxW->GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    if (maxW && maxW->GetValue() > kXFALayoutPrecision) {
       containerSize.width = maxW->ToUnit(XFA_Unit::Pt);
       *bContainerWidthAutoSize = false;
     }
 
     Optional<CXFA_Measurement> maxH =
         pFormNode->JSObject()->TryMeasure(XFA_Attribute::MaxH, false);
-    if (maxH && maxH->GetValue() > XFA_LAYOUT_FLOAT_PERCISION) {
+    if (maxH && maxH->GetValue() > kXFALayoutPrecision) {
       containerSize.height = maxH->ToUnit(XFA_Unit::Pt);
       *bContainerHeightAutoSize = false;
     }
@@ -471,9 +471,9 @@
                             bool* bAppChange,
                             bool bCalculateMargin) {
   CXFA_Node* pFormNode = pLayoutItem->GetFormNode();
-  if (*fProposedSplitPos <= fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION ||
+  if (*fProposedSplitPos <= fCurVerticalOffset + kXFALayoutPrecision ||
       *fProposedSplitPos > fCurVerticalOffset + pLayoutItem->m_sSize.height -
-                               XFA_LAYOUT_FLOAT_PERCISION) {
+                               kXFALayoutPrecision) {
     return false;
   }
 
@@ -505,7 +505,7 @@
             *fProposedSplitPos = fCurVerticalOffset + fRelSplitPos;
             *bAppChange = true;
             if (*fProposedSplitPos <=
-                fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) {
+                fCurVerticalOffset + kXFALayoutPrecision) {
               return true;
             }
           }
@@ -522,8 +522,7 @@
           bool bChange = false;
           if (FindLayoutItemSplitPos(pChildItem, fChildOffset, &fRelSplitPos,
                                      &bChange, bCalculateMargin)) {
-            if (fRelSplitPos - fChildOffset < XFA_LAYOUT_FLOAT_PERCISION &&
-                bChange) {
+            if (fRelSplitPos - fChildOffset < kXFALayoutPrecision && bChange) {
               *fProposedSplitPos = fRelSplitPos - fCurTopMargin;
             } else {
               *fProposedSplitPos = fRelSplitPos + fCurBottomMargin;
@@ -531,7 +530,7 @@
             bAnyChanged = true;
             bChanged = true;
             if (*fProposedSplitPos <=
-                fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) {
+                fCurVerticalOffset + kXFALayoutPrecision) {
               return true;
             }
             if (bAnyChanged)
@@ -670,7 +669,7 @@
   auto value = GetFormNode()->JSObject()->TryEnum(XFA_Attribute::Layout, true);
   XFA_AttributeValue eLayout = value.value_or(XFA_AttributeValue::Position);
   bool bCalculateMargin = eLayout != XFA_AttributeValue::Position;
-  while (fProposedSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+  while (fProposedSplitPos > kXFALayoutPrecision) {
     bool bAppChange = false;
     if (!FindLayoutItemSplitPos(m_pLayoutItem, 0, &fProposedSplitPos,
                                 &bAppChange, bCalculateMargin)) {
@@ -752,7 +751,7 @@
     pChildNext = ToContentLayoutItem(pChildItem->m_pNextSibling);
     pChildItem->m_pNextSibling = nullptr;
     if (fSplitPos <= fCurTopMargin + pChildItem->m_sPos.y + fCurBottomMargin +
-                         XFA_LAYOUT_FLOAT_PERCISION) {
+                         kXFALayoutPrecision) {
       if (!ExistContainerKeep(pChildItem->GetFormNode(), true)) {
         pChildItem->m_sPos.y -= fSplitPos - fCurBottomMargin;
         pChildItem->m_sPos.y += lHeightForKeep;
@@ -760,7 +759,7 @@
         pSecondLayoutItem->AddChild(pChildItem);
         continue;
       }
-      if (lHeightForKeep < XFA_LAYOUT_FLOAT_PERCISION) {
+      if (lHeightForKeep < kXFALayoutPrecision) {
         for (auto* pPreItem : keepLayoutItems) {
           pLayoutItem->RemoveChild(pPreItem);
           pPreItem->m_sPos.y -= fSplitPos;
@@ -782,9 +781,9 @@
       pSecondLayoutItem->AddChild(pChildItem);
       continue;
     }
-    if (fSplitPos + XFA_LAYOUT_FLOAT_PERCISION >=
-        fCurTopMargin + fCurBottomMargin + pChildItem->m_sPos.y +
-            pChildItem->m_sSize.height) {
+    if (fSplitPos + kXFALayoutPrecision >= fCurTopMargin + fCurBottomMargin +
+                                               pChildItem->m_sPos.y +
+                                               pChildItem->m_sSize.height) {
       pLayoutItem->AddChild(pChildItem);
       if (ExistContainerKeep(pChildItem->GetFormNode(), false))
         keepLayoutItems.push_back(pChildItem);
@@ -845,7 +844,7 @@
     XFA_ItemLayoutProcessorStages* nCurStage,
     CXFA_Node* pParentContainer,
     bool bUsePageBreak) {
-  CXFA_Node* pChildContainer = XFA_LAYOUT_INVALIDNODE;
+  CXFA_Node* pChildContainer = nullptr;
   switch (*nCurStage) {
     case XFA_ItemLayoutProcessorStages::BreakBefore:
     case XFA_ItemLayoutProcessorStages::BreakAfter: {
@@ -857,7 +856,7 @@
       pChildContainer = pCurActionNode;
       break;
     default:
-      pChildContainer = XFA_LAYOUT_INVALIDNODE;
+      pChildContainer = nullptr;
       break;
   }
 
@@ -871,12 +870,12 @@
       goto CheckNextChildContainer;
     }
     case XFA_ItemLayoutProcessorStages::None: {
-      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+      pCurActionNode = nullptr;
       FALLTHROUGH;
       case XFA_ItemLayoutProcessorStages::BookendLeader:
-        for (CXFA_Node* pBookendNode = pCurActionNode == XFA_LAYOUT_INVALIDNODE
-                                           ? pParentContainer->GetFirstChild()
-                                           : pCurActionNode->GetNextSibling();
+        for (CXFA_Node* pBookendNode = pCurActionNode
+                                           ? pCurActionNode->GetNextSibling()
+                                           : pParentContainer->GetFirstChild();
              pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
           switch (pBookendNode->GetElementType()) {
             case XFA_Element::Bookend:
@@ -890,10 +889,10 @@
         }
     }
       {
-        pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+        pCurActionNode = nullptr;
         FALLTHROUGH;
         case XFA_ItemLayoutProcessorStages::BreakBefore:
-          if (pCurActionNode != XFA_LAYOUT_INVALIDNODE) {
+          if (pCurActionNode) {
             CXFA_Node* pBreakBeforeNode = pCurActionNode->GetNextSibling();
             if (!m_bKeepBreakFinish &&
                 FindBreakNode(pBreakBeforeNode, true, &pCurActionNode,
@@ -914,19 +913,19 @@
           goto CheckNextChildContainer;
       }
     case XFA_ItemLayoutProcessorStages::Container: {
-      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+      pCurActionNode = nullptr;
       FALLTHROUGH;
       case XFA_ItemLayoutProcessorStages::BreakAfter: {
-        if (pCurActionNode == XFA_LAYOUT_INVALIDNODE) {
-          CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
-          if (!m_bKeepBreakFinish &&
-              FindBreakNode(pBreakAfterNode, false, &pCurActionNode,
+        if (pCurActionNode) {
+          CXFA_Node* pBreakAfterNode = pCurActionNode->GetNextSibling();
+          if (FindBreakNode(pBreakAfterNode, false, &pCurActionNode,
                             nCurStage)) {
             return;
           }
         } else {
-          CXFA_Node* pBreakAfterNode = pCurActionNode->GetNextSibling();
-          if (FindBreakNode(pBreakAfterNode, false, &pCurActionNode,
+          CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
+          if (!m_bKeepBreakFinish &&
+              FindBreakNode(pBreakAfterNode, false, &pCurActionNode,
                             nCurStage)) {
             return;
           }
@@ -937,9 +936,8 @@
 
     CheckNextChildContainer : {
       CXFA_Node* pNextChildContainer =
-          pChildContainer == XFA_LAYOUT_INVALIDNODE
-              ? pParentContainer->GetFirstContainerChild()
-              : pChildContainer->GetNextContainerSibling();
+          pChildContainer ? pChildContainer->GetNextContainerSibling()
+                          : pParentContainer->GetFirstContainerChild();
       while (pNextChildContainer &&
              pNextChildContainer->IsLayoutGeneratedNode()) {
         CXFA_Node* pSaveNode = pNextChildContainer;
@@ -969,12 +967,12 @@
     }
 
     NoMoreChildContainer : {
-      pCurActionNode = XFA_LAYOUT_INVALIDNODE;
+      pCurActionNode = nullptr;
       FALLTHROUGH;
       case XFA_ItemLayoutProcessorStages::BookendTrailer:
-        for (CXFA_Node* pBookendNode = pCurActionNode == XFA_LAYOUT_INVALIDNODE
-                                           ? pParentContainer->GetFirstChild()
-                                           : pCurActionNode->GetNextSibling();
+        for (CXFA_Node* pBookendNode = pCurActionNode
+                                           ? pCurActionNode->GetNextSibling()
+                                           : pParentContainer->GetFirstChild();
              pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
           switch (pBookendNode->GetElementType()) {
             case XFA_Element::Bookend:
@@ -1053,7 +1051,7 @@
 void CXFA_ItemLayoutProcessor::DoLayoutPageArea(
     CXFA_ContainerLayoutItem* pPageAreaLayoutItem) {
   CXFA_Node* pFormNode = pPageAreaLayoutItem->GetFormNode();
-  CXFA_Node* pCurChildNode = XFA_LAYOUT_INVALIDNODE;
+  CXFA_Node* pCurChildNode = nullptr;
   XFA_ItemLayoutProcessorStages nCurChildNodeStage =
       XFA_ItemLayoutProcessorStages::None;
   CXFA_LayoutItem* pBeforeItem = nullptr;
@@ -1124,7 +1122,7 @@
   float fContentCalculatedHeight = 0;
   float fHiddenContentCalculatedWidth = 0;
   float fHiddenContentCalculatedHeight = 0;
-  if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) {
+  if (!m_pCurChildNode) {
     GotoNextContainerNode(m_pCurChildNode, &m_nCurChildNodeStage, GetFormNode(),
                           false);
   }
@@ -1221,7 +1219,7 @@
   if (!pLayoutNode)
     pLayoutNode = GetFormNode();
 
-  ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE);
+  ASSERT(!m_pCurChildNode);
 
   m_pLayoutItem = CreateContentLayoutItem(GetFormNode());
   bool bContainerWidthAutoSize = true;
@@ -1267,7 +1265,7 @@
   layoutContext.m_prgSpecifiedColumnWidths = &m_rgSpecifiedColumnWidths;
   CXFA_LayoutContext* pLayoutContext =
       iSpecifiedColumnCount > 0 ? &layoutContext : nullptr;
-  if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) {
+  if (!m_pCurChildNode) {
     GotoNextContainerNode(m_pCurChildNode, &m_nCurChildNodeStage, GetFormNode(),
                           false);
   }
@@ -1360,7 +1358,7 @@
           for (int32_t j = 0; j < c; j++)
             m_rgSpecifiedColumnWidths.push_back(0);
         }
-        if (m_rgSpecifiedColumnWidths[iColCount] < XFA_LAYOUT_FLOAT_PERCISION)
+        if (m_rgSpecifiedColumnWidths[iColCount] < kXFALayoutPrecision)
           bAutoCol = true;
         if (bAutoCol &&
             m_rgSpecifiedColumnWidths[iColCount] < rgRowItemsWidth[i]) {
@@ -1948,7 +1946,7 @@
           ASSERT(m_pCurChildNode->IsContainerNode());
           if (m_pCurChildNode->GetElementType() == XFA_Element::Variables)
             break;
-          if (fContentCurRowY >= fHeightLimit + XFA_LAYOUT_FLOAT_PERCISION &&
+          if (fContentCurRowY >= fHeightLimit + kXFALayoutPrecision &&
               m_pCurChildNode->PresenceRequiresSpace()) {
             bForceEndPage = true;
             goto SuspendAndCreateNewRow;
@@ -2028,7 +2026,7 @@
       GetFormNode(), bContainerWidthAutoSize, fContentCalculatedWidth,
       bContainerHeightAutoSize, fContentCalculatedHeight, containerSize);
 
-  if (containerSize.height >= XFA_LAYOUT_FLOAT_PERCISION || m_pLayoutItem ||
+  if (containerSize.height >= kXFALayoutPrecision || m_pLayoutItem ||
       bRetValue) {
     if (!m_pLayoutItem)
       m_pLayoutItem = CreateContentLayoutItem(GetFormNode());
@@ -2198,7 +2196,7 @@
   if (m_pLayoutItem)
     return;
 
-  ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE);
+  ASSERT(!m_pCurChildNode);
   m_pLayoutItem = CreateContentLayoutItem(GetFormNode());
   if (!m_pLayoutItem)
     return;
@@ -2324,9 +2322,9 @@
   float fHeight = pTrailerLayoutItem->m_sSize.height;
   if (bUseInherited) {
     float fNewSplitPos = 0;
-    if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION)
+    if (fSplitPos - fHeight > kXFALayoutPrecision)
       fNewSplitPos = FindSplitPos(fSplitPos - fHeight);
-    if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION)
+    if (fNewSplitPos > kXFALayoutPrecision)
       SplitLayoutItem(fNewSplitPos);
     return;
   }
@@ -2362,10 +2360,10 @@
   }
 
   float fNewSplitPos = 0;
-  if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION)
+  if (fSplitPos - fHeight > kXFALayoutPrecision)
     fNewSplitPos = FindSplitPos(fSplitPos - fHeight);
 
-  if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+  if (fNewSplitPos > kXFALayoutPrecision) {
     SplitLayoutItem(fNewSplitPos);
     pTrailerLayoutItem->m_sPos.y = fNewSplitPos - fTopInset - fBottomInset;
   } else {
@@ -2554,15 +2552,13 @@
     return eRetValue;
 
   CFX_SizeF childSize = pProcessor->GetCurrentComponentSize();
-  if (bUseRealHeight && fRealHeight < XFA_LAYOUT_FLOAT_PERCISION) {
+  if (bUseRealHeight && fRealHeight < kXFALayoutPrecision) {
     fRealHeight = FLT_MAX;
     fAvailHeight = FLT_MAX;
   }
   if (bTakeSpace &&
-      (childSize.width >
-       *fContentCurRowAvailWidth + XFA_LAYOUT_FLOAT_PERCISION) &&
-      (fContentWidthLimit - *fContentCurRowAvailWidth >
-       XFA_LAYOUT_FLOAT_PERCISION)) {
+      (childSize.width > *fContentCurRowAvailWidth + kXFALayoutPrecision) &&
+      (fContentWidthLimit - *fContentCurRowAvailWidth > kXFALayoutPrecision)) {
     return XFA_ItemLayoutProcessorResult::RowFullBreak;
   }
 
@@ -2606,10 +2602,9 @@
 
   if (!bTakeSpace ||
       *fContentCurRowY + childSize.height <=
-          fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION ||
+          fAvailHeight + kXFALayoutPrecision ||
       (!bContainerHeightAutoSize &&
-       m_fUsedSize + fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION >=
-           fContainerHeight)) {
+       m_fUsedSize + fAvailHeight + kXFALayoutPrecision >= fContainerHeight)) {
     if (!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult::Done) {
       if (pProcessor->m_bUseInheriated) {
         if (pTrailerLayoutItem)
@@ -2682,7 +2677,7 @@
 
   *bForceEndPage = true;
   float fSplitPos = pProcessor->FindSplitPos(fAvailHeight - *fContentCurRowY);
-  if (fSplitPos > XFA_LAYOUT_FLOAT_PERCISION) {
+  if (fSplitPos > kXFALayoutPrecision) {
     XFA_AttributeValue eLayout =
         pProcessor->GetFormNode()->JSObject()->GetEnum(XFA_Attribute::Layout);
     if (eLayout == XFA_AttributeValue::Tb &&
@@ -2745,7 +2740,7 @@
     return XFA_ItemLayoutProcessorResult::PageFullBreak;
   }
 
-  if (*fContentCurRowY <= XFA_LAYOUT_FLOAT_PERCISION) {
+  if (*fContentCurRowY <= kXFALayoutPrecision) {
     childSize = pProcessor->GetCurrentComponentSize();
     if (pProcessor->m_pPageMgr->GetNextAvailContentHeight(childSize.height)) {
       CXFA_Node* pTempLeaderNode = nullptr;
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.h b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.h
index f545868..514bc56 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.h
@@ -16,8 +16,7 @@
 #include "core/fxcrt/fx_coordinates.h"
 #include "xfa/fxfa/fxfa_basic.h"
 
-#define XFA_LAYOUT_INVALIDNODE nullptr
-#define XFA_LAYOUT_FLOAT_PERCISION (0.0005f)
+constexpr float kXFALayoutPrecision = 0.0005f;
 
 class CXFA_ContainerLayoutItem;
 class CXFA_ContentLayoutItem;
@@ -164,7 +163,7 @@
 
   CXFA_Node* m_pFormNode;
   CXFA_ContentLayoutItem* m_pLayoutItem = nullptr;
-  CXFA_Node* m_pCurChildNode = XFA_LAYOUT_INVALIDNODE;
+  CXFA_Node* m_pCurChildNode = nullptr;
   float m_fUsedSize = 0;
   CXFA_LayoutPageMgr* m_pPageMgr;
   std::list<CXFA_Node*> m_PendingNodes;
diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
index fee62fd..69f6991 100644
--- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
@@ -499,7 +499,7 @@
                            ->JSObject()
                            ->GetMeasure(XFA_Attribute::H)
                            .ToUnit(XFA_Unit::Pt);
-  if (fAvailHeight >= XFA_LAYOUT_FLOAT_PERCISION)
+  if (fAvailHeight >= kXFALayoutPrecision)
     return fAvailHeight;
   if (m_CurrentContainerRecordIter == m_ProposedContainerRecords.begin())
     return 0.0f;
@@ -701,11 +701,11 @@
               continue;
             }
             iCurContentAreaIndex++;
-            if (rgUsedHeights[iCurContentAreaIndex] >
-                pContentAreaNode->JSObject()
-                        ->GetMeasure(XFA_Attribute::H)
-                        .ToUnit(XFA_Unit::Pt) +
-                    XFA_LAYOUT_FLOAT_PERCISION) {
+            const float fHeight = pContentAreaNode->JSObject()
+                                      ->GetMeasure(XFA_Attribute::H)
+                                      .ToUnit(XFA_Unit::Pt) +
+                                  kXFALayoutPrecision;
+            if (rgUsedHeights[iCurContentAreaIndex] > fHeight) {
               bUsable = false;
               break;
             }
@@ -1605,7 +1605,7 @@
   float fNextContentHeight = pContentArea->JSObject()
                                  ->GetMeasure(XFA_Attribute::H)
                                  .ToUnit(XFA_Unit::Pt);
-  if (fNextContentHeight < XFA_LAYOUT_FLOAT_PERCISION)
+  if (fNextContentHeight < kXFALayoutPrecision)
     return true;
   if (fNextContentHeight > fChildHeight)
     return true;
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index bbb6c42..c70d31b 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -3511,7 +3511,7 @@
     if (*pCalcHeight != 0) {
       if (iBlockIndex == 0)
         *pCalcHeight += fTopInset;
-      if (fabs(fHeight - *pCalcHeight) < XFA_FLOAT_PERCISION)
+      if (fabs(fHeight - *pCalcHeight) < kXFAWidgetPrecision)
         return false;
     }
     return true;
@@ -3632,7 +3632,7 @@
       *pCalcHeight = 0;
       return true;
     }
-    if (fStartOffset + XFA_FLOAT_PERCISION >= *pCalcHeight) {
+    if (fStartOffset + kXFAWidgetPrecision >= *pCalcHeight) {
       if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
         (*pFieldArray)[iBlockIndex * 3 + 1] = 0;
         (*pFieldArray)[iBlockIndex * 3 + 2] = *pCalcHeight;
@@ -3654,7 +3654,7 @@
       return true;
     }
     float fTextNum =
-        *pCalcHeight + XFA_FLOAT_PERCISION - fCapReserve - fStartOffset;
+        *pCalcHeight + kXFAWidgetPrecision - fCapReserve - fStartOffset;
     int32_t iLineNum =
         (int32_t)((fTextNum + (fLineHeight - fFontSize)) / fLineHeight);
     if (iLineNum >= iLinesCount) {
@@ -3687,7 +3687,7 @@
         pFieldArray->push_back(iLineNum);
         pFieldArray->push_back(fSplitHeight);
       }
-      if (fabs(fSplitHeight - *pCalcHeight) < XFA_FLOAT_PERCISION)
+      if (fabs(fSplitHeight - *pCalcHeight) < kXFAWidgetPrecision)
         return false;
 
       *pCalcHeight = fSplitHeight;
