diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index 67a4cb1..a58fd00 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -216,10 +216,9 @@
 
       CXFA_TextLayout* pCapTextLayout = m_pDataAcc->GetCaptionTextLayout();
       if (fCapReserve <= 0 && pCapTextLayout) {
-        CFX_SizeF size;
         CFX_SizeF minSize;
         CFX_SizeF maxSize;
-        pCapTextLayout->CalcSize(minSize, maxSize, size);
+        CFX_SizeF size = pCapTextLayout->CalcSize(minSize, maxSize);
         if (iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
             iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
           fCapReserve = size.height;
@@ -592,9 +591,8 @@
   if (!pCapTextLayout)
     return;
 
-  float fHeight = 0;
-  pCapTextLayout->Layout(CFX_SizeF(m_rtCaption.width, m_rtCaption.height),
-                         &fHeight);
+  float fHeight =
+      pCapTextLayout->Layout(CFX_SizeF(m_rtCaption.width, m_rtCaption.height));
   if (m_rtCaption.height < fHeight)
     m_rtCaption.height = fHeight;
 }
@@ -619,7 +617,7 @@
     rtClip = pMatrix->TransformRect(rtClip);
     mt.Concat(*pMatrix);
   }
-  pCapTextLayout->DrawString(pRenderDevice, mt, rtClip);
+  pCapTextLayout->DrawString(pRenderDevice, mt, rtClip, 0);
 }
 
 bool CXFA_FFField::ProcessCommittedData() {
diff --git a/xfa/fxfa/cxfa_ffpushbutton.cpp b/xfa/fxfa/cxfa_ffpushbutton.cpp
index fbadfce..c966cda 100644
--- a/xfa/fxfa/cxfa_ffpushbutton.cpp
+++ b/xfa/fxfa/cxfa_ffpushbutton.cpp
@@ -182,15 +182,15 @@
   uint32_t dwState = m_pNormalWidget->GetStates();
   if (m_pDownTextLayout && (dwState & FWL_STATE_PSB_Pressed) &&
       (dwState & FWL_STATE_PSB_Hovered)) {
-    if (m_pDownTextLayout->DrawString(pRenderDevice, mt, rtClip))
+    if (m_pDownTextLayout->DrawString(pRenderDevice, mt, rtClip, 0))
       return;
   } else if (m_pRolloverTextLayout && (dwState & FWL_STATE_PSB_Hovered)) {
-    if (m_pRolloverTextLayout->DrawString(pRenderDevice, mt, rtClip))
+    if (m_pRolloverTextLayout->DrawString(pRenderDevice, mt, rtClip, 0))
       return;
   }
 
   if (pCapTextLayout)
-    pCapTextLayout->DrawString(pRenderDevice, mt, rtClip);
+    pCapTextLayout->DrawString(pRenderDevice, mt, rtClip, 0);
 }
 
 void CXFA_FFPushButton::OnProcessMessage(CFWL_Message* pMessage) {
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 9be3c4f..532079e 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -246,10 +246,9 @@
 
   if (m_pLoader->m_lineHeights.empty() && m_pLoader->m_fWidth > 0) {
     CFX_SizeF szMax(m_pLoader->m_fWidth, m_pLoader->m_fHeight);
-    CFX_SizeF szDef;
     m_pLoader->m_bSaveLineHeight = true;
     m_pLoader->m_fLastPos = 0;
-    CalcSize(szMax, szMax, szDef);
+    CFX_SizeF szDef = CalcSize(szMax, szMax);
     m_pLoader->m_bSaveLineHeight = false;
     return szDef.height;
   }
@@ -276,24 +275,24 @@
   }
   m_pLoader->m_fWidth = fWidth;
 
-  if (fWidth < 0) {
-    CFX_SizeF szMax;
-    CFX_SizeF szDef;
-    m_pLoader->m_bSaveLineHeight = true;
-    m_pLoader->m_fLastPos = 0;
-    CalcSize(szMax, szMax, szDef);
-    m_pLoader->m_bSaveLineHeight = false;
-    fWidth = szDef.width;
-  }
-  return fWidth;
+  if (fWidth >= 0)
+    return fWidth;
+
+  CFX_SizeF szMax;
+
+  m_pLoader->m_bSaveLineHeight = true;
+  m_pLoader->m_fLastPos = 0;
+  CFX_SizeF szDef = CalcSize(szMax, szMax);
+  m_pLoader->m_bSaveLineHeight = false;
+  return szDef.width;
 }
 
-bool CXFA_TextLayout::DoLayout(int32_t iBlockIndex,
-                               float& fCalcHeight,
-                               float fContentAreaHeight,
-                               float fTextHeight) {
+float CXFA_TextLayout::DoLayout(int32_t iBlockIndex,
+                                float fCalcHeight,
+                                float fContentAreaHeight,
+                                float fTextHeight) {
   if (!m_pLoader)
-    return false;
+    return fCalcHeight;
 
   int32_t iBlockCount = pdfium::CollectionSize<int32_t>(m_Blocks);
   float fHeight = fTextHeight;
@@ -302,7 +301,7 @@
 
   m_pLoader->m_fHeight = fHeight;
   if (fContentAreaHeight < 0)
-    return false;
+    return fCalcHeight;
 
   m_bHasBlock = true;
   if (iBlockCount == 0 && fHeight > 0) {
@@ -335,10 +334,9 @@
   int32_t i = 0;
   for (i = iLineIndex; i < iCount; i++) {
     float fLineHeight = m_pLoader->m_lineHeights[i];
-    if (i == iLineIndex && fLineHeight - fContentAreaHeight > 0.001) {
-      fCalcHeight = 0;
-      return true;
-    }
+    if (i == iLineIndex && fLineHeight - fContentAreaHeight > 0.001)
+      return 0;
+
     if (fLinePos + fLineHeight - fContentAreaHeight > 0.001) {
       if (iBlockCount >= (iBlockIndex + 1) * 2) {
         m_Blocks[iBlockIndex * 2] = iLineIndex;
@@ -358,15 +356,13 @@
             m_pLoader->m_BlocksHeight.push_back(fCalcHeight);
           }
         }
-        return true;
+        return fCalcHeight;
       }
-
-      fCalcHeight = fLinePos;
-      return true;
+      return fLinePos;
     }
     fLinePos += fLineHeight;
   }
-  return false;
+  return fCalcHeight;
 }
 
 int32_t CXFA_TextLayout::CountBlocks() const {
@@ -374,29 +370,27 @@
   return iCount > 0 ? iCount : 1;
 }
 
-bool CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize,
-                               const CFX_SizeF& maxSize,
-                               CFX_SizeF& defaultSize) {
-  defaultSize.width = maxSize.width;
-  if (defaultSize.width < 1)
-    defaultSize.width = 0xFFFF;
+CFX_SizeF CXFA_TextLayout::CalcSize(const CFX_SizeF& minSize,
+                                    const CFX_SizeF& maxSize) {
+  float width = maxSize.width;
+  if (width < 1)
+    width = 0xFFFF;
 
   m_pBreak = CreateBreak(false);
   float fLinePos = 0;
   m_iLines = 0;
   m_fMaxWidth = 0;
-  Loader(defaultSize, fLinePos, false);
+  Loader(width, fLinePos, false);
   if (fLinePos < 0.1f)
     fLinePos = m_textParser.GetFontSize(m_pTextProvider, nullptr);
 
   m_pTabstopContext.reset();
-  defaultSize = CFX_SizeF(m_fMaxWidth, fLinePos);
-  return true;
+  return CFX_SizeF(m_fMaxWidth, fLinePos);
 }
 
-bool CXFA_TextLayout::Layout(const CFX_SizeF& size, float* fHeight) {
+float CXFA_TextLayout::Layout(const CFX_SizeF& size) {
   if (size.width < 1)
-    return false;
+    return 0.f;
 
   Unload();
   m_pBreak = CreateBreak(true);
@@ -407,12 +401,10 @@
 
   m_iLines = 0;
   float fLinePos = 0;
-  Loader(size, fLinePos, true);
+  Loader(size.width, fLinePos, true);
   UpdateAlign(size.height, fLinePos);
   m_pTabstopContext.reset();
-  if (fHeight)
-    *fHeight = fLinePos;
-  return true;
+  return fLinePos;
 }
 
 bool CXFA_TextLayout::Layout(int32_t iBlock) {
@@ -443,7 +435,7 @@
     if (iCount > 1)
       m_pLoader->m_iTotalLines = m_Blocks[iBlock * 2 + 1];
 
-    Loader(szText, fLinePos, true);
+    Loader(szText.width, fLinePos, true);
     if (iCount == 0 && m_pLoader->m_fStartLineOffset < 0.1f)
       UpdateAlign(szText.height, fLinePos);
   } else if (m_pTextDataNode) {
@@ -464,8 +456,8 @@
       CFX_XMLNode* pSaveXMLNode = m_pLoader->m_pXMLNode;
       for (; pXMLNode;
            pXMLNode = pXMLNode->GetNodeItem(CFX_XMLNode::NextSibling)) {
-        if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle,
-                          true, nullptr)) {
+        if (!LoadRichText(pXMLNode, szText.width, fLinePos,
+                          m_pLoader->m_pParentStyle, true, nullptr)) {
           break;
         }
       }
@@ -473,8 +465,8 @@
         pXMLNode = pSaveXMLNode->GetNodeItem(CFX_XMLNode::Parent);
         if (pXMLNode == pContainerNode)
           break;
-        if (!LoadRichText(pXMLNode, szText, fLinePos, m_pLoader->m_pParentStyle,
-                          true, nullptr, false)) {
+        if (!LoadRichText(pXMLNode, szText.width, fLinePos,
+                          m_pLoader->m_pParentStyle, true, nullptr, false)) {
           break;
         }
         pSaveXMLNode = pXMLNode;
@@ -483,7 +475,7 @@
           continue;
         for (; pXMLNode;
              pXMLNode = pXMLNode->GetNodeItem(CFX_XMLNode::NextSibling)) {
-          if (!LoadRichText(pXMLNode, szText, fLinePos,
+          if (!LoadRichText(pXMLNode, szText.width, fLinePos,
                             m_pLoader->m_pParentStyle, true, nullptr)) {
             break;
           }
@@ -493,7 +485,7 @@
       pNode = m_pLoader->m_pNode;
       if (!pNode)
         return true;
-      LoadText(pNode, szText, fLinePos, true);
+      LoadText(pNode, szText.width, fLinePos, true);
     }
   }
   if (iBlock == iCount) {
@@ -624,7 +616,7 @@
   }
 }
 
-bool CXFA_TextLayout::Loader(const CFX_SizeF& szText,
+bool CXFA_TextLayout::Loader(float textWidth,
                              float& fLinePos,
                              bool bSavePieces) {
   GetTextDataNode();
@@ -638,20 +630,20 @@
         m_textParser.DoParse(pXMLContainer, m_pTextProvider);
 
       auto pRootStyle = m_textParser.CreateRootStyle(m_pTextProvider);
-      LoadRichText(pXMLContainer, szText, fLinePos, pRootStyle, bSavePieces,
+      LoadRichText(pXMLContainer, textWidth, fLinePos, pRootStyle, bSavePieces,
                    nullptr);
     }
   } else {
-    LoadText(m_pTextDataNode, szText, fLinePos, bSavePieces);
+    LoadText(m_pTextDataNode, textWidth, fLinePos, bSavePieces);
   }
   return true;
 }
 
 void CXFA_TextLayout::LoadText(CXFA_Node* pNode,
-                               const CFX_SizeF& szText,
+                               float textWidth,
                                float& fLinePos,
                                bool bSavePieces) {
-  InitBreak(szText.width);
+  InitBreak(textWidth);
 
   CXFA_ParaData paraData = m_pTextProvider->GetParaData();
   float fSpaceAbove = 0;
@@ -682,7 +674,7 @@
 
 bool CXFA_TextLayout::LoadRichText(
     CFX_XMLNode* pXMLNode,
-    const CFX_SizeF& szText,
+    float textWidth,
     float& fLinePos,
     const RetainPtr<CFX_CSSComputedStyle>& pParentStyle,
     bool bSavePieces,
@@ -729,7 +721,7 @@
 
         pStyle = m_textParser.ComputeStyle(pXMLNode, pParentStyle.Get());
         InitBreak(bContentNode ? pParentStyle.Get() : pStyle.Get(), eDisplay,
-                  szText.width, pXMLNode, pParentStyle.Get());
+                  textWidth, pXMLNode, pParentStyle.Get());
         if ((eDisplay == CFX_CSSDisplay::Block ||
              eDisplay == CFX_CSSDisplay::ListItem) &&
             pStyle &&
@@ -828,7 +820,7 @@
       if (bCurOl)
         iLiCount++;
 
-      if (!LoadRichText(pChildNode, szText, fLinePos,
+      if (!LoadRichText(pChildNode, textWidth, fLinePos,
                         pContext ? pStyle : pParentStyle, bSavePieces,
                         pLinkData, true, bIsOl, iLiCount))
         return false;
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h
index 1811d96..070a2bd 100644
--- a/xfa/fxfa/cxfa_textlayout.h
+++ b/xfa/fxfa/cxfa_textlayout.h
@@ -34,21 +34,19 @@
   ~CXFA_TextLayout();
 
   float GetLayoutHeight();
-  float StartLayout(float fWidth = -1);
-  bool DoLayout(int32_t iBlockIndex,
-                float& fCalcHeight,
-                float fContentAreaHeight = -1,
-                float fTextHeight = -1);
+  float StartLayout(float fWidth);
+  float DoLayout(int32_t iBlockIndex,
+                 float fCalcHeight,
+                 float fContentAreaHeight,
+                 float fTextHeight);
+  float Layout(const CFX_SizeF& size);
 
-  bool CalcSize(const CFX_SizeF& minSize,
-                const CFX_SizeF& maxSize,
-                CFX_SizeF& defaultSize);
-  bool Layout(const CFX_SizeF& size, float* fHeight = nullptr);
+  CFX_SizeF CalcSize(const CFX_SizeF& minSize, const CFX_SizeF& maxSize);
   void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex);
   bool DrawString(CFX_RenderDevice* pFxDevice,
                   const CFX_Matrix& tmDoc2Device,
                   const CFX_RectF& rtClip,
-                  int32_t iBlock = 0);
+                  int32_t iBlock);
   bool IsLoaded() const { return !m_pieceLines.empty(); }
   void Unload();
   const std::vector<std::unique_ptr<CXFA_PieceLine>>* GetPieceLines() const {
@@ -67,16 +65,14 @@
                  CFX_CSSDisplay eDisplay,
                  float fLineWidth,
                  CFX_XMLNode* pXMLNode,
-                 CFX_CSSComputedStyle* pParentStyle = nullptr);
-  bool Loader(const CFX_SizeF& szText,
-              float& fLinePos,
-              bool bSavePieces = true);
+                 CFX_CSSComputedStyle* pParentStyle);
+  bool Loader(float textWidth, float& fLinePos, bool bSavePieces);
   void LoadText(CXFA_Node* pNode,
-                const CFX_SizeF& szText,
+                float textWidth,
                 float& fLinePos,
                 bool bSavePieces);
   bool LoadRichText(CFX_XMLNode* pXMLNode,
-                    const CFX_SizeF& szText,
+                    float textWidth,
                     float& fLinePos,
                     const RetainPtr<CFX_CSSComputedStyle>& pParentStyle,
                     bool bSavePieces,
diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp
index 2c54c3c..cb43783 100644
--- a/xfa/fxfa/cxfa_widgetacc.cpp
+++ b/xfa/fxfa/cxfa_widgetacc.cpp
@@ -709,7 +709,7 @@
       szCap.width = fCapReserve;
 
     CFX_SizeF minSize;
-    pCapTextLayout->CalcSize(minSize, szCap, szCap);
+    szCap = pCapTextLayout->CalcSize(minSize, szCap);
     if (bReserveExit)
       bVert ? szCap.height = fCapReserve : szCap.width = fCapReserve;
   } else {
@@ -1181,8 +1181,9 @@
 
     CXFA_TextLayout* pTextLayout =
         static_cast<CXFA_TextLayoutData*>(m_pLayoutData.get())->GetTextLayout();
-    pTextLayout->DoLayout(iBlockIndex, fCalcHeight, fCalcHeight,
-                          m_pLayoutData->m_fWidgetHeight - fTopInset);
+    fCalcHeight =
+        pTextLayout->DoLayout(iBlockIndex, fCalcHeight, fCalcHeight,
+                              m_pLayoutData->m_fWidgetHeight - fTopInset);
     if (fCalcHeight != 0) {
       if (iBlockIndex == 0)
         fCalcHeight = fCalcHeight + fTopInset;
