Introduce FPDFPageObj_GetMatrix() and FPDFPageObj_SetMatrix().
These new public APIs are easier for callers to use. The caller can call
the same API for all FPDF_PAGEOBJECTs, and no longer need to choose an
API based on the object type. For FPDFImageObj_GetMatrix() and
FPDFImageObj_SetMatrix(), the new replacement takes a single FS_MATRIX
parameter, instead of 6 matrix components.
All the replaced public APIs are immediately deleted at the same time,
as they are all experimental, with the exception of
FPDFImageObj_SetMatrix(), which is stable.
FPDFPageObj_GetMatrix() replaces:
- FPDFFormObj_GetMatrix()
- FPDFImageObj_GetMatrix()
- FPDFPath_GetMatrix()
- FPDFTextObj_GetMatrix()
FPDFPageObj_SetMatrix() replaces:
- FPDFImageObj_SetMatrix()
- FPDFPath_SetMatrix()
FPDFPageObj_SetMatrix() cannot set the matrix for form objects and text
objects yet.
Change-Id: I0fa19291c9953ac19a7b8c105bdc7a9b5563ffc8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/82612
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp
index f77fef0..65bd92c 100644
--- a/fpdfsdk/fpdf_annot_embeddertest.cpp
+++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -1396,8 +1396,9 @@
EXPECT_EQ(kBitmapSize, FPDFBitmap_GetHeight(image_bitmap));
FPDF_PAGEOBJECT image_object = FPDFPageObj_NewImageObj(document());
ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, image_object, image_bitmap));
- ASSERT_TRUE(FPDFImageObj_SetMatrix(image_object, kBitmapSize, 0, 0,
- kBitmapSize, 0, 0));
+ static constexpr FS_MATRIX kBitmapScaleMatrix{kBitmapSize, 0, 0,
+ kBitmapSize, 0, 0};
+ ASSERT_TRUE(FPDFPageObj_SetMatrix(image_object, &kBitmapScaleMatrix));
FPDFPageObj_Transform(image_object, 1, 0, 0, 1, 200, 600);
EXPECT_TRUE(FPDFAnnot_AppendObject(annot.get(), image_object));
}
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 53d764a..999e8e9 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -335,7 +335,8 @@
FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImageObj(temp_doc);
EXPECT_TRUE(
FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, orig_bitmap.get()));
- EXPECT_TRUE(FPDFImageObj_SetMatrix(temp_img, 612, 0, 0, 792, 0, 0));
+ static constexpr FS_MATRIX kLetterScaleMatrix{612, 0, 0, 792, 0, 0};
+ EXPECT_TRUE(FPDFPageObj_SetMatrix(temp_img, &kLetterScaleMatrix));
FPDFPage_InsertObject(temp_page, temp_img);
EXPECT_TRUE(FPDFPage_GenerateContent(temp_page));
EXPECT_TRUE(FPDF_SaveAsCopy(temp_doc, this, 0));
@@ -371,13 +372,11 @@
EXPECT_EQ(FPDF_FILLMODE_ALTERNATE, fillmode);
EXPECT_FALSE(stroke);
- static const FS_MATRIX kMatrix = {1, 2, 3, 4, 5, 6};
- EXPECT_FALSE(FPDFPath_SetMatrix(nullptr, &kMatrix));
- EXPECT_TRUE(FPDFPath_SetMatrix(red_rect, &kMatrix));
+ static constexpr FS_MATRIX kMatrix = {1, 2, 3, 4, 5, 6};
+ EXPECT_TRUE(FPDFPageObj_SetMatrix(red_rect, &kMatrix));
FS_MATRIX matrix;
- EXPECT_FALSE(FPDFPath_GetMatrix(nullptr, &matrix));
- EXPECT_TRUE(FPDFPath_GetMatrix(red_rect, &matrix));
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(red_rect, &matrix));
EXPECT_FLOAT_EQ(1.0f, matrix.a);
EXPECT_FLOAT_EQ(2.0f, matrix.b);
EXPECT_FLOAT_EQ(3.0f, matrix.c);
@@ -387,7 +386,7 @@
// Set back the identity matrix.
matrix = {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f};
- EXPECT_TRUE(FPDFPath_SetMatrix(red_rect, &matrix));
+ EXPECT_TRUE(FPDFPageObj_SetMatrix(red_rect, &matrix));
FPDFPage_InsertObject(page, red_rect);
{
@@ -2285,8 +2284,7 @@
}
FS_MATRIX matrix;
- EXPECT_FALSE(FPDFTextObj_GetMatrix(nullptr, &matrix));
- EXPECT_TRUE(FPDFTextObj_GetMatrix(text_object3, &matrix));
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(text_object3, &matrix));
EXPECT_FLOAT_EQ(1.0f, matrix.a);
EXPECT_FLOAT_EQ(1.5f, matrix.b);
EXPECT_FLOAT_EQ(2.0f, matrix.c);
@@ -2493,12 +2491,12 @@
CPDF_FormObject* pFormObj = CPDFPageObjectFromFPDFPageObject(form)->AsForm();
pFormObj->Transform(pFormObj->form_matrix().GetInverse());
- // FPDFFormObj_GetMatrix() positive testing.
+ // FPDFPageObj_GetMatrix() positive testing for forms.
static constexpr FS_MATRIX kMatrix = {1.0f, 1.5f, 2.0f, 2.5f, 100.0f, 200.0f};
pFormObj->Transform(CFXMatrixFromFSMatrix(kMatrix));
FS_MATRIX matrix;
- EXPECT_TRUE(FPDFFormObj_GetMatrix(form, &matrix));
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(form, &matrix));
EXPECT_FLOAT_EQ(kMatrix.a, matrix.a);
EXPECT_FLOAT_EQ(kMatrix.b, matrix.b);
EXPECT_FLOAT_EQ(kMatrix.c, matrix.c);
@@ -2506,10 +2504,8 @@
EXPECT_FLOAT_EQ(kMatrix.e, matrix.e);
EXPECT_FLOAT_EQ(kMatrix.f, matrix.f);
- // FPDFFormObj_GetMatrix() negative testing.
- EXPECT_FALSE(FPDFFormObj_GetMatrix(nullptr, &matrix));
- EXPECT_FALSE(FPDFFormObj_GetMatrix(form, nullptr));
- EXPECT_FALSE(FPDFFormObj_GetMatrix(nullptr, nullptr));
+ // FPDFPageObj_GetMatrix() negative testing for forms.
+ EXPECT_FALSE(FPDFPageObj_GetMatrix(form, nullptr));
UnloadPage(page);
}
@@ -3567,35 +3563,30 @@
}
// Check the matrix for |obj|.
- double a;
- double b;
- double c;
- double d;
- double e;
- double f;
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(53.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(43.0, d);
- EXPECT_DOUBLE_EQ(72.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ FS_MATRIX matrix;
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(53.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(43.0f, matrix.d);
+ EXPECT_FLOAT_EQ(72.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
// Modify the matrix for |obj|.
- a = 120.0;
- EXPECT_TRUE(FPDFImageObj_SetMatrix(obj, a, b, c, d, e, f));
+ matrix.a = 120.0;
+ EXPECT_TRUE(FPDFPageObj_SetMatrix(obj, &matrix));
// Make sure the matrix modification took place.
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(120.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(43.0, d);
- EXPECT_DOUBLE_EQ(72.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(120.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(43.0f, matrix.d);
+ EXPECT_FLOAT_EQ(72.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
{
- // Render |obj| again. Note that the FPDFImageObj_SetMatrix() call has no
+ // Render |obj| again. Note that the FPDFPageObj_SetMatrix() call has no
// effect.
ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj));
EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
@@ -3669,35 +3660,30 @@
}
// Check the matrix for |obj|.
- double a;
- double b;
- double c;
- double d;
- double e;
- double f;
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(53.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(43.0, d);
- EXPECT_DOUBLE_EQ(72.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ FS_MATRIX matrix;
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(53.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(43.0f, matrix.d);
+ EXPECT_FLOAT_EQ(72.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
// Modify the matrix for |obj|.
- a = 120.0;
- EXPECT_TRUE(FPDFImageObj_SetMatrix(obj, a, b, c, d, e, f));
+ matrix.a = 120.0;
+ EXPECT_TRUE(FPDFPageObj_SetMatrix(obj, &matrix));
// Make sure the matrix modification took place.
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(120.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(43.0, d);
- EXPECT_DOUBLE_EQ(72.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(120.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(43.0f, matrix.d);
+ EXPECT_FLOAT_EQ(72.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
{
- // Render |obj| again. Note that the FPDFImageObj_SetMatrix() call has an
+ // Render |obj| again. Note that the FPDFPageObj_SetMatrix() call has an
// effect.
ScopedFPDFBitmap bitmap(
FPDFImageObj_GetRenderedBitmap(document(), page, obj));
@@ -3819,72 +3805,67 @@
ASSERT_EQ(39, FPDFPage_CountObjects(page));
FPDF_PAGEOBJECT obj;
- double a;
- double b;
- double c;
- double d;
- double e;
- double f;
+ FS_MATRIX matrix;
obj = FPDFPage_GetObject(page, 33);
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(53.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(43.0, d);
- EXPECT_DOUBLE_EQ(72.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(53.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(43.0f, matrix.d);
+ EXPECT_FLOAT_EQ(72.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
obj = FPDFPage_GetObject(page, 34);
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(70.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(51.0, d);
- EXPECT_DOUBLE_EQ(216.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(70.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(51.0f, matrix.d);
+ EXPECT_FLOAT_EQ(216.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
obj = FPDFPage_GetObject(page, 35);
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(69.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(51.0, d);
- EXPECT_DOUBLE_EQ(360.0, e);
- EXPECT_DOUBLE_EQ(646.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(69.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(51.0f, matrix.d);
+ EXPECT_FLOAT_EQ(360.0f, matrix.e);
+ EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
obj = FPDFPage_GetObject(page, 36);
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(59.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(45.0, d);
- EXPECT_DOUBLE_EQ(72.0, e);
- EXPECT_DOUBLE_EQ(553.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(59.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(45.0f, matrix.d);
+ EXPECT_FLOAT_EQ(72.0f, matrix.e);
+ EXPECT_FLOAT_EQ(553.510009765625f, matrix.f);
obj = FPDFPage_GetObject(page, 37);
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(55.94000244140625, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(46.950000762939453, d);
- EXPECT_DOUBLE_EQ(216.0, e);
- EXPECT_DOUBLE_EQ(552.510009765625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(55.94000244140625f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(46.950000762939453f, matrix.d);
+ EXPECT_FLOAT_EQ(216.0f, matrix.e);
+ EXPECT_FLOAT_EQ(552.510009765625f, matrix.f);
obj = FPDFPage_GetObject(page, 38);
ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(obj, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(70.528999328613281, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(43.149997711181641, d);
- EXPECT_DOUBLE_EQ(360.0, e);
- EXPECT_DOUBLE_EQ(553.3599853515625, f);
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(obj, &matrix));
+ EXPECT_FLOAT_EQ(70.528999328613281f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(43.149997711181641f, matrix.d);
+ EXPECT_FLOAT_EQ(360.0f, matrix.e);
+ EXPECT_FLOAT_EQ(553.3599853515625f, matrix.f);
UnloadPage(page);
}
diff --git a/fpdfsdk/fpdf_editimg.cpp b/fpdfsdk/fpdf_editimg.cpp
index 98ed127..90c48cc 100644
--- a/fpdfsdk/fpdf_editimg.cpp
+++ b/fpdfsdk/fpdf_editimg.cpp
@@ -135,28 +135,6 @@
}
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
-FPDFImageObj_GetMatrix(FPDF_PAGEOBJECT image_object,
- double* a,
- double* b,
- double* c,
- double* d,
- double* e,
- double* f) {
- CPDF_ImageObject* pImgObj = CPDFImageObjectFromFPDFPageObject(image_object);
- if (!pImgObj || !a || !b || !c || !d || !e || !f)
- return false;
-
- const CFX_Matrix& matrix = pImgObj->matrix();
- *a = matrix.a;
- *b = matrix.b;
- *c = matrix.c;
- *d = matrix.d;
- *e = matrix.e;
- *f = matrix.f;
- return true;
-}
-
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,
double a,
double b,
diff --git a/fpdfsdk/fpdf_editimg_embeddertest.cpp b/fpdfsdk/fpdf_editimg_embeddertest.cpp
index 60f6ed1..ae3cb50 100644
--- a/fpdfsdk/fpdf_editimg_embeddertest.cpp
+++ b/fpdfsdk/fpdf_editimg_embeddertest.cpp
@@ -56,8 +56,9 @@
FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImageObj(doc);
ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, page_image, bitmap));
- ASSERT_TRUE(
- FPDFImageObj_SetMatrix(page_image, kBitmapSize, 0, 0, kBitmapSize, 0, 0));
+ static constexpr FS_MATRIX kScaleBitmapMatrix{kBitmapSize, 0, 0,
+ kBitmapSize, 0, 0};
+ ASSERT_TRUE(FPDFPageObj_SetMatrix(page_image, &kScaleBitmapMatrix));
FPDFPage_InsertObject(page, page_image);
EXPECT_EQ(1, FPDFPage_CountObjects(page));
EXPECT_TRUE(FPDFPage_GenerateContent(page));
@@ -123,58 +124,28 @@
FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
FPDF_PAGEOBJECT image = FPDFPageObj_NewImageObj(doc);
- double a;
- double b;
- double c;
- double d;
- double e;
- double f;
- EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, nullptr, nullptr, nullptr,
- nullptr, nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, nullptr, nullptr, nullptr,
- nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, &b, nullptr, nullptr,
- nullptr, nullptr));
- EXPECT_FALSE(
- FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, nullptr, nullptr, nullptr));
- EXPECT_FALSE(
- FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, nullptr, nullptr, nullptr));
- EXPECT_FALSE(
- FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, &d, nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, &d, &e, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, &b, &c, &d, &e, &f));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(nullptr, &a, nullptr, &c, &d, &e, &f));
+ FS_MATRIX matrix;
+ EXPECT_FALSE(FPDFPageObj_GetMatrix(nullptr, nullptr));
+ EXPECT_FALSE(FPDFPageObj_GetMatrix(nullptr, &matrix));
+ EXPECT_FALSE(FPDFPageObj_GetMatrix(image, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(image, nullptr, nullptr, nullptr, nullptr,
- nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, nullptr, nullptr, nullptr,
- nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, &b, nullptr, nullptr, nullptr,
- nullptr));
- EXPECT_FALSE(
- FPDFImageObj_GetMatrix(image, &a, &b, &c, nullptr, nullptr, nullptr));
- EXPECT_FALSE(
- FPDFImageObj_GetMatrix(image, &a, &b, &c, nullptr, nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, nullptr, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, &e, nullptr));
- EXPECT_FALSE(FPDFImageObj_GetMatrix(image, &a, nullptr, &c, &d, &e, &f));
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
+ EXPECT_FLOAT_EQ(1.0f, matrix.a);
+ EXPECT_FLOAT_EQ(0.0f, matrix.b);
+ EXPECT_FLOAT_EQ(0.0f, matrix.c);
+ EXPECT_FLOAT_EQ(1.0f, matrix.d);
+ EXPECT_FLOAT_EQ(0.0f, matrix.e);
+ EXPECT_FLOAT_EQ(0.0f, matrix.f);
- EXPECT_TRUE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(1.0, a);
- EXPECT_DOUBLE_EQ(0.0, b);
- EXPECT_DOUBLE_EQ(0.0, c);
- EXPECT_DOUBLE_EQ(1.0, d);
- EXPECT_DOUBLE_EQ(0.0, e);
- EXPECT_DOUBLE_EQ(0.0, f);
-
- EXPECT_TRUE(FPDFImageObj_SetMatrix(image, 1, 2, 3, 4, 5, 6));
- EXPECT_TRUE(FPDFImageObj_GetMatrix(image, &a, &b, &c, &d, &e, &f));
- EXPECT_DOUBLE_EQ(1.0, a);
- EXPECT_DOUBLE_EQ(2.0, b);
- EXPECT_DOUBLE_EQ(3.0, c);
- EXPECT_DOUBLE_EQ(4.0, d);
- EXPECT_DOUBLE_EQ(5.0, e);
- EXPECT_DOUBLE_EQ(6.0, f);
+ static constexpr FS_MATRIX kMatrix{1, 2, 3, 4, 5, 6};
+ EXPECT_TRUE(FPDFPageObj_SetMatrix(image, &kMatrix));
+ EXPECT_TRUE(FPDFPageObj_GetMatrix(image, &matrix));
+ EXPECT_FLOAT_EQ(1.0f, matrix.a);
+ EXPECT_FLOAT_EQ(2.0f, matrix.b);
+ EXPECT_FLOAT_EQ(3.0f, matrix.c);
+ EXPECT_FLOAT_EQ(4.0f, matrix.d);
+ EXPECT_FLOAT_EQ(5.0f, matrix.e);
+ EXPECT_FLOAT_EQ(6.0f, matrix.f);
FPDFPageObj_Destroy(image);
FPDF_CloseDocument(doc);
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index 1026c98..e118a91a 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -22,6 +22,7 @@
#include "core/fpdfapi/page/cpdf_pageobject.h"
#include "core/fpdfapi/page/cpdf_pathobject.h"
#include "core/fpdfapi/page/cpdf_shadingobject.h"
+#include "core/fpdfapi/page/cpdf_textobject.h"
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_document.h"
@@ -615,6 +616,61 @@
pPageObj->Transform(matrix);
}
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_GetMatrix(FPDF_PAGEOBJECT page_object, FS_MATRIX* matrix) {
+ CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ if (!pPageObj || !matrix)
+ return false;
+
+ switch (pPageObj->GetType()) {
+ case CPDF_PageObject::TEXT:
+ *matrix = FSMatrixFromCFXMatrix(pPageObj->AsText()->GetTextMatrix());
+ return true;
+ case CPDF_PageObject::PATH:
+ *matrix = FSMatrixFromCFXMatrix(pPageObj->AsPath()->matrix());
+ return true;
+ case CPDF_PageObject::IMAGE:
+ *matrix = FSMatrixFromCFXMatrix(pPageObj->AsImage()->matrix());
+ return true;
+ case CPDF_PageObject::SHADING:
+ return false;
+ case CPDF_PageObject::FORM:
+ *matrix = FSMatrixFromCFXMatrix(pPageObj->AsForm()->form_matrix());
+ return true;
+ default:
+ NOTREACHED();
+ return false;
+ }
+}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_SetMatrix(FPDF_PAGEOBJECT page_object, const FS_MATRIX* matrix) {
+ CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ if (!pPageObj || !matrix)
+ return false;
+
+ CFX_Matrix cmatrix = CFXMatrixFromFSMatrix(*matrix);
+ switch (pPageObj->GetType()) {
+ case CPDF_PageObject::TEXT:
+ return false;
+ case CPDF_PageObject::PATH:
+ pPageObj->AsPath()->set_matrix(cmatrix);
+ break;
+ case CPDF_PageObject::IMAGE:
+ pPageObj->AsImage()->SetImageMatrix(cmatrix);
+ break;
+ case CPDF_PageObject::SHADING:
+ return false;
+ case CPDF_PageObject::FORM:
+ return false;
+ default:
+ NOTREACHED();
+ return false;
+ }
+ pPageObj->SetDirty(true);
+ return true;
+}
+
FPDF_EXPORT void FPDF_CALLCONV
FPDFPageObj_SetBlendMode(FPDF_PAGEOBJECT page_object,
FPDF_BYTESTRING blend_mode) {
diff --git a/fpdfsdk/fpdf_editpath.cpp b/fpdfsdk/fpdf_editpath.cpp
index bb9eb3b..d4e12c4 100644
--- a/fpdfsdk/fpdf_editpath.cpp
+++ b/fpdfsdk/fpdf_editpath.cpp
@@ -184,33 +184,6 @@
return true;
}
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_GetMatrix(FPDF_PAGEOBJECT path,
- FS_MATRIX* matrix) {
- if (!path || !matrix)
- return false;
-
- CPDF_PathObject* pPathObj = CPDFPathObjectFromFPDFPageObject(path);
- if (!pPathObj)
- return false;
-
- *matrix = FSMatrixFromCFXMatrix(pPathObj->matrix());
- return true;
-}
-
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
-FPDFPath_SetMatrix(FPDF_PAGEOBJECT path, const FS_MATRIX* matrix) {
- if (!matrix)
- return false;
-
- CPDF_PathObject* pPathObj = CPDFPathObjectFromFPDFPageObject(path);
- if (!pPathObj)
- return false;
-
- pPathObj->set_matrix(CFXMatrixFromFSMatrix(*matrix));
- pPathObj->SetDirty(true);
- return true;
-}
-
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPathSegment_GetPoint(FPDF_PATHSEGMENT segment, float* x, float* y) {
auto* pPathPoint = FXPathPointFromFPDFPathSegment(segment);
diff --git a/fpdfsdk/fpdf_edittext.cpp b/fpdfsdk/fpdf_edittext.cpp
index da3d092..8493f32 100644
--- a/fpdfsdk/fpdf_edittext.cpp
+++ b/fpdfsdk/fpdf_edittext.cpp
@@ -519,19 +519,6 @@
CPDF_Font::GetStockFont(pDoc, ByteStringView(font)).Leak());
}
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFTextObj_GetMatrix(FPDF_PAGEOBJECT text,
- FS_MATRIX* matrix) {
- if (!matrix)
- return false;
-
- CPDF_TextObject* pTextObj = CPDFTextObjectFromFPDFPageObject(text);
- if (!pTextObj)
- return false;
-
- *matrix = FSMatrixFromCFXMatrix(pTextObj->GetTextMatrix());
- return true;
-}
-
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFTextObj_GetFontSize(FPDF_PAGEOBJECT text, float* size) {
if (!size)
diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c
index 3748fb5..de6b15e 100644
--- a/fpdfsdk/fpdf_view_c_api_test.c
+++ b/fpdfsdk/fpdf_view_c_api_test.c
@@ -157,7 +157,6 @@
// fpdf_edit.h
CHK(FPDFFont_Close);
CHK(FPDFFormObj_CountObjects);
- CHK(FPDFFormObj_GetMatrix);
CHK(FPDFFormObj_GetObject);
CHK(FPDFImageObj_GetBitmap);
CHK(FPDFImageObj_GetImageDataDecoded);
@@ -165,7 +164,6 @@
CHK(FPDFImageObj_GetImageFilter);
CHK(FPDFImageObj_GetImageFilterCount);
CHK(FPDFImageObj_GetImageMetadata);
- CHK(FPDFImageObj_GetMatrix);
CHK(FPDFImageObj_GetRenderedBitmap);
CHK(FPDFImageObj_LoadJpegFile);
CHK(FPDFImageObj_LoadJpegFileInline);
@@ -196,6 +194,7 @@
CHK(FPDFPageObj_GetLineCap);
CHK(FPDFPageObj_GetLineJoin);
CHK(FPDFPageObj_GetMark);
+ CHK(FPDFPageObj_GetMatrix);
CHK(FPDFPageObj_GetStrokeColor);
CHK(FPDFPageObj_GetStrokeWidth);
CHK(FPDFPageObj_GetType);
@@ -209,6 +208,7 @@
CHK(FPDFPageObj_SetFillColor);
CHK(FPDFPageObj_SetLineCap);
CHK(FPDFPageObj_SetLineJoin);
+ CHK(FPDFPageObj_SetMatrix);
CHK(FPDFPageObj_SetStrokeColor);
CHK(FPDFPageObj_SetStrokeWidth);
CHK(FPDFPageObj_Transform);
@@ -230,15 +230,12 @@
CHK(FPDFPath_Close);
CHK(FPDFPath_CountSegments);
CHK(FPDFPath_GetDrawMode);
- CHK(FPDFPath_GetMatrix);
CHK(FPDFPath_GetPathSegment);
CHK(FPDFPath_LineTo);
CHK(FPDFPath_MoveTo);
CHK(FPDFPath_SetDrawMode);
- CHK(FPDFPath_SetMatrix);
CHK(FPDFTextObj_GetFontName);
CHK(FPDFTextObj_GetFontSize);
- CHK(FPDFTextObj_GetMatrix);
CHK(FPDFTextObj_GetText);
CHK(FPDFTextObj_GetTextRenderMode);
CHK(FPDFTextObj_SetTextRenderMode);
diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h
index 563ed02..7378d1d 100644
--- a/public/fpdf_edit.h
+++ b/public/fpdf_edit.h
@@ -247,6 +247,36 @@
double e,
double f);
+// Experimental API.
+// Get the transform matrix of a page object.
+//
+// page_object - handle to a page object.
+// matrix - pointer to struct to receive the matrix value.
+//
+// The matrix is composed as:
+// |a c e|
+// |b d f|
+// and used to scale, rotate, shear and translate the page object.
+//
+// Returns TRUE on success.
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_GetMatrix(FPDF_PAGEOBJECT page_object, FS_MATRIX* matrix);
+
+// Experimental API.
+// Set the transform matrix of a page object.
+//
+// page_object - handle to a page object.
+// matrix - pointer to struct with the matrix value.
+//
+// The matrix is composed as:
+// |a c e|
+// |b d f|
+// and can be used to scale, rotate, shear and translate the page object.
+//
+// Returns TRUE on success.
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_SetMatrix(FPDF_PAGEOBJECT path, const FS_MATRIX* matrix);
+
// Transform all annotations in |page|.
//
// page - handle to a page.
@@ -558,32 +588,8 @@
FPDF_PAGEOBJECT image_object,
FPDF_FILEACCESS* file_access);
-// Experimental API.
-// Get the transform matrix of an image object.
+// TODO(thestig): Start deprecating this once FPDFPageObj_SetMatrix() is stable.
//
-// image_object - handle to an image object.
-// a - matrix value.
-// b - matrix value.
-// c - matrix value.
-// d - matrix value.
-// e - matrix value.
-// f - matrix value.
-//
-// The matrix is composed as:
-// |a c e|
-// |b d f|
-// and used to scale, rotate, shear and translate the image.
-//
-// Returns TRUE on success.
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
-FPDFImageObj_GetMatrix(FPDF_PAGEOBJECT image_object,
- double* a,
- double* b,
- double* c,
- double* d,
- double* e,
- double* f);
-
// Set the transform matrix of |image_object|.
//
// image_object - handle to an image object.
@@ -1077,36 +1083,6 @@
int* fillmode,
FPDF_BOOL* stroke);
-// Experimental API.
-// Get the transform matrix of a path.
-//
-// path - handle to a path.
-// matrix - pointer to struct to receive the matrix value.
-//
-// The matrix is composed as:
-// |a c e|
-// |b d f|
-// and used to scale, rotate, shear and translate the path.
-//
-// Returns TRUE on success.
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_GetMatrix(FPDF_PAGEOBJECT path,
- FS_MATRIX* matrix);
-
-// Experimental API.
-// Set the transform matrix of a path.
-//
-// path - handle to a path.
-// matrix - pointer to struct with the matrix value.
-//
-// The matrix is composed as:
-// |a c e|
-// |b d f|
-// and can be used to scale, rotate, shear and translate the path.
-//
-// Returns TRUE on success.
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetMatrix(FPDF_PAGEOBJECT path,
- const FS_MATRIX* matrix);
-
// Create a new text object using one of the standard PDF fonts.
//
// document - handle to the document.
@@ -1162,21 +1138,6 @@
FPDFText_LoadStandardFont(FPDF_DOCUMENT document, FPDF_BYTESTRING font);
// Experimental API.
-// Get the transform matrix of a text object.
-//
-// text - handle to a text.
-// matrix - pointer to struct with the matrix value.
-//
-// The matrix is composed as:
-// |a c e|
-// |b d f|
-// and used to scale, rotate, shear and translate the text.
-//
-// Returns TRUE on success.
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFTextObj_GetMatrix(FPDF_PAGEOBJECT text,
- FS_MATRIX* matrix);
-
-// Experimental API.
// Get the font size of a text object.
//
// text - handle to a text.
@@ -1283,21 +1244,6 @@
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
FPDFFormObj_GetObject(FPDF_PAGEOBJECT form_object, unsigned long index);
-// Experimental API.
-// Get the transform matrix of a form object.
-//
-// form_object - handle to a form.
-// matrix - pointer to struct to receive the matrix value.
-//
-// The matrix is composed as:
-// |a c e|
-// |b d f|
-// and used to scale, rotate, shear and translate the form object.
-//
-// Returns TRUE on success.
-FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
-FPDFFormObj_GetMatrix(FPDF_PAGEOBJECT form_object, FS_MATRIX* matrix);
-
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus