Make CFX_CountRef<>::m_pObject private, add accessors, fix const-ness.

Hide the CountedObj class from the rest of the code.

Rename GetModify() to GetPrivateCopy(), since it turns out
there are places where we modify a potentially-shared copy.
Add non-const version of GetObject() to permit these.

Review-Url: https://codereview.chromium.org/2287633002
diff --git a/core/fpdfapi/fpdf_page/cpdf_allstates.cpp b/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
index ab69eb7..e4b6e32 100644
--- a/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
@@ -45,7 +45,7 @@
 void CPDF_AllStates::SetLineDash(CPDF_Array* pArray,
                                  FX_FLOAT phase,
                                  FX_FLOAT scale) {
-  CFX_GraphStateData* pData = m_GraphState.GetModify();
+  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++)
@@ -54,7 +54,7 @@
 
 void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS,
                                   CPDF_StreamContentParser* pParser) {
-  CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify();
+  CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetPrivateCopy();
   for (const auto& it : *pGS) {
     const CFX_ByteString& key_str = it.first;
     CPDF_Object* pElement = it.second;
@@ -65,18 +65,18 @@
     uint32_t key = key_str.GetID();
     switch (key) {
       case FXBSTR_ID('L', 'W', 0, 0):
-        m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber();
+        m_GraphState.GetPrivateCopy()->m_LineWidth = pObject->GetNumber();
         break;
       case FXBSTR_ID('L', 'C', 0, 0):
-        m_GraphState.GetModify()->m_LineCap =
+        m_GraphState.GetPrivateCopy()->m_LineCap =
             (CFX_GraphStateData::LineCap)pObject->GetInteger();
         break;
       case FXBSTR_ID('L', 'J', 0, 0):
-        m_GraphState.GetModify()->m_LineJoin =
+        m_GraphState.GetPrivateCopy()->m_LineJoin =
             (CFX_GraphStateData::LineJoin)pObject->GetInteger();
         break;
       case FXBSTR_ID('M', 'L', 0, 0):
-        m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber();
+        m_GraphState.GetPrivateCopy()->m_MiterLimit = pObject->GetNumber();
         break;
       case FXBSTR_ID('D', 0, 0, 0): {
         CPDF_Array* pDash = pObject->AsArray();
@@ -98,7 +98,7 @@
         if (!pFont)
           break;
 
-        m_TextState.GetModify()->m_FontSize = pFont->GetNumberAt(1);
+        m_TextState.GetPrivateCopy()->m_FontSize = pFont->GetNumberAt(1);
         m_TextState.SetFont(pParser->FindFont(pFont->GetStringAt(0)));
         break;
       }
diff --git a/core/fpdfapi/fpdf_page/cpdf_clippath.cpp b/core/fpdfapi/fpdf_page/cpdf_clippath.cpp
index ea854d1..e820260 100644
--- a/core/fpdfapi/fpdf_page/cpdf_clippath.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_clippath.cpp
@@ -14,23 +14,23 @@
 #define FPDF_CLIPPATH_MAX_TEXTS 1024
 
 uint32_t CPDF_ClipPath::GetPathCount() const {
-  return pdfium::CollectionSize<uint32_t>(m_pObject->m_PathAndTypeList);
+  return pdfium::CollectionSize<uint32_t>(GetObject()->m_PathAndTypeList);
 }
 
 CPDF_Path CPDF_ClipPath::GetPath(size_t i) const {
-  return m_pObject->m_PathAndTypeList[i].first;
+  return GetObject()->m_PathAndTypeList[i].first;
 }
 
 uint8_t CPDF_ClipPath::GetClipType(size_t i) const {
-  return m_pObject->m_PathAndTypeList[i].second;
+  return GetObject()->m_PathAndTypeList[i].second;
 }
 
 uint32_t CPDF_ClipPath::GetTextCount() const {
-  return pdfium::CollectionSize<uint32_t>(m_pObject->m_TextList);
+  return pdfium::CollectionSize<uint32_t>(GetObject()->m_TextList);
 }
 
 CPDF_TextObject* CPDF_ClipPath::GetText(size_t i) const {
-  return m_pObject->m_TextList[i].get();
+  return GetObject()->m_TextList[i].get();
 }
 
 CFX_FloatRect CPDF_ClipPath::GetClipBox() const {
@@ -73,7 +73,7 @@
 }
 
 void CPDF_ClipPath::AppendPath(CPDF_Path path, uint8_t type, bool bAutoMerge) {
-  CPDF_ClipPathData* pData = GetModify();
+  CPDF_ClipPathData* pData = GetPrivateCopy();
   if (!pData->m_PathAndTypeList.empty() && bAutoMerge) {
     const CPDF_Path& old_path = pData->m_PathAndTypeList.back().first;
     if (old_path.IsRect()) {
@@ -89,7 +89,7 @@
 
 void CPDF_ClipPath::AppendTexts(
     std::vector<std::unique_ptr<CPDF_TextObject>>* pTexts) {
-  CPDF_ClipPathData* pData = GetModify();
+  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]));
@@ -99,7 +99,7 @@
 }
 
 void CPDF_ClipPath::Transform(const CFX_Matrix& matrix) {
-  CPDF_ClipPathData* pData = GetModify();
+  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 1d422cb..a223437 100644
--- a/core/fpdfapi/fpdf_page/cpdf_colorstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_colorstate.cpp
@@ -13,14 +13,14 @@
 void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS,
                                    FX_FLOAT* pValue,
                                    uint32_t nValues) {
-  CPDF_ColorStateData* pData = GetModify();
+  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) {
-  CPDF_ColorStateData* pData = GetModify();
+  CPDF_ColorStateData* pData = GetPrivateCopy();
   SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);
 }
 
@@ -45,7 +45,7 @@
 void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern,
                                      FX_FLOAT* pValue,
                                      uint32_t nValues) {
-  CPDF_ColorStateData* pData = GetModify();
+  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);
@@ -61,7 +61,7 @@
 void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern,
                                        FX_FLOAT* pValue,
                                        uint32_t nValues) {
-  CPDF_ColorStateData* pData = GetModify();
+  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_colorstate.h b/core/fpdfapi/fpdf_page/cpdf_colorstate.h
index c7b8854..128d675 100644
--- a/core/fpdfapi/fpdf_page/cpdf_colorstate.h
+++ b/core/fpdfapi/fpdf_page/cpdf_colorstate.h
@@ -18,12 +18,14 @@
 
 class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData> {
  public:
-  CPDF_Color* GetFillColor() const {
-    return m_pObject ? &m_pObject->m_FillColor : nullptr;
+  const CPDF_Color* GetFillColor() const {
+    const CPDF_ColorStateData* pData = GetObject();
+    return pData ? &pData->m_FillColor : nullptr;
   }
 
-  CPDF_Color* GetStrokeColor() const {
-    return m_pObject ? &m_pObject->m_StrokeColor : nullptr;
+  const CPDF_Color* GetStrokeColor() const {
+    const CPDF_ColorStateData* pData = GetObject();
+    return pData ? &pData->m_StrokeColor : nullptr;
   }
 
   void SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, uint32_t nValues);
diff --git a/core/fpdfapi/fpdf_page/cpdf_contentmark.cpp b/core/fpdfapi/fpdf_page/cpdf_contentmark.cpp
index 6e85d29..06a6a50 100644
--- a/core/fpdfapi/fpdf_page/cpdf_contentmark.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_contentmark.cpp
@@ -6,33 +6,34 @@
 
 #include "core/fpdfapi/fpdf_page/cpdf_contentmark.h"
 
-FX_BOOL CPDF_ContentMark::HasMark(const CFX_ByteStringC& mark) const {
-  if (!m_pObject)
-    return FALSE;
+bool CPDF_ContentMark::HasMark(const CFX_ByteStringC& mark) const {
+  const CPDF_ContentMarkData* pData = GetObject();
+  if (!pData)
+    return false;
 
-  for (int i = 0; i < m_pObject->CountItems(); i++) {
-    CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
-    if (item.GetName() == mark)
-      return TRUE;
+  for (int i = 0; i < pData->CountItems(); i++) {
+    if (pData->GetItem(i).GetName() == mark)
+      return true;
   }
-  return FALSE;
+  return false;
 }
 
-FX_BOOL CPDF_ContentMark::LookupMark(const CFX_ByteStringC& mark,
-                                     CPDF_Dictionary*& pDict) const {
-  if (!m_pObject)
-    return FALSE;
+bool CPDF_ContentMark::LookupMark(const CFX_ByteStringC& mark,
+                                  CPDF_Dictionary*& pDict) const {
+  const CPDF_ContentMarkData* pData = GetObject();
+  if (!pData)
+    return false;
 
-  for (int i = 0; i < m_pObject->CountItems(); i++) {
-    CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
+  for (int i = 0; i < pData->CountItems(); i++) {
+    const CPDF_ContentMarkItem& item = pData->GetItem(i);
     if (item.GetName() == mark) {
       pDict = nullptr;
       if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||
           item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {
         pDict = item.GetParam();
       }
-      return TRUE;
+      return true;
     }
   }
-  return FALSE;
+  return false;
 }
diff --git a/core/fpdfapi/fpdf_page/cpdf_contentmark.h b/core/fpdfapi/fpdf_page/cpdf_contentmark.h
index 680aed4..2f8c5cd 100644
--- a/core/fpdfapi/fpdf_page/cpdf_contentmark.h
+++ b/core/fpdfapi/fpdf_page/cpdf_contentmark.h
@@ -13,12 +13,13 @@
 
 class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData> {
  public:
-  int GetMCID() const { return m_pObject ? m_pObject->GetMCID() : -1; }
+  int GetMCID() const {
+    const CPDF_ContentMarkData* pData = GetObject();
+    return pData ? pData->GetMCID() : -1;
+  }
 
-  FX_BOOL HasMark(const CFX_ByteStringC& mark) const;
-
-  FX_BOOL LookupMark(const CFX_ByteStringC& mark,
-                     CPDF_Dictionary*& pDict) const;
+  bool HasMark(const CFX_ByteStringC& mark) const;
+  bool LookupMark(const CFX_ByteStringC& mark, CPDF_Dictionary*& pDict) const;
 };
 
 #endif  // CORE_FPDFAPI_FPDF_PAGE_CPDF_CONTENTMARK_H_
diff --git a/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp b/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp
index 45a40cc..0f6cce6 100644
--- a/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp
@@ -25,5 +25,5 @@
 }  // namespace
 
 void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) {
-  GetModify()->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 238675c..17014c4 100644
--- a/core/fpdfapi/fpdf_page/cpdf_pageobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_pageobject.cpp
@@ -81,14 +81,14 @@
 void CPDF_PageObject::TransformClipPath(CFX_Matrix& matrix) {
   if (!m_ClipPath)
     return;
-  m_ClipPath.GetModify();
+  m_ClipPath.GetPrivateCopy();
   m_ClipPath.Transform(matrix);
 }
 
 void CPDF_PageObject::TransformGeneralState(CFX_Matrix& matrix) {
   if (!m_GeneralState)
     return;
-  CPDF_GeneralStateData* pGS = m_GeneralState.GetModify();
+  CPDF_GeneralStateData* pGS = m_GeneralState.GetPrivateCopy();
   pGS->m_Matrix.Concat(matrix);
 }
 
diff --git a/core/fpdfapi/fpdf_page/cpdf_shadingobject.cpp b/core/fpdfapi/fpdf_page/cpdf_shadingobject.cpp
index 968c53b..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.GetModify();
+    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 caa7d0d..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.GetModify();
+  m_TextState.GetPrivateCopy();
   CFX_Matrix text_matrix;
   GetTextMatrix(&text_matrix);
   text_matrix.Concat(matrix);
@@ -160,7 +160,7 @@
 }
 
 void CPDF_TextObject::GetTextMatrix(CFX_Matrix* pMatrix) const {
-  FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
+  const FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
   pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3],
                m_PosX, m_PosY);
 }
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
index 50fc778..ae75876 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
@@ -10,7 +10,7 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 
 void CPDF_TextState::SetFont(CPDF_Font* pFont) {
-  CPDF_TextStateData* pStateData = GetModify();
+  CPDF_TextStateData* pStateData = GetPrivateCopy();
   if (pStateData) {
     CPDF_Document* pDoc = pStateData->m_pDocument;
     CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
@@ -23,26 +23,26 @@
 }
 
 FX_FLOAT CPDF_TextState::GetFontSizeV() const {
-  FX_FLOAT* pMatrix = GetMatrix();
+  const FX_FLOAT* pMatrix = GetMatrix();
   FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]);
   FX_FLOAT size = unit * GetFontSize();
   return (FX_FLOAT)FXSYS_fabs(size);
 }
 
 FX_FLOAT CPDF_TextState::GetFontSizeH() const {
-  FX_FLOAT* pMatrix = GetMatrix();
+  const FX_FLOAT* pMatrix = GetMatrix();
   FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]);
   FX_FLOAT size = unit * GetFontSize();
   return (FX_FLOAT)FXSYS_fabs(size);
 }
 
 FX_FLOAT CPDF_TextState::GetBaselineAngle() const {
-  FX_FLOAT* m_Matrix = GetMatrix();
+  const FX_FLOAT* m_Matrix = GetMatrix();
   return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
 }
 
 FX_FLOAT CPDF_TextState::GetShearAngle() const {
-  FX_FLOAT* m_Matrix = GetMatrix();
+  const FX_FLOAT* m_Matrix = GetMatrix();
   FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
   return GetBaselineAngle() + shear_angle;
 }
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.h b/core/fpdfapi/fpdf_page/cpdf_textstate.h
index cfb4b28..59c988d 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.h
+++ b/core/fpdfapi/fpdf_page/cpdf_textstate.h
@@ -14,11 +14,13 @@
 
 class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData> {
  public:
-  CPDF_Font* GetFont() const { return m_pObject->m_pFont; }
+  CPDF_Font* GetFont() const { return GetObject()->m_pFont; }
   void SetFont(CPDF_Font* pFont);
 
-  FX_FLOAT GetFontSize() const { return m_pObject->m_FontSize; }
-  FX_FLOAT* GetMatrix() const { return m_pObject->m_Matrix; }
+  FX_FLOAT GetFontSize() const { return GetObject()->m_FontSize; }
+  FX_FLOAT* GetMatrix() { return GetObject()->m_Matrix; }
+  const FX_FLOAT* GetMatrix() const { return GetObject()->m_Matrix; }
+
   FX_FLOAT GetFontSizeV() const;
   FX_FLOAT GetFontSizeH() const;
   FX_FLOAT GetBaselineAngle() const;
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 8d3f5b8..f110103 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -583,7 +583,7 @@
     bDirect = FALSE;
   }
   if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) {
-    m_CurContentMark.GetModify()->AddMark(tag, pDict, bDirect);
+    m_CurContentMark.GetPrivateCopy()->AddMark(tag, pDict, bDirect);
   }
 }
 
@@ -659,7 +659,7 @@
 
 void CPDF_StreamContentParser::Handle_BeginMarkedContent() {
   CFX_ByteString tag = GetString(0);
-  m_CurContentMark.GetModify()->AddMark(tag, nullptr, FALSE);
+  m_CurContentMark.GetPrivateCopy()->AddMark(tag, nullptr, FALSE);
 }
 
 void CPDF_StreamContentParser::Handle_BeginText() {
@@ -691,7 +691,7 @@
   if (!pCS) {
     return;
   }
-  m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);
+  m_pCurStates->m_ColorState.GetPrivateCopy()->m_FillColor.SetColorSpace(pCS);
 }
 
 void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() {
@@ -700,7 +700,7 @@
   if (!pCS) {
     return;
   }
-  m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);
+  m_pCurStates->m_ColorState.GetPrivateCopy()->m_StrokeColor.SetColorSpace(pCS);
 }
 
 void CPDF_StreamContentParser::Handle_SetDash() {
@@ -816,7 +816,7 @@
     m_CurContentMark.SetNull();
     return;
   }
-  m_CurContentMark.GetModify()->DeleteLastMark();
+  m_CurContentMark.GetPrivateCopy()->DeleteLastMark();
 }
 
 void CPDF_StreamContentParser::Handle_EndText() {
@@ -876,18 +876,18 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetFlat() {
-  m_pCurStates->m_GeneralState.GetModify()->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.GetModify()->m_LineJoin =
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_LineJoin =
       (CFX_GraphStateData::LineJoin)GetInteger(0);
 }
 
 void CPDF_StreamContentParser::Handle_SetLineCap() {
-  m_pCurStates->m_GraphState.GetModify()->m_LineCap =
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_LineCap =
       (CFX_GraphStateData::LineCap)GetInteger(0);
 }
 
@@ -931,7 +931,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetMiterLimit() {
-  m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_MiterLimit = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_MarkPlace() {}
@@ -1114,7 +1114,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetCharSpace() {
-  m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_CharSpace = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_MoveTextPoint() {
@@ -1134,7 +1134,7 @@
   if (fs == 0) {
     fs = m_DefFontSize;
   }
-  m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_FontSize = fs;
   CPDF_Font* pFont = FindFont(GetString(1));
   if (pFont) {
     m_pCurStates->m_TextState.SetFont(pFont);
@@ -1249,7 +1249,7 @@
     m_pLastTextObject = pText.get();
     SetGraphicStates(m_pLastTextObject, TRUE, TRUE, TRUE);
     if (TextRenderingModeIsStrokeMode(text_mode)) {
-      FX_FLOAT* pCTM = pText->m_TextState.GetModify()->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;
@@ -1358,7 +1358,7 @@
   text_matrix.Concat(m_pCurStates->m_TextMatrix);
   text_matrix.Concat(m_pCurStates->m_CTM);
   text_matrix.Concat(m_mtContentToUser);
-  FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->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;
@@ -1368,7 +1368,7 @@
 void CPDF_StreamContentParser::Handle_SetTextRenderMode() {
   int mode = GetInteger(0);
   SetTextRenderingModeFromInt(
-      mode, &m_pCurStates->m_TextState.GetModify()->m_TextMode);
+      mode, &m_pCurStates->m_TextState.GetPrivateCopy()->m_TextMode);
 }
 
 void CPDF_StreamContentParser::Handle_SetTextRise() {
@@ -1376,7 +1376,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetWordSpace() {
-  m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);
+  m_pCurStates->m_TextState.GetPrivateCopy()->m_WordSpace = GetNumber(0);
 }
 
 void CPDF_StreamContentParser::Handle_SetHorzScale() {
@@ -1401,7 +1401,7 @@
 
 void CPDF_StreamContentParser::Handle_SetLineWidth() {
   FX_FLOAT width = GetNumber(0);
-  m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;
+  m_pCurStates->m_GraphState.GetPrivateCopy()->m_LineWidth = width;
 }
 
 void CPDF_StreamContentParser::Handle_Clip() {
@@ -1424,8 +1424,8 @@
 }
 
 void CPDF_StreamContentParser::Handle_NextLineShowText_Space() {
-  m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);
-  m_pCurStates->m_TextState.GetModify()->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 dbfd741..6fa1df2 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -712,7 +712,7 @@
   }
   if (pForm->m_Transparency & PDFTRANS_GROUP) {
     CPDF_GeneralStateData* pData =
-        m_pParser->GetCurStates()->m_GeneralState.GetModify();
+        m_pParser->GetCurStates()->m_GeneralState.GetPrivateCopy();
     pData->m_BlendType = FXDIB_BLEND_NORMAL;
     pData->m_StrokeAlpha = 1.0f;
     pData->m_FillAlpha = 1.0f;
@@ -774,7 +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.GetModify()->Default();
+        m_pParser->GetCurStates()->m_ColorState.GetPrivateCopy()->Default();
       }
       if (m_CurrentOffset >= m_Size) {
         m_InternalStage = STAGE_CHECKCLIP;
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_generalstate.h b/core/fpdfapi/fpdf_page/include/cpdf_generalstate.h
index ab1e940..dff8371 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_generalstate.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_generalstate.h
@@ -15,14 +15,16 @@
   void SetRenderIntent(const CFX_ByteString& ri);
 
   int GetBlendType() const {
-    return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;
+    const CPDF_GeneralStateData* pData = GetObject();
+    return pData ? pData->m_BlendType : FXDIB_BLEND_NORMAL;
   }
 
   int GetAlpha(FX_BOOL bStroke) const {
-    if (!m_pObject)
+    const CPDF_GeneralStateData* pData = GetObject();
+    if (!pData)
       return 255;
-    return FXSYS_round(
-        (bStroke ? m_pObject->m_StrokeAlpha : m_pObject->m_FillAlpha) * 255);
+    return FXSYS_round((bStroke ? pData->m_StrokeAlpha : pData->m_FillAlpha) *
+                       255);
   }
 };
 
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_path.h b/core/fpdfapi/fpdf_page/include/cpdf_path.h
index 0e8c491..98de696 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_path.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_path.h
@@ -14,28 +14,30 @@
 
 class CPDF_Path : public CFX_CountRef<CFX_PathData> {
  public:
-  int GetPointCount() const { return m_pObject->GetPointCount(); }
-  int GetFlag(int index) const { return m_pObject->GetFlag(index); }
-  FX_FLOAT GetPointX(int index) const { return m_pObject->GetPointX(index); }
-  FX_FLOAT GetPointY(int index) const { return m_pObject->GetPointY(index); }
-  FX_PATHPOINT* GetPoints() const { return m_pObject->GetPoints(); }
-  CFX_FloatRect GetBoundingBox() const { return m_pObject->GetBoundingBox(); }
+  int GetPointCount() const { return GetObject()->GetPointCount(); }
+  int GetFlag(int index) const { return GetObject()->GetFlag(index); }
+  FX_FLOAT GetPointX(int index) const { return GetObject()->GetPointX(index); }
+  FX_FLOAT GetPointY(int index) const { return GetObject()->GetPointY(index); }
+  FX_PATHPOINT* GetPoints() const { return GetObject()->GetPoints(); }
+  CFX_FloatRect GetBoundingBox() const { return GetObject()->GetBoundingBox(); }
   CFX_FloatRect GetBoundingBox(FX_FLOAT line_width,
                                FX_FLOAT miter_limit) const {
-    return m_pObject->GetBoundingBox(line_width, miter_limit);
+    return GetObject()->GetBoundingBox(line_width, miter_limit);
   }
 
-  FX_BOOL IsRect() const { return m_pObject->IsRect(); }
-  void Transform(const CFX_Matrix* pMatrix) { GetModify()->Transform(pMatrix); }
+  FX_BOOL IsRect() const { return GetObject()->IsRect(); }
+  void Transform(const CFX_Matrix* pMatrix) {
+    GetPrivateCopy()->Transform(pMatrix);
+  }
   void Append(const CPDF_Path& other, const CFX_Matrix* pMatrix) {
-    m_pObject->Append(other.GetObject(), pMatrix);
+    GetObject()->Append(other.GetObject(), pMatrix);
   }
 
   void AppendRect(FX_FLOAT left,
                   FX_FLOAT bottom,
                   FX_FLOAT right,
                   FX_FLOAT top) {
-    m_pObject->AppendRect(left, bottom, right, top);
+    GetObject()->AppendRect(left, bottom, right, top);
   }
 };
 
diff --git a/core/fpdfapi/fpdf_render/fpdf_render.cpp b/core/fpdfapi/fpdf_render/fpdf_render.cpp
index f24a668..f77e46d 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -199,12 +199,14 @@
       const CPDF_ColorStateData* pParentData =
           pParentState->m_InitialStates.m_ColorState.GetObject();
       if (!pColorData || pColorData->m_FillColor.IsNull()) {
-        CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
+        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()) {
-        CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
+        CPDF_ColorStateData* pData =
+            m_InitialStates.m_ColorState.GetPrivateCopy();
         pData->m_StrokeRGB = pParentData->m_FillRGB;
         pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);
       }
@@ -915,10 +917,11 @@
   }
   CPDF_GraphicStates* pStates = new CPDF_GraphicStates;
   pStates->CopyStates(*pSrcStates);
-  CPDF_Color* pObjColor = bStroke ? pSrcStates->m_ColorState.GetStrokeColor()
-                                  : pSrcStates->m_ColorState.GetFillColor();
+  const CPDF_Color* pObjColor = bStroke
+                                    ? pSrcStates->m_ColorState.GetStrokeColor()
+                                    : pSrcStates->m_ColorState.GetFillColor();
   if (!pObjColor->IsNull()) {
-    CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetModify();
+    CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetPrivateCopy();
     pColorData->m_FillRGB =
         bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB
                 : pSrcStates->m_ColorState.GetObject()->m_FillRGB;
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
index 8d638f6..295ac4f 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -422,7 +422,7 @@
   m_bPatternColor = FALSE;
   m_pPattern = nullptr;
   if (m_pDIBSource->IsAlphaMask()) {
-    CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();
+    const CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();
     if (pColor && pColor->IsPattern()) {
       m_pPattern = pColor->GetPattern();
       if (m_pPattern) {
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
index 21af768..fc06c0b 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
@@ -1169,7 +1169,7 @@
 
 void CPDF_RenderStatus::DrawPathWithPattern(const CPDF_PathObject* pPathObj,
                                             const CFX_Matrix* pObj2Device,
-                                            CPDF_Color* pColor,
+                                            const CPDF_Color* pColor,
                                             FX_BOOL bStroke) {
   CPDF_Pattern* pattern = pColor->GetPattern();
   if (!pattern)
@@ -1186,14 +1186,14 @@
                                            int& filltype,
                                            FX_BOOL& bStroke) {
   if (filltype) {
-    CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();
+    const CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();
     if (FillColor.IsPattern()) {
       DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, FALSE);
       filltype = 0;
     }
   }
   if (bStroke) {
-    CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();
+    const CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();
     if (StrokeColor.IsPattern()) {
       DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE);
       bStroke = FALSE;
diff --git a/core/fpdfapi/fpdf_render/render_int.h b/core/fpdfapi/fpdf_render/render_int.h
index a10dca5..66d0a70 100644
--- a/core/fpdfapi/fpdf_render/render_int.h
+++ b/core/fpdfapi/fpdf_render/render_int.h
@@ -186,7 +186,7 @@
                           FX_BOOL& bStroke);
   void DrawPathWithPattern(const CPDF_PathObject* pPathObj,
                            const CFX_Matrix* pObj2Device,
-                           CPDF_Color* pColor,
+                           const CPDF_Color* pColor,
                            FX_BOOL bStroke);
   void DrawTilingPattern(CPDF_TilingPattern* pPattern,
                          const CPDF_PageObject* pPageObj,
diff --git a/core/fxcrt/cfx_count_ref_unittest.cpp b/core/fxcrt/cfx_count_ref_unittest.cpp
index 11c7c9b..7651c93 100644
--- a/core/fxcrt/cfx_count_ref_unittest.cpp
+++ b/core/fxcrt/cfx_count_ref_unittest.cpp
@@ -109,16 +109,16 @@
   Observer observer;
   {
     CFX_CountRef<Object> ptr;
-    EXPECT_NE(nullptr, ptr.GetModify(&observer, std::string("one")));
+    EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one")));
     EXPECT_EQ(1, observer.GetConstructionCount("one"));
     EXPECT_EQ(0, observer.GetDestructionCount("one"));
 
-    EXPECT_NE(nullptr, ptr.GetModify(&observer, std::string("one")));
+    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);
-      EXPECT_NE(nullptr, ptr.GetModify(&observer, std::string("one")));
+      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 7dbd5df..817ce95 100644
--- a/core/fxcrt/include/cfx_count_ref.h
+++ b/core/fxcrt/include/cfx_count_ref.h
@@ -30,10 +30,11 @@
   }
 
   void SetNull() { m_pObject.Reset(); }
+  ObjClass* GetObject() { return m_pObject.Get(); }
   const ObjClass* GetObject() const { return m_pObject.Get(); }
 
   template <typename... Args>
-  ObjClass* GetModify(Args... params) {
+  ObjClass* GetPrivateCopy(Args... params) {
     if (!m_pObject)
       return New(params...);
     if (!m_pObject->HasOneRef())
@@ -47,7 +48,7 @@
   bool operator!=(const CFX_CountRef& that) const { return !(*this == that); }
   operator bool() const { return m_pObject; }
 
- protected:
+ private:
   class CountedObj : public ObjClass {
    public:
     template <typename... Args>
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index c782150..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->GetModify();
+  pNewClipPath->GetPrivateCopy();
   CPDF_Path Path;
-  Path.GetModify();
+  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 da3d33e..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.GetModify();
+  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.GetModify();
+  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 d21411f..479fa97 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -137,7 +137,7 @@
                           FX_COLORREF crFill,
                           const CFX_FloatRect& rcFill) {
   std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject);
-  CFX_PathData* pPathData = pPathObj->m_Path.GetModify();
+  CFX_PathData* pPathData = pPathObj->m_Path.GetPrivateCopy();
   pPathData->AppendRect(rcFill.left, rcFill.bottom, rcFill.right, rcFill.top);
 
   FX_FLOAT rgb[3];
@@ -161,7 +161,7 @@
                                          const CFX_FloatPoint& point,
                                          const CFX_ByteString& text) {
   std::unique_ptr<CPDF_TextObject> pTxtObj(new CPDF_TextObject);
-  CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify();
+  CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetPrivateCopy();
   pTextStateData->m_pFont = pFont;
   pTextStateData->m_FontSize = fFontSize;
   pTextStateData->m_CharSpace = fCharSpace;