diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index 585e7e1..d0ff962 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -137,13 +137,14 @@
   return static_cast<unsigned int>(alpha * 255.f + 0.5f);
 }
 
+CPDF_FormObject* CPDFFormObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object) {
+  auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+  return pPageObj ? pPageObj->AsForm() : nullptr;
+}
+
 const CPDF_PageObjectList* CPDFPageObjListFromFPDFFormObject(
     FPDF_PAGEOBJECT page_object) {
-  auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
-  if (!pPageObj)
-    return nullptr;
-
-  CPDF_FormObject* pFormObject = pPageObj->AsForm();
+  CPDF_FormObject* pFormObject = CPDFFormObjectFromFPDFPageObject(page_object);
   if (!pFormObject)
     return nullptr;
 
@@ -250,8 +251,8 @@
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (!IsPageObject(pPage))
     return;
-  pPageObj->SetDirty(true);
 
+  pPageObj->SetDirty(true);
   pPage->AppendPageObject(std::move(pPageObjHolder));
   CalcBoundingBox(pPageObj);
 }
@@ -297,24 +298,24 @@
 
 FPDF_EXPORT int FPDF_CALLCONV
 FPDFPageObj_CountMarks(FPDF_PAGEOBJECT page_object) {
-  if (!page_object)
+  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+  if (!pPageObj)
     return -1;
 
-  const auto& mark =
-      CPDFPageObjectFromFPDFPageObject(page_object)->m_ContentMarks;
-  return mark.CountItems();
+  return pPageObj->m_ContentMarks.CountItems();
 }
 
 FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV
 FPDFPageObj_GetMark(FPDF_PAGEOBJECT page_object, unsigned long index) {
-  if (!page_object)
+  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+  if (!pPageObj)
     return nullptr;
 
-  auto* mark = &CPDFPageObjectFromFPDFPageObject(page_object)->m_ContentMarks;
-  if (index >= mark->CountItems())
+  auto& mark = pPageObj->m_ContentMarks;
+  if (index >= mark.CountItems())
     return nullptr;
 
-  return FPDFPageObjectMarkFromCPDFContentMarkItem(mark->GetItem(index));
+  return FPDFPageObjectMarkFromCPDFContentMarkItem(mark.GetItem(index));
 }
 
 FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV
@@ -323,13 +324,11 @@
   if (!pPageObj)
     return nullptr;
 
-  auto* mark = &pPageObj->m_ContentMarks;
-  mark->AddMark(name);
-  unsigned long index = mark->CountItems() - 1;
-
+  auto& mark = pPageObj->m_ContentMarks;
+  mark.AddMark(name);
+  unsigned long index = mark.CountItems() - 1;
   pPageObj->SetDirty(true);
-
-  return FPDFPageObjectMarkFromCPDFContentMarkItem(mark->GetItem(index));
+  return FPDFPageObjectMarkFromCPDFContentMarkItem(mark.GetItem(index));
 }
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
@@ -483,10 +482,10 @@
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject) {
-  if (!pageObject)
+  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(pageObject);
+  if (!pPageObj)
     return false;
 
-  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(pageObject);
   int blend_type = pPageObj->m_GeneralState.GetBlendType();
   if (blend_type != FXDIB_BLEND_NORMAL)
     return true;
@@ -598,11 +597,8 @@
 }
 
 FPDF_EXPORT int FPDF_CALLCONV FPDFPageObj_GetType(FPDF_PAGEOBJECT pageObject) {
-  if (!pageObject)
-    return FPDF_PAGEOBJ_UNKNOWN;
-
   CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(pageObject);
-  return pPageObj->GetType();
+  return pPageObj ? pPageObj->GetType() : FPDF_PAGEOBJ_UNKNOWN;
 }
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_GenerateContent(FPDF_PAGE page) {
@@ -692,11 +688,11 @@
                                    unsigned int G,
                                    unsigned int B,
                                    unsigned int A) {
-  if (!page_object || R > 255 || G > 255 || B > 255 || A > 255)
+  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+  if (!pPageObj || R > 255 || G > 255 || B > 255 || A > 255)
     return false;
 
   std::vector<float> rgb = {R / 255.f, G / 255.f, B / 255.f};
-  auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
   pPageObj->m_GeneralState.SetFillAlpha(A / 255.f);
   pPageObj->m_ColorState.SetFillColor(
       CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb);
@@ -728,10 +724,10 @@
                       float* bottom,
                       float* right,
                       float* top) {
-  if (!pageObject)
+  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(pageObject);
+  if (!pPageObj)
     return false;
 
-  CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(pageObject);
   const CFX_FloatRect& bbox = pPageObj->GetRect();
   *left = bbox.left;
   *bottom = bbox.bottom;
@@ -799,34 +795,38 @@
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFPageObj_SetLineJoin(FPDF_PAGEOBJECT page_object, int line_join) {
-  if (!page_object)
-    return false;
-  if (line_join <
-          static_cast<int>(CFX_GraphStateData::LineJoin::LineJoinMiter) ||
-      line_join >
-          static_cast<int>(CFX_GraphStateData::LineJoin::LineJoinBevel)) {
-    return false;
-  }
   auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
-  CFX_GraphStateData::LineJoin lineJoin =
-      static_cast<CFX_GraphStateData::LineJoin>(line_join);
-  pPageObj->m_GraphState.SetLineJoin(lineJoin);
+  if (!pPageObj)
+    return false;
+
+  constexpr int kLineJoinMiter =
+      static_cast<int>(CFX_GraphStateData::LineJoin::LineJoinMiter);
+  constexpr int kLineJoinBevel =
+      static_cast<int>(CFX_GraphStateData::LineJoin::LineJoinBevel);
+  if (line_join < kLineJoinMiter || line_join > kLineJoinBevel)
+    return false;
+
+  pPageObj->m_GraphState.SetLineJoin(
+      static_cast<CFX_GraphStateData::LineJoin>(line_join));
   pPageObj->SetDirty(true);
   return true;
 }
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFPageObj_SetLineCap(FPDF_PAGEOBJECT page_object, int line_cap) {
-  if (!page_object)
-    return false;
-  if (line_cap < static_cast<int>(CFX_GraphStateData::LineCap::LineCapButt) ||
-      line_cap > static_cast<int>(CFX_GraphStateData::LineCap::LineCapSquare)) {
-    return false;
-  }
   auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
-  CFX_GraphStateData::LineCap lineCap =
-      static_cast<CFX_GraphStateData::LineCap>(line_cap);
-  pPageObj->m_GraphState.SetLineCap(lineCap);
+  if (!pPageObj)
+    return false;
+
+  constexpr int kLineCapButt =
+      static_cast<int>(CFX_GraphStateData::LineCap::LineCapButt);
+  constexpr int kLineCapSquare =
+      static_cast<int>(CFX_GraphStateData::LineCap::LineCapSquare);
+  if (line_cap < kLineCapButt || line_cap > kLineCapSquare)
+    return false;
+
+  pPageObj->m_GraphState.SetLineCap(
+      static_cast<CFX_GraphStateData::LineCap>(line_cap));
   pPageObj->SetDirty(true);
   return true;
 }
@@ -835,10 +835,7 @@
 FPDFFormObj_CountObjects(FPDF_PAGEOBJECT page_object) {
   const CPDF_PageObjectList* pObjectList =
       CPDFPageObjListFromFPDFFormObject(page_object);
-  if (!pObjectList)
-    return -1;
-
-  return pObjectList->size();
+  return pObjectList ? pObjectList->size() : -1;
 }
 
 FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
@@ -860,12 +857,8 @@
                       double* d,
                       double* e,
                       double* f) {
-  if (!form_object || !a || !b || !c || !d || !e || !f)
-    return false;
-
-  auto* pPageObj = CPDFPageObjectFromFPDFPageObject(form_object);
-  CPDF_FormObject* pFormObj = pPageObj->AsForm();
-  if (!pFormObj)
+  CPDF_FormObject* pFormObj = CPDFFormObjectFromFPDFPageObject(form_object);
+  if (!pFormObj || !a || !b || !c || !d || !e || !f)
     return false;
 
   const CFX_Matrix& matrix = pFormObj->form_matrix();
@@ -875,6 +868,5 @@
   *d = matrix.d;
   *e = matrix.e;
   *f = matrix.f;
-
   return true;
 }
