Add FPDFTextEmbedderTest.BigtableTextRects

Demonstrate how FPDFText_CountRects() and FPDFText_GetRect() behaves
with bigtable_mini.pdf. FPDFText_CountRects() does not do a good job
merging text rects together for text on the same line with the same font
and font size.

Bug: 40448046
Change-Id: I6776bf36bd54c756838874860dffbe4a3bbca1de
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/124710
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_text_embeddertest.cpp b/fpdfsdk/fpdf_text_embeddertest.cpp
index 9b3276e..7e2976c 100644
--- a/fpdfsdk/fpdf_text_embeddertest.cpp
+++ b/fpdfsdk/fpdf_text_embeddertest.cpp
@@ -1787,6 +1787,51 @@
   }
 }
 
+TEST_F(FPDFTextEmbedderTest, BigtableTextRects) {
+  struct TextRect {
+    double left;
+    double top;
+    double right;
+    double bottom;
+  };
+  // TODO(crbug.com/40448046): The PDF uses fonts [/F2, /F1, /F2, /F1] with a
+  // constant size on a single line. FPDFText_CountRects() should merge the text
+  // into 4 rects.
+  constexpr auto kExpectedRects = fxcrt::ToArray<TextRect>({
+      {7.0195, 657.8847, 10.3102, 648.9273},
+      {11.1978, 657.4722, 13.9057, 651.1599},
+      {14.1085, 655.3652, 22.2230, 649.2321},
+      {21.9279, 657.4722, 33.2883, 649.2590},
+      {33.3711, 657.4722, 61.1938, 649.2321},
+      {60.8897, 657.3826, 97.9119, 649.7881},
+      {98.0787, 655.3831, 107.6010, 651.0792},
+      {107.6535, 657.3826, 149.5713, 649.7881},
+      {149.5072, 657.3826, 158.1329, 649.7881},
+      {161.1511, 657.3826, 193.8335, 649.2321},
+      {194.4253, 657.8847, 197.7160, 648.9273},
+      {198.8009, 657.3826, 248.5284, 649.2321},
+  });
+
+  ASSERT_TRUE(OpenDocument("bigtable_mini.pdf"));
+  ScopedEmbedderTestPage page = LoadScopedPage(0);
+  ASSERT_TRUE(page);
+
+  ScopedFPDFTextPage textpage(FPDFText_LoadPage(page.get()));
+  ASSERT_TRUE(textpage);
+
+  ASSERT_EQ(65, FPDFText_CountChars(textpage.get()));
+  ASSERT_EQ(12, FPDFText_CountRects(textpage.get(), 0, 65));
+  for (size_t i = 0; i < kExpectedRects.size(); ++i) {
+    TextRect result;
+    ASSERT_TRUE(FPDFText_GetRect(textpage.get(), i, &result.left, &result.top,
+                                 &result.right, &result.bottom));
+    EXPECT_NEAR(kExpectedRects[i].left, result.left, 0.001);
+    EXPECT_NEAR(kExpectedRects[i].top, result.top, 0.001);
+    EXPECT_NEAR(kExpectedRects[i].right, result.right, 0.001);
+    EXPECT_NEAR(kExpectedRects[i].bottom, result.bottom, 0.001);
+  }
+}
+
 TEST_F(FPDFTextEmbedderTest, Bug1769) {
   ASSERT_TRUE(OpenDocument("bug_1769.pdf"));
   ScopedEmbedderTestPage page = LoadScopedPage(0);