Fix issue with FPDFText_GetLooseCharBox() and the tranformation matrix.
Take the tranformation matrix into account, so
FPDFText_GetLooseCharBox() behavior is more consistent with
FPDFText_GetCharBox() behavior.
Bug: pdfium:1465
Change-Id: Ie12c0a6ede84b7dcbf317273e1b0189d1533e369
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/71878
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp
index 5b5ca93..3ec62e3 100644
--- a/fpdfsdk/fpdf_text.cpp
+++ b/fpdfsdk/fpdf_text.cpp
@@ -266,8 +266,9 @@
int ascent = charinfo.m_pTextObj->GetFont()->GetTypeAscent();
int descent = charinfo.m_pTextObj->GetFont()->GetTypeDescent();
if (ascent != descent) {
- float width = charinfo.m_pTextObj->GetCharWidth(charinfo.m_CharCode);
- float font_scale = font_size / (ascent - descent);
+ float width = charinfo.m_Matrix.a *
+ charinfo.m_pTextObj->GetCharWidth(charinfo.m_CharCode);
+ float font_scale = charinfo.m_Matrix.a * font_size / (ascent - descent);
rect->left = charinfo.m_Origin.x;
rect->right = charinfo.m_Origin.x + (is_vert_writing ? -width : width);
diff --git a/fpdfsdk/fpdf_text_embeddertest.cpp b/fpdfsdk/fpdf_text_embeddertest.cpp
index d82d327..7e7160a 100644
--- a/fpdfsdk/fpdf_text_embeddertest.cpp
+++ b/fpdfsdk/fpdf_text_embeddertest.cpp
@@ -1590,14 +1590,13 @@
EXPECT_NEAR(kExpectedCharHeight, top - bottom, 0.001);
// Check the loose character box size.
- // TODO(crbug.com/pdfium/1465): There should be no division here.
FS_RECTF rect;
ASSERT_TRUE(FPDFText_GetLooseCharBox(text_page.get(), 0, &rect));
- EXPECT_FLOAT_EQ(kExpectedLooseCharWidth / 12, rect.right - rect.left);
- EXPECT_FLOAT_EQ(kExpectedLooseCharHeight / 12, rect.top - rect.bottom);
+ EXPECT_FLOAT_EQ(kExpectedLooseCharWidth, rect.right - rect.left);
+ EXPECT_FLOAT_EQ(kExpectedLooseCharHeight, rect.top - rect.bottom);
ASSERT_TRUE(FPDFText_GetLooseCharBox(text_page.get(), 4, &rect));
- EXPECT_FLOAT_EQ(kExpectedLooseCharWidth / 12, rect.right - rect.left);
- EXPECT_FLOAT_EQ(kExpectedLooseCharHeight / 12, rect.top - rect.bottom);
+ EXPECT_FLOAT_EQ(kExpectedLooseCharWidth, rect.right - rect.left);
+ EXPECT_FLOAT_EQ(kExpectedLooseCharHeight, rect.top - rect.bottom);
ASSERT_TRUE(FPDFText_GetLooseCharBox(text_page.get(), 8, &rect));
EXPECT_FLOAT_EQ(kExpectedLooseCharWidth, rect.right - rect.left);
EXPECT_FLOAT_EQ(kExpectedLooseCharHeight, rect.top - rect.bottom);