Save loose char box values in CPDF_TextPage::CharInfo

Calculate loose char box values once per text page load, to be
consistent with other char info fields. Then repeated
FPDFText_GetLooseCharBox() calls won't have to recalculate the loose
char box values.

Change-Id: Ibf4101c503a24658944b0e1fe6ee5ae9f412ede1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/128812
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 5d2d41f..657e305 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -339,7 +339,9 @@
       origin_(origin),
       char_box_(char_box),
       matrix_(matrix),
-      text_object_(text_object) {}
+      text_object_(text_object) {
+  loose_char_box_ = GetLooseBounds(*this);
+}
 
 CPDF_TextPage::CharInfo::CharInfo(const CharInfo&) = default;
 
@@ -550,7 +552,8 @@
 }
 
 CFX_FloatRect CPDF_TextPage::GetCharLooseBounds(size_t index) const {
-  return GetLooseBounds(GetCharInfo(index));
+  CHECK_LT(index, m_CharList.size());
+  return m_CharList[index].loose_char_box();
 }
 
 WideString CPDF_TextPage::GetPageText(int start, int count) const {
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index a47d059..4ab40d6 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -67,6 +67,7 @@
     const CFX_PointF& origin() const { return origin_; }
 
     const CFX_FloatRect& char_box() const { return char_box_; }
+    const CFX_FloatRect& loose_char_box() const { return loose_char_box_; }
 
     const CFX_Matrix& matrix() const { return matrix_; }
 
@@ -79,6 +80,7 @@
     uint32_t char_code_ = 0;
     CFX_PointF origin_;
     CFX_FloatRect char_box_;
+    CFX_FloatRect loose_char_box_;
     CFX_Matrix matrix_;
     UnownedPtr<CPDF_TextObject> text_object_;
   };