diff --git a/core/fpdfapi/fpdf_page/cpdf_allstates.cpp b/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
index e4b6e32..e01b379 100644
--- a/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_allstates.cpp
@@ -98,7 +98,7 @@
         if (!pFont)
           break;
 
-        m_TextState.GetPrivateCopy()->m_FontSize = pFont->GetNumberAt(1);
+        m_TextState.SetFontSize(pFont->GetNumberAt(1));
         m_TextState.SetFont(pParser->FindFont(pFont->GetStringAt(0)));
         break;
       }
diff --git a/core/fpdfapi/fpdf_page/cpdf_graphicstates.cpp b/core/fpdfapi/fpdf_page/cpdf_graphicstates.cpp
index fc054ca..e411b53 100644
--- a/core/fpdfapi/fpdf_page/cpdf_graphicstates.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_graphicstates.cpp
@@ -11,7 +11,7 @@
 CPDF_GraphicStates::~CPDF_GraphicStates() {}
 
 void CPDF_GraphicStates::DefaultStates() {
-  m_ColorState.New()->Default();
+  m_ColorState.Emplace()->Default();
 }
 
 void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src) {
diff --git a/core/fpdfapi/fpdf_page/cpdf_textobject.cpp b/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
index af6ae06..f9e6bda 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textobject.cpp
@@ -334,9 +334,9 @@
     }
     curpos += charwidth;
     if (charcode == ' ' && (!pCIDFont || pCIDFont->GetCharSize(32) == 1)) {
-      curpos += m_TextState.GetObject()->m_WordSpace;
+      curpos += m_TextState.GetWordSpace();
     }
-    curpos += m_TextState.GetObject()->m_CharSpace;
+    curpos += m_TextState.GetCharSpace();
   }
   if (bVertWriting) {
     if (pTextAdvanceX) {
@@ -364,7 +364,7 @@
   m_Bottom = min_y;
   m_Top = max_y;
   matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
-  if (TextRenderingModeIsStrokeMode(m_TextState.GetObject()->m_TextMode)) {
+  if (TextRenderingModeIsStrokeMode(m_TextState.GetTextMode())) {
     FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;
     m_Left -= half_width;
     m_Right += half_width;
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
index ae75876..feb70ae 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
@@ -4,45 +4,87 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
 #include "core/fpdfapi/fpdf_page/cpdf_textstate.h"
+
+#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 
+CPDF_TextState::CPDF_TextState() {}
+CPDF_TextState::~CPDF_TextState() {}
+
+void CPDF_TextState::Emplace() {
+  m_Ref.Emplace();
+}
+
+CPDF_Font* CPDF_TextState::GetFont() const {
+  return m_Ref.GetObject()->m_pFont;
+}
+
 void CPDF_TextState::SetFont(CPDF_Font* 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;
-  }
+  m_Ref.GetPrivateCopy()->SetFont(pFont);
+}
+
+FX_FLOAT CPDF_TextState::GetFontSize() const {
+  return m_Ref.GetObject()->m_FontSize;
+}
+
+void CPDF_TextState::SetFontSize(FX_FLOAT size) {
+  m_Ref.GetPrivateCopy()->m_FontSize = size;
+}
+
+const FX_FLOAT* CPDF_TextState::GetMatrix() const {
+  return m_Ref.GetObject()->m_Matrix;
+}
+
+FX_FLOAT* CPDF_TextState::GetMutableMatrix() {
+  return m_Ref.GetPrivateCopy()->m_Matrix;
+}
+
+FX_FLOAT CPDF_TextState::GetCharSpace() const {
+  return m_Ref.GetObject()->m_CharSpace;
+}
+
+void CPDF_TextState::SetCharSpace(FX_FLOAT sp) {
+  m_Ref.GetPrivateCopy()->m_CharSpace = sp;
+}
+
+FX_FLOAT CPDF_TextState::GetWordSpace() const {
+  return m_Ref.GetObject()->m_WordSpace;
+}
+
+void CPDF_TextState::SetWordSpace(FX_FLOAT sp) {
+  m_Ref.GetPrivateCopy()->m_WordSpace = sp;
 }
 
 FX_FLOAT CPDF_TextState::GetFontSizeV() const {
-  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);
+  return m_Ref.GetObject()->GetFontSizeV();
 }
 
 FX_FLOAT CPDF_TextState::GetFontSizeH() const {
-  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);
+  return m_Ref.GetObject()->GetFontSizeH();
 }
 
 FX_FLOAT CPDF_TextState::GetBaselineAngle() const {
-  const FX_FLOAT* m_Matrix = GetMatrix();
-  return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
+  return m_Ref.GetObject()->GetBaselineAngle();
 }
 
 FX_FLOAT CPDF_TextState::GetShearAngle() const {
-  const FX_FLOAT* m_Matrix = GetMatrix();
-  FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
-  return GetBaselineAngle() + shear_angle;
+  return m_Ref.GetObject()->GetShearAngle();
+}
+
+TextRenderingMode CPDF_TextState::GetTextMode() const {
+  return m_Ref.GetObject()->m_TextMode;
+}
+
+void CPDF_TextState::SetTextMode(TextRenderingMode mode) {
+  m_Ref.GetPrivateCopy()->m_TextMode = mode;
+}
+
+const FX_FLOAT* CPDF_TextState::GetCTM() const {
+  return m_Ref.GetObject()->m_CTM;
+}
+
+FX_FLOAT* CPDF_TextState::GetMutableCTM() {
+  return m_Ref.GetPrivateCopy()->m_CTM;
 }
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.h b/core/fpdfapi/fpdf_page/cpdf_textstate.h
index 235bdf1..87f0b5c 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.h
+++ b/core/fpdfapi/fpdf_page/cpdf_textstate.h
@@ -8,23 +8,46 @@
 #define CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h"
+#include "core/fxcrt/include/cfx_count_ref.h"
 #include "core/fxcrt/include/fx_basic.h"
 
 class CPDF_Font;
 
-class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData> {
+class CPDF_TextState {
  public:
-  CPDF_Font* GetFont() const { return GetObject()->m_pFont; }
+  CPDF_TextState();
+  ~CPDF_TextState();
+
+  void Emplace();
+
+  CPDF_Font* GetFont() const;
   void SetFont(CPDF_Font* pFont);
 
-  FX_FLOAT GetFontSize() const { return GetObject()->m_FontSize; }
-  const FX_FLOAT* GetMatrix() const { return GetObject()->m_Matrix; }
-  FX_FLOAT* GetMutableMatrix() { return GetPrivateCopy()->m_Matrix; }
+  FX_FLOAT GetFontSize() const;
+  void SetFontSize(FX_FLOAT size);
+
+  const FX_FLOAT* GetMatrix() const;
+  FX_FLOAT* GetMutableMatrix();
+
+  FX_FLOAT GetCharSpace() const;
+  void SetCharSpace(FX_FLOAT sp);
+
+  FX_FLOAT GetWordSpace() const;
+  void SetWordSpace(FX_FLOAT sp);
 
   FX_FLOAT GetFontSizeV() const;
   FX_FLOAT GetFontSizeH() const;
   FX_FLOAT GetBaselineAngle() const;
   FX_FLOAT GetShearAngle() const;
+
+  TextRenderingMode GetTextMode() const;
+  void SetTextMode(TextRenderingMode mode);
+
+  const FX_FLOAT* GetCTM() const;
+  FX_FLOAT* GetMutableCTM();
+
+ private:
+  CFX_CountRef<CPDF_TextStateData> m_Ref;
 };
 
 #endif  // CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp b/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp
index e60af00..17c33a0 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp
@@ -72,3 +72,29 @@
       pPageData->ReleaseFont(m_pFont->GetFontDict());
   }
 }
+
+void CPDF_TextStateData::SetFont(CPDF_Font* pFont) {
+  CPDF_Document* pDoc = m_pDocument;
+  CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
+  if (pPageData && m_pFont && !pPageData->IsForceClear())
+    pPageData->ReleaseFont(m_pFont->GetFontDict());
+
+  m_pDocument = pFont ? pFont->m_pDocument : nullptr;
+  m_pFont = pFont;
+}
+
+FX_FLOAT CPDF_TextStateData::GetFontSizeV() const {
+  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize);
+}
+
+FX_FLOAT CPDF_TextStateData::GetFontSizeH() const {
+  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize);
+}
+
+FX_FLOAT CPDF_TextStateData::GetBaselineAngle() const {
+  return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
+}
+
+FX_FLOAT CPDF_TextStateData::GetShearAngle() const {
+  return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
+}
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index f110103..5560b9c 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -235,10 +235,10 @@
   if (pStates) {
     m_pCurStates->Copy(*pStates);
   } else {
-    m_pCurStates->m_GeneralState.New();
-    m_pCurStates->m_GraphState.New();
-    m_pCurStates->m_TextState.New();
-    m_pCurStates->m_ColorState.New();
+    m_pCurStates->m_GeneralState.Emplace();
+    m_pCurStates->m_GraphState.Emplace();
+    m_pCurStates->m_TextState.Emplace();
+    m_pCurStates->m_ColorState.Emplace();
   }
   for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) {
     m_Type3Data[i] = 0.0;
@@ -823,10 +823,9 @@
   if (m_ClipTextList.empty())
     return;
 
-  if (TextRenderingModeIsClipMode(
-          m_pCurStates->m_TextState.GetObject()->m_TextMode)) {
+  if (TextRenderingModeIsClipMode(m_pCurStates->m_TextState.GetTextMode()))
     m_pCurStates->m_ClipPath.AppendTexts(&m_ClipTextList);
-  }
+
   m_ClipTextList.clear();
 }
 
@@ -1114,7 +1113,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetCharSpace() {
-  m_pCurStates->m_TextState.GetPrivateCopy()->m_CharSpace = GetNumber(0);
+  m_pCurStates->m_TextState.SetCharSpace(GetNumber(0));
 }
 
 void CPDF_StreamContentParser::Handle_MoveTextPoint() {
@@ -1134,7 +1133,7 @@
   if (fs == 0) {
     fs = m_DefFontSize;
   }
-  m_pCurStates->m_TextState.GetPrivateCopy()->m_FontSize = fs;
+  m_pCurStates->m_TextState.SetFontSize(fs);
   CPDF_Font* pFont = FindFont(GetString(1));
   if (pFont) {
     m_pCurStates->m_TextState.SetFont(pFont);
@@ -1243,13 +1242,13 @@
   }
   const TextRenderingMode text_mode =
       pFont->IsType3Font() ? TextRenderingMode::MODE_FILL
-                           : m_pCurStates->m_TextState.GetObject()->m_TextMode;
+                           : m_pCurStates->m_TextState.GetTextMode();
   {
     std::unique_ptr<CPDF_TextObject> pText(new CPDF_TextObject);
     m_pLastTextObject = pText.get();
     SetGraphicStates(m_pLastTextObject, TRUE, TRUE, TRUE);
     if (TextRenderingModeIsStrokeMode(text_mode)) {
-      FX_FLOAT* pCTM = pText->m_TextState.GetPrivateCopy()->m_CTM;
+      FX_FLOAT* pCTM = pText->m_TextState.GetMutableCTM();
       pCTM[0] = m_pCurStates->m_CTM.a;
       pCTM[1] = m_pCurStates->m_CTM.c;
       pCTM[2] = m_pCurStates->m_CTM.b;
@@ -1358,7 +1357,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.GetPrivateCopy()->m_Matrix;
+  FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetMutableMatrix();
   pTextMatrix[0] = text_matrix.a;
   pTextMatrix[1] = text_matrix.c;
   pTextMatrix[2] = text_matrix.b;
@@ -1366,9 +1365,9 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetTextRenderMode() {
-  int mode = GetInteger(0);
-  SetTextRenderingModeFromInt(
-      mode, &m_pCurStates->m_TextState.GetPrivateCopy()->m_TextMode);
+  TextRenderingMode mode;
+  if (SetTextRenderingModeFromInt(GetInteger(0), &mode))
+    m_pCurStates->m_TextState.SetTextMode(mode);
 }
 
 void CPDF_StreamContentParser::Handle_SetTextRise() {
@@ -1376,7 +1375,7 @@
 }
 
 void CPDF_StreamContentParser::Handle_SetWordSpace() {
-  m_pCurStates->m_TextState.GetPrivateCopy()->m_WordSpace = GetNumber(0);
+  m_pCurStates->m_TextState.SetWordSpace(GetNumber(0));
 }
 
 void CPDF_StreamContentParser::Handle_SetHorzScale() {
@@ -1424,8 +1423,8 @@
 }
 
 void CPDF_StreamContentParser::Handle_NextLineShowText_Space() {
-  m_pCurStates->m_TextState.GetPrivateCopy()->m_WordSpace = GetNumber(2);
-  m_pCurStates->m_TextState.GetPrivateCopy()->m_CharSpace = GetNumber(1);
+  m_pCurStates->m_TextState.SetWordSpace(GetNumber(2));
+  m_pCurStates->m_TextState.SetCharSpace(GetNumber(1));
   Handle_NextLineShowText();
 }
 
@@ -1471,7 +1470,7 @@
   if (PathPointCount <= 1) {
     if (PathPointCount && PathClipType) {
       CPDF_Path path;
-      path.New()->AppendRect(0, 0, 0, 0);
+      path.Emplace()->AppendRect(0, 0, 0, 0);
       m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);
     }
     return;
@@ -1481,7 +1480,7 @@
     PathPointCount--;
   }
   CPDF_Path Path;
-  CFX_PathData* pPathData = Path.New();
+  CFX_PathData* pPathData = Path.Emplace();
   pPathData->SetPointCount(PathPointCount);
   FXSYS_memcpy(pPathData->GetPoints(), m_pPathPoints,
                sizeof(FX_PATHPOINT) * PathPointCount);
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index 6fa1df2..e261ce5 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -688,7 +688,7 @@
   CPDF_Path ClipPath;
   if (pBBox) {
     form_bbox = pBBox->GetRect();
-    ClipPath.New();
+    ClipPath.Emplace();
     ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right,
                         form_bbox.top);
     ClipPath.Transform(&form_matrix);
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h b/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h
index 4e33d5f..f3d6696 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h
@@ -34,6 +34,12 @@
   CPDF_TextStateData(const CPDF_TextStateData& src);
   ~CPDF_TextStateData();
 
+  void SetFont(CPDF_Font* pFont);
+  FX_FLOAT GetFontSizeV() const;
+  FX_FLOAT GetFontSizeH() const;
+  FX_FLOAT GetBaselineAngle() const;
+  FX_FLOAT GetShearAngle() const;
+
   CPDF_Font* m_pFont;
   CPDF_Document* m_pDocument;
   FX_FLOAT m_FontSize;
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 16d1235..e5e28b4 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -231,8 +231,7 @@
   if (textobj->m_nChars == 0)
     return TRUE;
 
-  const TextRenderingMode& text_render_mode =
-      textobj->m_TextState.GetObject()->m_TextMode;
+  const TextRenderingMode text_render_mode = textobj->m_TextState.GetTextMode();
   if (text_render_mode == TextRenderingMode::MODE_INVISIBLE)
     return TRUE;
 
@@ -308,7 +307,7 @@
     const CFX_Matrix* pDeviceMatrix = pObj2Device;
     CFX_Matrix device_matrix;
     if (bStroke) {
-      const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;
+      const FX_FLOAT* pCTM = textobj->m_TextState.GetCTM();
       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);
@@ -817,8 +816,8 @@
     path.m_FillType = FXFILL_WINDING;
     path.m_ClipPath.AppendTexts(&pCopy);
     path.m_ColorState = textobj->m_ColorState;
-    path.m_Path.New()->AppendRect(textobj->m_Left, textobj->m_Bottom,
-                                  textobj->m_Right, textobj->m_Top);
+    path.m_Path.Emplace()->AppendRect(textobj->m_Left, textobj->m_Bottom,
+                                      textobj->m_Right, textobj->m_Top);
     path.m_Left = textobj->m_Left;
     path.m_Bottom = textobj->m_Bottom;
     path.m_Right = textobj->m_Right;
@@ -864,7 +863,7 @@
                  charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
     matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX,
                   charpos.m_OriginY);
-    path.m_Path.New()->Append(pPath, &matrix);
+    path.m_Path.Emplace()->Append(pPath, &matrix);
     path.m_Matrix = *pTextMatrix;
     path.m_bStroke = bStroke;
     path.m_FillType = bFill ? FXFILL_WINDING : 0;
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 3981cfe..909e029 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.GetObject()->m_CharSpace && nItems >= 3) {
+  if (pTextObj->m_TextState.GetCharSpace() && nItems >= 3) {
     bool bAllChar = true;
-    FX_FLOAT spacing = matrix.TransformDistance(
-        pTextObj->m_TextState.GetObject()->m_CharSpace);
+    FX_FLOAT spacing =
+        matrix.TransformDistance(pTextObj->m_TextState.GetCharSpace());
     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.GetObject()->m_CharSpace;
+    FX_FLOAT charSpace = pTextObj->m_TextState.GetCharSpace();
     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 7651c93..6cb9f4a 100644
--- a/core/fxcrt/cfx_count_ref_unittest.cpp
+++ b/core/fxcrt/cfx_count_ref_unittest.cpp
@@ -58,7 +58,7 @@
   Observer observer;
   {
     CFX_CountRef<Object> ptr1;
-    ptr1.New(&observer, std::string("one"));
+    ptr1.Emplace(&observer, std::string("one"));
     {
       CFX_CountRef<Object> ptr2 = ptr1;
       EXPECT_EQ(1, observer.GetConstructionCount("one"));
@@ -79,8 +79,8 @@
   Observer observer;
   {
     CFX_CountRef<Object> ptr1;
-    ptr1.New(&observer, std::string("one"));
-    ptr1.New(&observer, std::string("two"));
+    ptr1.Emplace(&observer, std::string("one"));
+    ptr1.Emplace(&observer, std::string("two"));
     EXPECT_EQ(1, observer.GetConstructionCount("one"));
     EXPECT_EQ(1, observer.GetConstructionCount("two"));
     EXPECT_EQ(1, observer.GetDestructionCount("one"));
@@ -93,9 +93,9 @@
   Observer observer;
   {
     CFX_CountRef<Object> ptr1;
-    ptr1.New(&observer, std::string("one"));
+    ptr1.Emplace(&observer, std::string("one"));
     CFX_CountRef<Object> ptr2(ptr1);
-    ptr1.New(&observer, std::string("two"));
+    ptr1.Emplace(&observer, std::string("two"));
     EXPECT_EQ(1, observer.GetConstructionCount("one"));
     EXPECT_EQ(1, observer.GetConstructionCount("two"));
     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 954b72b..aac18b1 100644
--- a/core/fxcrt/include/cfx_count_ref.h
+++ b/core/fxcrt/include/cfx_count_ref.h
@@ -18,7 +18,7 @@
   ~CFX_CountRef() {}
 
   template <typename... Args>
-  ObjClass* New(Args... params) {
+  ObjClass* Emplace(Args... params) {
     m_pObject.Reset(new CountedObj(params...));
     return m_pObject.Get();
   }
@@ -35,7 +35,7 @@
   template <typename... Args>
   ObjClass* GetPrivateCopy(Args... params) {
     if (!m_pObject)
-      return New(params...);
+      return Emplace(params...);
     if (!m_pObject->HasOneRef())
       m_pObject.Reset(new CountedObj(*m_pObject));
     return m_pObject.Get();
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index cf0fd909..9db10ac 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -528,10 +528,7 @@
                     rasterizer.max_x() + 1, rasterizer.max_y() + 1);
   path_rect.Intersect(m_pClipRgn->GetBox());
   CFX_DIBitmapRef mask;
-  CFX_DIBitmap* pThisLayer = mask.New();
-  if (!pThisLayer) {
-    return;
-  }
+  CFX_DIBitmap* pThisLayer = mask.Emplace();
   pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask);
   pThisLayer->Clear(0);
   agg::rendering_buffer raw_buf(pThisLayer->GetBuffer(), pThisLayer->GetWidth(),
diff --git a/core/fxge/ge/cfx_cliprgn.cpp b/core/fxge/ge/cfx_cliprgn.cpp
index 41975e4..ba2605a 100644
--- a/core/fxge/ge/cfx_cliprgn.cpp
+++ b/core/fxge/ge/cfx_cliprgn.cpp
@@ -49,9 +49,7 @@
     m_Mask = Mask;
     return;
   }
-  CFX_DIBitmap* new_dib = m_Mask.New();
-  if (!new_dib)
-    return;
+  CFX_DIBitmap* new_dib = m_Mask.Emplace();
   new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);
   for (int row = m_Box.top; row < m_Box.bottom; row++) {
     uint8_t* dest_scan =
@@ -82,9 +80,7 @@
       return;
     }
     CFX_DIBitmapRef new_mask;
-    CFX_DIBitmap* new_dib = new_mask.New();
-    if (!new_dib)
-      return;
+    CFX_DIBitmap* new_dib = new_mask.Emplace();
     new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);
     const CFX_DIBitmap* old_dib = m_Mask.GetObject();
     for (int row = new_box.top; row < new_box.bottom; row++) {
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index 479fa97..098ef7f 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -161,16 +161,17 @@
                                          const CFX_FloatPoint& point,
                                          const CFX_ByteString& text) {
   std::unique_ptr<CPDF_TextObject> pTxtObj(new CPDF_TextObject);
-  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;
+  pTxtObj->m_TextState.SetFont(pFont);
+  pTxtObj->m_TextState.SetFontSize(fFontSize);
+  pTxtObj->m_TextState.SetCharSpace(fCharSpace);
+  pTxtObj->m_TextState.SetWordSpace(0);
+  pTxtObj->m_TextState.SetTextMode(TextRenderingMode::MODE_FILL);
+
+  FX_FLOAT* matrix = pTxtObj->m_TextState.GetMutableMatrix();
+  matrix[0] = nHorzScale / 100.0f;
+  matrix[1] = 0;
+  matrix[2] = 0;
+  matrix[3] = 1;
 
   FX_FLOAT rgb[3];
   rgb[0] = FXARGB_R(crText) / 255.0f;
