diff --git a/core/fpdfapi/fpdf_page/cpdf_allstates.cpp b/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
index fb0c244..e4b6e32 100644
--- a/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
@@ -45,16 +45,16 @@
 void CPDF_AllStates::SetLineDash(CPDF_Array* pArray,
                                  FX_FLOAT phase,
                                  FX_FLOAT scale) {
-  m_GraphState.MakePrivateCopy();
-  m_GraphState->m_DashPhase = phase * scale;
-  m_GraphState->SetDashCount(static_cast<int>(pArray->GetCount()));
+  CFX_GraphStateData* pData = m_GraphState.GetPrivateCopy();
+  pData->m_DashPhase = phase * scale;
+  pData->SetDashCount(static_cast<int>(pArray->GetCount()));
   for (size_t i = 0; i < pArray->GetCount(); i++)
-    m_GraphState->m_DashArray[i] = pArray->GetNumberAt(i) * scale;
+    pData->m_DashArray[i] = pArray->GetNumberAt(i) * scale;
 }
 
 void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS,
                                   CPDF_StreamContentParser* pParser) {
-  m_GeneralState.MakePrivateCopy();
+  CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetPrivateCopy();
   for (const auto& it : *pGS) {
     const CFX_ByteString& key_str = it.first;
     CPDF_Object* pElement = it.second;
@@ -65,22 +65,18 @@
     uint32_t key = key_str.GetID();
     switch (key) {
       case FXBSTR_ID('L', 'W', 0, 0):
-        m_GraphState.MakePrivateCopy();
-        m_GraphState->m_LineWidth = pObject->GetNumber();
+        m_GraphState.GetPrivateCopy()->m_LineWidth = pObject->GetNumber();
         break;
       case FXBSTR_ID('L', 'C', 0, 0):
-        m_GraphState.MakePrivateCopy();
-        m_GraphState->m_LineCap =
-            static_cast<CFX_GraphStateData::LineCap>(pObject->GetInteger());
+        m_GraphState.GetPrivateCopy()->m_LineCap =
+            (CFX_GraphStateData::LineCap)pObject->GetInteger();
         break;
       case FXBSTR_ID('L', 'J', 0, 0):
-        m_GraphState.MakePrivateCopy();
-        m_GraphState->m_LineJoin =
-            static_cast<CFX_GraphStateData::LineJoin>(pObject->GetInteger());
+        m_GraphState.GetPrivateCopy()->m_LineJoin =
+            (CFX_GraphStateData::LineJoin)pObject->GetInteger();
         break;
       case FXBSTR_ID('M', 'L', 0, 0):
-        m_GraphState.MakePrivateCopy();
-        m_GraphState->m_MiterLimit = pObject->GetNumber();
+        m_GraphState.GetPrivateCopy()->m_MiterLimit = pObject->GetNumber();
         break;
       case FXBSTR_ID('D', 0, 0, 0): {
         CPDF_Array* pDash = pObject->AsArray();
@@ -102,8 +98,7 @@
         if (!pFont)
           break;
 
-        m_TextState.MakePrivateCopy();
-        m_TextState->m_FontSize = pFont->GetNumberAt(1);
+        m_TextState.GetPrivateCopy()->m_FontSize = pFont->GetNumberAt(1);
         m_TextState.SetFont(pParser->FindFont(pFont->GetStringAt(0)));
         break;
       }
@@ -112,7 +107,7 @@
           continue;
         }
       case FXBSTR_ID('T', 'R', '2', 0):
-        m_GeneralState->m_pTR =
+        pGeneralState->m_pTR =
             (pObject && !pObject->IsName()) ? pObject : nullptr;
         break;
       case FXBSTR_ID('B', 'M', 0, 0): {
@@ -120,72 +115,72 @@
         CFX_ByteString mode =
             pArray ? pArray->GetStringAt(0) : pObject->GetString();
 
-        m_GeneralState->SetBlendMode(mode.AsStringC());
-        if (m_GeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {
+        pGeneralState->SetBlendMode(mode.AsStringC());
+        if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {
           pParser->GetPageObjectHolder()->SetBackgroundAlphaNeeded(TRUE);
         }
         break;
       }
       case FXBSTR_ID('S', 'M', 'a', 's'):
         if (ToDictionary(pObject)) {
-          m_GeneralState->m_pSoftMask = pObject;
-          FXSYS_memcpy(m_GeneralState->m_SMaskMatrix,
+          pGeneralState->m_pSoftMask = pObject;
+          FXSYS_memcpy(pGeneralState->m_SMaskMatrix,
                        &pParser->GetCurStates()->m_CTM, sizeof(CFX_Matrix));
         } else {
-          m_GeneralState->m_pSoftMask = nullptr;
+          pGeneralState->m_pSoftMask = nullptr;
         }
         break;
       case FXBSTR_ID('C', 'A', 0, 0):
-        m_GeneralState->m_StrokeAlpha = ClipFloat(pObject->GetNumber());
+        pGeneralState->m_StrokeAlpha = ClipFloat(pObject->GetNumber());
         break;
       case FXBSTR_ID('c', 'a', 0, 0):
-        m_GeneralState->m_FillAlpha = ClipFloat(pObject->GetNumber());
+        pGeneralState->m_FillAlpha = ClipFloat(pObject->GetNumber());
         break;
       case FXBSTR_ID('O', 'P', 0, 0):
-        m_GeneralState->m_StrokeOP = pObject->GetInteger();
+        pGeneralState->m_StrokeOP = pObject->GetInteger();
         if (!pGS->KeyExist("op")) {
-          m_GeneralState->m_FillOP = pObject->GetInteger();
+          pGeneralState->m_FillOP = pObject->GetInteger();
         }
         break;
       case FXBSTR_ID('o', 'p', 0, 0):
-        m_GeneralState->m_FillOP = pObject->GetInteger();
+        pGeneralState->m_FillOP = pObject->GetInteger();
         break;
       case FXBSTR_ID('O', 'P', 'M', 0):
-        m_GeneralState->m_OPMode = pObject->GetInteger();
+        pGeneralState->m_OPMode = pObject->GetInteger();
         break;
       case FXBSTR_ID('B', 'G', 0, 0):
         if (pGS->KeyExist("BG2")) {
           continue;
         }
       case FXBSTR_ID('B', 'G', '2', 0):
-        m_GeneralState->m_pBG = pObject;
+        pGeneralState->m_pBG = pObject;
         break;
       case FXBSTR_ID('U', 'C', 'R', 0):
         if (pGS->KeyExist("UCR2")) {
           continue;
         }
       case FXBSTR_ID('U', 'C', 'R', '2'):
-        m_GeneralState->m_pUCR = pObject;
+        pGeneralState->m_pUCR = pObject;
         break;
       case FXBSTR_ID('H', 'T', 0, 0):
-        m_GeneralState->m_pHT = pObject;
+        pGeneralState->m_pHT = pObject;
         break;
       case FXBSTR_ID('F', 'L', 0, 0):
-        m_GeneralState->m_Flatness = pObject->GetNumber();
+        pGeneralState->m_Flatness = pObject->GetNumber();
         break;
       case FXBSTR_ID('S', 'M', 0, 0):
-        m_GeneralState->m_Smoothness = pObject->GetNumber();
+        pGeneralState->m_Smoothness = pObject->GetNumber();
         break;
       case FXBSTR_ID('S', 'A', 0, 0):
-        m_GeneralState->m_StrokeAdjust = pObject->GetInteger();
+        pGeneralState->m_StrokeAdjust = pObject->GetInteger();
         break;
       case FXBSTR_ID('A', 'I', 'S', 0):
-        m_GeneralState->m_AlphaSource = pObject->GetInteger();
+        pGeneralState->m_AlphaSource = pObject->GetInteger();
         break;
       case FXBSTR_ID('T', 'K', 0, 0):
-        m_GeneralState->m_TextKnockout = pObject->GetInteger();
+        pGeneralState->m_TextKnockout = pObject->GetInteger();
         break;
     }
   }
-  m_GeneralState->m_Matrix = m_CTM;
+  pGeneralState->m_Matrix = m_CTM;
 }
diff --git a/core/fpdfapi/fpdf_page/cpdf_clippath.cpp b/core/fpdfapi/fpdf_page/cpdf_clippath.cpp
index 2c05df0..e820260 100644
--- a/core/fpdfapi/fpdf_page/cpdf_clippath.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_clippath.cpp
@@ -73,8 +73,7 @@
 }
 
 void CPDF_ClipPath::AppendPath(CPDF_Path path, uint8_t type, bool bAutoMerge) {
-  MakePrivateCopy();
-  CPDF_ClipPathData* pData = GetObject();
+  CPDF_ClipPathData* pData = GetPrivateCopy();
   if (!pData->m_PathAndTypeList.empty() && bAutoMerge) {
     const CPDF_Path& old_path = pData->m_PathAndTypeList.back().first;
     if (old_path.IsRect()) {
@@ -90,8 +89,7 @@
 
 void CPDF_ClipPath::AppendTexts(
     std::vector<std::unique_ptr<CPDF_TextObject>>* pTexts) {
-  MakePrivateCopy();
-  CPDF_ClipPathData* pData = GetObject();
+  CPDF_ClipPathData* pData = GetPrivateCopy();
   if (pData->m_TextList.size() + pTexts->size() <= FPDF_CLIPPATH_MAX_TEXTS) {
     for (size_t i = 0; i < pTexts->size(); i++)
       pData->m_TextList.push_back(std::move((*pTexts)[i]));
@@ -101,8 +99,7 @@
 }
 
 void CPDF_ClipPath::Transform(const CFX_Matrix& matrix) {
-  MakePrivateCopy();
-  CPDF_ClipPathData* pData = GetObject();
+  CPDF_ClipPathData* pData = GetPrivateCopy();
   for (auto& obj : pData->m_PathAndTypeList)
     obj.first.Transform(&matrix);
   for (auto& text : pData->m_TextList) {
diff --git a/core/fpdfapi/fpdf_page/cpdf_colorstate.cpp b/core/fpdfapi/fpdf_page/cpdf_colorstate.cpp
index a46dea3..a223437 100644
--- a/core/fpdfapi/fpdf_page/cpdf_colorstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_colorstate.cpp
@@ -13,16 +13,14 @@
 void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS,
                                    FX_FLOAT* pValue,
                                    uint32_t nValues) {
-  MakePrivateCopy();
-  CPDF_ColorStateData* pData = GetObject();
+  CPDF_ColorStateData* pData = GetPrivateCopy();
   SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);
 }
 
 void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS,
                                      FX_FLOAT* pValue,
                                      uint32_t nValues) {
-  MakePrivateCopy();
-  CPDF_ColorStateData* pData = GetObject();
+  CPDF_ColorStateData* pData = GetPrivateCopy();
   SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);
 }
 
@@ -47,8 +45,7 @@
 void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern,
                                      FX_FLOAT* pValue,
                                      uint32_t nValues) {
-  MakePrivateCopy();
-  CPDF_ColorStateData* pData = GetObject();
+  CPDF_ColorStateData* pData = GetPrivateCopy();
   pData->m_FillColor.SetValue(pPattern, pValue, nValues);
   int R, G, B;
   FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B);
@@ -64,8 +61,7 @@
 void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern,
                                        FX_FLOAT* pValue,
                                        uint32_t nValues) {
-  MakePrivateCopy();
-  CPDF_ColorStateData* pData = GetObject();
+  CPDF_ColorStateData* pData = GetPrivateCopy();
   pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);
   int R, G, B;
   FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B);
diff --git a/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp b/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp
index ff22d4d..0f6cce6 100644
--- a/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp
@@ -25,6 +25,5 @@
 }  // namespace
 
 void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) {
-  MakePrivateCopy();
-  GetObject()->m_RenderIntent = RI_StringToId(ri);
+  GetPrivateCopy()->m_RenderIntent = RI_StringToId(ri);
 }
diff --git a/core/fpdfapi/fpdf_page/cpdf_pageobject.cpp b/core/fpdfapi/fpdf_page/cpdf_pageobject.cpp
index df777df..17014c4 100644
--- a/core/fpdfapi/fpdf_page/cpdf_pageobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_pageobject.cpp
@@ -81,15 +81,15 @@
 void CPDF_PageObject::TransformClipPath(CFX_Matrix& matrix) {
   if (!m_ClipPath)
     return;
-  m_ClipPath.MakePrivateCopy();
+  m_ClipPath.GetPrivateCopy();
   m_ClipPath.Transform(matrix);
 }
 
 void CPDF_PageObject::TransformGeneralState(CFX_Matrix& matrix) {
   if (!m_GeneralState)
     return;
-  m_GeneralState.MakePrivateCopy();
-  m_GeneralState->m_Matrix.Concat(matrix);
+  CPDF_GeneralStateData* pGS = m_GeneralState.GetPrivateCopy();
+  pGS->m_Matrix.Concat(matrix);
 }
 
 FX_RECT CPDF_PageObject::GetBBox(const CFX_Matrix* pMatrix) const {
diff --git a/core/fpdfapi/fpdf_page/cpdf_pathobject.cpp b/core/fpdfapi/fpdf_page/cpdf_pathobject.cpp
index ceb3dd4..0055d6a 100644
--- a/core/fpdfapi/fpdf_page/cpdf_pathobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_pathobject.cpp
@@ -46,9 +46,9 @@
   if (!m_Path)
     return;
   CFX_FloatRect rect;
-  FX_FLOAT width = m_GraphState->m_LineWidth;
+  FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;
   if (m_bStroke && width != 0) {
-    rect = m_Path.GetBoundingBox(width, m_GraphState->m_MiterLimit);
+    rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);
   } else {
     rect = m_Path.GetBoundingBox();
   }
diff --git a/core/fpdfapi/fpdf_page/cpdf_shadingobject.cpp b/core/fpdfapi/fpdf_page/cpdf_shadingobject.cpp
index 383fd15..d869bc2 100644
--- a/core/fpdfapi/fpdf_page/cpdf_shadingobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_shadingobject.cpp
@@ -36,7 +36,7 @@
 
 void CPDF_ShadingObject::Transform(const CFX_Matrix& matrix) {
   if (m_ClipPath) {
-    m_ClipPath.MakePrivateCopy();
+    m_ClipPath.GetPrivateCopy();
     m_ClipPath.Transform(matrix);
   }
   m_Matrix.Concat(matrix);
diff --git a/core/fpdfapi/fpdf_page/cpdf_textobject.cpp b/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
index a365335..bd17dea 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
@@ -133,7 +133,7 @@
 }
 
 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) {
-  m_TextState.MakePrivateCopy();
+  m_TextState.GetPrivateCopy();
   CFX_Matrix text_matrix;
   GetTextMatrix(&text_matrix);
   text_matrix.Concat(matrix);
@@ -334,9 +334,9 @@
     }
     curpos += charwidth;
     if (charcode == ' ' && (!pCIDFont || pCIDFont->GetCharSize(32) == 1)) {
-      curpos += m_TextState->m_WordSpace;
+      curpos += m_TextState.GetObject()->m_WordSpace;
     }
-    curpos += m_TextState->m_CharSpace;
+    curpos += m_TextState.GetObject()->m_CharSpace;
   }
   if (bVertWriting) {
     if (pTextAdvanceX) {
@@ -364,8 +364,8 @@
   m_Bottom = min_y;
   m_Top = max_y;
   matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
-  if (TextRenderingModeIsStrokeMode(m_TextState->m_TextMode)) {
-    FX_FLOAT half_width = m_GraphState->m_LineWidth / 2;
+  if (TextRenderingModeIsStrokeMode(m_TextState.GetObject()->m_TextMode)) {
+    FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;
     m_Left -= half_width;
     m_Right += half_width;
     m_Top += half_width;
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
index 47e2116..ae75876 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
@@ -10,15 +10,16 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 
 void CPDF_TextState::SetFont(CPDF_Font* pFont) {
-  MakePrivateCopy();
-  CPDF_TextStateData* pStateData = GetObject();
-  CPDF_Document* pDoc = pStateData->m_pDocument;
-  CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
-  if (pPageData && pStateData->m_pFont && !pPageData->IsForceClear())
-    pPageData->ReleaseFont(pStateData->m_pFont->GetFontDict());
-
-  pStateData->m_pDocument = pFont ? pFont->m_pDocument : nullptr;
-  pStateData->m_pFont = pFont;
+  CPDF_TextStateData* pStateData = GetPrivateCopy();
+  if (pStateData) {
+    CPDF_Document* pDoc = pStateData->m_pDocument;
+    CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
+    if (pPageData && pStateData->m_pFont && !pPageData->IsForceClear()) {
+      pPageData->ReleaseFont(pStateData->m_pFont->GetFontDict());
+    }
+    pStateData->m_pDocument = pFont ? pFont->m_pDocument : nullptr;
+    pStateData->m_pFont = pFont;
+  }
 }
 
 FX_FLOAT CPDF_TextState::GetFontSizeV() const {
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 3afcf4b..f110103 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -583,8 +583,7 @@
     bDirect = FALSE;
   }
   if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) {
-    m_CurContentMark.MakePrivateCopy();
-    m_CurContentMark->AddMark(tag, pDict, bDirect);
+    m_CurContentMark.GetPrivateCopy()->AddMark(tag, pDict, bDirect);
   }
 }
 
@@ -659,8 +658,8 @@
 }
 
 void CPDF_StreamContentParser::Handle_BeginMarkedContent() {
-  m_CurContentMark.MakePrivateCopy();
-  m_CurContentMark->AddMark(GetString(0), nullptr, FALSE);
+  CFX_ByteString tag = GetString(0);
+  m_CurContentMark.GetPrivateCopy()->AddMark(tag, nullptr, FALSE);
 }
 
 void CPDF_StreamContentParser::Handle_BeginText() {
@@ -687,21 +686,21 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetColorSpace_Fill() {
-  CPDF_ColorSpace* pCS = FindColorSpace(GetString(0));
-  if (!pCS)
+  CFX_ByteString csname = GetString(0);
+  CPDF_ColorSpace* pCS = FindColorSpace(csname);
+  if (!pCS) {
     return;
-
-  m_pCurStates->m_ColorState.MakePrivateCopy();
-  m_pCurStates->m_ColorState->m_FillColor.SetColorSpace(pCS);
+  }
+  m_pCurStates->m_ColorState.GetPrivateCopy()->m_FillColor.SetColorSpace(pCS);
 }
 
 void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() {
-  CPDF_ColorSpace* pCS = FindColorSpace(GetString(0));
-  if (!pCS)
+  CFX_ByteString csname = GetString(0);
+  CPDF_ColorSpace* pCS = FindColorSpace(csname);
+  if (!pCS) {
     return;
-
-  m_pCurStates->m_ColorState.MakePrivateCopy();
-  m_pCurStates->m_ColorState->m_StrokeColor.SetColorSpace(pCS);
+  }
+  m_pCurStates->m_ColorState.GetPrivateCopy()->m_StrokeColor.SetColorSpace(pCS);
 }
 
 void CPDF_StreamContentParser::Handle_SetDash() {
@@ -812,22 +811,22 @@
   if (!m_CurContentMark)
     return;
 
-  if (m_CurContentMark->CountItems() == 1) {
-    m_CurContentMark.Clear();
+  int count = m_CurContentMark.GetObject()->CountItems();
+  if (count == 1) {
+    m_CurContentMark.SetNull();
     return;
   }
-
-  m_CurContentMark.MakePrivateCopy();
-  m_CurContentMark->DeleteLastMark();
+  m_CurContentMark.GetPrivateCopy()->DeleteLastMark();
 }
 
 void CPDF_StreamContentParser::Handle_EndText() {
   if (m_ClipTextList.empty())
     return;
 
-  if (TextRenderingModeIsClipMode(m_pCurStates->m_TextState->m_TextMode))
+  if (TextRenderingModeIsClipMode(
+          m_pCurStates->m_TextState.GetObject()->m_TextMode)) {
     m_pCurStates->m_ClipPath.AppendTexts(&m_ClipTextList);
-
+  }
   m_ClipTextList.clear();
 }
 
@@ -877,22 +876,19 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetFlat() {
-  m_pCurStates->m_GeneralState.MakePrivateCopy();
-  m_pCurStates->m_GeneralState->m_Flatness = GetNumber(0);
+  m_pCurStates->m_GeneralState.GetPrivateCopy()->m_Flatness = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_BeginImageData() {}
 
 void CPDF_StreamContentParser::Handle_SetLineJoin() {
-  m_pCurStates->m_GraphState.MakePrivateCopy();
-  m_pCurStates->m_GraphState->m_LineJoin =
-      static_cast<CFX_GraphStateData::LineJoin>(GetInteger(0));
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_LineJoin =
+      (CFX_GraphStateData::LineJoin)GetInteger(0);
 }
 
 void CPDF_StreamContentParser::Handle_SetLineCap() {
-  m_pCurStates->m_GraphState.MakePrivateCopy();
-  m_pCurStates->m_GraphState->m_LineCap =
-      static_cast<CFX_GraphStateData::LineCap>(GetInteger(0));
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_LineCap =
+      (CFX_GraphStateData::LineCap)GetInteger(0);
 }
 
 void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() {
@@ -935,8 +931,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetMiterLimit() {
-  m_pCurStates->m_GraphState.MakePrivateCopy();
-  m_pCurStates->m_GraphState->m_MiterLimit = GetNumber(0);
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_MiterLimit = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_MarkPlace() {}
@@ -1119,8 +1114,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetCharSpace() {
-  m_pCurStates->m_TextState.MakePrivateCopy();
-  m_pCurStates->m_TextState->m_CharSpace = GetNumber(0);
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_CharSpace = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_MoveTextPoint() {
@@ -1137,14 +1131,14 @@
 
 void CPDF_StreamContentParser::Handle_SetFont() {
   FX_FLOAT fs = GetNumber(0);
-  if (fs == 0)
+  if (fs == 0) {
     fs = m_DefFontSize;
-
-  m_pCurStates->m_TextState.MakePrivateCopy();
-  m_pCurStates->m_TextState->m_FontSize = fs;
+  }
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_FontSize = fs;
   CPDF_Font* pFont = FindFont(GetString(1));
-  if (pFont)
+  if (pFont) {
     m_pCurStates->m_TextState.SetFont(pFont);
+  }
 }
 
 CPDF_Object* CPDF_StreamContentParser::FindResourceObj(
@@ -1249,14 +1243,13 @@
   }
   const TextRenderingMode text_mode =
       pFont->IsType3Font() ? TextRenderingMode::MODE_FILL
-                           : m_pCurStates->m_TextState->m_TextMode;
+                           : m_pCurStates->m_TextState.GetObject()->m_TextMode;
   {
     std::unique_ptr<CPDF_TextObject> pText(new CPDF_TextObject);
     m_pLastTextObject = pText.get();
     SetGraphicStates(m_pLastTextObject, TRUE, TRUE, TRUE);
     if (TextRenderingModeIsStrokeMode(text_mode)) {
-      pText->m_TextState.MakePrivateCopy();
-      FX_FLOAT* pCTM = pText->m_TextState->m_CTM;
+      FX_FLOAT* pCTM = pText->m_TextState.GetPrivateCopy()->m_CTM;
       pCTM[0] = m_pCurStates->m_CTM.a;
       pCTM[1] = m_pCurStates->m_CTM.c;
       pCTM[2] = m_pCurStates->m_CTM.b;
@@ -1365,8 +1358,7 @@
   text_matrix.Concat(m_pCurStates->m_TextMatrix);
   text_matrix.Concat(m_pCurStates->m_CTM);
   text_matrix.Concat(m_mtContentToUser);
-  m_pCurStates->m_TextState.MakePrivateCopy();
-  FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState->m_Matrix;
+  FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetPrivateCopy()->m_Matrix;
   pTextMatrix[0] = text_matrix.a;
   pTextMatrix[1] = text_matrix.c;
   pTextMatrix[2] = text_matrix.b;
@@ -1374,9 +1366,9 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetTextRenderMode() {
-  m_pCurStates->m_TextState.MakePrivateCopy();
-  SetTextRenderingModeFromInt(GetInteger(0),
-                              &m_pCurStates->m_TextState->m_TextMode);
+  int mode = GetInteger(0);
+  SetTextRenderingModeFromInt(
+      mode, &m_pCurStates->m_TextState.GetPrivateCopy()->m_TextMode);
 }
 
 void CPDF_StreamContentParser::Handle_SetTextRise() {
@@ -1384,14 +1376,13 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetWordSpace() {
-  m_pCurStates->m_TextState.MakePrivateCopy();
-  m_pCurStates->m_TextState->m_WordSpace = GetNumber(0);
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_WordSpace = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_SetHorzScale() {
-  if (m_ParamCount != 1)
+  if (m_ParamCount != 1) {
     return;
-
+  }
   m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
   OnChangeTextMatrix();
 }
@@ -1409,8 +1400,8 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetLineWidth() {
-  m_pCurStates->m_GraphState.MakePrivateCopy();
-  m_pCurStates->m_GraphState->m_LineWidth = GetNumber(0);
+  FX_FLOAT width = GetNumber(0);
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_LineWidth = width;
 }
 
 void CPDF_StreamContentParser::Handle_Clip() {
@@ -1433,9 +1424,8 @@
 }
 
 void CPDF_StreamContentParser::Handle_NextLineShowText_Space() {
-  m_pCurStates->m_TextState.MakePrivateCopy();
-  m_pCurStates->m_TextState->m_WordSpace = GetNumber(2);
-  m_pCurStates->m_TextState->m_CharSpace = GetNumber(1);
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_WordSpace = GetNumber(2);
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_CharSpace = GetNumber(1);
   Handle_NextLineShowText();
 }
 
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index 1b37862..6fa1df2 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -711,9 +711,8 @@
                                                      TRUE);
   }
   if (pForm->m_Transparency & PDFTRANS_GROUP) {
-    m_pParser->GetCurStates()->m_GeneralState.MakePrivateCopy();
     CPDF_GeneralStateData* pData =
-        m_pParser->GetCurStates()->m_GeneralState.GetObject();
+        m_pParser->GetCurStates()->m_GeneralState.GetPrivateCopy();
     pData->m_BlendType = FXDIB_BLEND_NORMAL;
     pData->m_StrokeAlpha = 1.0f;
     pData->m_FillAlpha = 1.0f;
@@ -775,8 +774,7 @@
             m_pObjectHolder->m_pDocument, m_pObjectHolder->m_pPageResources,
             nullptr, nullptr, m_pObjectHolder, m_pObjectHolder->m_pResources,
             &m_pObjectHolder->m_BBox, nullptr, 0));
-        m_pParser->GetCurStates()->m_ColorState.MakePrivateCopy();
-        m_pParser->GetCurStates()->m_ColorState->Default();
+        m_pParser->GetCurStates()->m_ColorState.GetPrivateCopy()->Default();
       }
       if (m_CurrentOffset >= m_Size) {
         m_InternalStage = STAGE_CHECKCLIP;
@@ -814,8 +812,9 @@
                                ClipPath.GetPointX(2), ClipPath.GetPointY(2));
         CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right,
                                pObj->m_Top);
-        if (old_rect.Contains(obj_rect))
-          pObj->m_ClipPath.Clear();
+        if (old_rect.Contains(obj_rect)) {
+          pObj->m_ClipPath.SetNull();
+        }
       }
       m_Status = Done;
       return;
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_path.h b/core/fpdfapi/fpdf_page/include/cpdf_path.h
index 33db4d7..98de696 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_path.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_path.h
@@ -27,8 +27,7 @@
 
   FX_BOOL IsRect() const { return GetObject()->IsRect(); }
   void Transform(const CFX_Matrix* pMatrix) {
-    MakePrivateCopy();
-    GetObject()->Transform(pMatrix);
+    GetPrivateCopy()->Transform(pMatrix);
   }
   void Append(const CPDF_Path& other, const CFX_Matrix* pMatrix) {
     GetObject()->Append(other.GetObject(), pMatrix);
diff --git a/core/fpdfapi/fpdf_render/fpdf_render.cpp b/core/fpdfapi/fpdf_render/fpdf_render.cpp
index f5ab969..f77e46d 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -199,16 +199,16 @@
       const CPDF_ColorStateData* pParentData =
           pParentState->m_InitialStates.m_ColorState.GetObject();
       if (!pColorData || pColorData->m_FillColor.IsNull()) {
-        m_InitialStates.m_ColorState.MakePrivateCopy();
-        m_InitialStates.m_ColorState->m_FillRGB = pParentData->m_FillRGB;
-        m_InitialStates.m_ColorState->m_FillColor.Copy(
-            &pParentData->m_FillColor);
+        CPDF_ColorStateData* pData =
+            m_InitialStates.m_ColorState.GetPrivateCopy();
+        pData->m_FillRGB = pParentData->m_FillRGB;
+        pData->m_FillColor.Copy(&pParentData->m_FillColor);
       }
       if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
-        m_InitialStates.m_ColorState.MakePrivateCopy();
-        m_InitialStates.m_ColorState->m_StrokeRGB = pParentData->m_FillRGB;
-        m_InitialStates.m_ColorState->m_StrokeColor.Copy(
-            &pParentData->m_StrokeColor);
+        CPDF_ColorStateData* pData =
+            m_InitialStates.m_ColorState.GetPrivateCopy();
+        pData->m_StrokeRGB = pParentData->m_FillRGB;
+        pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);
       }
     }
   } else {
@@ -579,7 +579,7 @@
   if (!ClipPath) {
     if (m_LastClipPath) {
       m_pDevice->RestoreState(true);
-      m_LastClipPath.Clear();
+      m_LastClipPath.SetNull();
     }
     return;
   }
@@ -921,11 +921,11 @@
                                     ? pSrcStates->m_ColorState.GetStrokeColor()
                                     : pSrcStates->m_ColorState.GetFillColor();
   if (!pObjColor->IsNull()) {
-    pStates->m_ColorState.MakePrivateCopy();
-    pStates->m_ColorState->m_FillRGB =
-        bStroke ? pSrcStates->m_ColorState->m_StrokeRGB
-                : pSrcStates->m_ColorState->m_FillRGB;
-    pStates->m_ColorState->m_StrokeRGB = pStates->m_ColorState->m_FillRGB;
+    CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetPrivateCopy();
+    pColorData->m_FillRGB =
+        bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB
+                : pSrcStates->m_ColorState.GetObject()->m_FillRGB;
+    pColorData->m_StrokeRGB = pColorData->m_FillRGB;
   }
   return pStates;
 }
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 4b59f1d..16d1235 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -231,7 +231,8 @@
   if (textobj->m_nChars == 0)
     return TRUE;
 
-  const TextRenderingMode& text_render_mode = textobj->m_TextState->m_TextMode;
+  const TextRenderingMode& text_render_mode =
+      textobj->m_TextState.GetObject()->m_TextMode;
   if (text_render_mode == TextRenderingMode::MODE_INVISIBLE)
     return TRUE;
 
@@ -307,7 +308,7 @@
     const CFX_Matrix* pDeviceMatrix = pObj2Device;
     CFX_Matrix device_matrix;
     if (bStroke) {
-      const FX_FLOAT* pCTM = textobj->m_TextState->m_CTM;
+      const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;
       if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
         CFX_Matrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
         text_matrix.ConcatInverse(ctm);
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index ca1cbf19..3981cfe 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -45,10 +45,10 @@
                             const CFX_Matrix& matrix) {
   FX_FLOAT baseSpace = 0.0;
   const int nItems = pTextObj->CountItems();
-  if (pTextObj->m_TextState->m_CharSpace && nItems >= 3) {
+  if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) {
     bool bAllChar = true;
-    FX_FLOAT spacing =
-        matrix.TransformDistance(pTextObj->m_TextState->m_CharSpace);
+    FX_FLOAT spacing = matrix.TransformDistance(
+        pTextObj->m_TextState.GetObject()->m_CharSpace);
     baseSpace = spacing;
     for (int i = 0; i < nItems; i++) {
       CPDF_TextObjectItem item;
@@ -1088,7 +1088,7 @@
       spacing = -fontsize_h * item.m_OriginX / 1000;
       continue;
     }
-    FX_FLOAT charSpace = pTextObj->m_TextState->m_CharSpace;
+    FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;
     if (charSpace > 0.001)
       spacing += matrix.TransformDistance(charSpace);
     else if (charSpace < -0.001)
diff --git a/core/fxcrt/cfx_count_ref_unittest.cpp b/core/fxcrt/cfx_count_ref_unittest.cpp
index 2a36292..7651c93 100644
--- a/core/fxcrt/cfx_count_ref_unittest.cpp
+++ b/core/fxcrt/cfx_count_ref_unittest.cpp
@@ -109,19 +109,16 @@
   Observer observer;
   {
     CFX_CountRef<Object> ptr;
-    ptr.MakePrivateCopy(&observer, std::string("one"));
-    EXPECT_NE(nullptr, ptr.GetObject());
+    EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one")));
     EXPECT_EQ(1, observer.GetConstructionCount("one"));
     EXPECT_EQ(0, observer.GetDestructionCount("one"));
 
-    ptr.MakePrivateCopy(&observer, std::string("one"));
-    EXPECT_NE(nullptr, ptr.GetObject());
+    EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one")));
     EXPECT_EQ(1, observer.GetConstructionCount("one"));
     EXPECT_EQ(0, observer.GetDestructionCount("one"));
     {
       CFX_CountRef<Object> other(ptr);
-      ptr.MakePrivateCopy(&observer, std::string("one"));
-      EXPECT_NE(nullptr, ptr.GetObject());
+      EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one")));
       EXPECT_EQ(2, observer.GetConstructionCount("one"));
       EXPECT_EQ(0, observer.GetDestructionCount("one"));
     }
diff --git a/core/fxcrt/include/cfx_count_ref.h b/core/fxcrt/include/cfx_count_ref.h
index 0837894..817ce95 100644
--- a/core/fxcrt/include/cfx_count_ref.h
+++ b/core/fxcrt/include/cfx_count_ref.h
@@ -29,16 +29,17 @@
     return *this;
   }
 
-  void Clear() { m_pObject.Reset(); }
+  void SetNull() { m_pObject.Reset(); }
   ObjClass* GetObject() { return m_pObject.Get(); }
   const ObjClass* GetObject() const { return m_pObject.Get(); }
 
   template <typename... Args>
-  void MakePrivateCopy(Args... params) {
+  ObjClass* GetPrivateCopy(Args... params) {
     if (!m_pObject)
-      m_pObject.Reset(new CountedObj(params...));
-    else if (!m_pObject->HasOneRef())
+      return New(params...);
+    if (!m_pObject->HasOneRef())
       m_pObject.Reset(new CountedObj(*m_pObject));
+    return m_pObject.Get();
   }
 
   bool operator==(const CFX_CountRef& that) const {
@@ -46,8 +47,6 @@
   }
   bool operator!=(const CFX_CountRef& that) const { return !(*this == that); }
   operator bool() const { return m_pObject; }
-  ObjClass& operator*() const { return *m_pObject.Get(); }
-  ObjClass* operator->() const { return m_pObject.Get(); }
 
  private:
   class CountedObj : public ObjClass {
diff --git a/core/fxge/ge/cfx_cliprgn.cpp b/core/fxge/ge/cfx_cliprgn.cpp
index 9b20633..41975e4 100644
--- a/core/fxge/ge/cfx_cliprgn.cpp
+++ b/core/fxge/ge/cfx_cliprgn.cpp
@@ -20,7 +20,7 @@
 void CFX_ClipRgn::Reset(const FX_RECT& rect) {
   m_Type = RectI;
   m_Box = rect;
-  m_Mask.Clear();
+  m_Mask.SetNull();
 }
 
 void CFX_ClipRgn::IntersectRect(const FX_RECT& rect) {
@@ -77,7 +77,7 @@
     new_box.Intersect(mask_box);
     if (new_box.IsEmpty()) {
       m_Type = RectI;
-      m_Mask.Clear();
+      m_Mask.SetNull();
       m_Box = new_box;
       return;
     }
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index af8bb7d..712080a 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -220,9 +220,9 @@
                                                     float right,
                                                     float top) {
   CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath();
-  pNewClipPath->MakePrivateCopy();
+  pNewClipPath->GetPrivateCopy();
   CPDF_Path Path;
-  Path.MakePrivateCopy();
+  Path.GetPrivateCopy();
   Path.AppendRect(left, bottom, right, top);
   pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE);
   return pNewClipPath;
diff --git a/fpdfsdk/fpdfeditimg.cpp b/fpdfsdk/fpdfeditimg.cpp
index 372e676..1fe832b 100644
--- a/fpdfsdk/fpdfeditimg.cpp
+++ b/fpdfsdk/fpdfeditimg.cpp
@@ -33,7 +33,7 @@
 
   IFX_FileRead* pFile = new CPDF_CustomAccess(fileAccess);
   CPDF_ImageObject* pImgObj = reinterpret_cast<CPDF_ImageObject*>(image_object);
-  pImgObj->m_GeneralState.MakePrivateCopy();
+  pImgObj->m_GeneralState.GetPrivateCopy();
   for (int index = 0; index < nCount; index++) {
     CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]);
     if (pPage)
@@ -73,7 +73,7 @@
     return FALSE;
 
   CPDF_ImageObject* pImgObj = reinterpret_cast<CPDF_ImageObject*>(image_object);
-  pImgObj->m_GeneralState.MakePrivateCopy();
+  pImgObj->m_GeneralState.GetPrivateCopy();
   for (int index = 0; index < nCount; index++) {
     CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]);
     if (pPage)
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index c744958..479fa97 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -137,9 +137,8 @@
                           FX_COLORREF crFill,
                           const CFX_FloatRect& rcFill) {
   std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject);
-  pPathObj->m_Path.MakePrivateCopy();
-  pPathObj->m_Path->AppendRect(rcFill.left, rcFill.bottom, rcFill.right,
-                               rcFill.top);
+  CFX_PathData* pPathData = pPathObj->m_Path.GetPrivateCopy();
+  pPathData->AppendRect(rcFill.left, rcFill.bottom, rcFill.right, rcFill.top);
 
   FX_FLOAT rgb[3];
   rgb[0] = FXARGB_R(crFill) / 255.0f;
@@ -162,16 +161,16 @@
                                          const CFX_FloatPoint& point,
                                          const CFX_ByteString& text) {
   std::unique_ptr<CPDF_TextObject> pTxtObj(new CPDF_TextObject);
-  pTxtObj->m_TextState.MakePrivateCopy();
-  pTxtObj->m_TextState->m_pFont = pFont;
-  pTxtObj->m_TextState->m_FontSize = fFontSize;
-  pTxtObj->m_TextState->m_CharSpace = fCharSpace;
-  pTxtObj->m_TextState->m_WordSpace = 0;
-  pTxtObj->m_TextState->m_TextMode = TextRenderingMode::MODE_FILL;
-  pTxtObj->m_TextState->m_Matrix[0] = nHorzScale / 100.0f;
-  pTxtObj->m_TextState->m_Matrix[1] = 0;
-  pTxtObj->m_TextState->m_Matrix[2] = 0;
-  pTxtObj->m_TextState->m_Matrix[3] = 1;
+  CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetPrivateCopy();
+  pTextStateData->m_pFont = pFont;
+  pTextStateData->m_FontSize = fFontSize;
+  pTextStateData->m_CharSpace = fCharSpace;
+  pTextStateData->m_WordSpace = 0;
+  pTextStateData->m_TextMode = TextRenderingMode::MODE_FILL;
+  pTextStateData->m_Matrix[0] = nHorzScale / 100.0f;
+  pTextStateData->m_Matrix[1] = 0;
+  pTextStateData->m_Matrix[2] = 0;
+  pTextStateData->m_Matrix[3] = 1;
 
   FX_FLOAT rgb[3];
   rgb[0] = FXARGB_R(crText) / 255.0f;
