Encapsulate CPDF_CharPosList.

Also merge Load() into the ctor.

Change-Id: Idbdd1b29d12a9a29d547db7bf25c8b7517f9d68e
Reviewed-on: https://pdfium-review.googlesource.com/c/50075
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_charposlist.cpp b/core/fpdfapi/render/cpdf_charposlist.cpp
index 9c89ba4..b59564d 100644
--- a/core/fpdfapi/render/cpdf_charposlist.cpp
+++ b/core/fpdfapi/render/cpdf_charposlist.cpp
@@ -11,16 +11,10 @@
 #include "core/fxge/cfx_renderdevice.h"
 #include "core/fxge/cfx_substfont.h"
 
-CPDF_CharPosList::CPDF_CharPosList() = default;
-
-CPDF_CharPosList::~CPDF_CharPosList() {
-  FX_Free(m_pCharPos);
-}
-
-void CPDF_CharPosList::Load(const std::vector<uint32_t>& charCodes,
-                            const std::vector<float>& charPos,
-                            CPDF_Font* pFont,
-                            float FontSize) {
+CPDF_CharPosList::CPDF_CharPosList(const std::vector<uint32_t>& charCodes,
+                                   const std::vector<float>& charPos,
+                                   CPDF_Font* pFont,
+                                   float FontSize) {
   m_pCharPos = FX_Alloc(TextCharPos, charCodes.size());
   m_nChars = 0;
   CPDF_CIDFont* pCIDFont = pFont->AsCIDFont();
@@ -118,3 +112,15 @@
     }
   }
 }
+
+CPDF_CharPosList::~CPDF_CharPosList() {
+  FX_Free(m_pCharPos);
+}
+
+uint32_t CPDF_CharPosList::GetCount() const {
+  return m_nChars;
+}
+
+const TextCharPos& CPDF_CharPosList::GetAt(size_t index) const {
+  return m_pCharPos[index];
+}
diff --git a/core/fpdfapi/render/cpdf_charposlist.h b/core/fpdfapi/render/cpdf_charposlist.h
index f2c5f44..a8872a0 100644
--- a/core/fpdfapi/render/cpdf_charposlist.h
+++ b/core/fpdfapi/render/cpdf_charposlist.h
@@ -16,14 +16,17 @@
 
 class CPDF_CharPosList {
  public:
-  CPDF_CharPosList();
+  CPDF_CharPosList(const std::vector<uint32_t>& charCodes,
+                   const std::vector<float>& charPos,
+                   CPDF_Font* pFont,
+                   float font_size);
   ~CPDF_CharPosList();
 
-  void Load(const std::vector<uint32_t>& charCodes,
-            const std::vector<float>& charPos,
-            CPDF_Font* pFont,
-            float font_size);
+  uint32_t empty() const { return m_nChars == 0; }
+  uint32_t GetCount() const;
+  const TextCharPos& GetAt(size_t index) const;
 
+ private:
   // TODO(thestig): Convert to unique_ptr or vector.
   TextCharPos* m_pCharPos = nullptr;
   uint32_t m_nChars = 0;
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 5af2af8..4a6ee85 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1977,11 +1977,10 @@
     RenderSingleObject(&path, mtObj2Device);
     return;
   }
-  CPDF_CharPosList CharPosList;
-  CharPosList.Load(textobj->GetCharCodes(), textobj->GetCharPositions(), pFont,
-                   font_size);
-  for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
-    TextCharPos& charpos = CharPosList.m_pCharPos[i];
+  CPDF_CharPosList CharPosList(textobj->GetCharCodes(),
+                               textobj->GetCharPositions(), pFont, font_size);
+  for (uint32_t i = 0; i < CharPosList.GetCount(); ++i) {
+    const TextCharPos& charpos = CharPosList.GetAt(i);
     auto* font = charpos.m_FallbackFontPosition == -1
                      ? pFont->GetFont()
                      : pFont->GetFontFallback(charpos.m_FallbackFontPosition);
diff --git a/core/fpdfapi/render/cpdf_textrenderer.cpp b/core/fpdfapi/render/cpdf_textrenderer.cpp
index 1bf81ed..ee93418 100644
--- a/core/fpdfapi/render/cpdf_textrenderer.cpp
+++ b/core/fpdfapi/render/cpdf_textrenderer.cpp
@@ -37,34 +37,33 @@
                                      FX_ARGB stroke_argb,
                                      CFX_PathData* pClippingPath,
                                      int nFlag) {
-  CPDF_CharPosList CharPosList;
-  CharPosList.Load(charCodes, charPos, pFont, font_size);
-  if (CharPosList.m_nChars == 0)
+  CPDF_CharPosList CharPosList(charCodes, charPos, pFont, font_size);
+  if (CharPosList.empty())
     return true;
 
   bool bDraw = true;
-  int32_t fontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition;
+  int32_t fontPosition = CharPosList.GetAt(0).m_FallbackFontPosition;
   uint32_t startIndex = 0;
-  for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
-    int32_t curFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition;
+  for (uint32_t i = 0; i < CharPosList.GetCount(); ++i) {
+    int32_t curFontPosition = CharPosList.GetAt(i).m_FallbackFontPosition;
     if (fontPosition == curFontPosition)
       continue;
 
     CFX_Font* font = GetFont(pFont, fontPosition);
-    if (!pDevice->DrawTextPath(i - startIndex,
-                               CharPosList.m_pCharPos + startIndex, font,
-                               font_size, pText2User, pUser2Device, pGraphState,
-                               fill_argb, stroke_argb, pClippingPath, nFlag)) {
+    if (!pDevice->DrawTextPath(i - startIndex, &CharPosList.GetAt(startIndex),
+                               font, font_size, pText2User, pUser2Device,
+                               pGraphState, fill_argb, stroke_argb,
+                               pClippingPath, nFlag)) {
       bDraw = false;
     }
     fontPosition = curFontPosition;
     startIndex = i;
   }
   CFX_Font* font = GetFont(pFont, fontPosition);
-  if (!pDevice->DrawTextPath(CharPosList.m_nChars - startIndex,
-                             CharPosList.m_pCharPos + startIndex, font,
-                             font_size, pText2User, pUser2Device, pGraphState,
-                             fill_argb, stroke_argb, pClippingPath, nFlag)) {
+  if (!pDevice->DrawTextPath(CharPosList.GetCount() - startIndex,
+                             &CharPosList.GetAt(startIndex), font, font_size,
+                             pText2User, pUser2Device, pGraphState, fill_argb,
+                             stroke_argb, pClippingPath, nFlag)) {
     bDraw = false;
   }
   return bDraw;
@@ -116,9 +115,8 @@
                                        const CFX_Matrix* pText2Device,
                                        FX_ARGB fill_argb,
                                        const CPDF_RenderOptions* pOptions) {
-  CPDF_CharPosList CharPosList;
-  CharPosList.Load(charCodes, charPos, pFont, font_size);
-  if (CharPosList.m_nChars == 0)
+  CPDF_CharPosList CharPosList(charCodes, charPos, pFont, font_size);
+  if (CharPosList.empty())
     return true;
   int FXGE_flags = 0;
   if (pOptions) {
@@ -141,27 +139,26 @@
   if (pFont->IsCIDFont())
     FXGE_flags |= FXFONT_CIDFONT;
   bool bDraw = true;
-  int32_t fontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition;
+  int32_t fontPosition = CharPosList.GetAt(0).m_FallbackFontPosition;
   uint32_t startIndex = 0;
-  for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
-    int32_t curFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition;
+  for (uint32_t i = 0; i < CharPosList.GetCount(); ++i) {
+    int32_t curFontPosition = CharPosList.GetAt(i).m_FallbackFontPosition;
     if (fontPosition == curFontPosition)
       continue;
 
     CFX_Font* font = GetFont(pFont, fontPosition);
-    if (!pDevice->DrawNormalText(
-            i - startIndex, CharPosList.m_pCharPos + startIndex, font,
-            font_size, pText2Device, fill_argb, FXGE_flags)) {
+    if (!pDevice->DrawNormalText(i - startIndex, &CharPosList.GetAt(startIndex),
+                                 font, font_size, pText2Device, fill_argb,
+                                 FXGE_flags)) {
       bDraw = false;
     }
     fontPosition = curFontPosition;
     startIndex = i;
   }
   CFX_Font* font = GetFont(pFont, fontPosition);
-  if (!pDevice->DrawNormalText(CharPosList.m_nChars - startIndex,
-                               CharPosList.m_pCharPos + startIndex, font,
-                               font_size, pText2Device, fill_argb,
-                               FXGE_flags)) {
+  if (!pDevice->DrawNormalText(CharPosList.GetCount() - startIndex,
+                               &CharPosList.GetAt(startIndex), font, font_size,
+                               pText2Device, fill_argb, FXGE_flags)) {
     bDraw = false;
   }
   return bDraw;