Avoid loose bounds for invalid char codes

The current loose bounds computation assumes that the
CharInfo::char_code_ is valid. When the char code isn't valid the loose
bounds width will be zero.

In addition, the /ActualText kPiece currently attempt to store a valid
char code. However, this is incorrect as the text did not originate from
any char code. An incorrect char code could lead to the loose bounds
being calculated from a completely different glyph than that which was
used for drawing.

Bug: 42271607
Change-Id: Ie2d2d41287322f3aa3b28192d72f3a8301577d91
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/133370
Reviewed-by: Ben Wagner <bungeman@google.com>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Ben Wagner <bungeman@google.com>
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index cbb2b40..204def4 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -284,7 +284,8 @@
 
   const CPDF_TextObject* text_object = charinfo.text_object();
   float font_size = GetFontSize(text_object);
-  if (text_object && !FXSYS_IsFloatZero(font_size)) {
+  if (text_object && !FXSYS_IsFloatZero(font_size) &&
+      charinfo.char_code() != CPDF_Font::kInvalidCharCode) {
     RetainPtr<CPDF_Font> font = text_object->GetFont();
     bool is_vert_writing = font->IsVertWriting();
     if (is_vert_writing && font->IsCIDFont()) {
@@ -1038,7 +1039,7 @@
     char_box.Translate(k * step, 0);
     temp_text_buf_.AppendChar(wChar);
     temp_char_list_.push_back(
-        CharInfo(CharType::kPiece, font->CharCodeFromUnicode(wChar), wChar,
+        CharInfo(CharType::kPiece, CPDF_Font::kInvalidCharCode, wChar,
                  pTextObj->GetPos(), char_box, matrix, pTextObj));
   }
 }