12#include "build/build_config.h"
13#include "core/fpdfapi/font/cpdf_font.h"
14#include "core/fpdfapi/page/cpdf_page.h"
15#include "core/fpdfapi/page/cpdf_pageobject.h"
16#include "core/fpdfapi/parser/cpdf_array.h"
17#include "core/fpdfapi/parser/cpdf_dictionary.h"
18#include "core/fpdfapi/parser/cpdf_number.h"
19#include "core/fpdfapi/parser/cpdf_stream.h"
20#include "core/fpdfapi/parser/cpdf_stream_acc.h"
21#include "core/fxcrt/check.h"
22#include "core/fxcrt/compiler_specific.h"
23#include "core/fxcrt/fx_codepage.h"
24#include "core/fxcrt/fx_memcpy_wrappers.h"
25#include "core/fxcrt/fx_system.h"
26#include "core/fxge/cfx_defaultrenderdevice.h"
27#include "core/fxge/fx_font.h"
28#include "fpdfsdk/cpdfsdk_helpers.h"
29#include "public/cpp/fpdf_scopers.h"
30#include "public/fpdf_annot.h"
31#include "public/fpdf_edit.h"
32#include "public/fpdfview.h"
33#include "testing/embedder_test.h"
34#include "testing/embedder_test_constants.h"
35#include "testing/fx_string_testhelpers.h"
36#include "testing/gmock/include/gmock/gmock-matchers.h"
37#include "testing/gtest/include/gtest/gtest.h"
38#include "testing/utils/file_util.h"
39#include "testing/utils/hash.h"
40#include "testing/utils/path_service.h"
42using pdfium::HelloWorldChecksum;
43using testing::HasSubstr;
45using testing::UnorderedElementsAreArray;
49const char kAllRemovedChecksum[] =
"eee4600ac08b458ac7ac2320e225674c";
51const wchar_t kBottomText[] = L"I'm at the bottom of the page";
53const char* BottomTextChecksum() {
56 return "5d8f2b613a2f9591a52373c72d6b88ee";
57#elif BUILDFLAG(IS_APPLE)
58 return "8ca7dc6269ee68507389aa40eebcb9f8";
60 return "c62d315856a558d2666b80d474831efe";
63#if BUILDFLAG(IS_APPLE)
64 return "81636489006a31fcb00cf29efcdf7909";
66 return "891dcb6e914c8360998055f1f47c9727";
70const char* FirstRemovedChecksum() {
73 return "251007e902e512d0359240ad957ee2dc";
74#elif BUILDFLAG(IS_APPLE)
75 return "dcb929fae86d5b935888ce7f9f1ab71b";
77 return "3006ab2b12d27246eae4faad509ac575";
80#if BUILDFLAG(IS_APPLE)
81 return "a1dc2812692fcc7ee4f01ca77435df9d";
83 return "e1477dc3b5b3b9c560814c4d1135a02b";
87const wchar_t kLoadedFontText[] = L"I am testing my loaded font, WEE.";
89const char* LoadedFontTextChecksum() {
92 return "b0efd562e84958f06bb006ba27d5f4bd";
93#elif BUILDFLAG(IS_APPLE)
94 return "23e7874d160692b0ef3e0c8780f73dab";
96 return "fc2334c350cbd0d2ae6076689da09741";
99#if BUILDFLAG(IS_APPLE)
100 return "0f3e4a7d71f9e7eb8a1a0d69403b9848";
102 return "d58570cc045dfb818b92cbabbd1a364c";
106const char kRedRectangleChecksum[] =
"66d02eaa6181e2c069ce2ea99beda497";
109const char kEmbeddedImage33Checksum[] =
"cb3637934bb3b95a6e4ae1ea9eb9e56e";
111const char* NotoSansSCChecksum() {
114 return "a1bc9e4007dc2155e9f56bf16234573e";
115#elif BUILDFLAG(IS_APPLE)
116 return "9a31fb87d1c6d2346bba22d1196041cd";
118 return "5bb65e15fc0a685934cd5006dec08a76";
121 return "9a31fb87d1c6d2346bba22d1196041cd";
124struct FPDFEditMoveEmbedderTestCase {
125 std::vector<
int> page_indices;
126 int page_indices_len;
129 bool expected_result;
131 std::vector<
int> expected_order;
132 const char*
const name;
135std::ostream& operator<<(
std::ostream& os,
136 const FPDFEditMoveEmbedderTestCase& t) {
137 os << t.name <<
": Indices are {";
138 for (size_t i = 0; i < t.page_indices.size(); ++i) {
139 os << t.page_indices[i];
140 if (i != t.page_indices.size() - 1) {
144 os <<
"}, page order len is " << t.page_indices_len <<
", dest page index is "
145 << t.dest_page_index <<
", expected result is " << t.expected_result;
155 cpdf_doc_ = CPDFDocumentFromFPDFDocument(
document());
163 pdfium::span<
const uint8_t> span) {
165 font_dict->GetDictFor(
"FontDescriptor");
166 ASSERT_TRUE(font_desc);
167 EXPECT_EQ(
"FontDescriptor", font_desc->GetNameFor(
"Type"));
168 ByteString font_name = font_desc->GetNameFor(
"FontName");
169 EXPECT_FALSE(font_name.IsEmpty());
174 ASSERT_TRUE(font_desc->KeyExist(
"Flags"));
176 int font_flags = font_desc->GetIntegerFor(
"Flags");
180 ASSERT_TRUE(font_desc->KeyExist(
"FontBBox"));
183 ASSERT_TRUE(fontBBox);
184 EXPECT_EQ(4u, fontBBox->size());
187 EXPECT_TRUE(fontBBox->GetIntegerAt(0) < fontBBox->GetIntegerAt(2));
188 EXPECT_TRUE(fontBBox->GetIntegerAt(1) < fontBBox->GetIntegerAt(3));
190 EXPECT_TRUE(font_desc->KeyExist(
"ItalicAngle"));
191 EXPECT_TRUE(font_desc->KeyExist(
"Ascent"));
192 EXPECT_TRUE(font_desc->KeyExist(
"Descent"));
193 EXPECT_TRUE(font_desc->KeyExist(
"CapHeight"));
194 EXPECT_TRUE(font_desc->KeyExist(
"StemV"));
198 std::swap(present, absent);
199 EXPECT_TRUE(font_desc->KeyExist(present));
200 EXPECT_FALSE(font_desc->KeyExist(absent));
203 pdfium::MakeRetain<CPDF_StreamAcc>(font_desc->GetStreamFor(present));
204 streamAcc->LoadAllDataRaw();
207 ASSERT_EQ(span.size(), streamAcc->GetSize());
209 ASSERT_EQ(
static_cast<
int>(span.size()), streamAcc->GetLength1ForTest());
212 pdfium::span<
const uint8_t> stream_data = streamAcc->GetSpan();
213 for (size_t j = 0; j < span.size(); j++)
214 EXPECT_EQ(span[j], stream_data[j]) <<
" at byte " << j;
222 EXPECT_GT(widths_array->size(), 1u);
223 int num_cids_checked = 0;
225 for (size_t idx = 0; idx < widths_array->size(); idx++) {
226 int cid = widths_array->GetFloatAt(idx);
227 EXPECT_GE(cid, cur_cid);
228 ASSERT_FALSE(++idx == widths_array->size());
230 if (next->IsArray()) {
233 int cnt =
static_cast<
int>(arr->size());
234 size_t inner_idx = 0;
235 for (cur_cid = cid; cur_cid < cid + cnt; cur_cid++) {
236 int width = arr->GetFloatAt(inner_idx++);
238 <<
" at cid " << cur_cid;
240 num_cids_checked += cnt;
244 ASSERT_TRUE(next->IsNumber());
245 int last_cid = next->AsNumber()->GetInteger();
246 ASSERT_FALSE(++idx == widths_array->size());
247 int width = widths_array->GetFloatAt(idx);
248 for (cur_cid = cid; cur_cid <= last_cid; cur_cid++) {
250 <<
" at cid " << cur_cid;
252 num_cids_checked += last_cid - cid + 1;
255 EXPECT_GT(num_cids_checked, 200);
265const char kExpectedPDF[] =
267 "%\xA1\xB3\xC5\xD7\r\n"
269 "<</Pages 2 0 R /Type/Catalog>>\r\n"
272 "<</Count 1/Kids\\[ 4 0 R \\]/Type/Pages>>\r\n"
275 "<</CreationDate\\(D:.*\\)/Creator\\(PDFium\\)>>\r\n"
278 "<</MediaBox\\[ 0 0 640 480\\]/Parent 2 0 R "
280 "/Rotate 0/Type/Page"
285 "0000000000 65535 f\r\n"
286 "0000000017 00000 n\r\n"
287 "0000000066 00000 n\r\n"
288 "0000000122 00000 n\r\n"
289 "0000000192 00000 n\r\n"
294 "/Size 5/ID\\[<.*><.*>\\]>>\r\n"
302 CreateEmptyDocument();
303 ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400));
304 std::string font_path;
306 "NotoSansCJK/NotoSansSC-Regular.subset.otf", &font_path));
308 std::vector<uint8_t> font_data = GetFileContents(font_path.c_str());
309 ASSERT_FALSE(font_data.empty());
311 ScopedFPDFFont font(FPDFText_LoadFont(document(), font_data.data(),
315 FPDF_PAGEOBJECT text_object =
316 FPDFPageObj_CreateTextObj(document(), font.get(), 20.0f);
317 EXPECT_TRUE(text_object);
322 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
324 const FS_MATRIX matrix{1, 0, 0, 1, 50, 200};
326 FPDFPage_InsertObject(page.get(), text_object);
327 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
329 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
330 CompareBitmap(page_bitmap.get(), 400, 400, NotoSansSCChecksum());
332 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
333 VerifySavedDocument(400, 400, NotoSansSCChecksum());
337 CreateEmptyDocument();
338 ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400));
339 std::string font_path;
341 "NotoSansCJK/NotoSansSC-Regular.subset.otf", &font_path));
343 std::vector<uint8_t> font_data = GetFileContents(font_path.c_str());
344 ASSERT_FALSE(font_data.empty());
346 ScopedFPDFFont font(FPDFText_LoadFont(document(), font_data.data(),
350 FPDF_PAGEOBJECT text_object =
351 FPDFPageObj_CreateTextObj(document(), font.get(), 20.0f);
352 EXPECT_TRUE(text_object);
355 const std::vector<uint32_t> charcodes = {9, 6, 7, 3, 5, 2, 1,
358 FPDFText_SetCharcodes(text_object, charcodes.data(), charcodes.size()));
360 const FS_MATRIX matrix{1, 0, 0, 1, 50, 200};
362 FPDFPage_InsertObject(page.get(), text_object);
363 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
365 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
366 CompareBitmap(page_bitmap.get(), 400, 400, NotoSansSCChecksum());
368 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
369 VerifySavedDocument(400, 400, NotoSansSCChecksum());
373 CreateEmptyDocument();
374 ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400));
375 std::string font_path = PathService::GetTestFilePath(
"fonts/bug_2094.ttf");
376 ASSERT_FALSE(font_path.empty());
378 std::vector<uint8_t> font_data = GetFileContents(font_path.c_str());
379 ASSERT_FALSE(font_data.empty());
381 ScopedFPDFFont font(FPDFText_LoadFont(document(), font_data.data(),
388 CreateEmptyDocument();
389 FPDF_PAGE page = FPDFPage_New(document(), 0, 640.0, 480.0);
393 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
395 EXPECT_THAT(GetString(), testing::MatchesRegex(std::string(
396 kExpectedPDF,
sizeof(kExpectedPDF))));
402 const char kAllBlackChecksum[] =
"5708fc5c4a8bd0abde99c8e8f0390615";
405 ScopedFPDFBitmap orig_bitmap;
407 ASSERT_TRUE(OpenDocument(
"black.pdf"));
408 FPDF_PAGE orig_page = LoadPage(0);
409 ASSERT_TRUE(orig_page);
410 orig_bitmap = RenderLoadedPage(orig_page);
411 CompareBitmap(orig_bitmap.get(), 612, 792, kAllBlackChecksum);
412 UnloadPage(orig_page);
418 ScopedFPDFPage temp_page(FPDFPage_New(temp_doc.get(), 0, 612, 792));
422 ScopedFPDFPageObject temp_img(FPDFPageObj_NewImageObj(temp_doc.get()));
423 FPDF_PAGE pages_array[] = {temp_page.get()};
424 EXPECT_TRUE(FPDFImageObj_SetBitmap(pages_array, 1, temp_img.get(),
426 static constexpr FS_MATRIX kLetterScaleMatrix{612, 0, 0, 792, 0, 0};
427 EXPECT_TRUE(FPDFPageObj_SetMatrix(temp_img.get(), &kLetterScaleMatrix));
428 FPDFPage_InsertObject(temp_page.get(), temp_img.release());
429 EXPECT_TRUE(FPDFPage_GenerateContent(temp_page.get()));
430 EXPECT_TRUE(FPDF_SaveAsCopy(temp_doc.get(),
this, 0));
435 EXPECT_GT(GetString().size(), 923u);
436 VerifySavedDocument(612, 792, kAllBlackChecksum);
441 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
446 ASSERT_TRUE(red_rect);
456 FPDF_BOOL stroke =
true;
459 EXPECT_FALSE(stroke);
461 static constexpr FS_MATRIX kMatrix = {1, 2, 3, 4, 5, 6};
466 EXPECT_FLOAT_EQ(1.0f, matrix.a);
467 EXPECT_FLOAT_EQ(2.0f, matrix.b);
468 EXPECT_FLOAT_EQ(3.0f, matrix.c);
469 EXPECT_FLOAT_EQ(4.0f, matrix.d);
470 EXPECT_FLOAT_EQ(5.0f, matrix.e);
471 EXPECT_FLOAT_EQ(6.0f, matrix.f);
474 matrix = {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f};
479 ScopedFPDFBitmap page_bitmap = RenderPage(page);
480 CompareBitmap(page_bitmap.get(), 612, 792, kRedRectangleChecksum);
541 ScopedFPDFBitmap page_bitmap = RenderPage(page);
542 CompareBitmap(page_bitmap.get(), 612, 792,
543 "7b0b87604594e773add528fae567a558");
581 ScopedFPDFBitmap page_bitmap = RenderPage(page);
582 CompareBitmap(page_bitmap.get(), 612, 792,
583 "eadc8020a14dfcf091da2688733d8806");
598 const char* blue_path_checksum = []() {
600 return "ed14c60702b1489c597c7d46ece7f86d";
602 return "9823e1a21bd9b72b6a442ba4f12af946";
604 ScopedFPDFBitmap page_bitmap = RenderPage(page);
605 CompareBitmap(page_bitmap.get(), 612, 792, blue_path_checksum);
610 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
616 const char* last_checksum = []() {
618 return "423b20c18c177e78c93d8b67594e49f1";
620 return "111c38e9bf9e2ba0a57b875cca596fff";
622 VerifySavedDocument(612, 792, last_checksum);
628 ASSERT_TRUE(OpenDocument(
"clip_path.pdf"));
629 FPDF_PAGE page = LoadPage(0);
635 ASSERT_TRUE(triangle);
671 ASSERT_TRUE(clip_path);
724 ASSERT_TRUE(OpenDocument(
"bug_1399.pdf"));
725 FPDF_PAGE page = LoadPage(0);
739 EXPECT_FLOAT_EQ(107.718f, x);
740 EXPECT_FLOAT_EQ(719.922f, y);
746 EXPECT_FLOAT_EQ(394.718f, x);
747 EXPECT_FLOAT_EQ(719.922f, y);
752 ASSERT_TRUE(clip_path);
762 static const char kOriginalChecksum[] =
"126366fb95e6caf8ea196780075b22b2";
763 static const char kRemovedChecksum[] =
"6ec2f27531927882624b37bc7d8e12f4";
765 ASSERT_TRUE(OpenDocument(
"bug_1549.pdf"));
766 FPDF_PAGE page = LoadPage(0);
769 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
770 CompareBitmap(bitmap.get(), 100, 150, kOriginalChecksum);
774 ASSERT_TRUE(FPDFPage_RemoveObject(page, obj.get()));
780 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
781 CompareBitmap(bitmap.get(), 100, 150, kRemovedChecksum);
784 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
788 VerifySavedDocument(100, 150,
"4f9889cd5993db20f1ab37d677ac8d26");
793 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
794 FPDF_PAGE page = LoadPage(0);
800 ASSERT_TRUE(page_object);
802 EXPECT_TRUE(FPDFText_SetText(page_object, text1.get()));
808 const char* changed_checksum = []() {
811 return "e1c530ca0705424f19a1b7ff0bffdbaa";
812#elif BUILDFLAG(IS_APPLE)
813 return "c65881cb16125c23e5513a16dc68f3a2";
815 return "4a8345a139507932729e07d4831cbe2b";
818#if BUILDFLAG(IS_APPLE)
819 return "b720e83476fd6819d47c533f1f43c728";
821 return "9a85b9354a69c61772ed24151c140f46";
825 ScopedFPDFBitmap page_bitmap = RenderPage(page);
826 CompareBitmap(page_bitmap.get(), 200, 200, changed_checksum);
831 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
836 ASSERT_TRUE(OpenSavedDocument());
837 FPDF_PAGE saved_page = LoadSavedPage(0);
838 ASSERT_TRUE(saved_page);
841 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
842 CompareBitmap(page_bitmap.get(), 200, 200, changed_checksum);
845 CloseSavedPage(saved_page);
846 CloseSavedDocument();
850 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
851 FPDF_PAGE page = LoadPage(0);
856 ASSERT_TRUE(page_object);
858 const uint32_t kDummyValue = 42;
859 EXPECT_FALSE(FPDFText_SetCharcodes(
nullptr,
nullptr, 0));
860 EXPECT_FALSE(FPDFText_SetCharcodes(
nullptr,
nullptr, 1));
861 EXPECT_FALSE(FPDFText_SetCharcodes(
nullptr, &kDummyValue, 0));
862 EXPECT_FALSE(FPDFText_SetCharcodes(
nullptr, &kDummyValue, 1));
863 EXPECT_FALSE(FPDFText_SetCharcodes(page_object,
nullptr, 1));
870 ASSERT_TRUE(OpenDocument(
"bug_1558.pdf"));
871 FPDF_PAGE page = LoadPage(0);
874 const char* original_checksum = []() {
877 return "0822ec5d476e8371544ef4bb7a0596e1";
878#elif BUILDFLAG(IS_APPLE)
879 return "721dae4e2258a52a000af88d09ec75ca";
881 return "3c04e3acc732faaf39fb0c19efd056ac";
884#if BUILDFLAG(IS_APPLE)
885 return "ae7a25c85e0e2dd0c5cb9dd5cd37f6df";
887 return "7af7fe5b281298261eb66ac2d22f5054";
892 ScopedFPDFBitmap original_bitmap = RenderPage(page);
893 CompareBitmap(original_bitmap.get(), 200, 200, original_checksum);
900 ASSERT_TRUE(text_page);
902 ASSERT_EQ(2, obj_count);
903 for (
int i = 0; i < obj_count; ++i) {
907 FPDFTextObj_GetText(text_obj, text_page.get(),
910 std::vector<FPDF_WCHAR> buffer = GetFPDFWideStringBuffer(size);
911 ASSERT_EQ(size, FPDFTextObj_GetText(text_obj, text_page.get(),
912 buffer.data(), size));
913 EXPECT_TRUE(FPDFText_SetText(text_obj, buffer.data()));
919 ScopedFPDFBitmap edited_bitmap = RenderPage(page);
920 CompareBitmap(edited_bitmap.get(), 200, 200, original_checksum);
925 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
929 ASSERT_TRUE(OpenSavedDocument());
930 FPDF_PAGE saved_page = LoadSavedPage(0);
931 ASSERT_TRUE(saved_page);
934 ScopedFPDFBitmap saved_bitmap = RenderSavedPage(saved_page);
935 CompareBitmap(saved_bitmap.get(), 200, 200, original_checksum);
938 CloseSavedPage(saved_page);
939 CloseSavedDocument();
944 ASSERT_TRUE(OpenDocument(
"bug_1574.pdf"));
945 FPDF_PAGE page = LoadPage(0);
948 const char* original_checksum = []() {
951 return "6f22adb3ba2a2c60a940bfb52e14dd58";
952#elif BUILDFLAG(IS_APPLE)
953 return "afa2260cbe84be78867940d72420d0b4";
955 return "d76a31d931a350f0809226a41029a9a4";
958#if BUILDFLAG(IS_APPLE)
959 return "1226bc2b8072622eb28f52321876e814";
961 return "c5241eef60b9eac68ed1f2a5fd002703";
966 ScopedFPDFBitmap original_bitmap = RenderPage(page);
967 CompareBitmap(original_bitmap.get(), 200, 300, original_checksum);
974 ASSERT_TRUE(text_page);
980 unsigned long size = FPDFTextObj_GetText(text_obj, text_page.get(),
983 std::vector<FPDF_WCHAR> buffer = GetFPDFWideStringBuffer(size);
984 ASSERT_EQ(size, FPDFTextObj_GetText(text_obj, text_page.get(),
985 buffer.data(), size));
986 EXPECT_TRUE(FPDFText_SetText(text_obj, buffer.data()));
991 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
995 ASSERT_TRUE(OpenSavedDocument());
996 FPDF_PAGE saved_page = LoadSavedPage(0);
997 ASSERT_TRUE(saved_page);
1000 ScopedFPDFBitmap saved_bitmap = RenderSavedPage(saved_page);
1001 CompareBitmap(saved_bitmap.get(), 200, 300, original_checksum);
1004 CloseSavedPage(saved_page);
1005 CloseSavedDocument();
1009 ASSERT_TRUE(OpenDocument(
"bug_1893.pdf"));
1010 FPDF_PAGE page = LoadPage(0);
1012 const char* original_checksum = []() {
1014#if BUILDFLAG(IS_WIN)
1015 return "10c8257bb54b4431196d963d68d45f12";
1016#elif BUILDFLAG(IS_APPLE)
1017 return "c42eef2028cb86a0a8601d61707b126f";
1019 return "d8be4379e729242785945458924318a3";
1022#if BUILDFLAG(IS_APPLE)
1023 return "0964322399241618539b474dbf9d40c6";
1025 return "c3672f206e47d98677401f1617ad56eb";
1029 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
1030 CompareBitmap(bitmap.get(), 200, 300, original_checksum);
1035 const char* removed_checksum = []() {
1037#if BUILDFLAG(IS_WIN)
1038 return "95484d03b9da898617f297b1429f7f84";
1039#elif BUILDFLAG(IS_APPLE)
1040 return "7222709eca0e8f72a66ce06283f7c10f";
1042 return "4a02191e033dddeb2110d55af3f14544";
1045#if BUILDFLAG(IS_APPLE)
1046 return "d0837f2b8809a5902d3c4219441fbafe";
1048 return "e9c0cbd6adcb2151b4e36a61ab26a20a";
1055 ASSERT_TRUE(FPDFPage_RemoveObject(page, object.get()));
1058 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
1059 CompareBitmap(bitmap.get(), 200, 300, removed_checksum);
1062 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1066 ASSERT_TRUE(OpenSavedDocument());
1067 FPDF_PAGE saved_page = LoadSavedPage(0);
1068 ScopedFPDFBitmap bitmap = RenderSavedPageWithFlags(saved_page,
FPDF_ANNOT);
1069 CompareBitmap(bitmap.get(), 200, 300, removed_checksum);
1070 CloseSavedPage(saved_page);
1071 CloseSavedDocument();
1077 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1078 FPDF_PAGE page = LoadPage(0);
1083 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1092 ASSERT_TRUE(text_page);
1093 EXPECT_EQ(30, FPDFText_CountChars(text_page.get()));
1094 EXPECT_EQ(0, FPDFText_GetFontWeight(text_page.get(), 0));
1101 ASSERT_TRUE(page_object);
1103 EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object.get()));
1109 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1110 CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
1116 ASSERT_TRUE(text_page);
1117 EXPECT_EQ(15, FPDFText_CountChars(text_page.get()));
1118 EXPECT_EQ(0, FPDFText_GetFontWeight(text_page.get(), 0));
1124 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1125 CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
1129 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1130 VerifySavedDocument(200, 200, FirstRemovedChecksum());
1133 EXPECT_THAT(GetString(), Not(HasSubstr(
"/F1")));
1134 EXPECT_THAT(GetString(), Not(HasSubstr(
"/F2")));
1135 EXPECT_THAT(GetString(), Not(HasSubstr(
"/Times-Roman")));
1143 ASSERT_TRUE(OpenDocument(
"hello_world_2_pages.pdf"));
1144 FPDF_PAGE page1 = LoadPage(0);
1146 FPDF_PAGE page2 = LoadPage(1);
1151 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1153 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1161 ASSERT_TRUE(page_object);
1163 EXPECT_TRUE(FPDFPage_RemoveObject(page1, page_object.get()));
1169 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1170 CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
1171 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1178 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1179 CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
1180 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1185 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1186 ASSERT_TRUE(OpenSavedDocument());
1187 FPDF_PAGE saved_page1 = LoadSavedPage(0);
1188 VerifySavedRendering(saved_page1, 200, 200, FirstRemovedChecksum());
1189 CloseSavedPage(saved_page1);
1190 FPDF_PAGE saved_page2 = LoadSavedPage(1);
1192 CloseSavedPage(saved_page2);
1193 CloseSavedDocument();
1195 std::vector<std::string> split_saved_data = StringSplit(GetString(),
'\n');
1198 EXPECT_THAT(split_saved_data, Contains(HasSubstr(
"/F1")).Times(1));
1199 EXPECT_THAT(split_saved_data, Contains(HasSubstr(
"/F2")).Times(1));
1200 EXPECT_THAT(split_saved_data, Contains(HasSubstr(
"/Times-Roman")).Times(1));
1209 ASSERT_TRUE(OpenDocument(
"hello_world_2_pages_split_streams.pdf"));
1210 FPDF_PAGE page1 = LoadPage(0);
1212 FPDF_PAGE page2 = LoadPage(1);
1217 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1219 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1227 ASSERT_TRUE(page_object);
1229 EXPECT_TRUE(FPDFPage_RemoveObject(page1, page_object.get()));
1235 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1236 CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
1237 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1244 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1245 CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
1246 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1251 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1252 ASSERT_TRUE(OpenSavedDocument());
1253 FPDF_PAGE saved_page1 = LoadSavedPage(0);
1254 VerifySavedRendering(saved_page1, 200, 200, FirstRemovedChecksum());
1255 CloseSavedPage(saved_page1);
1256 FPDF_PAGE saved_page2 = LoadSavedPage(1);
1258 CloseSavedPage(saved_page2);
1259 CloseSavedDocument();
1267 ASSERT_TRUE(OpenDocument(
"hello_world_2_pages_shared_resources_dict.pdf"));
1268 FPDF_PAGE page1 = LoadPage(0);
1270 FPDF_PAGE page2 = LoadPage(1);
1275 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1277 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1285 ASSERT_TRUE(page_object);
1287 EXPECT_TRUE(FPDFPage_RemoveObject(page1, page_object.get()));
1293 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1294 CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
1295 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1302 ScopedFPDFBitmap page1_bitmap = RenderPage(page1);
1303 CompareBitmap(page1_bitmap.get(), 200, 200, FirstRemovedChecksum());
1304 ScopedFPDFBitmap page2_bitmap = RenderPage(page2);
1309 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1310 ASSERT_TRUE(OpenSavedDocument());
1311 FPDF_PAGE saved_page1 = LoadSavedPage(0);
1312 VerifySavedRendering(saved_page1, 200, 200, FirstRemovedChecksum());
1313 CloseSavedPage(saved_page1);
1314 FPDF_PAGE saved_page2 = LoadSavedPage(1);
1316 CloseSavedPage(saved_page2);
1317 CloseSavedDocument();
1325 int expected_object_count,
1326 size_t expected_prime_count,
1327 size_t expected_square_count,
1328 size_t expected_greater_than_ten_count,
1329 size_t expected_bounds_count) {
1331 ASSERT_EQ(expected_object_count, object_count);
1333 size_t prime_count = 0;
1334 size_t square_count = 0;
1335 size_t greater_than_ten_count = 0;
1336 size_t bounds_count = 0;
1337 for (
int i = 0; i < object_count; ++i) {
1341 for (
int j = 0; j < mark_count; ++j) {
1345 unsigned long name_len = 999u;
1348 EXPECT_GT(name_len, 0u);
1349 EXPECT_NE(999u, name_len);
1351 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1352 if (name == L"Prime") {
1354 }
else if (name == L"Square") {
1356 int expected_square = start_from + i;
1359 unsigned long get_param_key_return = 999u;
1361 &get_param_key_return
));
1362 EXPECT_EQ((6u + 1u) * 2u, get_param_key_return);
1364 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1365 EXPECT_EQ(L"Factor", key);
1372 EXPECT_EQ(expected_square, square_root * square_root);
1373 }
else if (name == L"GreaterThanTen") {
1374 greater_than_ten_count++;
1375 }
else if (name == L"Bounds") {
1379 unsigned long get_param_key_return = 999u;
1381 &get_param_key_return
));
1382 EXPECT_EQ((8u + 1u) * 2u, get_param_key_return);
1384 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1385 EXPECT_EQ(L"Position", key);
1389 unsigned long length;
1391 mark
, "Position", buffer
, sizeof(buffer)
, &length
));
1392 ASSERT_GT(length, 0u);
1393 std::wstring value =
1394 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1398 EXPECT_EQ((5u + 1u) * 2u, length);
1399 EXPECT_EQ(L"First", value);
1400 }
else if (i == object_count - 1) {
1401 if (length == (4u + 1u) * 2u) {
1402 EXPECT_EQ(L"Last", value);
1403 }
else if (length == (3u + 1u) * 2u) {
1404 EXPECT_EQ(L"End", value);
1419 EXPECT_EQ(expected_prime_count, prime_count);
1420 EXPECT_EQ(expected_square_count, square_count);
1421 EXPECT_EQ(expected_greater_than_ten_count, greater_than_ten_count);
1422 EXPECT_EQ(expected_bounds_count, bounds_count);
1426 ASSERT_TRUE(OpenDocument(
"tagged_marked_content.pdf"));
1427 ScopedEmbedderTestPage page = LoadScopedPage(0);
1430 constexpr int kExpectedObjectCount = 4;
1431 ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page.get()));
1432 for (
int i = 0; i < kExpectedObjectCount; ++i) {
1433 FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), i);
1434 ASSERT_TRUE(page_object);
1445 ASSERT_TRUE(OpenDocument(
"text_in_page_marked_indirect.pdf"));
1446 FPDF_PAGE page = LoadPage(0);
1456 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
1457 FPDF_PAGE page = LoadPage(0);
1462 const char* original_checksum = []() {
1464#if BUILDFLAG(IS_WIN)
1465 return "cefa45d13f92fb761251661a2c889157";
1466#elif BUILDFLAG(IS_APPLE)
1467 return "b2044dc5b49fdca723d74bd6277df689";
1469 return "efc2206b313fff03be8e701907322b06";
1472#if BUILDFLAG(IS_APPLE)
1473#ifdef ARCH_CPU_ARM64
1474 return "401858d37db450bfd3f9458ac490eb08";
1476 return "966579fb98206858ce2f0a1f94a74d05";
1479 return "3d5a3de53d5866044c2b6bf339742c97";
1482 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1483 CompareBitmap(page_bitmap.get(), 200, 200, original_checksum);
1486 constexpr int expected_object_count = 19;
1490 std::vector<FPDF_PAGEOBJECT> primes;
1491 for (
int i = 0; i < expected_object_count; ++i) {
1495 for (
int j = 0; j < mark_count; ++j) {
1499 unsigned long name_len = 999u;
1502 EXPECT_GT(name_len, 0u);
1503 EXPECT_NE(999u, name_len);
1505 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1506 if (name == L"Prime") {
1507 primes.push_back(page_object);
1513 for (FPDF_PAGEOBJECT page_object : primes) {
1514 EXPECT_TRUE(FPDFPage_RemoveObject(page, page_object));
1515 FPDFPageObj_Destroy(page_object);
1519 const char* non_primes_checksum = []() {
1521#if BUILDFLAG(IS_WIN)
1522 return "690c7d4c7850fbe726c2299208425f4f";
1523#elif BUILDFLAG(IS_APPLE)
1524 return "427228e73125ede1050a641cd9b9c8ec";
1526 return "10a6558c9e40ea837922e6f2882a2d57";
1529#if BUILDFLAG(IS_APPLE)
1530#ifdef ARCH_CPU_ARM64
1531 return "6a1e31ffe451997946e449250b97d5b2";
1533 return "6e19a4dd674b522cd39cf41956559bd6";
1536 return "bc8623c052f12376c3d8dd09a6cd27df";
1539 const char* non_primes_after_save_checksum = []() {
1541#if BUILDFLAG(IS_WIN)
1542 return "690c7d4c7850fbe726c2299208425f4f";
1543#elif BUILDFLAG(IS_APPLE)
1544 return "427228e73125ede1050a641cd9b9c8ec";
1546 return "10a6558c9e40ea837922e6f2882a2d57";
1549#if BUILDFLAG(IS_APPLE)
1550#ifdef ARCH_CPU_ARM64
1551 return "d250bee3658c74e5d74729a09cbd80cd";
1553 return "3cb35c681f8fb5a43a49146ac7caa818";
1556 return "bc8623c052f12376c3d8dd09a6cd27df";
1560 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1561 CompareBitmap(page_bitmap.get(), 200, 200, non_primes_checksum);
1566 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1570 ASSERT_TRUE(OpenSavedDocument());
1571 FPDF_PAGE saved_page = LoadSavedPage(0);
1572 ASSERT_TRUE(saved_page);
1576 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
1577 CompareBitmap(page_bitmap.get(), 200, 200, non_primes_after_save_checksum);
1580 CloseSavedPage(saved_page);
1581 CloseSavedDocument();
1586 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
1587 FPDF_PAGE page = LoadPage(0);
1590 constexpr int kExpectedObjectCount = 19;
1594 for (
int i = 0; i < kExpectedObjectCount; ++i) {
1598 for (
int j = mark_count - 1; j >= 0; --j) {
1602 unsigned long name_len = 999u;
1605 EXPECT_GT(name_len, 0u);
1606 EXPECT_NE(999u, name_len);
1608 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1609 if (name == L"Prime") {
1624 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1628 ASSERT_TRUE(OpenSavedDocument());
1629 FPDF_PAGE saved_page = LoadSavedPage(0);
1630 ASSERT_TRUE(saved_page);
1634 CloseSavedPage(saved_page);
1635 CloseSavedDocument();
1640 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
1641 FPDF_PAGE page = LoadPage(0);
1644 constexpr int kExpectedObjectCount = 19;
1648 for (
int i = 0; i < kExpectedObjectCount; ++i) {
1652 for (
int j = 0; j < mark_count; ++j) {
1656 unsigned long name_len = 999u;
1659 EXPECT_GT(name_len, 0u);
1660 EXPECT_NE(999u, name_len);
1662 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1663 if (name == L"Square") {
1681 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1685 ASSERT_TRUE(OpenSavedDocument());
1686 FPDF_PAGE saved_page = LoadSavedPage(0);
1687 ASSERT_TRUE(saved_page);
1689 size_t square_count = 0;
1690 for (
int i = 0; i < kExpectedObjectCount; ++i) {
1694 for (
int j = 0; j < mark_count; ++j) {
1698 unsigned long name_len = 999u;
1701 EXPECT_GT(name_len, 0u);
1702 EXPECT_NE(999u, name_len);
1704 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
1705 if (name == L"Square") {
1717 EXPECT_EQ(4u, square_count);
1719 CloseSavedPage(saved_page);
1720 CloseSavedDocument();
1725 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
1726 FPDF_PAGE page = LoadPage(0);
1741 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1745 ASSERT_TRUE(OpenSavedDocument());
1746 FPDF_PAGE saved_page = LoadSavedPage(0);
1747 ASSERT_TRUE(saved_page);
1751 CloseSavedPage(saved_page);
1752 CloseSavedDocument();
1757 ASSERT_TRUE(OpenDocument(
"text_in_page_marked_indirect.pdf"));
1758 FPDF_PAGE page = LoadPage(0);
1773 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1777 ASSERT_TRUE(OpenSavedDocument());
1778 FPDF_PAGE saved_page = LoadSavedPage(0);
1779 ASSERT_TRUE(saved_page);
1783 CloseSavedPage(saved_page);
1784 CloseSavedDocument();
1789 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1790 FPDF_PAGE page = LoadPage(0);
1796 ASSERT_TRUE(page_object);
1804 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1809 ASSERT_TRUE(OpenSavedDocument());
1810 FPDF_PAGE saved_page = LoadSavedPage(0);
1811 ASSERT_TRUE(saved_page);
1813 CloseSavedPage(saved_page);
1814 CloseSavedDocument();
1819 ASSERT_TRUE(OpenDocument(
"hello_world_split_streams.pdf"));
1820 FPDF_PAGE page = LoadPage(0);
1827 ASSERT_TRUE(page_object);
1832 const char* hello_removed_checksum = []() {
1834#if BUILDFLAG(IS_WIN)
1835 return "48b5524e20e942d2a8f7e15611968cc7";
1836#elif BUILDFLAG(IS_APPLE)
1837 return "5b9d1dee233eb9d51e23a36c6c631443";
1839 return "204c11472f5b93719487de7b9c1b1c93";
1842#if BUILDFLAG(IS_APPLE)
1843 return "5508c2f06d104050f74f655693e38c2c";
1845 return "a8cd82499cf744e0862ca468c9d4ceb8";
1849 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1850 CompareBitmap(page_bitmap.get(), 200, 200, hello_removed_checksum);
1855 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1860 ASSERT_TRUE(OpenSavedDocument());
1861 FPDF_PAGE saved_page = LoadSavedPage(0);
1862 ASSERT_TRUE(saved_page);
1866 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
1867 CompareBitmap(page_bitmap.get(), 200, 200, hello_removed_checksum);
1870 CloseSavedPage(saved_page);
1871 CloseSavedDocument();
1876 ASSERT_TRUE(OpenDocument(
"hello_world_split_streams.pdf"));
1877 FPDF_PAGE page = LoadPage(0);
1884 ASSERT_TRUE(page_object);
1890 ScopedFPDFBitmap page_bitmap = RenderPage(page);
1896 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
1901 ASSERT_TRUE(OpenSavedDocument());
1902 FPDF_PAGE saved_page = LoadSavedPage(0);
1903 ASSERT_TRUE(saved_page);
1907 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
1911 CloseSavedPage(saved_page);
1912 CloseSavedDocument();
1917 ASSERT_TRUE(OpenDocument(
"split_streams.pdf"));
1918 FPDF_PAGE page = LoadPage(0);
1925 for (
int i = 0; i < 19; i++) {
1927 ASSERT_TRUE(page_object);
1943 ASSERT_TRUE(OpenDocument(
"split_streams.pdf"));
1944 FPDF_PAGE page = LoadPage(0);
1954 for (
int i = 18; i >= 0; i--) {
1956 ASSERT_TRUE(page_object);
1970 for (
int i = 0; i < 16; i++) {
1972 ASSERT_TRUE(page_object);
1988 for (
int i = 0; i < 16; i++) {
1990 ASSERT_TRUE(page_object);
1999 const char* stream1_removed_checksum = []() {
2001#if BUILDFLAG(IS_WIN)
2002 return "d7e6debf2dc02de449860ee8012a18d2";
2003#elif BUILDFLAG(IS_APPLE)
2004 return "b26ac6d9bef9c756a19a9aafc60709bd";
2006 return "0b3ef335b8d86a3f9d609368b9d075e0";
2009#if BUILDFLAG(IS_APPLE)
2011 return "a47297bbcfa01e27891eeb52375b6f9e";
2013 return "3cdc75af44c15bed80998facd6e674c9";
2016 return "b474826df1acedb05c7b82e1e49e64a6";
2020 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2021 CompareBitmap(page_bitmap.get(), 200, 200, stream1_removed_checksum);
2025 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2030 ASSERT_TRUE(OpenSavedDocument());
2031 FPDF_PAGE saved_page = LoadSavedPage(0);
2032 ASSERT_TRUE(saved_page);
2037 for (
int i = 0; i < 16; i++) {
2039 ASSERT_TRUE(page_object);
2049 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2050 CompareBitmap(page_bitmap.get(), 200, 200, stream1_removed_checksum);
2053 CloseSavedPage(saved_page);
2054 CloseSavedDocument();
2059 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
2060 FPDF_PAGE page = LoadPage(0);
2068 for (
int i = 1; i >= 0; i--) {
2070 ASSERT_TRUE(page_object);
2088 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2089 CompareBitmap(page_bitmap.get(), 200, 200, kAllRemovedChecksum);
2093 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2097 ASSERT_TRUE(OpenSavedDocument());
2098 FPDF_PAGE saved_page = LoadSavedPage(0);
2099 ASSERT_TRUE(saved_page);
2103 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2104 CompareBitmap(page_bitmap.get(), 200, 200, kAllRemovedChecksum);
2107 CloseSavedPage(saved_page);
2108 CloseSavedDocument();
2113 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
2114 FPDF_PAGE page = LoadPage(0);
2122 ASSERT_TRUE(page_object);
2132 ASSERT_TRUE(page_object);
2141 ASSERT_TRUE(page_object);
2146 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2147 CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
2151 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2155 ASSERT_TRUE(OpenSavedDocument());
2156 FPDF_PAGE saved_page = LoadSavedPage(0);
2157 ASSERT_TRUE(saved_page);
2161 ASSERT_TRUE(page_object);
2165 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2166 CompareBitmap(page_bitmap.get(), 200, 200, FirstRemovedChecksum());
2169 CloseSavedPage(saved_page);
2170 CloseSavedDocument();
2175 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
2176 FPDF_PAGE page = LoadPage(0);
2184 ASSERT_TRUE(page_object);
2194 ASSERT_TRUE(page_object);
2203 ASSERT_TRUE(page_object);
2207 using pdfium::HelloWorldRemovedChecksum;
2209 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2214 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2218 ASSERT_TRUE(OpenSavedDocument());
2219 FPDF_PAGE saved_page = LoadSavedPage(0);
2220 ASSERT_TRUE(saved_page);
2224 ASSERT_TRUE(page_object);
2228 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2232 CloseSavedPage(saved_page);
2233 CloseSavedDocument();
2238 ASSERT_TRUE(OpenDocument(
"hello_world_split_streams.pdf"));
2239 FPDF_PAGE page = LoadPage(0);
2248 for (
int i = 2; i >= 0; i--) {
2250 ASSERT_TRUE(page_object);
2265 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2266 CompareBitmap(page_bitmap.get(), 200, 200, kAllRemovedChecksum);
2270 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2274 ASSERT_TRUE(OpenSavedDocument());
2275 FPDF_PAGE saved_page = LoadSavedPage(0);
2276 ASSERT_TRUE(saved_page);
2280 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2281 CompareBitmap(page_bitmap.get(), 200, 200, kAllRemovedChecksum);
2284 CloseSavedPage(saved_page);
2285 CloseSavedDocument();
2290 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
2291 FPDF_PAGE page = LoadPage(0);
2306 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2310 ASSERT_TRUE(OpenSavedDocument());
2311 FPDF_PAGE saved_page = LoadSavedPage(0);
2312 ASSERT_TRUE(saved_page);
2314 CloseSavedPage(saved_page);
2315 CloseSavedDocument();
2320 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
2321 FPDF_PAGE page = LoadPage(0);
2340 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2344 ASSERT_TRUE(OpenSavedDocument());
2345 FPDF_PAGE saved_page = LoadSavedPage(0);
2346 ASSERT_TRUE(saved_page);
2348 CloseSavedPage(saved_page);
2349 CloseSavedDocument();
2353 const int kOriginalObjectCount = 600;
2356 ASSERT_TRUE(OpenDocument(
"many_rectangles.pdf"));
2357 FPDF_PAGE page = LoadPage(0);
2360 using pdfium::ManyRectanglesChecksum;
2362 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2375 const char* plus_rectangle_checksum = []() {
2377 return "0d3715fcfb9bd0dd25dcce60800bff47";
2379 return "6b9396ab570754b32b04ca629e902f77";
2382 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2383 CompareBitmap(page_bitmap.get(), 200, 300, plus_rectangle_checksum);
2388 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2392 ASSERT_TRUE(OpenSavedDocument());
2393 FPDF_PAGE saved_page = LoadSavedPage(0);
2394 ASSERT_TRUE(saved_page);
2397 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2398 CompareBitmap(page_bitmap.get(), 200, 300, plus_rectangle_checksum);
2402 FPDF_PAGEOBJECT added_object =
2407 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2414 EXPECT_TRUE(FPDF_SaveAsCopy(saved_document(),
this, 0));
2416 CloseSavedPage(saved_page);
2417 CloseSavedDocument();
2421 ASSERT_TRUE(OpenSavedDocument());
2422 saved_page = LoadSavedPage(0);
2423 ASSERT_TRUE(saved_page);
2426 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
2430 CloseSavedPage(saved_page);
2431 CloseSavedDocument();
2436 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
2440 using pdfium::kBlankPage612By792Checksum;
2442 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2449 ASSERT_TRUE(red_rect);
2454 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2455 CompareBitmap(page_bitmap.get(), 612, 792, kRedRectangleChecksum);
2463 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2476 CreateNewDocument();
2477 FPDF_PAGEOBJECT img = FPDFPageObj_NewImageObj(document());
2504 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
2505 FPDF_PAGE page = LoadPage(0);
2524 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
2525 const char* checksum = []() {
2527#if BUILDFLAG(IS_WIN)
2528 return "52c133b5b6bf76760c59cffc12c1131a";
2529#elif BUILDFLAG(IS_APPLE)
2530 return "9eba2a1a6599c2abcf002012217a6505";
2532 return "72523cfac069f8a81057164682998961";
2535#if BUILDFLAG(IS_APPLE)
2536 return "279693baca9f48da2d75a8e289aed58e";
2538 return "fe415d47945c10b9cc8e9ca08887369e";
2541 CompareBitmap(bitmap.get(), 200, 200, checksum);
2547 ASSERT_TRUE(OpenDocument(
"bug_717.pdf"));
2548 FPDF_PAGE page = LoadPage(0);
2563 const char* original_checksum = []() {
2565 return "1e82fbdd21490cee9d3479fe6125af67";
2567 return "ad04e5bd0f471a9a564fb034bd0fb073";
2569 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
2570 CompareBitmap(bitmap.get(), 612, 792, original_checksum);
2574 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2577 ASSERT_TRUE(OpenSavedDocument());
2578 FPDF_PAGE saved_page = LoadSavedPage(0);
2579 ASSERT_TRUE(saved_page);
2580 VerifySavedRendering(saved_page, 612, 792, original_checksum);
2594 const char* last_checksum = []() {
2596 return "8705d023e5fec3499d1e30cf2bcc5dc1";
2598 return "4b5b00f824620f8c9b8801ebb98e1cdd";
2601 ScopedFPDFBitmap new_bitmap = RenderSavedPage(saved_page);
2602 CompareBitmap(new_bitmap.get(), 612, 792, last_checksum);
2607 EXPECT_TRUE(FPDF_SaveAsCopy(saved_document(),
this, 0));
2609 CloseSavedPage(saved_page);
2610 CloseSavedDocument();
2613 VerifySavedDocument(612, 792, last_checksum);
2618 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
2628 EXPECT_EQ(15.0f, width);
2633 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2634 const char* checksum_1 = []() {
2636 return "1469acf60e7647ebeb8e1fb08c5d6c7a";
2638 return "64bd31f862a89e0a9e505a5af6efd506";
2640 CompareBitmap(page_bitmap.get(), 612, 792, checksum_1);
2654 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2655 const char* checksum_2 = []() {
2657 return "c4b2314ce2da802fbb390ea3bb2adae9";
2659 return "4b6f3b9d25c4e194821217d5016c3724";
2661 CompareBitmap(page_bitmap.get(), 612, 792, checksum_2);
2676 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2677 const char* checksum_3 = []() {
2679 return "e37dfe983eac22a3f936dfc86355fde5";
2681 return "ff3e6a22326754944cc6e56609acd73b";
2683 CompareBitmap(page_bitmap.get(), 612, 792, checksum_3);
2691 ScopedFPDFPage page(FPDFPage_New(CreateNewDocument(), 0, 612, 792));
2694 FPDF_PAGEOBJECT text_object1 =
2695 FPDFPageObj_NewTextObj(document(),
"Arial", 12.0f);
2696 EXPECT_TRUE(text_object1);
2698 EXPECT_TRUE(FPDFText_SetText(text_object1, text1.get()));
2699 static constexpr FS_MATRIX kMatrix1{1, 0, 0, 1, 20, 20};
2701 FPDFPage_InsertObject(page.get(), text_object1);
2702 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
2704 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
2705 CompareBitmap(page_bitmap.get(), 612, 792, BottomTextChecksum());
2707 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2708 VerifySavedDocument(612, 792, BottomTextChecksum());
2712 FPDF_PAGEOBJECT text_object2 =
2713 FPDFPageObj_NewTextObj(document(),
"TimesNewRomanBold", 15.0f);
2714 EXPECT_TRUE(text_object2);
2716 GetFPDFWideString(L"Hi, I'm Bold. Times New Roman Bold.");
2717 EXPECT_TRUE(FPDFText_SetText(text_object2, text2.get()));
2719 FPDFPage_InsertObject(page.get(), text_object2);
2720 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
2722 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
2723 const char* checksum = []() {
2725#if BUILDFLAG(IS_WIN)
2726 return "667f74c7cbf72c75bce303ca2de975a3";
2727#elif BUILDFLAG(IS_APPLE)
2728 return "86d51a764615b843465695786e92fec5";
2730 return "3fa05f8935a43a38a8923e9d5fb94365";
2733#if BUILDFLAG(IS_APPLE)
2734 return "983baaa1f688eff7a14b1bf91c171a1a";
2736 return "161523e196eb5341604cd73e12c97922";
2739 CompareBitmap(page_bitmap.get(), 612, 792, checksum);
2741 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2742 VerifySavedDocument(612, 792, checksum);
2746 FPDF_PAGEOBJECT text_object3 =
2747 FPDFPageObj_NewTextObj(document(),
"Courier-Bold", 20.0f);
2748 EXPECT_TRUE(text_object3);
2750 EXPECT_TRUE(FPDFText_SetText(text_object3, text3.get()));
2752 FPDFPage_InsertObject(page.get(), text_object3);
2753 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
2755 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
2756 const char* checksum = []() {
2758#if BUILDFLAG(IS_WIN)
2759 return "4695b3de213d6795a591f27cd8d86e26";
2760#elif BUILDFLAG(IS_APPLE)
2761 return "422f1384c13e95c218498a8f18b9e5a7";
2763 return "63385a217934d9ee9e17ef4d7f7b2128";
2766#if BUILDFLAG(IS_APPLE)
2767 return "e0b3493c5c16e41d0d892ffb48e63fba";
2769 return "1fbf772dca8d82b960631e6683934964";
2772 CompareBitmap(page_bitmap.get(), 612, 792, checksum);
2774 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2775 VerifySavedDocument(612, 792, checksum);
2780 EXPECT_FLOAT_EQ(1.0f, matrix.a);
2781 EXPECT_FLOAT_EQ(1.5f, matrix.b);
2782 EXPECT_FLOAT_EQ(2.0f, matrix.c);
2783 EXPECT_FLOAT_EQ(0.5f, matrix.d);
2784 EXPECT_FLOAT_EQ(200.0f, matrix.e);
2785 EXPECT_FLOAT_EQ(200.0f, matrix.f);
2790 EXPECT_EQ(55, size);
2792 EXPECT_EQ(20, size);
2800 ScopedFPDFPage page(FPDFPage_New(CreateNewDocument(), 0, 612, 792));
2803 FPDF_PAGEOBJECT text_object =
2804 FPDFPageObj_NewTextObj(document(),
"Arial", 0.0f);
2805 EXPECT_TRUE(text_object);
2807 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
2812 EXPECT_EQ(0.0f, size);
2814 FPDFPage_InsertObject(page.get(), text_object);
2815 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
2817 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
2818 CompareBitmap(page_bitmap.get(), 612, 792,
2821 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2827 ASSERT_TRUE(OpenDocument(
"text_render_mode.pdf"));
2828 FPDF_PAGE page = LoadPage(0);
2832 EXPECT_EQ(FPDF_TEXTRENDERMODE_UNKNOWN,
2845 const char* original_checksum = []() {
2847#if BUILDFLAG(IS_WIN)
2848 return "e17a6453cb48a600f180c5907c4ea02e";
2849#elif BUILDFLAG(IS_APPLE)
2850 return "e2d5c32499173c0ff939ad2e7fc01fd6";
2852 return "48c7f21b2a1a1bbeab24cccccc131e47";
2855#if BUILDFLAG(IS_APPLE)
2856 return "c488514ce0fc949069ff560407edacd2";
2858 return "97a4fcf3c9581e19917895631af31d41";
2861 const char* stroke_checksum = []() {
2863 return "d16eb1bb4748eeb5fb801594da70d519";
2865 return "e06ee84aeebe926e8c980b7822027e8a";
2869 ASSERT_TRUE(OpenDocument(
"text_render_mode.pdf"));
2870 FPDF_PAGE page = LoadPage(0);
2876 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2877 CompareBitmap(page_bitmap.get(), 612, 446, original_checksum);
2887 ASSERT_TRUE(page_object);
2888 EXPECT_EQ(FPDF_TEXTRENDERMODE_FILL,
2893 FPDF_TEXTRENDERMODE_UNKNOWN
));
2897 EXPECT_EQ(FPDF_TEXTRENDERMODE_STROKE,
2902 ScopedFPDFBitmap page_bitmap = RenderPage(page);
2903 CompareBitmap(page_bitmap.get(), 612, 446, stroke_checksum);
2908 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
2916 ASSERT_TRUE(OpenSavedDocument());
2917 FPDF_PAGE saved_page = LoadSavedPage(0);
2918 ASSERT_TRUE(saved_page);
2921 EXPECT_TRUE(page_object);
2922 EXPECT_EQ(FPDF_TEXTRENDERMODE_STROKE,
2925 ScopedFPDFBitmap bitmap = RenderSavedPage(saved_page);
2926 CompareBitmap(bitmap.get(), 612, 446, stroke_checksum);
2928 CloseSavedPage(saved_page);
2929 CloseSavedDocument();
2936 EXPECT_EQ(0U, FPDFFont_GetBaseFontName(
nullptr,
nullptr, 5));
2937 EXPECT_EQ(0U, FPDFFont_GetFamilyName(
nullptr,
nullptr, 5));
2947 ASSERT_TRUE(OpenDocument(
"text_font.pdf"));
2948 FPDF_PAGE page = LoadPage(0);
2971 EXPECT_EQ(0, angle);
2975 EXPECT_FLOAT_EQ(891 * font_size / 1000.0f, ascent);
2979 EXPECT_FLOAT_EQ(-216 * font_size / 1000.0f, descent);
2984 EXPECT_FLOAT_EQ(a12, 5.316f);
2986 EXPECT_FLOAT_EQ(a24, 10.632f);
2991 size_t size = FPDFFont_GetBaseFontName(font,
nullptr, 0);
2992 const char kExpectedFontName[] =
"LiberationSerif";
2993 ASSERT_EQ(
sizeof(kExpectedFontName), size);
2994 std::vector<
char> font_name(size);
2995 ASSERT_EQ(size, FPDFFont_GetBaseFontName(font, font_name.data(), size));
2996 ASSERT_STREQ(kExpectedFontName, font_name.data());
2999 ASSERT_EQ(0U, FPDFFont_GetBaseFontName(
nullptr,
nullptr, 0));
3001 font_name.resize(2);
3003 font_name[1] =
'\0';
3004 size = FPDFFont_GetBaseFontName(font, font_name.data(), font_name.size());
3005 ASSERT_EQ(
sizeof(kExpectedFontName), size);
3006 ASSERT_STREQ(
"x", font_name.data());
3011 unsigned long size = FPDFFont_GetFamilyName(font,
nullptr, 0);
3012 const char kExpectedFontName[] =
"Liberation Serif";
3013 ASSERT_EQ(
sizeof(kExpectedFontName), size);
3014 std::vector<
char> font_name(size);
3015 ASSERT_EQ(size, FPDFFont_GetFamilyName(font, font_name.data(), size));
3016 ASSERT_STREQ(kExpectedFontName, font_name.data());
3019 ASSERT_EQ(0U, FPDFFont_GetFamilyName(
nullptr,
nullptr, 0));
3021 font_name.resize(2);
3023 font_name[1] =
'\0';
3024 size = FPDFFont_GetFamilyName(font, font_name.data(), font_name.size());
3025 ASSERT_EQ(
sizeof(kExpectedFontName), size);
3026 ASSERT_STREQ(
"x", font_name.data());
3031 constexpr size_t kExpectedSize = 8268;
3032 std::vector<uint8_t> buf;
3033 size_t buf_bytes_required = 123;
3034 ASSERT_TRUE(FPDFFont_GetFontData(font,
nullptr, 0, &buf_bytes_required));
3035 ASSERT_EQ(kExpectedSize, buf_bytes_required);
3037 buf.resize(kExpectedSize);
3038 EXPECT_EQ(
"495800b8e56e2d37f3bc48a1b52db952", GenerateMD5Base16(buf));
3039 buf_bytes_required = 234;
3041 EXPECT_TRUE(FPDFFont_GetFontData(font, buf.data(), buf.size() - 1,
3042 &buf_bytes_required));
3043 EXPECT_EQ(
"495800b8e56e2d37f3bc48a1b52db952", GenerateMD5Base16(buf));
3044 EXPECT_EQ(kExpectedSize, buf_bytes_required);
3047 buf_bytes_required = 234;
3048 EXPECT_TRUE(FPDFFont_GetFontData(font, buf.data(), buf.size(),
3049 &buf_bytes_required));
3050 EXPECT_EQ(
"1a67be75f719b6c476804d85bb9e4844", GenerateMD5Base16(buf));
3051 EXPECT_EQ(kExpectedSize, buf_bytes_required);
3054 EXPECT_FALSE(FPDFFont_GetFontData(
nullptr,
nullptr, 0,
nullptr));
3055 EXPECT_FALSE(FPDFFont_GetFontData(font,
nullptr, 0,
nullptr));
3057 buf_bytes_required = 345;
3059 FPDFFont_GetFontData(
nullptr,
nullptr, 0, &buf_bytes_required));
3060 EXPECT_EQ(345u, buf_bytes_required);
3063 FPDFFont_GetFontData(
nullptr, buf.data(), buf.size(),
nullptr));
3064 EXPECT_FALSE(FPDFFont_GetFontData(font, buf.data(), buf.size(),
nullptr));
3066 buf_bytes_required = 345;
3067 EXPECT_FALSE(FPDFFont_GetFontData(
nullptr, buf.data(), buf.size(),
3068 &buf_bytes_required));
3069 EXPECT_EQ(345u, buf_bytes_required);
3080 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
3081 FPDF_PAGE page = LoadPage(0);
3088 constexpr size_t kTinosRegularSize = 469968;
3093 std::vector<uint8_t> buf;
3094 buf.resize(kTinosRegularSize);
3095 size_t buf_bytes_required;
3097 FPDFFont_GetFontData(font, buf.data(), buf.size(), &buf_bytes_required));
3098 EXPECT_EQ(kTinosRegularSize, buf_bytes_required);
3099 EXPECT_EQ(
"2b019558f2c2de0b7cbc0a6e64b20599", GenerateMD5Base16(buf));
3103 constexpr size_t kArimoRegularSize = 436180;
3108 buf.resize(kArimoRegularSize);
3110 FPDFFont_GetFontData(font, buf.data(), buf.size(), &buf_bytes_required));
3111 EXPECT_EQ(kArimoRegularSize, buf_bytes_required);
3112 EXPECT_EQ(
"7ac02a544211773d9636e056e9da6c35", GenerateMD5Base16(buf));
3119 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
3120 ScopedEmbedderTestPage page = LoadScopedPage(0);
3122 ASSERT_EQ(2, FPDFPage_CountObjects(page.get()));
3125 FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
3126 ASSERT_TRUE(page_object);
3129 size_t size = FPDFFont_GetBaseFontName(font,
nullptr, 0);
3130 const char kExpectedFontName[] =
"Times-Roman";
3131 ASSERT_EQ(
sizeof(kExpectedFontName), size);
3132 std::vector<
char> font_name(size);
3133 ASSERT_EQ(size, FPDFFont_GetBaseFontName(font, font_name.data(), size));
3134 EXPECT_STREQ(kExpectedFontName, font_name.data());
3137 FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 1);
3138 ASSERT_TRUE(page_object);
3141 size_t size = FPDFFont_GetBaseFontName(font,
nullptr, 0);
3142 const char kExpectedFontName[] =
"Helvetica";
3143 ASSERT_EQ(
sizeof(kExpectedFontName), size);
3144 std::vector<
char> font_name(size);
3145 ASSERT_EQ(size, FPDFFont_GetBaseFontName(font, font_name.data(), size));
3146 ASSERT_STREQ(kExpectedFontName, font_name.data());
3155 ASSERT_TRUE(OpenDocument(
"text_font.pdf"));
3156 FPDF_PAGE page = LoadPage(0);
3172 ASSERT_GT(count, 0);
3177 ASSERT_TRUE(segment);
3184 ASSERT_TRUE(OpenDocument(
"form_object.pdf"));
3185 FPDF_PAGE page = LoadPage(0);
3202 ASSERT_EQ(271,
static_cast<
int>(top));
3207 ASSERT_EQ(221,
static_cast<
int>(top));
3215 static constexpr FS_MATRIX kMatrix = {1.0f, 1.5f, 2.0f, 2.5f, 100.0f, 200.0f};
3220 EXPECT_FLOAT_EQ(kMatrix.a, matrix.a);
3221 EXPECT_FLOAT_EQ(kMatrix.b, matrix.b);
3222 EXPECT_FLOAT_EQ(kMatrix.c, matrix.c);
3223 EXPECT_FLOAT_EQ(kMatrix.d, matrix.d);
3224 EXPECT_FLOAT_EQ(kMatrix.e, matrix.e);
3225 EXPECT_FLOAT_EQ(kMatrix.f, matrix.f);
3240 const char* orig_checksum = []() {
3242#if BUILDFLAG(IS_WIN)
3243 return "9d0ca0d471efc12950f337a867ab1694";
3244#elif BUILDFLAG(IS_APPLE)
3245 return "4cfff1919007a7faf099be5cc2cea00a";
3247 return "1c6dae4b04fea7430a791135721eaba5";
3250#if BUILDFLAG(IS_APPLE)
3251 return "a637057185f50aac1aa5490f726aef95";
3253 return "34a9ec0a9581a7970e073c0bcc4ca676";
3256 const char* new_checksum = []() {
3258#if BUILDFLAG(IS_WIN)
3259 return "dbebf244eb706dfebfd0594c23e993a9";
3260#elif BUILDFLAG(IS_APPLE)
3261 return "eb88a6842f5e12f5180385261db1f81d";
3263 return "7282fe98693c0a7ad2c1b3f3f9563977";
3266#if BUILDFLAG(IS_APPLE)
3267 return "8ad9d79b02b609ff734e2a2195c96e2d";
3269 return "609b5632a21c886fa93182dbc290bf7a";
3273 ASSERT_TRUE(OpenDocument(
"form_object.pdf"));
3274 FPDF_PAGE page = LoadPage(0);
3279 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
3280 CompareBitmap(bitmap.get(), 62, 69, orig_checksum);
3290 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
3291 CompareBitmap(bitmap.get(), 62, 69, new_checksum);
3294 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3295 VerifySavedDocument(62, 69, new_checksum);
3303 ScopedFPDFPage page(FPDFPage_New(CreateNewDocument(), 0, 612, 792));
3306 ScopedFPDFFont font(FPDFText_LoadStandardFont(document(),
"Helvetica"));
3310 FPDF_PAGEOBJECT text_object =
3311 FPDFPageObj_CreateTextObj(document(), font.get(), 12.0f);
3312 EXPECT_TRUE(text_object);
3314 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
3316 FPDFPage_InsertObject(page.get(), text_object);
3317 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
3318 CompareBitmap(page_bitmap.get(), 612, 792, BottomTextChecksum());
3322 CreateNewDocument();
3323 static constexpr const char* kStandardFontNames[] = {
3329 "Courier-BoldOblique",
3334 "CourierNew-BoldItalic",
3335 "CourierNew-Italic",
3338 "Helvetica-BoldOblique",
3339 "Helvetica-Oblique",
3342 "TimesNewRoman-Bold",
3343 "TimesNewRoman-BoldItalic",
3344 "TimesNewRoman-Italic",
3346 for (
const char* font_name : kStandardFontNames) {
3347 ScopedFPDFFont font(FPDFText_LoadStandardFont(document(), font_name));
3348 EXPECT_TRUE(font) << font_name <<
" should be considered a standard font.";
3350 static constexpr const char* kNotStandardFontNames[] = {
3351 "Abcdefg",
"ArialB",
"Arial-Style",
3352 "Font Name",
"FontArial",
"NotAStandardFontName",
3353 "TestFontName",
"Quack",
"Symbol-Italic",
3355 for (
const char* font_name : kNotStandardFontNames) {
3356 ScopedFPDFFont font(FPDFText_LoadStandardFont(document(), font_name));
3357 EXPECT_FALSE(font) << font_name
3358 <<
" should not be considered a standard font.";
3364 ScopedFPDFPage page(FPDFPage_New(CreateNewDocument(), 0, 612, 792));
3369 FPDFPage_InsertObject(page.get(), rect1);
3370 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
3373 CPDF_Page* cpage = CPDFPageFromFPDFPage(page.get());
3375 cpage->GetResources()->GetDictFor(
"ExtGState");
3376 ASSERT_TRUE(graphics_dict);
3377 EXPECT_THAT(graphics_dict->GetKeys(),
3378 UnorderedElementsAreArray({
"FXE1",
"FXE2"}));
3381 FPDF_PAGEOBJECT text1 = FPDFPageObj_NewTextObj(document(),
"Arial", 12.0f);
3385 FPDFPage_InsertObject(page.get(), text1);
3386 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
3387 EXPECT_THAT(graphics_dict->GetKeys(),
3388 UnorderedElementsAreArray({
"FXE1",
"FXE2"}));
3391 FPDF_PAGEOBJECT text2 =
3392 FPDFPageObj_NewTextObj(document(),
"Times-Roman", 12.0f);
3393 FPDFPage_InsertObject(page.get(), text2);
3396 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
3397 EXPECT_THAT(graphics_dict->GetKeys(),
3398 UnorderedElementsAreArray({
"FXE1",
"FXE2",
"FXE3"}));
3404 FPDFPage_InsertObject(page.get(), path);
3405 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
3406 EXPECT_THAT(graphics_dict->GetKeys(),
3407 UnorderedElementsAreArray({
"FXE1",
"FXE2",
"FXE3"}));
3414 FPDFPage_InsertObject(page.get(), rect2);
3415 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
3416 EXPECT_THAT(graphics_dict->GetKeys(),
3417 UnorderedElementsAreArray({
"FXE1",
"FXE2",
"FXE3",
"FXE4"}));
3422 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
3434 cpage->GetResources()->GetDictFor(
"ExtGState");
3435 ASSERT_TRUE(graphics_dict);
3436 EXPECT_THAT(graphics_dict->GetKeys(),
3437 UnorderedElementsAreArray({
"FXE1",
"FXE2"}));
3441 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3442 CompareBitmap(page_bitmap.get(), 612, 792,
3443 "5384da3406d62360ffb5cac4476fff1c");
3450 EXPECT_THAT(graphics_dict->GetKeys(),
3451 UnorderedElementsAreArray({
"FXE1",
"FXE3"}));
3455 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3456 CompareBitmap(page_bitmap.get(), 612, 792,
3457 "2e51656f5073b0bee611d9cd086aa09c");
3462 EXPECT_THAT(graphics_dict->GetKeys(),
3463 UnorderedElementsAreArray({
"FXE1",
"FXE3"}));
3465 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3466 CompareBitmap(page_bitmap.get(), 612, 792,
3467 "2e51656f5073b0bee611d9cd086aa09c");
3472 cpage->GetResources()->GetDictFor(
"Font");
3473 EXPECT_FALSE(font_dict);
3474 FPDF_PAGEOBJECT text_object =
3475 FPDFPageObj_NewTextObj(document(),
"Arial", 12.0f);
3477 GetFPDFWideString(L"Something something #text# something");
3478 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
3484 font_dict = cpage->GetResources()->GetDictFor(
"Font");
3485 ASSERT_TRUE(font_dict);
3486 EXPECT_THAT(graphics_dict->GetKeys(),
3487 UnorderedElementsAreArray({
"FXE1",
"FXE3"}));
3488 EXPECT_THAT(font_dict->GetKeys(), UnorderedElementsAreArray({
"FXF1"}));
3492 EXPECT_THAT(graphics_dict->GetKeys(),
3493 UnorderedElementsAreArray({
"FXE1",
"FXE3"}));
3494 EXPECT_THAT(font_dict->GetKeys(), UnorderedElementsAreArray({
"FXF1"}));
3499 CreateNewDocument();
3502 CPDF_Font::GetStockFont(cpdf_doc(),
"Times-Bold");
3503 pdfium::span<
const uint8_t> span = stock_font->GetFont()->GetFontSpan();
3504 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
3507 CPDF_Font* typed_font = CPDFFontFromFPDFFont(font.get());
3511 EXPECT_EQ(
"Font", font_dict->GetNameFor(
"Type"));
3512 EXPECT_EQ(
"Type1", font_dict->GetNameFor(
"Subtype"));
3513 EXPECT_EQ(
"Tinos-Bold", font_dict->GetNameFor(
"BaseFont"));
3514 ASSERT_TRUE(font_dict->KeyExist(
"FirstChar"));
3515 ASSERT_TRUE(font_dict->KeyExist(
"LastChar"));
3516 EXPECT_EQ(32, font_dict->GetIntegerFor(
"FirstChar"));
3517 EXPECT_EQ(255, font_dict->GetIntegerFor(
"LastChar"));
3520 ASSERT_TRUE(widths_array);
3521 ASSERT_EQ(224u, widths_array->size());
3522 EXPECT_EQ(250, widths_array->GetFloatAt(0));
3523 EXPECT_EQ(569, widths_array->GetFloatAt(11));
3524 EXPECT_EQ(500, widths_array->GetFloatAt(223));
3529 CreateNewDocument();
3531 CPDF_Font::GetStockFont(cpdf_doc(),
"Courier");
3532 pdfium::span<
const uint8_t> span = stock_font->GetFont()->GetFontSpan();
3533 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
3536 CPDF_Font* typed_font = CPDFFontFromFPDFFont(font.get());
3540 EXPECT_EQ(
"Font", font_dict->GetNameFor(
"Type"));
3541 EXPECT_EQ(
"TrueType", font_dict->GetNameFor(
"Subtype"));
3542 EXPECT_EQ(
"Cousine-Regular", font_dict->GetNameFor(
"BaseFont"));
3543 ASSERT_TRUE(font_dict->KeyExist(
"FirstChar"));
3544 ASSERT_TRUE(font_dict->KeyExist(
"LastChar"));
3545 EXPECT_EQ(32, font_dict->GetIntegerFor(
"FirstChar"));
3546 EXPECT_EQ(255, font_dict->GetIntegerFor(
"LastChar"));
3549 ASSERT_TRUE(widths_array);
3550 ASSERT_EQ(224u, widths_array->size());
3551 EXPECT_EQ(600, widths_array->GetFloatAt(33));
3552 EXPECT_EQ(600, widths_array->GetFloatAt(74));
3553 EXPECT_EQ(600, widths_array->GetFloatAt(223));
3558 CreateNewDocument();
3560 CPDF_Font::GetStockFont(cpdf_doc(),
"Times-Roman");
3561 pdfium::span<
const uint8_t> span = stock_font->GetFont()->GetFontSpan();
3562 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
3565 CPDF_Font* typed_font = CPDFFontFromFPDFFont(font.get());
3570 EXPECT_EQ(
"Font", font_dict->GetNameFor(
"Type"));
3571 EXPECT_EQ(
"Type0", font_dict->GetNameFor(
"Subtype"));
3572 EXPECT_EQ(
"Tinos-Regular-Identity-H", font_dict->GetNameFor(
"BaseFont"));
3573 EXPECT_EQ(
"Identity-H", font_dict->GetNameFor(
"Encoding"));
3575 font_dict->GetArrayFor(
"DescendantFonts");
3576 ASSERT_TRUE(descendant_array);
3577 EXPECT_EQ(1u, descendant_array->size());
3581 descendant_array->GetDictAt(0);
3582 EXPECT_EQ(
"Font", cidfont_dict->GetNameFor(
"Type"));
3583 EXPECT_EQ(
"CIDFontType0", cidfont_dict->GetNameFor(
"Subtype"));
3584 EXPECT_EQ(
"Tinos-Regular", cidfont_dict->GetNameFor(
"BaseFont"));
3586 cidfont_dict->GetDictFor(
"CIDSystemInfo");
3587 ASSERT_TRUE(cidinfo_dict);
3589 cidinfo_dict->GetObjectFor(
"Registry");
3590 ASSERT_TRUE(registry);
3592 EXPECT_EQ(
"Adobe", registry->GetString());
3594 cidinfo_dict->GetObjectFor(
"Ordering");
3595 ASSERT_TRUE(ordering);
3597 EXPECT_EQ(
"Identity", ordering->GetString());
3598 EXPECT_EQ(0, cidinfo_dict->GetFloatFor(
"Supplement"));
3599 CheckFontDescriptor(cidfont_dict.Get(),
FPDF_FONT_TYPE1,
false,
false, span);
3603 ASSERT_TRUE(widths_array);
3604 EXPECT_GT(widths_array->size(), 1u);
3605 CheckCompositeFontWidths(widths_array.Get(), typed_font);
3609 CreateNewDocument();
3611 CPDF_Font::GetStockFont(cpdf_doc(),
"Helvetica-Oblique");
3612 pdfium::span<
const uint8_t> span = stock_font->GetFont()->GetFontSpan();
3613 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
3616 CPDF_Font* typed_font = CPDFFontFromFPDFFont(font.get());
3621 EXPECT_EQ(
"Font", font_dict->GetNameFor(
"Type"));
3622 EXPECT_EQ(
"Type0", font_dict->GetNameFor(
"Subtype"));
3623 EXPECT_EQ(
"Arimo-Italic", font_dict->GetNameFor(
"BaseFont"));
3624 EXPECT_EQ(
"Identity-H", font_dict->GetNameFor(
"Encoding"));
3626 font_dict->GetArrayFor(
"DescendantFonts");
3627 ASSERT_TRUE(descendant_array);
3628 EXPECT_EQ(1u, descendant_array->size());
3632 descendant_array->GetDictAt(0);
3633 EXPECT_EQ(
"Font", cidfont_dict->GetNameFor(
"Type"));
3634 EXPECT_EQ(
"CIDFontType2", cidfont_dict->GetNameFor(
"Subtype"));
3635 EXPECT_EQ(
"Arimo-Italic", cidfont_dict->GetNameFor(
"BaseFont"));
3637 cidfont_dict->GetDictFor(
"CIDSystemInfo");
3638 ASSERT_TRUE(cidinfo_dict);
3639 EXPECT_EQ(
"Adobe", cidinfo_dict->GetByteStringFor(
"Registry"));
3640 EXPECT_EQ(
"Identity", cidinfo_dict->GetByteStringFor(
"Ordering"));
3641 EXPECT_EQ(0, cidinfo_dict->GetFloatFor(
"Supplement"));
3647 ASSERT_TRUE(widths_array);
3648 CheckCompositeFontWidths(widths_array.Get(), typed_font);
3653 ASSERT_TRUE(OpenDocument(
"bug_713197.pdf"));
3654 FPDF_PAGE page = LoadPage(0);
3663 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
3666 CPDF_Font::GetStockFont(cpdf_doc(),
"Arial");
3667 pdfium::span<
const uint8_t> span = stock_font->GetFont()->GetFontSpan();
3668 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
3673 FPDF_PAGEOBJECT text_object =
3674 FPDFPageObj_CreateTextObj(document(), font.get(), 12.0f);
3675 EXPECT_TRUE(text_object);
3677 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
3680 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3681 CompareBitmap(page_bitmap.get(), 612, 792, LoadedFontTextChecksum());
3684 FPDF_PAGEOBJECT text_object2 =
3685 FPDFPageObj_CreateTextObj(document(), font.get(), 15.0f);
3687 EXPECT_TRUE(FPDFText_SetText(text_object2, text2.get()));
3691 ScopedFPDFBitmap page_bitmap2 = RenderPage(page);
3692 const char* insert_true_type_checksum = []() {
3694#if BUILDFLAG(IS_WIN)
3695 return "7e44d135666d8bfcef5cdb4c8161fd4b";
3696#elif BUILDFLAG(IS_APPLE)
3697 return "6bab7f663daca1aab63d787a0f5cb33b";
3699 return "4f9a6c7752ac7d4e4c731260fdb5af15";
3702#if BUILDFLAG(IS_APPLE)
3703 return "c7e2271a7f30e5b919a13ead47cea105";
3705 return "683f4a385a891494100192cb338b11f0";
3708 CompareBitmap(page_bitmap2.get(), 612, 792, insert_true_type_checksum);
3711 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3714 VerifySavedDocument(612, 792, insert_true_type_checksum);
3719 ASSERT_TRUE(OpenDocument(
"annotation_highlight_long_content.pdf"));
3720 FPDF_PAGE page = LoadPage(0);
3725 ScopedFPDFAnnotation annot(
3737#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
3738TEST_F(FPDFEditEmbedderTest, AddCIDFontText) {
3740 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
3744 cid_font.LoadSubst(
"Noto Sans CJK JP",
true, 0, 400, 0,
3745 FX_CodePage::kShiftJIS,
false);
3746 EXPECT_EQ(
"Noto Sans CJK JP", cid_font.GetFamilyName());
3747 pdfium::span<
const uint8_t> span = cid_font.GetFontSpan();
3750 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
3751 FPDF_FONT_TRUETYPE, 1));
3755 FPDF_PAGEOBJECT text_object =
3756 FPDFPageObj_CreateTextObj(document(), font.get(), 12.0f);
3757 ASSERT_TRUE(text_object);
3758 std::wstring wstr = L"ABCDEFGhijklmnop.";
3759 ScopedFPDFWideString text = GetFPDFWideString(wstr);
3760 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
3761 FPDFPageObj_Transform(text_object, 1, 0, 0, 1, 200, 200);
3762 FPDFPage_InsertObject(page, text_object);
3765 FPDF_PAGEOBJECT text_object2 =
3766 FPDFPageObj_CreateTextObj(document(), font.get(), 18.0f);
3767 ASSERT_TRUE(text_object2);
3768 std::wstring wstr2 =
3769 L"\u3053\u3093\u306B\u3061\u306f\u4e16\u754C\u3002\u3053\u3053\u306B1"
3771 ScopedFPDFWideString text2 = GetFPDFWideString(wstr2);
3772 EXPECT_TRUE(FPDFText_SetText(text_object2, text2.get()));
3773 FPDFPageObj_Transform(text_object2, 1, 0, 0, 1, 100, 500);
3774 FPDFPage_InsertObject(page, text_object2);
3778 const char* checksum = []() {
3779 if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
3780 return "2e174d17de96a760d42ca3a06acbf36a";
3782 return "84d31d11b76845423a2cfc1879c0fbb9";
3786 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3787 CompareBitmap(page_bitmap.get(), 612, 792, checksum);
3791 EXPECT_TRUE(FPDFPage_GenerateContent(page));
3792 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3793 FPDF_ClosePage(page);
3795 VerifySavedDocument(612, 792, checksum);
3802 CreateEmptyDocument();
3803 ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400));
3804 std::string font_path;
3806 "NotoSansCJK/NotoSansSC-Regular.subset.otf", &font_path));
3808 std::vector<uint8_t> font_data = GetFileContents(font_path.c_str());
3809 ASSERT_FALSE(font_data.empty());
3811 static const char kToUnicodeCMap[] = R"(
3812/CIDInit /ProcSet findresource begin
381312 dict begin
3814begincmap
3815/CIDSystemInfo <<
3816 /Registry (Adobe)
3817 /Ordering (Identity)
3818 /Supplement 0
3819>> def
3820/CMapName /Adobe-Identity-H def
3821/CMapType 2 def
38221 begincodespacerange
3823<0000> <FFFF>
3824endcodespacerange
38255 beginbfrange
3826<0001> <0003> [<0020> <3002> <2F00>]
3827<0003> <0004> [<4E00> <2F06>]
3828<0004> <0005> [<4E8C> <53E5>]
3829<0005> <0008> [<F906> <662F> <7B2C> <884C>]
3830<0008> <0009> [<FA08> <8FD9>]
3831endbfrange
3832endcmap
3833CMapName currentdict /CMap defineresource pop
3834end
3835end
3836)";
3838 const std::vector<uint8_t> cid_to_gid_map = {0, 0, 0, 1, 0, 2, 0, 3, 0, 4,
3839 0, 5, 0, 6, 0, 7, 0, 8, 0, 9};
3841 ScopedFPDFFont font(FPDFText_LoadCidType2Font(
3842 document(), font_data.data(), font_data.size(), kToUnicodeCMap,
3843 cid_to_gid_map.data(), cid_to_gid_map.size()));
3846 FPDF_PAGEOBJECT text_object =
3847 FPDFPageObj_CreateTextObj(document(), font.get(), 20.0f);
3848 EXPECT_TRUE(text_object);
3853 EXPECT_TRUE(FPDFText_SetText(text_object, text.get()));
3856 FPDFPage_InsertObject(page.get(), text_object);
3857 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
3859 ScopedFPDFBitmap page_bitmap = RenderPage(page.get());
3860 CompareBitmap(page_bitmap.get(), 400, 400, NotoSansSCChecksum());
3862 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3863 VerifySavedDocument(400, 400, NotoSansSCChecksum());
3867 ASSERT_TRUE(CreateNewDocument());
3869 const std::vector<uint8_t> dummy_vec(3);
3870 const char kDummyString[] =
"dummy";
3871 EXPECT_FALSE(FPDFText_LoadCidType2Font(
nullptr, dummy_vec.data(),
3872 dummy_vec.size(), kDummyString,
3873 dummy_vec.data(), dummy_vec.size()));
3874 EXPECT_FALSE(FPDFText_LoadCidType2Font(document(),
nullptr, dummy_vec.size(),
3875 kDummyString, dummy_vec.data(),
3877 EXPECT_FALSE(FPDFText_LoadCidType2Font(document(), dummy_vec.data(), 0,
3878 kDummyString, dummy_vec.data(),
3880 EXPECT_FALSE(FPDFText_LoadCidType2Font(document(), dummy_vec.data(),
3881 dummy_vec.size(),
nullptr,
3882 dummy_vec.data(), dummy_vec.size()));
3883 EXPECT_FALSE(FPDFText_LoadCidType2Font(document(), dummy_vec.data(),
3884 dummy_vec.size(),
"", dummy_vec.data(),
3886 EXPECT_FALSE(FPDFText_LoadCidType2Font(document(), dummy_vec.data(),
3887 dummy_vec.size(), kDummyString,
3888 nullptr, dummy_vec.size()));
3889 EXPECT_FALSE(FPDFText_LoadCidType2Font(document(), dummy_vec.data(),
3890 dummy_vec.size(), kDummyString,
3891 dummy_vec.data(), 0));
3895 const char* checksum = []() {
3897 return "9a78649e85e69d220c22e0fc316da740";
3899 return "3c20472b0552c0c22b88ab1ed8c6202b";
3902 ASSERT_TRUE(OpenDocument(
"bug_779.pdf"));
3903 FPDF_PAGE page = LoadPage(0);
3904 ASSERT_NE(
nullptr, page);
3918 ScopedFPDFBitmap page_bitmap = RenderLoadedPage(page);
3919 CompareBitmap(page_bitmap.get(), 612, 792, checksum);
3923 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3927 VerifySavedDocument(612, 792, checksum);
3932 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
3933 FPDF_PAGE page = LoadPage(0);
3942 EXPECT_TRUE(FPDFPageObjMark_SetStringParam(document(), page_object, mark,
3943 "Position",
"First"));
3949 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3953 ASSERT_TRUE(OpenSavedDocument());
3954 FPDF_PAGE saved_page = LoadSavedPage(0);
3955 ASSERT_TRUE(saved_page);
3959 CloseSavedPage(saved_page);
3960 CloseSavedDocument();
3965 ASSERT_TRUE(OpenDocument(
"hello_world_compressed_stream.pdf"));
3966 FPDF_PAGE page = LoadPage(0);
3971 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3980 EXPECT_TRUE(FPDFPageObjMark_SetStringParam(document(), page_object, mark,
3981 "Position",
"First"));
3985 ScopedFPDFBitmap page_bitmap = RenderPage(page);
3992 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
3996 ASSERT_TRUE(OpenSavedDocument());
3997 FPDF_PAGE saved_page = LoadSavedPage(0);
3998 ASSERT_TRUE(saved_page);
4001 ScopedFPDFBitmap page_bitmap = RenderPage(saved_page);
4006 CloseSavedPage(saved_page);
4007 CloseSavedDocument();
4012 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
4013 FPDF_PAGE page = LoadPage(0);
4016 constexpr int kExpectedObjectCount = 19;
4024 unsigned long name_len = 999u;
4026 EXPECT_EQ((6u + 1u) * 2u, name_len);
4027 ASSERT_EQ(L"Bounds",
4028 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4029 unsigned long out_buffer_len;
4031 mark
, "Position", buffer
, sizeof(buffer)
, &out_buffer_len
));
4033 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4036 EXPECT_TRUE(FPDFPageObjMark_SetStringParam(document(), page_object, mark,
4037 "Position",
"End"));
4041 EXPECT_FALSE(FPDFPageObjMark_SetStringParam(document(), another_page_object,
4042 mark,
"Position",
"End"));
4049 mark
, "Position", buffer
, sizeof(buffer)
, &out_buffer_len
));
4051 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4055 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
4059 ASSERT_TRUE(OpenSavedDocument());
4060 FPDF_PAGE saved_page = LoadSavedPage(0);
4061 ASSERT_TRUE(saved_page);
4067 mark
, "Position", buffer
, sizeof(buffer)
, &out_buffer_len
));
4069 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4071 CloseSavedPage(saved_page);
4072 CloseSavedDocument();
4077 FPDF_PAGE page = FPDFPage_New(CreateNewDocument(), 0, 612, 792);
4080 CPDF_Font::GetStockFont(cpdf_doc(),
"Arial");
4081 pdfium::span<
const uint8_t> span = stock_font->GetFont()->GetFontSpan();
4082 ScopedFPDFFont font(FPDFText_LoadFont(document(), span.data(), span.size(),
4084 ASSERT_TRUE(font.get());
4087 FPDF_PAGEOBJECT text_object =
4088 FPDFPageObj_CreateTextObj(document(), font.get(), 12.0f);
4090 EXPECT_TRUE(text_object);
4092 EXPECT_TRUE(FPDFText_SetText(text_object, text1.get()));
4103 unsigned long name_len = 999u;
4105 EXPECT_EQ((14u + 1u) * 2, name_len);
4107 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
4108 EXPECT_EQ(L"Test Mark Name", name);
4114 constexpr size_t kBlobLen = 28;
4115 char block_value[kBlobLen];
4117 block_value,
"\x01\x02\x03\0BlobValue1\0\0\0BlobValue2\0", kBlobLen));
4120 FPDFPageObjMark_SetIntParam(document(), text_object, mark,
"IntKey", 42));
4121 EXPECT_TRUE(FPDFPageObjMark_SetStringParam(document(), text_object, mark,
4122 "StringKey",
"StringValue"));
4123 EXPECT_TRUE(FPDFPageObjMark_SetBlobParam(document(), text_object, mark,
4124 "BlobKey", block_value, kBlobLen));
4132 EXPECT_EQ(42, int_value);
4136 unsigned long out_buffer_len = 999u;
4138 mark
, "StringKey", buffer
, sizeof(buffer)
, &out_buffer_len
));
4139 EXPECT_GT(out_buffer_len, 0u);
4140 EXPECT_NE(999u, out_buffer_len);
4141 name = GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
4142 EXPECT_EQ(L"StringValue", name);
4148 mark
, "BlobKey", buffer
, sizeof(buffer)
, &out_buffer_len
));
4149 EXPECT_EQ(kBlobLen, out_buffer_len);
4150 EXPECT_EQ(0, memcmp(block_value, buffer, kBlobLen));
4154 ScopedFPDFBitmap page_bitmap = RenderPage(page);
4155 CompareBitmap(page_bitmap.get(), 612, 792, LoadedFontTextChecksum());
4161 EXPECT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
4166 ASSERT_TRUE(OpenSavedDocument());
4167 FPDF_PAGE saved_page = LoadSavedPage(0);
4168 ASSERT_TRUE(saved_page);
4172 EXPECT_TRUE(text_object);
4179 EXPECT_EQ((14u + 1u) * 2, name_len);
4180 name = GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer));
4181 EXPECT_EQ(L"Test Mark Name", name);
4183 CloseSavedPage(saved_page);
4184 CloseSavedDocument();
4188 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
4189 FPDF_PAGE page = LoadPage(0);
4196 unsigned long out_len;
4201 EXPECT_EQ((6u + 1u) * 2u, out_len);
4205 EXPECT_EQ(L"Bounds",
4206 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4207 EXPECT_EQ((6u + 1u) * 2u, out_len);
4213 EXPECT_EQ(999u, out_len);
4221 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
4222 FPDF_PAGE page = LoadPage(0);
4229 unsigned long out_len;
4234 EXPECT_EQ((8u + 1u) * 2u, out_len);
4239 EXPECT_EQ(L"Position",
4240 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4241 EXPECT_EQ((8u + 1u) * 2u, out_len);
4247 EXPECT_EQ(999u, out_len);
4252 EXPECT_EQ(999u, out_len);
4261 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
4262 FPDF_PAGE page = LoadPage(0);
4273 EXPECT_EQ(3, out_value);
4278 EXPECT_EQ(999, out_value);
4283 EXPECT_EQ(999, out_value);
4291 EXPECT_EQ(999, out_value);
4297 ASSERT_TRUE(OpenDocument(
"text_in_page_marked.pdf"));
4298 FPDF_PAGE page = LoadPage(0);
4305 unsigned long out_len;
4311 EXPECT_EQ((4u + 1u) * 2u, out_len);
4315 sizeof(buffer)
, &out_len
));
4317 GetPlatformWString(
reinterpret_cast<
unsigned short*>(buffer)));
4318 EXPECT_EQ((4u + 1u) * 2u, out_len);
4323 sizeof(buffer)
, &out_len
));
4324 EXPECT_EQ(999u, out_len);
4328 mark
, "ParamThatDoesNotExist", buffer
, sizeof(buffer)
, &out_len
));
4329 EXPECT_EQ(999u, out_len);
4332 sizeof(buffer)
, nullptr));
4338 sizeof(buffer)
, &out_len
));
4339 EXPECT_EQ(999u, out_len);
4347 ASSERT_TRUE(OpenDocument(
"marked_content_id.pdf"));
4348 FPDF_PAGE page = LoadPage(0);
4353 ASSERT_TRUE(object1);
4357 ASSERT_TRUE(mark11);
4358 unsigned long len = 0;
4359 unsigned short buf[40];
4361 EXPECT_EQ(18u, len);
4362 EXPECT_EQ(L"Artifact", GetPlatformWString(buf));
4365 EXPECT_EQ(10u, len);
4366 EXPECT_EQ(L"BBox", GetPlatformWString(buf));
4370 EXPECT_EQ(10u, len);
4371 EXPECT_EQ(L"Type", GetPlatformWString(buf));
4376 ASSERT_TRUE(object2);
4381 ASSERT_TRUE(mark21);
4383 EXPECT_EQ(14u, len);
4384 EXPECT_EQ(L"Figure", GetPlatformWString(buf));
4387 EXPECT_EQ(10u, len);
4388 EXPECT_EQ(L"MCID", GetPlatformWString(buf));
4396 ASSERT_TRUE(mark22);
4398 EXPECT_EQ(18u, len);
4399 EXPECT_EQ(L"ClipSpan", GetPlatformWString(buf));
4406 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4407 FPDF_PAGE page = LoadPage(0);
4420 CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
4428 CompareBitmap(bitmap.get(), 103, 75,
"c8d51fa6821ceb2a67f08446ff236c40");
4436 CompareBitmap(bitmap.get(), 92, 68,
"7e34551035943e30a9f353db17de62ab");
4444 CompareBitmap(bitmap.get(), 79, 60,
"f4e72fb783a01c7b4614cdc25eaa98ac");
4452 CompareBitmap(bitmap.get(), 126, 106,
"2cf9e66414c72461f4ccbf9cdebdfa1b");
4460 CompareBitmap(bitmap.get(), 194, 119,
"a8f3a126cec274dab8242fd2ccdc1b8b");
4467 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4468 FPDF_PAGE page = LoadPage(0);
4479 CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
4485 EXPECT_FLOAT_EQ(53.0f, matrix.a);
4486 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4487 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4488 EXPECT_FLOAT_EQ(43.0f, matrix.d);
4489 EXPECT_FLOAT_EQ(72.0f, matrix.e);
4490 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4498 EXPECT_FLOAT_EQ(120.0f, matrix.a);
4499 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4500 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4501 EXPECT_FLOAT_EQ(43.0f, matrix.d);
4502 EXPECT_FLOAT_EQ(72.0f, matrix.e);
4503 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4510 CompareBitmap(bitmap.get(), 109, 88, kEmbeddedImage33Checksum);
4517 ASSERT_TRUE(OpenDocument(
"bug_631912.pdf"));
4518 FPDF_PAGE page = LoadPage(0);
4526 ASSERT_TRUE(bitmap);
4528 CompareBitmap(bitmap.get(), 1152, 720,
"3f6a48e2b3e91b799bf34567f55cb4de");
4535 ASSERT_TRUE(OpenDocument(
"matte.pdf"));
4536 FPDF_PAGE page = LoadPage(0);
4539 constexpr int kExpectedObjects = 4;
4542 for (
int i = 0; i < kExpectedObjects; ++i) {
4546 ASSERT_TRUE(bitmap);
4548 CompareBitmap(bitmap.get(), 50, 50,
"46c9a1dbe0b44765ce46017ad629a2fe");
4555 ASSERT_TRUE(OpenDocument(
"bug_343075986.pdf"));
4557 FPDF_PAGE page = LoadPage(0);
4560 constexpr int kExpectedObjects = 2;
4566 ASSERT_TRUE(bitmap);
4568 CompareBitmap(bitmap.get(), 4, 4,
"49b4d39d3fd81c9853b493b615e475d1");
4574 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4575 FPDF_PAGE page = LoadPage(0);
4584 ScopedFPDFBitmap bitmap(
4585 FPDFImageObj_GetRenderedBitmap(document(), page, obj));
4587 const char* checksum = []() {
4589 return "3b51fc066ee18efbf70bab0501763603";
4591 return "582ca300e003f512d7b552c7b5b45d2e";
4593 CompareBitmap(bitmap.get(), 53, 43, checksum);
4599 EXPECT_FLOAT_EQ(53.0f, matrix.a);
4600 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4601 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4602 EXPECT_FLOAT_EQ(43.0f, matrix.d);
4603 EXPECT_FLOAT_EQ(72.0f, matrix.e);
4604 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4612 EXPECT_FLOAT_EQ(120.0f, matrix.a);
4613 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4614 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4615 EXPECT_FLOAT_EQ(43.0f, matrix.d);
4616 EXPECT_FLOAT_EQ(72.0f, matrix.e);
4617 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4622 ScopedFPDFBitmap bitmap(
4623 FPDFImageObj_GetRenderedBitmap(document(), page, obj));
4625 const char* checksum = []() {
4627 return "1003585870ad0fe37baf1c5bb3f5fd76";
4629 return "0824c16dcf2dfcef44b45d88db1fddce";
4631 CompareBitmap(bitmap.get(), 120, 43, checksum);
4638 ASSERT_TRUE(OpenDocument(
"matte.pdf"));
4639 FPDF_PAGE page = LoadPage(0);
4642 constexpr int kExpectedObjects = 4;
4645 const char* smask_checksum = []() {
4647 return "a85ca0183ac6aee8851c30c5bdc2f594";
4649 return "5a3ae4a660ce919e29c42ec2258142f1";
4651 const char* no_smask_checksum = []() {
4653 return "712f832dcbfb6cefc74f39bef459bea4";
4655 return "67504e83f5d78214ea00efc19082c5c1";
4658 for (
int i = 0; i < kExpectedObjects; ++i) {
4661 ScopedFPDFBitmap bitmap(
4662 FPDFImageObj_GetRenderedBitmap(document(), page, obj));
4663 ASSERT_TRUE(bitmap);
4666 CompareBitmap(bitmap.get(), 40, 60, smask_checksum);
4668 CompareBitmap(bitmap.get(), 40, 60, no_smask_checksum);
4675 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4676 FPDF_PAGE page = LoadPage(0);
4684 EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(document(),
nullptr,
nullptr));
4687 EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(document(), page,
nullptr));
4692 EXPECT_FALSE(FPDFImageObj_GetRenderedBitmap(new_document.get(), page, obj));
4698 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4699 FPDF_PAGE page = LoadPage(0);
4709 std::vector<uint8_t> buf(len);
4710 EXPECT_EQ(4091u, FPDFImageObj_GetImageDataRaw(obj, buf.data(), len));
4711 EXPECT_EQ(
"f73802327d2e88e890f653961bcda81a", GenerateMD5Base16(buf));
4717 EXPECT_EQ(28776u, FPDFImageObj_GetImageDataDecoded(obj, buf.data(), len));
4718 EXPECT_EQ(kEmbeddedImage33Checksum, GenerateMD5Base16(buf));
4728 EXPECT_EQ(4370u, FPDFImageObj_GetImageDataRaw(obj, buf.data(), len));
4729 EXPECT_EQ(
"6aae1f3710335023a9e12191be66b64b", GenerateMD5Base16(buf));
4737 EXPECT_EQ(4370u, FPDFImageObj_GetImageDataDecoded(obj, buf.data(), len));
4738 EXPECT_EQ(
"6aae1f3710335023a9e12191be66b64b", GenerateMD5Base16(buf));
4744 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4745 FPDF_PAGE page = LoadPage(0);
4749 FPDF_PAGEOBJECT obj;
4755 EXPECT_FLOAT_EQ(53.0f, matrix.a);
4756 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4757 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4758 EXPECT_FLOAT_EQ(43.0f, matrix.d);
4759 EXPECT_FLOAT_EQ(72.0f, matrix.e);
4760 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4765 EXPECT_FLOAT_EQ(70.0f, matrix.a);
4766 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4767 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4768 EXPECT_FLOAT_EQ(51.0f, matrix.d);
4769 EXPECT_FLOAT_EQ(216.0f, matrix.e);
4770 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4775 EXPECT_FLOAT_EQ(69.0f, matrix.a);
4776 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4777 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4778 EXPECT_FLOAT_EQ(51.0f, matrix.d);
4779 EXPECT_FLOAT_EQ(360.0f, matrix.e);
4780 EXPECT_FLOAT_EQ(646.510009765625f, matrix.f);
4785 EXPECT_FLOAT_EQ(59.0f, matrix.a);
4786 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4787 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4788 EXPECT_FLOAT_EQ(45.0f, matrix.d);
4789 EXPECT_FLOAT_EQ(72.0f, matrix.e);
4790 EXPECT_FLOAT_EQ(553.510009765625f, matrix.f);
4795 EXPECT_FLOAT_EQ(55.94000244140625f, matrix.a);
4796 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4797 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4798 EXPECT_FLOAT_EQ(46.950000762939453f, matrix.d);
4799 EXPECT_FLOAT_EQ(216.0f, matrix.e);
4800 EXPECT_FLOAT_EQ(552.510009765625f, matrix.f);
4805 EXPECT_FLOAT_EQ(70.528999328613281f, matrix.a);
4806 EXPECT_FLOAT_EQ(0.0f, matrix.b);
4807 EXPECT_FLOAT_EQ(0.0f, matrix.c);
4808 EXPECT_FLOAT_EQ(43.149997711181641f, matrix.d);
4809 EXPECT_FLOAT_EQ(360.0f, matrix.e);
4810 EXPECT_FLOAT_EQ(553.3599853515625f, matrix.f);
4824 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4825 FPDF_PAGE page = LoadPage(0);
4839 std::vector<
char> buf(len);
4840 static constexpr char kFlateDecode[] =
"FlateDecode";
4841 EXPECT_EQ(
sizeof(kFlateDecode),
4842 FPDFImageObj_GetImageFilter(obj, 0, buf.data(), len));
4843 EXPECT_STREQ(kFlateDecode, buf.data());
4853 static constexpr char kASCIIHexDecode[] =
"ASCIIHexDecode";
4854 EXPECT_EQ(
sizeof(kASCIIHexDecode),
4855 FPDFImageObj_GetImageFilter(obj, 0, buf.data(), len));
4856 EXPECT_STREQ(kASCIIHexDecode, buf.data());
4861 static constexpr char kDCTDecode[] =
"DCTDecode";
4862 EXPECT_EQ(
sizeof(kDCTDecode),
4863 FPDFImageObj_GetImageFilter(obj, 1, buf.data(), len));
4864 EXPECT_STREQ(kDCTDecode, buf.data());
4870 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4871 FPDF_PAGE page = LoadPage(0);
4875 FPDF_IMAGEOBJ_METADATA metadata;
4887 EXPECT_EQ(92u, metadata
.width);
4888 EXPECT_EQ(68u, metadata
.height);
4897 EXPECT_EQ(92u, metadata
.width);
4898 EXPECT_EQ(68u, metadata
.height);
4909 EXPECT_EQ(126u, metadata
.width);
4910 EXPECT_EQ(106u, metadata
.height);
4920 ASSERT_TRUE(OpenDocument(
"jpx_lzw.pdf"));
4921 FPDF_PAGE page = LoadPage(0);
4927 FPDF_IMAGEOBJ_METADATA metadata;
4930 EXPECT_EQ(612u, metadata
.width);
4931 EXPECT_EQ(792u, metadata
.height);
4941 ASSERT_TRUE(OpenDocument(
"embedded_images.pdf"));
4942 FPDF_PAGE page = LoadPage(0);
4946 unsigned int width = 0;
4947 unsigned int height = 0;
4960 EXPECT_EQ(92u, width);
4961 EXPECT_EQ(68u, height);
4966 EXPECT_EQ(126u, width);
4967 EXPECT_EQ(106u, height);
4973 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
4974 FPDF_PAGE page = LoadPage(0);
4981 ScopedFPDFBitmap bitmap(
4982 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 1));
4983 ASSERT_TRUE(bitmap);
4984 const char* checksum = []() {
4986#if BUILDFLAG(IS_WIN)
4987 return "764e3503960ef0b176796faa3543b9c7";
4988#elif BUILDFLAG(IS_APPLE)
4989 return "9e7774173acee966fcaa72e599eb9a93";
4991 return "b17801afe8a36d6aad6c2239b88f2a73";
4994 return "bb0abe1accca1cfeaaf78afa35762350";
4996 CompareBitmap(bitmap.get(), 64, 11, checksum);
4998 ScopedFPDFBitmap x2_bitmap(
4999 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 2.4f));
5000 ASSERT_TRUE(x2_bitmap);
5001 const char* x2_checksum = []() {
5003#if BUILDFLAG(IS_WIN)
5004 return "3cea4255285df04659e3c7477287bdb1";
5005#elif BUILDFLAG(IS_APPLE)
5006 return "2b34bddd2a1471e245cf72603c6799b4";
5008 return "33af8b151ab26ebce5a71b39eedea6b1";
5011 return "80db528ec7146d92247f2339a8f10ba5";
5013 CompareBitmap(x2_bitmap.get(), 153, 25, x2_checksum);
5015 ScopedFPDFBitmap x10_bitmap(
5016 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10));
5017 ASSERT_TRUE(x10_bitmap);
5018 const char* x10_checksum = []() {
5020#if BUILDFLAG(IS_WIN)
5021 return "1cc617da9ed5922eeac2414108509ef5";
5022#elif BUILDFLAG(IS_APPLE)
5023 return "0450d576560274a7df31cb93d040e721";
5025 return "93dd7ad07bdaaba9ecd268350cb91596";
5028 return "149f63de758ab01d3b75605cdfd4c176";
5030 CompareBitmap(x10_bitmap.get(), 631, 103, x10_checksum);
5037 ScopedFPDFBitmap bitmap(
5038 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 1));
5039 ASSERT_TRUE(bitmap);
5040 const char* checksum = []() {
5042#if BUILDFLAG(IS_WIN)
5043 return "4cdba7492317bcae2643bd4090e18812";
5044#elif BUILDFLAG(IS_APPLE)
5045 return "0b9efedcb8f5aa9246c52e90811cb046";
5047 return "63fd059d984a5bea10f27ba026420202";
5050 return "3fc1101b2408c5484adc24ba0a11ff3d";
5052 CompareBitmap(bitmap.get(), 116, 16, checksum);
5054 ScopedFPDFBitmap x2_bitmap(
5055 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 2.4f));
5056 ASSERT_TRUE(x2_bitmap);
5057 const char* x2_checksum = []() {
5059#if BUILDFLAG(IS_WIN)
5060 return "c5cecc5553843a4dd4fff3ceb4855a82";
5061#elif BUILDFLAG(IS_APPLE)
5062 return "10f4d9528a5471ab0b235984f0354dd4";
5064 return "fc45021e3ea3ebd406fe6ffaa8c5c5b7";
5067 return "429960ae7b822f0c630432535e637465";
5069 CompareBitmap(x2_bitmap.get(), 276, 36, x2_checksum);
5071 ScopedFPDFBitmap x10_bitmap(
5072 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10));
5073 ASSERT_TRUE(x10_bitmap);
5074 const char* x10_checksum = []() {
5076#if BUILDFLAG(IS_WIN)
5077 return "cff29dcbe77092ec7f73e46766a289c7";
5078#elif BUILDFLAG(IS_APPLE)
5079 return "9e87791ffdf4cca0a0f118be245970c8";
5081 return "61476636eaa0da0b93d8b1937cf22b75";
5084 return "f5f93bf64de579b59e775d7076ca0a5a";
5086 CompareBitmap(x10_bitmap.get(), 1143, 150, x10_checksum);
5093 ASSERT_TRUE(OpenDocument(
"rotated_text.pdf"));
5094 FPDF_PAGE page = LoadPage(0);
5100 ScopedFPDFBitmap bitmap(
5101 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 1));
5102 ASSERT_TRUE(bitmap);
5103 const char* checksum = []() {
5105#if BUILDFLAG(IS_WIN)
5106 return "ba5322a4e6b0f79dca42be88f3007708";
5107#elif BUILDFLAG(IS_APPLE)
5108 return "22cf71716a7059f481a63e32b6088c8c";
5110 return "f515a7209d7892065d3716ec462f5c10";
5113 return "08ada0802f780d3fefb161dc6fb45977";
5115 CompareBitmap(bitmap.get(), 29, 28, checksum);
5117 ScopedFPDFBitmap x2_bitmap(
5118 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 2.4f));
5119 ASSERT_TRUE(x2_bitmap);
5120 const char* x2_checksum = []() {
5122#if BUILDFLAG(IS_WIN)
5123 return "e8fb0a707b2924726757a2ed32d6f28d";
5124#elif BUILDFLAG(IS_APPLE)
5125 return "5d4be6808bdcec3f6ee7352122dd986d";
5127 return "c69bbe5318ec149f63228e276e708612";
5130 return "09d7ddb647b8653cb59aede349a0c3e1";
5132 CompareBitmap(x2_bitmap.get(), 67, 67, x2_checksum);
5134 ScopedFPDFBitmap x10_bitmap(
5135 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10));
5136 ASSERT_TRUE(x10_bitmap);
5137 const char* x10_checksum = []() {
5139#if BUILDFLAG(IS_WIN)
5140 return "eb0cbf56707d1c39ce0ab89a9b43d6a8";
5141#elif BUILDFLAG(IS_APPLE)
5142 return "98757f865abde60c7f7f60c74435cb85";
5144 return "bb7c2ec575f27cf882dcd38f2563c00f";
5147 return "bbd3842a4b50dbfcbce4eee2b067a297";
5149 CompareBitmap(x10_bitmap.get(), 275, 275, x10_checksum);
5155 ASSERT_TRUE(OpenDocument(
"text_color.pdf"));
5156 FPDF_PAGE page = LoadPage(0);
5162 ScopedFPDFBitmap bitmap(
5163 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 7.3f));
5164 ASSERT_TRUE(bitmap);
5165 const char* checksum = []() {
5167 return "9199f0c27c8a61a57189b1b044941e5e";
5169 return "e8154fa8ededf4d9b8b35b5260897b6c";
5171 CompareBitmap(bitmap.get(), 120, 186, checksum);
5178 ASSERT_TRUE(CreateNewDocument());
5181 ScopedFPDFPageObject text_object(
5182 FPDFPageObj_NewTextObj(document(),
"Arial", 12.0f));
5185 EXPECT_TRUE(FPDFText_SetText(text_object.get(), text.get()));
5187 ScopedFPDFBitmap bitmap(
5188 FPDFTextObj_GetRenderedBitmap(document(),
nullptr, text_object.get(), 1));
5189 ASSERT_TRUE(bitmap);
5190 const char* checksum = []() {
5192#if BUILDFLAG(IS_WIN)
5193 return "6d88537a49fa2dccfa0f58ac325c5b75";
5194#elif BUILDFLAG(IS_APPLE)
5195 return "a637d62f2e8ae10c3267b2ff5fcc2246";
5197 return "574ae982d02e653ab6a8f23a6cdf4085";
5200 return "fa947759dab76d68a07ccf6f97b2d9c2";
5202 CompareBitmap(bitmap.get(), 151, 12, checksum);
5206 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
5207 FPDF_PAGE page = LoadPage(0);
5211 ASSERT_TRUE(text_object);
5215 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(),
nullptr,
nullptr, 0));
5219 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page,
nullptr, 0));
5220 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(),
nullptr,
nullptr, 1));
5224 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page,
nullptr, 1));
5228 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 0));
5230 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, -1));
5232 FPDFTextObj_GetRenderedBitmap(document(), page, text_object, 10000));
5233 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(
5234 document(), page, text_object,
std::numeric_limits<
float>::max()));
5235 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(
5236 document(), page, text_object,
std::numeric_limits<
float>::infinity()));
5241 ScopedFPDFBitmap bitmap(
5242 FPDFTextObj_GetRenderedBitmap(document(),
nullptr, text_object, 1));
5243 EXPECT_TRUE(bitmap);
5248 EXPECT_FALSE(FPDFTextObj_GetRenderedBitmap(empty_document.get(), page,
5256 ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100));
5257 EXPECT_EQ(0, FPDFPage_CountObjects(page.get()));
5259 constexpr int kBitmapWidth = 50;
5260 constexpr int kBitmapHeight = 100;
5262 ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0, kBitmapWidth,
5263 kBitmapHeight, 0x00000000));
5264 ScopedFPDFPageObject page_image(FPDFPageObj_NewImageObj(doc.get()));
5266 FPDFImageObj_SetBitmap(
nullptr, 0, page_image.get(), bitmap.get()));
5269 constexpr int kScaleX = 2;
5270 constexpr int kScaleY = 3;
5271 static constexpr FS_MATRIX kBitmapMatrix{
5272 0, -kScaleX * kBitmapWidth, kScaleY * kBitmapHeight, 0, 0, 0};
5273 ASSERT_TRUE(FPDFPageObj_SetMatrix(page_image.get(), &kBitmapMatrix));
5274 FPDFPage_InsertObject(page.get(), page_image.release());
5275 EXPECT_EQ(1, FPDFPage_CountObjects(page.get()));
5276 EXPECT_TRUE(FPDFPage_GenerateContent(page.get()));
5278 FPDF_PAGEOBJECT page_object = FPDFPage_GetObject(page.get(), 0);
5279 ScopedFPDFBitmap extracted_bitmap(
5280 FPDFImageObj_GetRenderedBitmap(doc.get(), page.get(), page_object));
5281 ASSERT_TRUE(extracted_bitmap);
5283 ASSERT_EQ(FPDFBitmap_GetWidth(extracted_bitmap.get()),
5284 kScaleY * kBitmapHeight);
5285 ASSERT_EQ(FPDFBitmap_GetHeight(extracted_bitmap.get()),
5286 kScaleX * kBitmapWidth);
5290 ASSERT_TRUE(OpenDocument(
"multiple_graphics_states.pdf"));
5291 FPDF_PAGE page = LoadPage(0);
5296 EXPECT_TRUE(FPDFPageObj_SetFillColor(path.get(), 255, 0, 0, 255));
5298 EXPECT_TRUE(FPDFPath_MoveTo(path.get(), 100, 100));
5299 EXPECT_TRUE(FPDFPath_LineTo(path.get(), 100, 125));
5300 EXPECT_TRUE(FPDFPath_Close(path.get()));
5302 FPDFPage_InsertObject(page, path.release());
5307 ?
"7ebec75d95c64b522999a710de76c52c"
5308 :
"f4b36616a7fea81a4f06cc7b01a55ac1";
5310 ScopedFPDFBitmap bitmap = RenderPage(page);
5311 CompareBitmap(bitmap.get(), 200, 300, checksum);
5313 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
5314 VerifySavedDocument(200, 300, checksum);
5320 constexpr int kExpectedWidth = 200;
5321 constexpr int kExpectedHeight = 200;
5323 OpenDocument(
"form_object_with_text.pdf");
5324 FPDF_PAGE page = LoadPage(0);
5328 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
5329 CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
5339 EXPECT_FLOAT_EQ(2.0f, matrix.a);
5340 EXPECT_FLOAT_EQ(0.0f, matrix.b);
5341 EXPECT_FLOAT_EQ(0.0f, matrix.c);
5342 EXPECT_FLOAT_EQ(-1.0f, matrix.d);
5343 EXPECT_FLOAT_EQ(0.0f, matrix.e);
5344 EXPECT_FLOAT_EQ(200.0f, matrix.f);
5348 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
5349 CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
5358 EXPECT_FLOAT_EQ(0.5f, matrix.a);
5359 EXPECT_FLOAT_EQ(0.0f, matrix.b);
5360 EXPECT_FLOAT_EQ(0.0f, matrix.c);
5361 EXPECT_FLOAT_EQ(-1.0f, matrix.d);
5362 EXPECT_FLOAT_EQ(10.0f, matrix.e);
5363 EXPECT_FLOAT_EQ(150.0f, matrix.f);
5367 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
5368 CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
5373 ASSERT_TRUE(FPDF_SaveAsCopy(document(),
this, 0));
5376 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
5377 CompareBitmap(bitmap.get(), kExpectedWidth, kExpectedHeight,
5388 ScopedFPDFPageObject image(FPDFPageObj_NewImageObj(doc.get()));
5391 const FS_MATRIX matrix{1, 2, 3, 4, 5, 6};
5393 EXPECT_FALSE(FPDFPageObj_TransformF(image.get(),
nullptr));
5399 std::vector<std::string> HashesForDocument(
int page_count) {
5400 std::vector<std::string> hashes;
5401 hashes.reserve(page_count);
5402 for (
int i = 0; i < page_count; ++i) {
5403 hashes.push_back(HashForPage(i));
5409 std::string HashForPage(
int page_index) {
5410 FPDF_PAGE page =
LoadPage(page_index);
5412 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
5413 std::string hash = HashBitmap(bitmap.get());
5419TEST_F(FPDFEditMoveEmbedderTest, MovePagesTest) {
5420 static const FPDFEditMoveEmbedderTestCase kTestCases[] = {
5421 {{0, 1, 2, 3, 4}, 5, 0,
true, {0, 1, 2, 3, 4},
"no change"},
5422 {{0, 4, 2, 1, 3}, 5, 0,
true, {0, 4, 2, 1, 3},
"reorder all pages"},
5423 {{0, 2, 4, 3}, 4, 1,
true, {1, 0, 2, 4, 3},
"reorder 4 pages"},
5424 {{1, 4, 2}, 3, 2,
true, {0, 3, 1, 4, 2},
"reorder 3 pages"},
5425 {{3, 2}, 2, 3,
true, {0, 1, 4, 3, 2},
"reorder 2 pages"},
5426 {{3}, 1, 4,
true, {0, 1, 2, 4, 3},
"reorder 1 page"},
5427 {{1, 1}, 2, 2,
false, {},
"duplicate index"},
5428 {{5, 3, 2}, 3, 0,
false, {},
"out of range index"},
5429 {{3}, 0, 0,
false, {},
"page_indices_len needs to be in range [1, 5]"},
5430 {{4, 3, 2, 1, 0}, 6, 0,
false, {},
"page_indices_len is too big"},
5431 {{3}, 0, 5,
false, {},
"dest_page_index is out of range"},
5432 {{3, 1, 4}, 0, -1,
false, {},
"dest_page_index is out of range"},
5436 for (
const FPDFEditMoveEmbedderTestCase& tc : kTestCases) {
5437 ASSERT_TRUE(OpenDocument(
"rectangles_multi_pages.pdf"));
5438 const int page_count = GetPageCount();
5439 ASSERT_EQ(page_count, 5);
5441 if (tc.expected_result) {
5442 ASSERT_THAT(tc.expected_order, testing::SizeIs(page_count));
5444 ASSERT_THAT(tc.expected_order, testing::SizeIs(0));
5448 std::vector<std::string> orig_hashes = HashesForDocument(page_count);
5449 ASSERT_THAT(orig_hashes, testing::SizeIs(page_count));
5451 EXPECT_EQ(FPDF_MovePages(document(), &tc.page_indices[0],
5452 tc.page_indices_len, tc.dest_page_index),
5456 if (tc.expected_result) {
5458 std::vector<std::string> new_hashes = HashesForDocument(page_count);
5459 std::vector<std::string> expected_hashes;
5460 expected_hashes.reserve(page_count);
5461 for (
int i = 0; i < page_count; ++i) {
5462 expected_hashes.push_back(orig_hashes[tc.expected_order[i]]);
5464 EXPECT_THAT(new_hashes, testing::ContainerEq(expected_hashes)) << tc;
5467 EXPECT_THAT(HashesForDocument(page_count),
5468 testing::ContainerEq(orig_hashes))
fxcrt::ByteString ByteString
static bool UseSkiaRenderer()
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
ByteString GetNameFor(const ByteString &key) const
virtual bool IsTrueTypeFont() const
virtual int GetCharWidthF(uint32_t charcode)=0
virtual bool IsType1Font() const
virtual bool IsCIDFont() const
int32_t GetContentStream() const
FPDF_PAGE LoadPage(int page_index)
void UnloadPage(FPDF_PAGE page)
FPDF_DOCUMENT document() const
void CreateEmptyDocumentWithoutFormFillEnvironment()
CPDF_Document * cpdf_doc()
void CheckCompositeFontWidths(const CPDF_Array *widths_array, CPDF_Font *typed_font)
FPDF_DOCUMENT CreateNewDocument()
void CheckFontDescriptor(const CPDF_Dictionary *font_dict, int font_type, bool bold, bool italic, pdfium::span< const uint8_t > span)
ByteString(const char *ptr)
CPDF_Page * CPDFPageFromFPDFPage(FPDF_PAGE page)
CPDF_PageObject * CPDFPageObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object)
#define FPDF_ANNOT_UNDERLINE
FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_CreateAnnot(FPDF_PAGE page, FPDF_ANNOTATION_SUBTYPE subtype)
FPDF_EXPORT FPDF_PATHSEGMENT FPDF_CALLCONV FPDFPath_GetPathSegment(FPDF_PAGEOBJECT path, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFFont_GetGlyphWidth(FPDF_FONT font, uint32_t glyph, float font_size, float *width)
#define FPDF_FILLMODE_ALTERNATE
FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetRotation(FPDF_PAGE page)
FPDF_EXPORT int FPDF_CALLCONV FPDFFont_GetWeight(FPDF_FONT font)
#define FPDF_COLORSPACE_UNKNOWN
FPDF_EXPORT int FPDF_CALLCONV FPDFFormObj_CountObjects(FPDF_PAGEOBJECT form_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_SetStrokeColor(FPDF_PAGEOBJECT page_object, unsigned int R, unsigned int G, unsigned int B, unsigned int A)
FPDF_EXPORT int FPDF_CALLCONV FPDFFont_GetIsEmbedded(FPDF_FONT font)
FPDF_EXPORT int FPDF_CALLCONV FPDFPathSegment_GetType(FPDF_PATHSEGMENT segment)
#define FPDF_FONT_TRUETYPE
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFPageObj_CreateNewPath(float x, float y)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path, int fillmode, FPDF_BOOL stroke)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObjMark_GetParamKey(FPDF_PAGEOBJECTMARK mark, unsigned long index, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFImageObj_GetImageMetadata(FPDF_PAGEOBJECT image_object, FPDF_PAGE page, FPDF_IMAGEOBJ_METADATA *metadata)
FPDF_EXPORT void FPDF_CALLCONV FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPathSegment_GetPoint(FPDF_PATHSEGMENT segment, float *x, float *y)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFFont_GetDescent(FPDF_FONT font, float font_size, float *descent)
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_CreateNewDocument()
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFImageObj_GetRenderedBitmap(FPDF_DOCUMENT document, FPDF_PAGE page, FPDF_PAGEOBJECT image_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_Close(FPDF_PAGEOBJECT path)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object, unsigned int R, unsigned int G, unsigned int B, unsigned int A)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFTextObj_SetTextRenderMode(FPDF_PAGEOBJECT text, FPDF_TEXT_RENDERMODE render_mode)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_GetDrawMode(FPDF_PAGEOBJECT path, int *fillmode, FPDF_BOOL *stroke)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFFont_GetItalicAngle(FPDF_FONT font, int *angle)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFImageObj_GetImageDataRaw(FPDF_PAGEOBJECT image_object, void *buffer, unsigned long buflen)
#define FPDF_FILLMODE_NONE
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFImageObj_GetImageFilter(FPDF_PAGEOBJECT image_object, int index, void *buffer, unsigned long buflen)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetFillColor(FPDF_PAGEOBJECT page_object, unsigned int *R, unsigned int *G, unsigned int *B, unsigned int *A)
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFImageObj_GetBitmap(FPDF_PAGEOBJECT image_object)
FPDF_EXPORT int FPDF_CALLCONV FPDFPageObjMark_CountParams(FPDF_PAGEOBJECTMARK mark)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_RemoveMark(FPDF_PAGEOBJECT page_object, FPDF_PAGEOBJECTMARK mark)
FPDF_EXPORT int FPDF_CALLCONV FPDFFont_GetFlags(FPDF_FONT font)
#define FPDF_SEGMENT_MOVETO
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObjMark_GetParamStringValue(FPDF_PAGEOBJECTMARK mark, FPDF_BYTESTRING key, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDFPageObj_CountMarks(FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFPageObj_CreateNewRect(float x, float y, float w, float h)
#define FPDF_SEGMENT_UNKNOWN
FPDF_EXPORT void FPDF_CALLCONV FPDFPage_TransformAnnots(FPDF_PAGE page, double a, double b, double c, double d, double e, double f)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_RemoveObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObjMark_GetParamBlobValue(FPDF_PAGEOBJECTMARK mark, FPDF_BYTESTRING key, void *buffer, unsigned long buflen, unsigned long *out_buflen)
#define FPDF_SEGMENT_BEZIERTO
FPDF_EXPORT int FPDF_CALLCONV FPDFImageObj_GetImageFilterCount(FPDF_PAGEOBJECT image_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObjMark_RemoveParam(FPDF_PAGEOBJECT page_object, FPDF_PAGEOBJECTMARK mark, FPDF_BYTESTRING key)
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFPage_GetObject(FPDF_PAGE page, int index)
FPDF_EXPORT FPDF_TEXT_RENDERMODE FPDF_CALLCONV FPDFTextObj_GetTextRenderMode(FPDF_PAGEOBJECT text)
FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV FPDFPageObjMark_GetParamValueType(FPDF_PAGEOBJECTMARK mark, FPDF_BYTESTRING key)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObjMark_GetParamIntValue(FPDF_PAGEOBJECTMARK mark, FPDF_BYTESTRING key, int *out_value)
FPDF_EXPORT FPDF_FONT FPDF_CALLCONV FPDFTextObj_GetFont(FPDF_PAGEOBJECT text)
FPDF_EXPORT FPDF_GLYPHPATH FPDF_CALLCONV FPDFFont_GetGlyphPath(FPDF_FONT font, uint32_t glyph, float font_size)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_BezierTo(FPDF_PAGEOBJECT path, float x1, float y1, float x2, float y2, float x3, float y3)
FPDF_EXPORT int FPDF_CALLCONV FPDFPageObj_GetType(FPDF_PAGEOBJECT page_object)
#define FPDF_PAGEOBJ_PATH
FPDF_EXPORT int FPDF_CALLCONV FPDFPath_CountSegments(FPDF_PAGEOBJECT path)
#define FPDF_PAGEOBJ_TEXT
#define FPDF_PAGEOBJ_IMAGE
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_MoveTo(FPDF_PAGEOBJECT path, float x, float y)
#define FPDF_COLORSPACE_INDEXED
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetBounds(FPDF_PAGEOBJECT page_object, float *left, float *bottom, float *right, float *top)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFTextObj_GetFontSize(FPDF_PAGEOBJECT text, float *size)
FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV FPDFPageObj_GetMark(FPDF_PAGEOBJECT page_object, unsigned long index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetStrokeWidth(FPDF_PAGEOBJECT page_object, float *width)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_SetMatrix(FPDF_PAGEOBJECT page_object, const FS_MATRIX *matrix)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_SetStrokeWidth(FPDF_PAGEOBJECT page_object, float width)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFImageObj_GetImagePixelSize(FPDF_PAGEOBJECT image_object, unsigned int *width, unsigned int *height)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFFont_GetAscent(FPDF_FONT font, float font_size, float *ascent)
#define FPDF_PAGEOBJ_FORM
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFImageObj_GetImageDataDecoded(FPDF_PAGEOBJECT image_object, void *buffer, unsigned long buflen)
FPDF_EXPORT int FPDF_CALLCONV FPDFPageObj_GetMarkedContentID(FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_GenerateContent(FPDF_PAGE page)
FPDF_EXPORT FPDF_PATHSEGMENT FPDF_CALLCONV FPDFGlyphPath_GetGlyphPathSegment(FPDF_GLYPHPATH glyphpath, int index)
#define FPDF_COLORSPACE_DEVICERGB
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFTextObj_GetRenderedBitmap(FPDF_DOCUMENT document, FPDF_PAGE page, FPDF_PAGEOBJECT text_object, float scale)
FPDF_EXPORT int FPDF_CALLCONV FPDFPage_CountObjects(FPDF_PAGE page)
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDFFormObj_GetObject(FPDF_PAGEOBJECT form_object, unsigned long index)
FPDF_EXPORT FPDF_PAGEOBJECTMARK FPDF_CALLCONV FPDFPageObj_AddMark(FPDF_PAGEOBJECT page_object, FPDF_BYTESTRING name)
#define FPDF_SEGMENT_LINETO
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObjMark_GetName(FPDF_PAGEOBJECTMARK mark, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_GetMatrix(FPDF_PAGEOBJECT page_object, FS_MATRIX *matrix)
FPDF_EXPORT int FPDF_CALLCONV FPDFGlyphPath_CountGlyphSegments(FPDF_GLYPHPATH glyphpath)
FPDF_EXPORT void FPDF_CALLCONV FPDFPageObj_SetBlendMode(FPDF_PAGEOBJECT page_object, FPDF_BYTESTRING blend_mode)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPageObj_TransformF(FPDF_PAGEOBJECT page_object, const FS_MATRIX *matrix)
FPDF_EXPORT void FPDF_CALLCONV FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object, double a, double b, double c, double d, double e, double f)
FPDF_EXPORT void FPDF_CALLCONV FPDFPageObj_Destroy(FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPathSegment_GetClose(FPDF_PATHSEGMENT segment)
#define FPDF_FILLMODE_WINDING
TEST_F(FPDFEditEmbedderTest, EmbedNotoSansSCFont)
TEST_F(FPDFEditEmbedderTest, GraphicsData)
void CheckMarkCounts(FPDF_PAGE page, int start_from, int expected_object_count, size_t expected_prime_count, size_t expected_square_count, size_t expected_greater_than_ten_count, size_t expected_bounds_count)
FPDF_EXPORT FPDF_TEXTPAGE FPDF_CALLCONV FPDFText_LoadPage(FPDF_PAGE page)
FPDF_EXPORT int FPDF_CALLCONV FPDFClipPath_CountPaths(FPDF_CLIPPATH clip_path)
FPDF_EXPORT FPDF_CLIPPATH FPDF_CALLCONV FPDFPageObj_GetClipPath(FPDF_PAGEOBJECT page_object)
FPDF_EXPORT FPDF_PATHSEGMENT FPDF_CALLCONV FPDFClipPath_GetPathSegment(FPDF_CLIPPATH clip_path, int path_index, int segment_index)
FPDF_EXPORT int FPDF_CALLCONV FPDFClipPath_CountPathSegments(FPDF_CLIPPATH clip_path, int path_index)
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFBitmap_Create(int width, int height, int alpha)
FPDF_EXPORT void FPDF_CALLCONV FPDF_ClosePage(FPDF_PAGE page)
#define FPDF_OBJECT_NUMBER
#define FPDF_OBJECT_STRING
#define FPDF_OBJECT_ARRAY
bool FontStyleIsNonSymbolic(uint32_t style)
bool FontStyleIsItalic(uint32_t style)
bool FontStyleIsForceBold(uint32_t style)
std::unique_ptr< FPDF_WCHAR, pdfium::FreeDeleter > ScopedFPDFWideString
const char kBlankPage612By792Checksum[]
const char * HelloWorldChecksum()
const char * HelloWorldRemovedChecksum()
const char * ManyRectanglesChecksum()