Use signed widths consistently in CFGAS_TxtBreak.

CFGAS_TxtBreak::AppendChar_Combination() may return a negative width
for combining characters, so ensure it isn't cast back-and-forth to
size_t.

Bug: chromium:1333307
Change-Id: Ibf05bb9159f6ab233069c43296e0e88156f94333
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/94230
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index 05823e8..42c07ab 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -896,7 +896,7 @@
              : content_[gap_position_ + gap_size_ + (idx - gap_position_)];
 }
 
-size_t CFDE_TextEditEngine::GetWidthOfChar(size_t idx) {
+int32_t CFDE_TextEditEngine::GetWidthOfChar(size_t idx) {
   // Recalculate the widths if necessary.
   Layout();
   return idx < char_widths_.size() ? char_widths_[idx] : 0;
diff --git a/xfa/fde/cfde_texteditengine.h b/xfa/fde/cfde_texteditengine.h
index 9195191..00aa2d8 100644
--- a/xfa/fde/cfde_texteditengine.h
+++ b/xfa/fde/cfde_texteditengine.h
@@ -90,7 +90,7 @@
 
   // CFGAS_TxtBreak::Engine:
   wchar_t GetChar(size_t idx) const override;
-  size_t GetWidthOfChar(size_t idx) override;
+  int32_t GetWidthOfChar(size_t idx) override;
 
   void SetDelegate(Delegate* delegate) { delegate_ = delegate; }
   void Clear();
@@ -213,7 +213,7 @@
   CFX_RectF contents_bounding_box_;
   UnownedPtr<Delegate> delegate_;
   std::vector<FDE_TEXTEDITPIECE> text_piece_info_;
-  std::vector<size_t> char_widths_;
+  std::vector<int32_t> char_widths_;  // May be negative for combining chars.
   CFGAS_TxtBreak text_break_;
   RetainPtr<CFGAS_GEFont> font_;
   FX_ARGB font_color_ = 0xff000000;
diff --git a/xfa/fde/cfde_texteditengine_unittest.cpp b/xfa/fde/cfde_texteditengine_unittest.cpp
index 36c4d35..380d91f 100644
--- a/xfa/fde/cfde_texteditengine_unittest.cpp
+++ b/xfa/fde/cfde_texteditengine_unittest.cpp
@@ -265,14 +265,14 @@
 
 TEST_F(CFDE_TextEditEngineTest, GetWidthOfChar) {
   // Out of Bounds.
-  EXPECT_EQ(0U, engine()->GetWidthOfChar(0));
+  EXPECT_EQ(0, engine()->GetWidthOfChar(0));
 
   engine()->Insert(0, L"Hello World");
-  EXPECT_EQ(173280U, engine()->GetWidthOfChar(0));
-  EXPECT_EQ(133440U, engine()->GetWidthOfChar(1));
+  EXPECT_EQ(173280, engine()->GetWidthOfChar(0));
+  EXPECT_EQ(133440, engine()->GetWidthOfChar(1));
 
   engine()->Insert(0, L"\t");
-  EXPECT_EQ(0U, engine()->GetWidthOfChar(0));
+  EXPECT_EQ(0, engine()->GetWidthOfChar(0));
 }
 
 TEST_F(CFDE_TextEditEngineTest, GetDisplayPos) {
diff --git a/xfa/fgas/layout/cfgas_txtbreak.cpp b/xfa/fgas/layout/cfgas_txtbreak.cpp
index 6d677ef..fc2dc7b 100644
--- a/xfa/fgas/layout/cfgas_txtbreak.cpp
+++ b/xfa/fgas/layout/cfgas_txtbreak.cpp
@@ -677,8 +677,7 @@
     wchar_t wch;
     if (pEngine) {
       wch = pEngine->GetChar(iAbsolute);
-      iWidth = pdfium::base::checked_cast<int32_t>(
-          pEngine->GetWidthOfChar(iAbsolute));
+      iWidth = pEngine->GetWidthOfChar(iAbsolute);
     } else {
       wch = *pStr++;
       iWidth = *pWidths++;
@@ -905,8 +904,7 @@
     if (pEngine) {
       int32_t iAbsolute = i + run.iStart;
       wch = pEngine->GetChar(iAbsolute);
-      iCharSize = pdfium::base::checked_cast<int32_t>(
-          pEngine->GetWidthOfChar(iAbsolute));
+      iCharSize = pEngine->GetWidthOfChar(iAbsolute);
     } else {
       wch = *pStr++;
       iCharSize = *pWidths++;
diff --git a/xfa/fgas/layout/cfgas_txtbreak.h b/xfa/fgas/layout/cfgas_txtbreak.h
index 283e8c6..618853e 100644
--- a/xfa/fgas/layout/cfgas_txtbreak.h
+++ b/xfa/fgas/layout/cfgas_txtbreak.h
@@ -39,8 +39,9 @@
    public:
     virtual ~Engine();
     virtual wchar_t GetChar(size_t idx) const = 0;
-    // Non-const so we can force a layout if needed.
-    virtual size_t GetWidthOfChar(size_t idx) = 0;
+    // May return negative for combining characters. Non-const so we can force
+    // a layout if needed.
+    virtual int32_t GetWidthOfChar(size_t idx) = 0;
   };
 
   struct Run {