diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index fc7e97f..593680e 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -388,7 +388,7 @@
   *buf << "/" << PDF_NameEncode(dictName) << " " << pTextObj->GetFontSize()
        << " Tf ";
   ByteString text;
-  for (uint32_t charcode : pTextObj->m_CharCodes) {
+  for (uint32_t charcode : pTextObj->GetCharCodes()) {
     if (charcode != CPDF_Font::kInvalidCharCode)
       pFont->AppendChar(&text, charcode);
   }
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 47aa209..4ba1d2a 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1262,10 +1262,11 @@
       pCTM[3] = m_pCurStates->m_CTM.d;
     }
     pText->SetSegments(pStrs, pKerning, nsegs);
-    pText->m_Pos = m_mtContentToUser.Transform(
-        m_pCurStates->m_CTM.Transform(m_pCurStates->m_TextMatrix.Transform(
-            CFX_PointF(m_pCurStates->m_TextPos.x,
-                       m_pCurStates->m_TextPos.y + m_pCurStates->m_TextRise))));
+    pText->SetPosition(
+        m_mtContentToUser.Transform(m_pCurStates->m_CTM.Transform(
+            m_pCurStates->m_TextMatrix.Transform(CFX_PointF(
+                m_pCurStates->m_TextPos.x,
+                m_pCurStates->m_TextPos.y + m_pCurStates->m_TextRise)))));
 
     m_pCurStates->m_TextPos +=
         pText->CalcPositionData(m_pCurStates->m_TextHorzScale);
diff --git a/core/fpdfapi/page/cpdf_textobject.h b/core/fpdfapi/page/cpdf_textobject.h
index 5cffbd1..02653dc 100644
--- a/core/fpdfapi/page/cpdf_textobject.h
+++ b/core/fpdfapi/page/cpdf_textobject.h
@@ -48,20 +48,18 @@
   float GetFontSize() const;
 
   void SetText(const ByteString& text);
+  void SetPosition(CFX_PointF pos) { m_Pos = pos; }
   void SetPosition(float x, float y);
 
   void RecalcPositionData();
 
- private:
-  friend class CPDF_RenderStatus;
-  friend class CPDF_StreamContentParser;
-  friend class CPDF_TextRenderer;
-  friend class CPDF_PageContentGenerator;
+  const std::vector<uint32_t>& GetCharCodes() const { return m_CharCodes; }
+  const std::vector<float>& GetCharPositions() const { return m_CharPos; }
 
   void SetSegments(const ByteString* pStrs, const float* pKerning, int nSegs);
-
   CFX_PointF CalcPositionData(float horz_scale);
 
+ private:
   CFX_PointF m_Pos;
   std::vector<uint32_t> m_CharCodes;
   std::vector<float> m_CharPos;
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index b493949..9061430 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1590,7 +1590,7 @@
 
       CFX_Matrix text_matrix = textobj->GetTextMatrix();
       CPDF_TextRenderer::DrawTextPath(
-          &text_device, textobj->m_CharCodes, textobj->m_CharPos,
+          &text_device, textobj->GetCharCodes(), textobj->GetCharPositions(),
           textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(),
           &text_matrix, &new_matrix, textobj->m_GraphState.GetObject(),
           (FX_ARGB)-1, 0, nullptr, 0);
@@ -1712,7 +1712,7 @@
 bool CPDF_RenderStatus::ProcessText(CPDF_TextObject* textobj,
                                     const CFX_Matrix* pObj2Device,
                                     CFX_PathData* pClippingPath) {
-  if (textobj->m_CharCodes.empty())
+  if (textobj->GetCharCodes().empty())
     return true;
 
   const TextRenderingMode text_render_mode = textobj->m_TextState.GetTextMode();
@@ -1805,14 +1805,15 @@
     if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH)
       flag |= FXFILL_NOPATHSMOOTH;
     return CPDF_TextRenderer::DrawTextPath(
-        m_pDevice, textobj->m_CharCodes, textobj->m_CharPos, pFont, font_size,
-        &text_matrix, pDeviceMatrix, textobj->m_GraphState.GetObject(),
-        fill_argb, stroke_argb, pClippingPath, flag);
+        m_pDevice, textobj->GetCharCodes(), textobj->GetCharPositions(), pFont,
+        font_size, &text_matrix, pDeviceMatrix,
+        textobj->m_GraphState.GetObject(), fill_argb, stroke_argb,
+        pClippingPath, flag);
   }
   text_matrix.Concat(*pObj2Device);
-  return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_CharCodes,
-                                           textobj->m_CharPos, pFont, font_size,
-                                           &text_matrix, fill_argb, &m_Options);
+  return CPDF_TextRenderer::DrawNormalText(
+      m_pDevice, textobj->GetCharCodes(), textobj->GetCharPositions(), pFont,
+      font_size, &text_matrix, fill_argb, &m_Options);
 }
 
 RetainPtr<CPDF_Type3Cache> CPDF_RenderStatus::GetCachedType3(
@@ -1844,14 +1845,14 @@
   int device_class = m_pDevice->GetDeviceClass();
   std::vector<FXTEXT_GLYPHPOS> glyphs;
   if (device_class == FXDC_DISPLAY)
-    glyphs.resize(textobj->m_CharCodes.size());
+    glyphs.resize(textobj->GetCharCodes().size());
   else if (fill_alpha < 255)
     return false;
 
   CPDF_RefType3Cache refTypeCache(pType3Font);
-  for (int iChar = 0; iChar < pdfium::CollectionSize<int>(textobj->m_CharCodes);
-       iChar++) {
-    uint32_t charcode = textobj->m_CharCodes[iChar];
+  for (int iChar = 0;
+       iChar < pdfium::CollectionSize<int>(textobj->GetCharCodes()); iChar++) {
+    uint32_t charcode = textobj->GetCharCodes()[iChar];
     if (charcode == static_cast<uint32_t>(-1))
       continue;
 
@@ -1860,7 +1861,7 @@
       continue;
 
     CFX_Matrix matrix = char_matrix;
-    matrix.e += iChar ? textobj->m_CharPos[iChar - 1] : 0;
+    matrix.e += iChar ? textobj->GetCharPositions()[iChar - 1] : 0;
     matrix.Concat(text_matrix);
     matrix.Concat(*pObj2Device);
     if (!pType3Char->LoadBitmap(m_pContext.Get())) {
@@ -2014,7 +2015,8 @@
     return;
   }
   CPDF_CharPosList CharPosList;
-  CharPosList.Load(textobj->m_CharCodes, textobj->m_CharPos, pFont, font_size);
+  CharPosList.Load(textobj->GetCharCodes(), textobj->GetCharPositions(), pFont,
+                   font_size);
   for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
     FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];
     auto* font = charpos.m_FallbackFontPosition == -1
