14#include "build/build_config.h"
15#include "core/fpdfapi/parser/cpdf_document.h"
16#include "core/fxge/cfx_defaultrenderdevice.h"
17#include "fpdfsdk/cpdfsdk_helpers.h"
18#include "fpdfsdk/fpdf_view_c_api_test.h"
19#include "public/cpp/fpdf_scopers.h"
20#include "public/fpdfview.h"
21#include "testing/embedder_test.h"
22#include "testing/embedder_test_constants.h"
23#include "testing/embedder_test_environment.h"
24#include "testing/fx_string_testhelpers.h"
25#include "testing/gtest/include/gtest/gtest.h"
26#include "testing/utils/file_util.h"
27#include "testing/utils/hash.h"
28#include "testing/utils/path_service.h"
30#if defined(PDF_USE_SKIA)
31#include "third_party/skia/include/core/SkCanvas.h"
32#include "third_party/skia/include/core/SkColor.h"
33#include "third_party/skia/include/core/SkColorType.h"
34#include "third_party/skia/include/core/SkImage.h"
35#include "third_party/skia/include/core/SkImageInfo.h"
36#include "third_party/skia/include/core/SkPicture.h"
37#include "third_party/skia/include/core/SkPictureRecorder.h"
38#include "third_party/skia/include/core/SkRefCnt.h"
39#include "third_party/skia/include/core/SkSize.h"
40#include "third_party/skia/include/core/SkSurface.h"
43using pdfium::ManyRectanglesChecksum;
47constexpr char kFirstAlternate[] =
"FirstAlternate";
48constexpr char kLastAlternate[] =
"LastAlternate";
51const char kExpectedRectanglePostScript[] = R"(
52save
53/im/initmatrix load def
54/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def
55/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def
56/rg/setrgbcolor load def/k/setcmykcolor load def
57/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def
58/q/gsave load def/Q/grestore load def/iM/imagemask load def
59/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def
60/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def
610 300 m 0 0 l 200 0 l 200 300 l 0 300 l h W n
62q
630 300 m 0 0 l 200 0 l 200 300 l 0 300 l h W n
64q
650 J
66[]0 d
670 j
681 w
6910 M
70mx Cm [1 0 0 -1 0 300]cm 0 290 m 10 290 l 10 300 l 0 300 l 0 290 l h 0 0 0 rg
71q F Q s sm
72mx Cm [1 0 0 -1 0 300]cm 10 150 m 60 150 l 60 180 l 10 180 l 10 150 l h q F Q s sm
73mx Cm [1 0 0 -1 0 300]cm 190 290 m 200 290 l 200 300 l 190 300 l 190 290 l h 0 0 1 rg
74q F Q 0 0 0 rg
75s sm
76mx Cm [1 0 0 -1 0 300]cm 70 232 m 120 232 l 120 262 l 70 262 l 70 232 l h 0 0 1 rg
77q F Q 0 0 0 rg
78s sm
79mx Cm [1 0 0 -1 0 300]cm 190 0 m 200 0 l 200 10 l 190 10 l 190 0 l h 0 1 0 rg
80q F Q 0 0 0 rg
81s sm
82mx Cm [1 0 0 -1 0 300]cm 130 150 m 180 150 l 180 180 l 130 180 l 130 150 l h 0 1 0 rg
83q F Q 0 0 0 rg
84s sm
85mx Cm [1 0 0 -1 0 300]cm 0 0 m 10 0 l 10 10 l 0 10 l 0 0 l h 1 0 0 rg
86q F Q 0 0 0 rg
87s sm
88mx Cm [1 0 0 -1 0 300]cm 70 67 m 120 67 l 120 97 l 70 97 l 70 67 l h 1 0 0 rg
89q F Q 0 0 0 rg
90s sm
91Q
92Q
93Q
94
95restore
96)";
99class MockDownloadHints
final :
public FX_DOWNLOADHINTS {
101 static void SAddSegment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {
104 MockDownloadHints() {
109 ~MockDownloadHints() =
default;
112#if defined(PDF_USE_SKIA)
113ScopedFPDFBitmap SkImageToPdfiumBitmap(
const SkImage& image) {
114 ScopedFPDFBitmap bitmap(
115 FPDFBitmap_Create(image.width(), image.height(), 1));
117 ADD_FAILURE() <<
"Could not create FPDF_BITMAP";
121 if (!image.readPixels(
nullptr,
122 image.imageInfo().makeColorType(kBGRA_8888_SkColorType),
123 FPDFBitmap_GetBuffer(bitmap.get()),
124 FPDFBitmap_GetStride(bitmap.get()),
126 ADD_FAILURE() <<
"Could not read pixels from SkImage";
133ScopedFPDFBitmap SkPictureToPdfiumBitmap(sk_sp<SkPicture> picture,
134 const SkISize& size) {
135 sk_sp<SkSurface> surface =
136 SkSurfaces::Raster(SkImageInfo::MakeN32Premul(size));
138 ADD_FAILURE() <<
"Could not create SkSurface";
142 surface->getCanvas()->clear(SK_ColorWHITE);
143 surface->getCanvas()->drawPicture(picture);
144 sk_sp<SkImage> image = surface->makeImageSnapshot();
146 ADD_FAILURE() <<
"Could not snapshot SkSurface";
150 return SkImageToPdfiumBitmap(*image);
165 const FS_MATRIX& matrix,
166 const FS_RECTF& rect,
167 const char* expected_checksum) {
169 ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0, bitmap_width,
170 bitmap_height, 0xFFFFFFFF));
171 FPDF_RenderPageBitmapWithMatrix(bitmap.get(), page, &matrix, &rect, 0);
177 const char* expected_checksum) {
181 ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0, bitmap_width,
182 bitmap_height, 0xFFFFFFFF));
183 FPDF_RenderPageBitmap(bitmap.get(), page, 0, 0, bitmap_width, bitmap_height,
190 const char* expected_checksum) {
192 page
, format
, 0
, expected_checksum
);
199 const char* expected_checksum) {
203 ASSERT_NE(0, bytes_per_pixel);
206 bitmap_width
, bitmap_height
, format
, nullptr, bitmap_stride
));
207 RenderPageToBitmapAndCheck(page, bitmap.get(), expected_checksum);
212 const char* expected_checksum) {
215 ASSERT_NE(0, bytes_per_pixel);
217 int bitmap_stride = bytes_per_pixel * bitmap_width;
218 return TestRenderPageBitmapWithExternalMemoryImpl(
219 page, format, bitmap_stride, expected_checksum);
225 const char* expected_checksum) {
226 return TestRenderPageBitmapWithExternalMemoryImpl(
227 page, format, 0, expected_checksum);
230#if defined(PDF_USE_SKIA)
254 void TestRenderPageBitmapWithExternalMemoryImpl(
258 const char* expected_checksum) {
262 std::vector<uint8_t> external_memory(bitmap_stride * bitmap_height);
263 ScopedFPDFBitmap bitmap(FPDFBitmap_CreateEx(bitmap_width, bitmap_height,
264 format, external_memory.data(),
266 RenderPageToBitmapAndCheck(page, bitmap.get(), expected_checksum);
269 void RenderPageToBitmapAndCheck(FPDF_PAGE page,
271 const char* expected_checksum) {
286 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
287 ScopedEmbedderTestPage page = LoadScopedPage(0);
291 const double kTolerance = 0.0001;
308 EXPECT_TRUE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
309 rotate, device_x, device_y, &page_x, &page_y));
310 EXPECT_NEAR(9.5625, page_x, kTolerance);
311 EXPECT_NEAR(775.5, page_y, kTolerance);
315 EXPECT_TRUE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
316 rotate, device_x, device_y, &page_x, &page_y));
317 EXPECT_NEAR(12.75, page_x, kTolerance);
318 EXPECT_NEAR(12.375, page_y, kTolerance);
322 EXPECT_TRUE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
323 rotate, device_x, device_y, &page_x, &page_y));
324 EXPECT_NEAR(602.4374, page_x, kTolerance);
325 EXPECT_NEAR(16.5, page_y, kTolerance);
329 EXPECT_TRUE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
330 rotate, device_x, device_y, &page_x, &page_y));
331 EXPECT_NEAR(599.25, page_x, kTolerance);
332 EXPECT_NEAR(779.625, page_y, kTolerance);
338 EXPECT_TRUE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
339 rotate, device_x, device_y, &page_x, &page_y));
340 EXPECT_NEAR(9.5625, page_x, kTolerance);
341 EXPECT_NEAR(775.5, page_y, kTolerance);
346 EXPECT_TRUE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
347 rotate, device_x, device_y, &page_x, &page_y));
348 EXPECT_NEAR(device_x, page_x, kTolerance);
349 EXPECT_NEAR(device_y, page_y, kTolerance);
355 rotate
, device_x
, device_y
, &page_x
, &page_y
));
357 EXPECT_NEAR(1234.0, page_x, kTolerance);
358 EXPECT_NEAR(5678.0, page_y, kTolerance);
361 EXPECT_FALSE(FPDF_DeviceToPage(page.get(), start_x, start_y, size_x, size_y,
362 rotate, device_x, device_y,
nullptr,
nullptr));
367 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
368 FPDF_PAGE page = LoadPage(0);
382 double page_y = 775.0;
387 page_x
, page_y
, &device_x
, &device_y
));
389 EXPECT_EQ(9, device_x);
390 EXPECT_EQ(10, device_y);
395 page_x
, page_y
, &device_x
, &device_y
));
396 EXPECT_EQ(626, device_x);
397 EXPECT_EQ(7, device_y);
402 page_x
, page_y
, &device_x
, &device_y
));
403 EXPECT_EQ(631, device_x);
404 EXPECT_EQ(470, device_y);
409 page_x
, page_y
, &device_x
, &device_y
));
410 EXPECT_EQ(14, device_x);
411 EXPECT_EQ(473, device_y);
418 page_x
, page_y
, &device_x
, &device_y
));
419 EXPECT_EQ(9, device_x);
420 EXPECT_EQ(10, device_y);
426 page_x
, page_y
, &device_x
, &device_y
));
427 EXPECT_EQ(start_x, device_x);
428 EXPECT_EQ(start_y, device_y);
434 rotate
, page_x
, page_y
, &device_x
, &device_y
));
436 EXPECT_EQ(1234, device_x);
437 EXPECT_EQ(5678, device_y);
441 page_x
, page_y
, nullptr, nullptr));
450 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
463 for (
int i = 0; i < 3; ++i) {
464 if (!OpenDocument(
"about_blank.pdf"))
478 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
479 EXPECT_EQ(1, GetPageCount());
480 EXPECT_EQ(0, GetFirstPageNum());
483 EXPECT_TRUE(FPDF_GetFileVersion(document(), &version));
484 EXPECT_EQ(14, version);
487 EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document()));
488 EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocUserPermissions(document()));
489 EXPECT_EQ(-1, FPDF_GetSecurityHandlerRevision(document()));
493 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
494 EXPECT_EQ(1, GetPageCount());
495 EXPECT_EQ(0, GetFirstPageNum());
498 EXPECT_TRUE(FPDF_GetFileVersion(document(), &version));
499 EXPECT_EQ(14, version);
502 EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document()));
503 EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocUserPermissions(document()));
504 EXPECT_EQ(-1, FPDF_GetSecurityHandlerRevision(document()));
510 ASSERT_FALSE(file_path.empty());
512 std::vector<uint8_t> file_contents = GetFileContents(file_path.c_str());
513 ASSERT_FALSE(file_contents.empty());
514 ScopedFPDFDocument doc(FPDF_LoadMemDocument64(file_contents.data(),
515 file_contents.size(),
nullptr));
519 EXPECT_TRUE(FPDF_GetFileVersion(doc.get(), &version));
520 EXPECT_EQ(14, version);
530 ASSERT_TRUE(OpenDocument(
"no_page_count.pdf"));
531 ASSERT_EQ(6, FPDF_GetPageCount(document()));
535 ASSERT_TRUE(OpenDocument(
"page_tree_empty_node.pdf"));
536 ASSERT_EQ(2, FPDF_GetPageCount(document()));
541 CreateEmptyDocument();
544 EXPECT_FALSE(FPDF_GetFileVersion(document(), &version));
545 EXPECT_EQ(0, version);
547 EXPECT_EQ(0U, FPDF_GetDocPermissions(document()));
548 EXPECT_EQ(-1, FPDF_GetSecurityHandlerRevision(document()));
549 EXPECT_EQ(0, FPDF_GetPageCount(document()));
550 EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document()));
551 EXPECT_EQ(1, FPDF_VIEWERREF_GetNumCopies(document()));
552 EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document()));
555 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"foo",
nullptr, 0));
556 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"foo", buf,
sizeof(buf)));
557 EXPECT_EQ(0u, FPDF_CountNamedDests(document()));
564 CreateEmptyDocument();
565 len = FPDF_GetMetaText(document(),
"CreationDate", buf,
sizeof(buf));
567 EXPECT_NE(0u, buf[0]);
571 CreateEmptyDocument();
572 len = FPDF_GetMetaText(document(),
"CreationDate", buf,
sizeof(buf));
574 EXPECT_EQ(0u, buf[0]);
577 constexpr unsigned long kNoSuchPolicy = 102;
579 CreateEmptyDocument();
580 len = FPDF_GetMetaText(document(),
"CreationDate", buf,
sizeof(buf));
582 EXPECT_EQ(0u, buf[0]);
586 CreateEmptyDocument();
587 len = FPDF_GetMetaText(document(),
"CreationDate", buf,
sizeof(buf));
589 EXPECT_NE(0u, buf[0]);
594 ASSERT_TRUE(OpenDocumentLinearized(
"feature_linearized_loading.pdf"));
596 EXPECT_TRUE(FPDF_GetFileVersion(document(), &version));
597 EXPECT_EQ(16, version);
606 std::string file_contents_string;
607 ScopedFPDFDocument doc;
611 ASSERT_FALSE(pdf_path.empty());
612 std::vector<uint8_t> file_contents = GetFileContents(pdf_path.c_str());
613 ASSERT_FALSE(file_contents.empty());
614 std::copy(file_contents.begin(), file_contents.end(),
615 std::back_inserter(file_contents_string));
619 FPDF_FILEACCESS file_access = {};
620 file_access.m_FileLen = file_contents_string.size();
621 file_access.m_GetBlock = GetBlockFromString;
622 file_access.m_Param = &file_contents_string;
628 ScopedFPDFPage page(FPDF_LoadPage(doc.get(), 0));
630 EXPECT_FLOAT_EQ(200.0f, FPDF_GetPageWidthF(page.get()));
631 EXPECT_FLOAT_EQ(300.0f, FPDF_GetPageHeightF(page.get()));
635 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
636 FPDF_PAGE page = LoadPage(0);
644 EXPECT_EQ(0.0, rect.left);
645 EXPECT_EQ(0.0, rect.bottom);
646 EXPECT_EQ(612.0, rect.right);
647 EXPECT_EQ(792.0, rect.top);
656 EXPECT_FALSE(LoadPage(1));
660 ASSERT_TRUE(OpenDocument(
"about_blank.pdf"));
661 EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document()));
662 EXPECT_EQ(1, FPDF_VIEWERREF_GetNumCopies(document()));
663 EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document()));
666 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"foo",
nullptr, 0));
667 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"foo", buf,
sizeof(buf)));
669 FPDF_PAGERANGE page_range = FPDF_VIEWERREF_GetPrintPageRange(document());
670 EXPECT_FALSE(page_range);
671 EXPECT_EQ(0U, FPDF_VIEWERREF_GetPrintPageRangeCount(page_range));
672 EXPECT_EQ(-1, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 0));
673 EXPECT_EQ(-1, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 1));
677 ASSERT_TRUE(OpenDocument(
"viewer_ref.pdf"));
678 EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document()));
679 EXPECT_EQ(5, FPDF_VIEWERREF_GetNumCopies(document()));
680 EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document()));
684 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"", buf,
sizeof(buf)));
685 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"foo",
nullptr, 0));
686 EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(),
"foo", buf,
sizeof(buf)));
691 EXPECT_EQ(4U, FPDF_VIEWERREF_GetName(document(),
"Foo", buf, 1));
692 EXPECT_STREQ(
"ABCD", buf);
695 EXPECT_EQ(4U, FPDF_VIEWERREF_GetName(document(),
"Foo",
nullptr, 0));
696 ASSERT_EQ(4U, FPDF_VIEWERREF_GetName(document(),
"Foo", buf,
sizeof(buf)));
697 EXPECT_STREQ(
"foo", buf);
701 0U, FPDF_VIEWERREF_GetName(document(),
"HideToolbar", buf,
sizeof(buf)));
703 FPDF_VIEWERREF_GetName(document(),
"NumCopies", buf,
sizeof(buf)));
707 FPDF_VIEWERREF_GetName(document(),
"Direction", buf,
sizeof(buf)));
708 EXPECT_STREQ(
"R2L", buf);
710 FPDF_VIEWERREF_GetName(document(),
"ViewArea", buf,
sizeof(buf)));
711 EXPECT_STREQ(
"CropBox", buf);
713 FPDF_PAGERANGE page_range = FPDF_VIEWERREF_GetPrintPageRange(document());
714 EXPECT_TRUE(page_range);
715 EXPECT_EQ(4U, FPDF_VIEWERREF_GetPrintPageRangeCount(page_range));
716 EXPECT_EQ(0, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 0));
717 EXPECT_EQ(2, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 1));
718 EXPECT_EQ(4, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 2));
719 EXPECT_EQ(4, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 3));
720 EXPECT_EQ(-1, FPDF_VIEWERREF_GetPrintPageRangeElement(page_range, 4));
724 ASSERT_TRUE(OpenDocument(
"named_dests.pdf"));
725 EXPECT_EQ(6u, FPDF_CountNamedDests(document()));
728 char fixed_buffer[512];
732 buffer_size = 2000000;
733 dest = FPDF_GetNamedDest(document(), 0,
nullptr, &buffer_size);
735 EXPECT_EQ(12, buffer_size);
739 dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size);
741 EXPECT_EQ(-1, buffer_size);
746 dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size);
748 EXPECT_EQ(12, buffer_size);
754 buffer_size =
sizeof(fixed_buffer);
755 dest = FPDF_GetNamedDest(document(), 1, fixed_buffer, &buffer_size);
757 EXPECT_EQ(10, buffer_size);
764 buffer_size =
sizeof(fixed_buffer);
765 dest = FPDF_GetNamedDest(document(), 2, fixed_buffer, &buffer_size);
767 EXPECT_EQ(
sizeof(fixed_buffer),
768 static_cast<size_t>(buffer_size));
772 buffer_size =
sizeof(fixed_buffer);
773 dest = FPDF_GetNamedDest(document(), 3, fixed_buffer, &buffer_size);
775 EXPECT_EQ(
sizeof(fixed_buffer),
776 static_cast<size_t>(buffer_size));
780 buffer_size =
sizeof(fixed_buffer);
781 dest = FPDF_GetNamedDest(document(), 4, fixed_buffer, &buffer_size);
783 EXPECT_EQ(30, buffer_size);
784 EXPECT_EQ(kFirstAlternate,
790 buffer_size =
sizeof(fixed_buffer);
791 dest = FPDF_GetNamedDest(document(), 5, fixed_buffer, &buffer_size);
793 EXPECT_EQ(28, buffer_size);
794 EXPECT_EQ(kLastAlternate,
798 buffer_size =
sizeof(fixed_buffer);
799 dest = FPDF_GetNamedDest(document(), 6, fixed_buffer, &buffer_size);
801 EXPECT_EQ(
sizeof(fixed_buffer),
802 static_cast<size_t>(buffer_size));
805 buffer_size =
sizeof(fixed_buffer);
806 dest = FPDF_GetNamedDest(document(),
std::numeric_limits<
int>::max(),
807 fixed_buffer, &buffer_size);
809 EXPECT_EQ(
sizeof(fixed_buffer),
810 static_cast<size_t>(buffer_size));
812 buffer_size =
sizeof(fixed_buffer);
813 dest = FPDF_GetNamedDest(document(),
std::numeric_limits<
int>::min(),
814 fixed_buffer, &buffer_size);
816 EXPECT_EQ(
sizeof(fixed_buffer),
817 static_cast<size_t>(buffer_size));
819 buffer_size =
sizeof(fixed_buffer);
820 dest = FPDF_GetNamedDest(document(), -1, fixed_buffer, &buffer_size);
822 EXPECT_EQ(
sizeof(fixed_buffer),
823 static_cast<size_t>(buffer_size));
827 ASSERT_TRUE(OpenDocument(
"named_dests.pdf"));
830 FPDF_DEST dest = FPDF_GetNamedDestByName(document(),
nullptr);
834 dest = FPDF_GetNamedDestByName(document(),
"");
838 dest = FPDF_GetNamedDestByName(document(),
"First");
842 FPDF_DEST dest_by_index =
843 FPDF_GetNamedDest(document(), 0,
nullptr, &ignore_len);
844 EXPECT_EQ(dest_by_index, dest);
847 dest = FPDF_GetNamedDestByName(document(), kFirstAlternate);
851 dest_by_index = FPDF_GetNamedDest(document(), 4,
nullptr, &ignore_len);
852 EXPECT_EQ(dest_by_index, dest);
855 dest = FPDF_GetNamedDestByName(document(),
"WrongType");
859 dest = FPDF_GetNamedDestByName(document(),
"Bogus");
864 ASSERT_TRUE(OpenDocument(
"named_dests_old_style.pdf"));
865 EXPECT_EQ(2u, FPDF_CountNamedDests(document()));
868 EXPECT_FALSE(FPDF_GetNamedDestByName(document(),
nullptr));
869 EXPECT_FALSE(FPDF_GetNamedDestByName(document(),
""));
870 EXPECT_FALSE(FPDF_GetNamedDestByName(document(),
"NoSuchName"));
873 EXPECT_TRUE(FPDF_GetNamedDestByName(document(), kFirstAlternate));
874 EXPECT_TRUE(FPDF_GetNamedDestByName(document(), kLastAlternate));
877 constexpr long kBufferSize =
sizeof(buffer);
878 long size = kBufferSize;
881 EXPECT_FALSE(FPDF_GetNamedDest(document(), -1, buffer, &size));
882 EXPECT_EQ(kBufferSize, size);
884 EXPECT_FALSE(FPDF_GetNamedDest(document(), 2, buffer, &size));
885 EXPECT_EQ(kBufferSize, size);
889 ASSERT_TRUE(FPDF_GetNamedDest(document(), 0, buffer, &size));
890 ASSERT_EQ(
static_cast<
int>(
sizeof(kFirstAlternate) * 2), size);
891 EXPECT_EQ(kFirstAlternate,
894 ASSERT_TRUE(FPDF_GetNamedDest(document(), 1, buffer, &size));
895 ASSERT_EQ(
static_cast<
int>(
sizeof(kLastAlternate) * 2), size);
896 EXPECT_EQ(kLastAlternate,
902 ASSERT_TRUE(OpenDocument(
"bug_113.pdf"));
907 EXPECT_FALSE(OpenDocument(
"bug_451830.pdf"));
911 ASSERT_TRUE(OpenDocument(
"bug_452455.pdf"));
912 ScopedEmbedderTestPage page = LoadScopedPage(0);
918 EXPECT_FALSE(OpenDocument(
"bug_454695.pdf"));
922 ASSERT_TRUE(OpenDocument(
"bug_572871.pdf"));
928 ASSERT_TRUE(OpenDocument(
"bug_213.pdf"));
933 EXPECT_FALSE(OpenDocument(
"bug_298.pdf"));
937 ASSERT_TRUE(OpenDocument(
"bug_773229.pdf"));
945 ASSERT_TRUE(OpenDocument(
"bug_xrefv4_loop.pdf"));
946 MockDownloadHints hints;
952 ret = FPDFAvail_IsDocAvail(avail(), &hints);
959 EXPECT_FALSE(OpenDocument(
"bug_343.pdf"));
965 EXPECT_FALSE(OpenDocument(
"bug_344.pdf"));
971 EXPECT_FALSE(OpenDocument(
"bug_355.pdf"));
975 EXPECT_FALSE(OpenDocument(
"bug_360.pdf"));
981 ASSERT_TRUE(OpenDocumentLinearized(
"linearized_bug_1055.pdf"));
983 EXPECT_TRUE(FPDF_GetFileVersion(document(), &version));
984 EXPECT_EQ(16, version);
988 const char* clipped_checksum = []() {
990 return "d2929fae285593cd1c1d446750d47d60";
992 return "a84cab93c102b9b9290fba3047ba702c";
994 const char* top_left_quarter_checksum = []() {
996 return "31d24d8c6a2bac380b2f5c393e77ecc9";
998 return "f11a11137c8834389e31cf555a4a6979";
1000 const char* rotated_90_clockwise_checksum = []() {
1002 return "b4baa001d201baed576cd6d5d0d5a160";
1004 return "d8da2c7bf77521550d0f2752b9cf3482";
1006 const char* rotated_180_clockwise_checksum = []() {
1008 return "51819227d0863222aed366d5d7c5d9c8";
1010 return "0113386bb0bd45125bacc6dee78bfe78";
1012 const char* rotated_270_clockwise_checksum = []() {
1014 return "f2b046e46c2751cebc777a9725ae2f3e";
1016 return "a287e0f74ce203699cda89f9cc97a240";
1018 const char* mirror_hori_checksum = []() {
1020 return "c7fbec322b4fc6bcf46ec1eb89661c41";
1022 return "6e8d7a6fde39d8e720fb9e620102918c";
1024 const char* mirror_vert_checksum = []() {
1026 return "a8b00bc40677a73c15a08b9769d1b576";
1028 return "8f3a555ef9c0d5031831ae3715273707";
1030 const char* larger_top_left_quarter_checksum = []() {
1032 return "35deb5ed4b73675ce33f68328a33c687";
1034 return "172a2f4adafbadbe98017b1c025b9e27";
1036 const char* larger_rotated_diagonal_checksum = []() {
1038 return "a7179bc24e329341a1a1f6d6be20a1e9";
1040 return "3d62417468bdaff0eb14391a0c30a3b1";
1042 const char* tile_checksum = []() {
1044 return "387be3a84774f39aaa955314d2fe7106";
1046 return "0a190003c97220bf8877684c8d7e89cf";
1048 const char kHoriStretchedChecksum[] =
"48ef9205941ed19691ccfa00d717187e";
1049 const char kLargerChecksum[] =
"c806145641c3e6fc4e022c7065343749";
1050 const char kLargerClippedChecksum[] =
"091d3b1c7933c8f6945eb2cb41e588e9";
1051 const char kLargerRotatedChecksum[] =
"115f13353ebfc82ddb392d1f0059eb12";
1052 const char kLargerRotatedLandscapeChecksum[] =
1053 "c901239d17d84ac84cb6f2124da71b0d";
1055 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
1056 FPDF_PAGE page = LoadPage(0);
1060 EXPECT_FLOAT_EQ(200, page_width);
1061 EXPECT_FLOAT_EQ(300, page_height);
1063 using pdfium::RectanglesChecksum;
1064 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
1067 FS_RECTF page_rect{0, 0, page_width, page_height};
1071 FS_MATRIX identity_matrix{1, 0, 0, 1, 0, 0};
1072 TestRenderPageBitmapWithMatrix(page, page_width, page_height, identity_matrix,
1076 FS_RECTF middle_of_page_rect{page_width / 4, page_height / 4,
1077 page_width * 3 / 4, page_height * 3 / 4};
1078 TestRenderPageBitmapWithMatrix(page, page_width, page_height, identity_matrix,
1079 middle_of_page_rect, clipped_checksum);
1082 FS_MATRIX half_scale_matrix{0.5, 0, 0, 0.5, 0, 0};
1083 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1084 half_scale_matrix, page_rect,
1085 top_left_quarter_checksum);
1089 FS_MATRIX stretch_x_matrix{2, 0, 0, 1, 0, 0};
1090 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1091 stretch_x_matrix, page_rect,
1092 kHoriStretchedChecksum);
1096 FS_MATRIX rotate_90_matrix{0, 1, -1, 0, page_width, 0};
1097 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1098 rotate_90_matrix, page_rect,
1099 rotated_90_clockwise_checksum);
1102 FS_MATRIX rotate_180_matrix{-1, 0, 0, -1, page_width, page_height};
1103 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1104 rotate_180_matrix, page_rect,
1105 rotated_180_clockwise_checksum);
1108 FS_MATRIX rotate_270_matrix{0, -1, 1, 0, 0, page_width};
1109 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1110 rotate_270_matrix, page_rect,
1111 rotated_270_clockwise_checksum);
1114 FS_MATRIX mirror_hori_matrix{-1, 0, 0, 1, page_width, 0};
1115 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1116 mirror_hori_matrix, page_rect,
1117 mirror_hori_checksum);
1120 FS_MATRIX mirror_vert_matrix{1, 0, 0, -1, 0, page_height};
1121 TestRenderPageBitmapWithMatrix(page, page_width, page_height,
1122 mirror_vert_matrix, page_rect,
1123 mirror_vert_checksum);
1126 const float bitmap_width = page_width * 2;
1127 const float bitmap_height = page_height * 2;
1130 FS_RECTF bitmap_rect{0, 0, bitmap_width, bitmap_height};
1131 TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
1132 identity_matrix, bitmap_rect,
1133 larger_top_left_quarter_checksum);
1136 FS_MATRIX double_scale_matrix{2, 0, 0, 2, 0, 0};
1137 TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
1138 double_scale_matrix, bitmap_rect,
1142 FS_RECTF middle_of_bitmap_rect{bitmap_width / 4, bitmap_height / 4,
1143 bitmap_width * 3 / 4, bitmap_height * 3 / 4};
1144 TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
1145 double_scale_matrix, middle_of_bitmap_rect,
1146 kLargerClippedChecksum);
1150 FS_MATRIX rotate_90_scale_2_matrix{0, 2, -2, 0, bitmap_width, 0};
1151 TestRenderPageBitmapWithMatrix(page, bitmap_width, bitmap_height,
1152 rotate_90_scale_2_matrix, bitmap_rect,
1153 kLargerRotatedChecksum);
1157 const float landscape_bitmap_width = bitmap_height;
1158 const float landscape_bitmap_height = bitmap_width;
1159 FS_RECTF landscape_bitmap_rect{0, 0, landscape_bitmap_width,
1160 landscape_bitmap_height};
1161 FS_MATRIX landscape_rotate_90_scale_2_matrix{
1162 0, 2, -2, 0, landscape_bitmap_width, 0};
1163 TestRenderPageBitmapWithMatrix(
1164 page, landscape_bitmap_width, landscape_bitmap_height,
1165 landscape_rotate_90_scale_2_matrix, landscape_bitmap_rect,
1166 kLargerRotatedLandscapeChecksum);
1170 const float sqrt2 = 1.41421356f;
1171 const float diagonal_bitmap_size =
1172 ceil((bitmap_width + bitmap_height) / sqrt2);
1173 FS_RECTF diagonal_bitmap_rect{0, 0, diagonal_bitmap_size,
1174 diagonal_bitmap_size};
1175 FS_MATRIX rotate_45_scale_2_matrix{
1176 sqrt2, sqrt2, -sqrt2, sqrt2, bitmap_height / sqrt2, 0};
1177 TestRenderPageBitmapWithMatrix(page, diagonal_bitmap_size,
1178 diagonal_bitmap_size, rotate_45_scale_2_matrix,
1179 diagonal_bitmap_rect,
1180 larger_rotated_diagonal_checksum);
1184 const float scale = 7.0;
1185 const int tile_size = 50;
1186 const int tile_x = 2;
1187 const int tile_y = 1;
1188 float tile_bitmap_size = scale * tile_size;
1189 FS_RECTF tile_bitmap_rect{0, 0, tile_bitmap_size, tile_bitmap_size};
1190 FS_MATRIX tile_2_1_matrix{scale,
1194 -tile_x * tile_bitmap_size,
1195 -tile_y * tile_bitmap_size};
1196 TestRenderPageBitmapWithMatrix(page, tile_bitmap_size, tile_bitmap_size,
1197 tile_2_1_matrix, tile_bitmap_rect,
1204 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
1208 EXPECT_FALSE(FPDF_GetPageSizeByIndexF(document(), 0,
nullptr));
1211 EXPECT_FALSE(FPDF_GetPageSizeByIndexF(document(), -1, &size));
1214 EXPECT_FALSE(FPDF_GetPageSizeByIndexF(document(), 1, &size));
1217 EXPECT_TRUE(FPDF_GetPageSizeByIndexF(document(), 0, &size));
1218 EXPECT_FLOAT_EQ(200.0f, size.width);
1219 EXPECT_FLOAT_EQ(300.0f, size.height);
1221 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document());
1222#ifdef PDF_ENABLE_XFA
1224 EXPECT_EQ(1u, pDoc->GetParsedPageCountForTesting());
1230 FPDF_PAGE page = LoadPage(0);
1239 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
1245 EXPECT_FALSE(FPDF_GetPageSizeByIndex(document(), 0,
nullptr, &height));
1246 EXPECT_FALSE(FPDF_GetPageSizeByIndex(document(), 0, &width,
nullptr));
1249 EXPECT_FALSE(FPDF_GetPageSizeByIndex(document(), -1, &width, &height));
1252 EXPECT_FALSE(FPDF_GetPageSizeByIndex(document(), 1, &width, &height));
1255 EXPECT_TRUE(FPDF_GetPageSizeByIndex(document(), 0, &width, &height));
1256 EXPECT_EQ(200.0, width);
1257 EXPECT_EQ(300.0, height);
1259 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document());
1260#ifdef PDF_ENABLE_XFA
1262 EXPECT_EQ(1u, pDoc->GetParsedPageCountForTesting());
1268 FPDF_PAGE page = LoadPage(0);
1277 static constexpr struct {
1280 size_t content_length;
1281 const char* content_checksum;
1283 {0,
"preamble", 124u,
"71be364e53292596412242bfcdb46eab"},
1284 {1,
"config", 642u,
"bcd1ca1d420ee31a561273a54a06435f"},
1285 {2,
"template", 541u,
"0f48cb2fa1bb9cbf9eee802d66e81bf4"},
1286 {3,
"localeSet", 3455u,
"bb1f253d3e5c719ac0da87d055bc164e"},
1287 {4,
"postamble", 11u,
"6b79e25da35d86634ea27c38f64cf243"},
1290 ASSERT_TRUE(OpenDocument(
"simple_xfa.pdf"));
1291 ASSERT_EQ(
static_cast<
int>(
std::size(kTestCases)),
1292 FPDF_GetXFAPacketCount(document()));
1294 for (
const auto& testcase : kTestCases) {
1295 char name_buffer[20] = {};
1296 ASSERT_EQ(strlen(testcase.name) + 1,
1297 FPDF_GetXFAPacketName(document(), testcase.index,
nullptr, 0));
1298 EXPECT_EQ(strlen(testcase.name) + 1,
1299 FPDF_GetXFAPacketName(document(), testcase.index, name_buffer,
1300 sizeof(name_buffer)));
1301 EXPECT_STREQ(testcase.name, name_buffer);
1303 unsigned long buflen;
1304 ASSERT_TRUE(FPDF_GetXFAPacketContent(document(), testcase.index,
nullptr, 0,
1306 ASSERT_EQ(testcase.content_length, buflen);
1307 std::vector<uint8_t> data_buffer(buflen);
1308 EXPECT_TRUE(FPDF_GetXFAPacketContent(document(), testcase.index,
1309 data_buffer.data(), data_buffer.size(),
1311 EXPECT_EQ(testcase.content_length, buflen);
1312 EXPECT_EQ(testcase.content_checksum, GenerateMD5Base16(data_buffer));
1319 EXPECT_EQ(0u, FPDF_GetXFAPacketName(document(), -1,
nullptr, 0));
1321 0u, FPDF_GetXFAPacketName(document(),
std::size(kTestCases),
nullptr, 0));
1323 unsigned long buflen = 123;
1325 EXPECT_EQ(123u, buflen);
1326 EXPECT_FALSE(FPDF_GetXFAPacketContent(document(), -1,
nullptr, 0, &buflen));
1327 EXPECT_EQ(123u, buflen);
1328 EXPECT_FALSE(FPDF_GetXFAPacketContent(document(),
std::size(kTestCases),
1329 nullptr, 0, &buflen));
1330 EXPECT_EQ(123u, buflen);
1331 EXPECT_FALSE(FPDF_GetXFAPacketContent(document(), 0,
nullptr, 0,
nullptr));
1335 ASSERT_TRUE(OpenDocument(
"bug_1265.pdf"));
1337 ASSERT_EQ(1, FPDF_GetXFAPacketCount(document()));
1339 char name_buffer[20] = {};
1340 ASSERT_EQ(1u, FPDF_GetXFAPacketName(document(), 0,
nullptr, 0));
1341 EXPECT_EQ(1u, FPDF_GetXFAPacketName(document(), 0, name_buffer,
1342 sizeof(name_buffer)));
1343 EXPECT_STREQ(
"", name_buffer);
1345 unsigned long buflen;
1346 ASSERT_TRUE(FPDF_GetXFAPacketContent(document(), 0,
nullptr, 0, &buflen));
1347 ASSERT_EQ(121u, buflen);
1348 std::vector<uint8_t> data_buffer(buflen);
1349 EXPECT_TRUE(FPDF_GetXFAPacketContent(document(), 0, data_buffer.data(),
1350 data_buffer.size(), &buflen));
1351 EXPECT_EQ(121u, buflen);
1352 EXPECT_EQ(
"8f912eaa1e66c9341cb3032ede71e147", GenerateMD5Base16(data_buffer));
1356 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1358 EXPECT_EQ(0, FPDF_GetXFAPacketCount(document()));
1362 ASSERT_TRUE(OpenDocument(
"text_form.pdf"));
1364 EXPECT_EQ(0, FPDF_GetXFAPacketCount(document()));
1378 RecordUnsupportedErrorDelegate delegate;
1379 SetDelegate(&delegate);
1380 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1381 EXPECT_EQ(delegate
.type_, -1);
1382 SetDelegate(
nullptr);
1386 RecordUnsupportedErrorDelegate delegate;
1387 SetDelegate(&delegate);
1388 ASSERT_TRUE(OpenDocument(
"unsupported_feature.pdf"));
1390 SetDelegate(
nullptr);
1394 std::string file_path =
1396 ASSERT_FALSE(file_path.empty());
1398 RecordUnsupportedErrorDelegate delegate;
1399 SetDelegate(&delegate);
1401 ScopedFPDFDocument doc(FPDF_LoadDocument(file_path.c_str(),
""));
1405 SetDelegate(
nullptr);
1409 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1410 EXPECT_TRUE(FPDF_DocumentHasValidCrossReferenceTable(document()));
1416 ASSERT_TRUE(OpenDocument(
"bug_664284.pdf"));
1417 EXPECT_FALSE(FPDF_DocumentHasValidCrossReferenceTable(document()));
1422 ASSERT_TRUE(OpenDocument(
"empty_xref.pdf"));
1423 EXPECT_TRUE(FPDF_DocumentHasValidCrossReferenceTable(document()));
1426 ASSERT_FALSE(file_path.empty());
1428 ScopedFPDFDocument doc(FPDF_LoadDocument(file_path.c_str(),
""));
1430 EXPECT_TRUE(FPDF_DocumentHasValidCrossReferenceTable(doc.get()));
1433 std::vector<uint8_t> file_contents = GetFileContents(file_path.c_str());
1434 ASSERT_FALSE(file_contents.empty());
1435 ScopedFPDFDocument doc(
1436 FPDF_LoadMemDocument(file_contents.data(), file_contents.size(),
""));
1438 EXPECT_TRUE(FPDF_DocumentHasValidCrossReferenceTable(doc.get()));
1456 const char* original_checksum = []() {
1458#if BUILDFLAG(IS_WIN)
1459 return "1c5d8217aca4f6fa86a8ed192f34b210";
1460#elif BUILDFLAG(IS_APPLE)
1461 return "b7ac2ca2b934f4e213ab4ba36c5f8ffd";
1463 return "29cb8045c21cfa2c920fdf43de70efd8";
1466#if BUILDFLAG(IS_APPLE)
1467 return "0e339d606aafb63077f49e238dc27cb0";
1469 return "288502887ffc63291f35a0573b944375";
1472 static const char kNoNativeTextChecksum[] =
1473 "288502887ffc63291f35a0573b944375";
1474 ASSERT_TRUE(OpenDocument(
"bug_664284.pdf"));
1475 FPDF_PAGE page = LoadPage(0);
1478 TestRenderPageBitmapWithFlags(page, 0, original_checksum);
1480 kNoNativeTextChecksum);
1486 const char* annotation_checksum = []() {
1488 return "eaece6b8041c0cb9b33398e5b6d5ddda";
1490 return "c108ba6e0a9743652f12e4bc223f9b32";
1492 static const char kPrintingChecksum[] =
"3e235b9f88f652f2b97b1fc393924849";
1493 ASSERT_TRUE(OpenDocument(
"bug_1658.pdf"));
1494 FPDF_PAGE page = LoadPage(0);
1498 TestRenderPageBitmapWithFlags(page,
FPDF_ANNOT, annotation_checksum);
1511 ASSERT_TRUE(OpenDocument(
"bug_1396264.pdf"));
1512 ScopedFPDFPage page(FPDF_LoadPage(document(), 0));
1515 TestRenderPageBitmapWithFlags(page.get(), 0,
1516 "81e7f4498090977c848a21b5c6510d3a");
1518 "505ba6d1c7f4044c11c91873452a8bde");
1522 static const char kNormalChecksum[] =
"4bcd56cae1ca2622403e8af07242e71a";
1523 static const char kGrayscaleChecksum[] =
"fe45ad56efe868ba82285fa5ffedc0cb";
1525 ASSERT_TRUE(OpenDocument(
"jpx_lzw.pdf"));
1526 FPDF_PAGE page = LoadPage(0);
1529 TestRenderPageBitmapWithFlags(page, 0, kNormalChecksum);
1530 TestRenderPageBitmapWithFlags(page,
FPDF_ANNOT, kNormalChecksum);
1531 TestRenderPageBitmapWithFlags(page,
FPDF_LCD_TEXT, kNormalChecksum);
1533 TestRenderPageBitmapWithFlags(page,
FPDF_GRAYSCALE, kGrayscaleChecksum);
1538 TestRenderPageBitmapWithFlags(page,
FPDF_PRINTING, kNormalChecksum);
1550 const char* grayscale_checksum = []() {
1552 return "b596ac8bbe64e7bff31888ab05e4dcf4";
1554 return "7b553f1052069a9c61237a05db0955d6";
1556 const char* no_smoothpath_checksum = []() {
1558 return "4d71ed53d9f6e6a761876ebb4ff23e19";
1560 return "ff6e5c509d1f6984bcdfd18b26a4203a";
1563 ASSERT_TRUE(OpenDocument(
"many_rectangles.pdf"));
1564 FPDF_PAGE page = LoadPage(0);
1572 TestRenderPageBitmapWithFlags(page,
FPDF_GRAYSCALE, grayscale_checksum);
1583 no_smoothpath_checksum);
1589 ASSERT_TRUE(OpenDocument(
"many_rectangles.pdf"));
1590 FPDF_PAGE page = LoadPage(0);
1593 const char* bgr_checksum = []() {
1595 return "4d52e5cc1d4a8067bf918b85b232fff0";
1597 return "ab6312e04c0d3f4e46fb302a45173d05";
1599 static constexpr int kBgrStride = 600;
1600 TestRenderPageBitmapWithInternalMemory(page,
FPDFBitmap_BGR, bgr_checksum);
1601 TestRenderPageBitmapWithInternalMemoryAndStride(page,
FPDFBitmap_BGR,
1602 kBgrStride, bgr_checksum);
1603 TestRenderPageBitmapWithExternalMemory(page,
FPDFBitmap_BGR, bgr_checksum);
1604 TestRenderPageBitmapWithExternalMemoryAndNoStride(page,
FPDFBitmap_BGR,
1607 const char* gray_checksum = []() {
1609 return "3dfe1fc3889123d68e1748fefac65e72";
1611 return "b561c11edc44dc3972125a9b8744fa2f";
1614 TestRenderPageBitmapWithInternalMemory(page,
FPDFBitmap_Gray, gray_checksum);
1615 static constexpr int kGrayStride = 200;
1616 TestRenderPageBitmapWithInternalMemoryAndStride(page,
FPDFBitmap_Gray,
1617 kGrayStride, gray_checksum);
1618 TestRenderPageBitmapWithExternalMemory(page,
FPDFBitmap_Gray, gray_checksum);
1619 TestRenderPageBitmapWithExternalMemoryAndNoStride(page,
FPDFBitmap_Gray,
1622 static constexpr int kBgrxStride = 800;
1625 TestRenderPageBitmapWithInternalMemoryAndStride(
1629 TestRenderPageBitmapWithExternalMemoryAndNoStride(page,
FPDFBitmap_BGRx,
1634 TestRenderPageBitmapWithInternalMemoryAndStride(
1638 TestRenderPageBitmapWithExternalMemoryAndNoStride(page,
FPDFBitmap_BGRA,
1645 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1646 FPDF_PAGE page = LoadPage(0);
1649 using pdfium::HelloWorldChecksum;
1663 const char* lcd_text_checksum = []() {
1665#if BUILDFLAG(IS_WIN)
1666 return "496d1f907349b153c5ecdc87c8073c7b";
1667#elif BUILDFLAG(IS_APPLE)
1668 return "b110924c4af6e87232249ea2a564f0e4";
1670 return "d1decde2de1c07b5274cc8cb44f92427";
1673#if BUILDFLAG(IS_APPLE)
1674 return "6eef7237f7591f07616e238422086737";
1676 return "09152e25e51fa8ca31fc28d0937bf477";
1679 const char* no_smoothtext_checksum = []() {
1681#if BUILDFLAG(IS_WIN)
1682 return "04dcf7d221437081034ca1152c717a8a";
1683#elif BUILDFLAG(IS_APPLE)
1684 return "8c99ca392ecff724da0d04b17453a45a";
1686 return "cd5bbe9407c3fcc85d365172a9a55abd";
1689#if BUILDFLAG(IS_APPLE)
1690 return "6eef7237f7591f07616e238422086737";
1692 return "6dec98c848028fa4be3ad38d6782e304";
1696 TestRenderPageBitmapWithFlags(page,
FPDF_LCD_TEXT, lcd_text_checksum);
1698 no_smoothtext_checksum);
1703 no_smoothtext_checksum);
1711#define MAYBE_LargeImageDoesNotRenderBlank LargeImageDoesNotRenderBlank
1713#define MAYBE_LargeImageDoesNotRenderBlank DISABLED_LargeImageDoesNotRenderBlank
1716 static const char kChecksum[] =
"a6056db6961f4e65c42ab2e246171fe1";
1718 ASSERT_TRUE(OpenDocument(
"bug_1646.pdf"));
1719 FPDF_PAGE page = LoadPage(0);
1722 constexpr int kWidth = 40000;
1723 constexpr int kHeight = 100;
1724 TestRenderPageBitmapWithMatrix(page, kWidth, kHeight, {1000, 0, 0, 1, 0, 0},
1725 {0, 0, kWidth, kHeight}, kChecksum);
1730#if BUILDFLAG(IS_WIN)
1731TEST_F(FPDFViewEmbedderTest, FPDFRenderPageEmf) {
1732 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
1733 FPDF_PAGE page = LoadPage(0);
1736 std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
1737 EXPECT_EQ(3772u, emf_normal.size());
1740 std::vector<uint8_t> emf_reverse_byte_order =
1741 RenderPageWithFlagsToEmf(page, FPDF_REVERSE_BYTE_ORDER);
1742 EXPECT_EQ(emf_normal, emf_reverse_byte_order);
1747class PostScriptRenderEmbedderTestBase :
public FPDFViewEmbedderTest {
1749 ~PostScriptRenderEmbedderTestBase() override =
default;
1752 void TearDown() override {
1753 FPDF_SetPrintMode(FPDF_PRINTMODE_EMF);
1754 FPDFViewEmbedderTest::TearDown();
1758class PostScriptLevel2EmbedderTest :
public PostScriptRenderEmbedderTestBase {
1760 PostScriptLevel2EmbedderTest() =
default;
1761 ~PostScriptLevel2EmbedderTest() override =
default;
1765 void SetUp() override {
1766 FPDFViewEmbedderTest::SetUp();
1767 FPDF_SetPrintMode(FPDF_PRINTMODE_POSTSCRIPT2);
1771class PostScriptLevel3EmbedderTest :
public PostScriptRenderEmbedderTestBase {
1773 PostScriptLevel3EmbedderTest() =
default;
1774 ~PostScriptLevel3EmbedderTest() override =
default;
1778 void SetUp() override {
1779 FPDFViewEmbedderTest::SetUp();
1780 FPDF_SetPrintMode(FPDF_PRINTMODE_POSTSCRIPT3);
1784TEST_F(PostScriptLevel2EmbedderTest, Rectangles) {
1785 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
1786 FPDF_PAGE page = LoadPage(0);
1789 std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
1790 std::string ps_data = GetPostScriptFromEmf(emf_normal);
1791 EXPECT_EQ(kExpectedRectanglePostScript, ps_data);
1794 std::vector<uint8_t> emf_reverse_byte_order =
1795 RenderPageWithFlagsToEmf(page, FPDF_REVERSE_BYTE_ORDER);
1796 EXPECT_EQ(emf_normal, emf_reverse_byte_order);
1801TEST_F(PostScriptLevel3EmbedderTest, Rectangles) {
1802 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
1803 FPDF_PAGE page = LoadPage(0);
1806 std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
1807 std::string ps_data = GetPostScriptFromEmf(emf_normal);
1808 EXPECT_EQ(kExpectedRectanglePostScript, ps_data);
1811 std::vector<uint8_t> emf_reverse_byte_order =
1812 RenderPageWithFlagsToEmf(page, FPDF_REVERSE_BYTE_ORDER);
1813 EXPECT_EQ(emf_normal, emf_reverse_byte_order);
1818TEST_F(PostScriptLevel2EmbedderTest, Image) {
1819 const char kExpected[] =
1822 "/im/initmatrix load def\n"
1823 "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load "
1824 "def/h/closepath load def\n"
1825 "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load "
1826 "def/W*/eoclip load def\n"
1827 "/rg/setrgbcolor load def/k/setcmykcolor load def\n"
1828 "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load "
1829 "def/M/setmiterlimit load def/d/setdash load def\n"
1830 "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n"
1831 "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont "
1833 "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load "
1834 "def/sm/setmatrix load def\n"
1835 "0 792 m 0 0 l 612 0 l 612 792 l 0 792 l h W n\n"
1837 "0 792 m 0 0 l 612 0 l 612 792 l 0 792 l h W n\n"
1841 "281 106.7 m 331 106.7 l 331 56.7 l 281 56.7 l 281 106.7 l h W* n\n"
1843 "[49.9 0 0 -50 281.1 106.6]cm 50 50 8[50 0 0 -50 0 "
1844 "50]currentfile/ASCII85Decode filter /DCTDecode filter false 3 "
1846 "s4IA0!\"_al8O`[\\!<<*#!!*'\"s4[N@!!ic5#6k>;#6tJ?#m^kH'FbHY$Odmc'+Yct)"
1848 ",VCGe+tOrY*%3`p/2/e81c-:%3B]>W4>&EH1B6)/"
1849 "6NIK\"#n.1M(_$ok1*IV\\1,:U?1,:U?1,:U?\r\n"
1850 "1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,:U?1,AmF!\"fJ:1&s'3!?qLF&HMtG!"
1852 "*rl9A\"T\\W)!<E3$z!!!!\"!WrQ/\"pYD?$4HmP!4<@<!W`B*!X&T/"
1853 "\"U\"r.!!.KK!WrE*&Hrdj0gQ!W\r\n"
1854 ";.0\\RE>10ZOeE%*6F\"?A;UOtZ1LbBV#mqFa(`=5<-7:2j.Ps\"@2`NfY6UX@47n?3D;"
1856 "@q9._B4u!oF*)PJGBeCZK7nr5LPUeEP*;,qQC!u,R\\HRQV5C/"
1857 "hWN*81['d?O\\@K2f_o0O6a2lBF\r\n"
1858 "daQ^rf%8R-g>V&OjQ5OekiqC&o(2MHp@n@XqZ\"J6*ru?D!<E3%!<E3%!<<*\"!!!!\"!"
1860 "$4HmP!4<C=!W`?*\"9Sc3\"U\"r.!<RHF!<N?8\"9fr'\"qj4!#@VTc+u4]T'LIqUZ,$_"
1862 "(*k`q-1Mcg)&ahL-n-W'2E*TU3^Z;(7Rp!@8lJ\\h<``C+>%;)SAnPdkC3+K>G'A1VH@gd&"
1864 "M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\\eCE.%f\\,!<j5f="
1866 "p@n@XqZ#7L$j-M1!YGMH!'^JZre`+s!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!"
1868 "!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!&-(;~>\n"
1880 ASSERT_TRUE(OpenDocument(
"tagged_alt_text.pdf"));
1881 FPDF_PAGE page = LoadPage(0);
1884 std::vector<uint8_t> emf = RenderPageWithFlagsToEmf(page, 0);
1885 std::string ps_data = GetPostScriptFromEmf(emf);
1886 EXPECT_EQ(kExpected, ps_data);
1891TEST_F(PostScriptLevel3EmbedderTest, Image) {
1892 const char kExpected[] = R"(
1893save
1894/im/initmatrix load def
1895/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def
1896/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def
1897/rg/setrgbcolor load def/k/setcmykcolor load def
1898/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def
1899/q/gsave load def/Q/grestore load def/iM/imagemask load def
1900/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def
1901/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def
19020 792 m 0 0 l 612 0 l 612 792 l 0 792 l h W n
1903q
19040 792 m 0 0 l 612 0 l 612 792 l 0 792 l h W n
1905q
1906Q
1907q
1908281 106.7 m 331 106.7 l 331 56.7 l 281 56.7 l 281 106.7 l h W* n
1909q
1910[49.9 0 0 -50 281.1 106.6]cm 50 50 8[50 0 0 -50 0 50]currentfile/ASCII85Decode filter /FlateDecode filter false 3 colorimage
1911Gb"0;0`_7S!5bE%:[N')TE"rlzGQSs[!!*~>
1912Q
1913Q
1914q
1915q
1916Q
1917Q
1918Q
1919Q
1920
1921restore
1922)";
1924 ASSERT_TRUE(OpenDocument(
"tagged_alt_text.pdf"));
1925 FPDF_PAGE page = LoadPage(0);
1928 std::vector<uint8_t> emf = RenderPageWithFlagsToEmf(page, 0);
1929 std::string ps_data = GetPostScriptFromEmf(emf);
1930 EXPECT_EQ(kExpected, ps_data);
1935TEST_F(FPDFViewEmbedderTest, ImageMask) {
1936 ASSERT_TRUE(OpenDocument(
"bug_674771.pdf"));
1937 FPDF_PAGE page = LoadPage(0);
1941 FPDF_SetPrintMode(FPDF_PRINTMODE_EMF_IMAGE_MASKS);
1942 std::vector<uint8_t> emf_image_masks = RenderPageWithFlagsToEmf(page, 0);
1945 FPDF_SetPrintMode(FPDF_PRINTMODE_EMF);
1946 std::vector<uint8_t> emf_normal = RenderPageWithFlagsToEmf(page, 0);
1948 EXPECT_LT(emf_image_masks.size(), emf_normal.size());
1955 ASSERT_TRUE(OpenDocument(
"two_signatures.pdf"));
1958 unsigned long size = FPDF_GetTrailerEnds(document(),
nullptr, 0);
1959 const std::vector<
unsigned int> kExpectedEnds{633, 1703, 2781};
1960 ASSERT_EQ(kExpectedEnds.size(), size);
1961 std::vector<
unsigned int> ends(size);
1962 ASSERT_EQ(size, FPDF_GetTrailerEnds(document(), ends.data(), size));
1963 ASSERT_EQ(kExpectedEnds, ends);
1971 size = FPDF_GetTrailerEnds(document(), ends.data(), ends.size());
1972 ASSERT_EQ(kExpectedEnds.size(), size);
1973 EXPECT_EQ(0U, ends[0]);
1974 EXPECT_EQ(1U, ends[1]);
1979 ASSERT_TRUE(OpenDocument(
"hello_world.pdf"));
1982 unsigned long size = FPDF_GetTrailerEnds(document(),
nullptr, 0);
1983 const std::vector<
unsigned int> kExpectedEnds{840};
1984 ASSERT_EQ(kExpectedEnds.size(), size);
1985 std::vector<
unsigned int> ends(size);
1986 ASSERT_EQ(size, FPDF_GetTrailerEnds(document(), ends.data(), size));
1987 ASSERT_EQ(kExpectedEnds, ends);
1992 ASSERT_TRUE(OpenDocument(
"annotation_stamp_with_ap.pdf"));
1995 unsigned long size = FPDF_GetTrailerEnds(document(),
nullptr, 0);
1996 const std::vector<
unsigned int> kExpectedEnds{441, 7945, 101719};
1997 ASSERT_EQ(kExpectedEnds.size(), size);
1998 std::vector<
unsigned int> ends(size);
1999 ASSERT_EQ(size, FPDF_GetTrailerEnds(document(), ends.data(), size));
2000 ASSERT_EQ(kExpectedEnds, ends);
2005 FileAccessForTesting file_acc(
"linearized.pdf");
2011 SetDocumentFromAvail();
2012 ASSERT_TRUE(document());
2015 unsigned long size = FPDF_GetTrailerEnds(document(),
nullptr, 0);
2016 const std::vector<
unsigned int> kExpectedEnds{474, 11384};
2017 ASSERT_EQ(kExpectedEnds.size(), size);
2018 std::vector<
unsigned int> ends(size);
2019 ASSERT_EQ(size, FPDF_GetTrailerEnds(document(), ends.data(), size));
2020 ASSERT_EQ(kExpectedEnds, ends);
2025 ASSERT_TRUE(OpenDocument(
"trailer_end_trailing_space.pdf"));
2027 unsigned long size = FPDF_GetTrailerEnds(document(),
nullptr, 0);
2028 const std::vector<
unsigned int> kExpectedEnds{1193};
2031 ASSERT_EQ(kExpectedEnds.size(), size);
2032 std::vector<
unsigned int> ends(size);
2033 ASSERT_EQ(size, FPDF_GetTrailerEnds(document(), ends.data(), size));
2034 EXPECT_EQ(kExpectedEnds, ends);
2038 ASSERT_TRUE(OpenDocument(
"simple_xfa.pdf"));
2040 FPDF_PAGE page = LoadPage(0);
2049#if defined(PDF_USE_SKIA)
2050TEST_F(FPDFViewEmbedderTest, RenderPageToSkp) {
2051 if (!CFX_DefaultRenderDevice::UseSkiaRenderer()) {
2052 GTEST_SKIP() <<
"FPDF_RenderPageSkp() only makes sense with Skia";
2055 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
2057 FPDF_PAGE page = LoadPage(0);
2060 TestRenderPageSkp(page, pdfium::RectanglesChecksum());
2065TEST_F(FPDFViewEmbedderTest, RenderXfaPageToSkp) {
2066 if (!CFX_DefaultRenderDevice::UseSkiaRenderer()) {
2067 GTEST_SKIP() <<
"FPDF_RenderPageSkp() only makes sense with Skia";
2070 ASSERT_TRUE(OpenDocument(
"simple_xfa.pdf"));
2072 FPDF_PAGE page = LoadPage(0);
2076 TestRenderPageSkp(page, pdfium::kBlankPage612By792Checksum);
2081TEST_F(FPDFViewEmbedderTest, Bug2087) {
2082 FPDF_DestroyLibrary();
2084 std::string agg_checksum;
2085 const FPDF_LIBRARY_CONFIG kAggConfig = {
2087 .m_pUserFontPaths =
nullptr,
2088 .m_pIsolate =
nullptr,
2089 .m_v8EmbedderSlot = 0,
2090 .m_pPlatform =
nullptr,
2091 .m_RendererType = FPDF_RENDERERTYPE_AGG,
2093 FPDF_InitLibraryWithConfig(&kAggConfig);
2095 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
2096 FPDF_PAGE page = LoadPage(0);
2097 ScopedFPDFBitmap bitmap = RenderPage(page);
2098 agg_checksum = HashBitmap(bitmap.get());
2102 FPDF_DestroyLibrary();
2104 std::string skia_checksum;
2105 const FPDF_LIBRARY_CONFIG kSkiaConfig = {
2107 .m_pUserFontPaths =
nullptr,
2108 .m_pIsolate =
nullptr,
2109 .m_v8EmbedderSlot = 0,
2111 FPDF_InitLibraryWithConfig(&kSkiaConfig);
2113 ASSERT_TRUE(OpenDocument(
"rectangles.pdf"));
2114 FPDF_PAGE page = LoadPage(0);
2115 ScopedFPDFBitmap bitmap = RenderPage(page);
2116 skia_checksum = HashBitmap(bitmap.get());
2121 EXPECT_NE(agg_checksum, skia_checksum);
2123 EmbedderTestEnvironment::GetInstance()->TearDown();
2124 EmbedderTestEnvironment::GetInstance()->SetUp();
2129 ASSERT_TRUE(OpenDocument(
"bug_1919.pdf"));
2130 FPDF_PAGE page = LoadPage(0);
2133 const char* checksum = []() {
2134#if BUILDFLAG(IS_WIN)
2135 if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
2136 return "d97d0a9da6a5955f68a58a3f25466bd7";
2138#elif !BUILDFLAG(IS_APPLE)
2139 if (CFX_DefaultRenderDevice::UseSkiaRenderer()) {
2140 return "ceeb93d2bcdb586d62c95b33cadcd873";
2143 return "5f99e2fa2bad09393d6428e105a83c96";
2151 ASSERT_TRUE(OpenDocument(
"bug_1302355.pdf"));
2152 ScopedEmbedderTestPage page = LoadScopedPage(0);
2155 constexpr int kWidth = 200;
2156 constexpr int kHeight = 200;
2157 EXPECT_EQ(kWidth,
static_cast<
int>(FPDF_GetPageWidthF(page.get())));
2158 EXPECT_EQ(kHeight,
static_cast<
int>(FPDF_GetPageHeightF(page.get())));
2159 EXPECT_TRUE(FPDFPage_HasTransparency(page.get()));
2162 FPDFBitmap_FillRect(bitmap.get(), 0, 0, kWidth, kHeight, 0xFFFFFFFF));
2163 FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0,
2164 0, kWidth, kHeight, 0,
2167 EXPECT_EQ(
"eee4600ac08b458ac7ac2320e225674c", HashBitmap(bitmap.get()));
2171 constexpr int kWidth = 595;
2172 constexpr int kHeight = 842;
2173 constexpr int kStride = kWidth * 3;
2174 std::vector<uint8_t> vec(kStride * kHeight);
2175 ScopedFPDFBitmap bitmap(FPDFBitmap_CreateEx(kWidth, kHeight,
FPDFBitmap_BGR,
2176 vec.data(), kStride));
2181 ASSERT_TRUE(OpenDocument(
"annotation_highlight_square_with_ap.pdf"));
2182 ScopedEmbedderTestPage page = LoadScopedPage(0);
2185 const char*
const gray_checksum = []() {
2187#if BUILDFLAG(IS_WIN)
2188 return "c18c1b7ee995f16dfb18e6da73a3c2d3";
2189#elif BUILDFLAG(IS_APPLE)
2190 return "92e96cad5e6b93fee3e2017ea27e2497";
2192 return "b73df08d5252615ad6ed2fe7d6c73883";
2195 return "c02f449666bf2633d06b909c76bc1c1d";
2203 constexpr int kWidth = 200;
2204 constexpr int kHeight = 200;
2205 constexpr char kExpectedChecksum[] =
"acc736435c9f84aa82941ba561bc5dbc";
2207 ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0,
2209 kHeight, 0xFFFF0000));
2210 EXPECT_EQ(kExpectedChecksum, HashBitmap(bitmap.get()));
2213 ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0,
2216 EXPECT_EQ(kExpectedChecksum, HashBitmap(bitmap.get()));
2219 ASSERT_FALSE(FPDFBitmap_FillRect(
2220 bitmap.get(),
std::numeric_limits<
int>::max(),
2221 0,
std::numeric_limits<
int>::max(),
2222 kHeight, 0xFF0000FF));
2223 EXPECT_EQ(kExpectedChecksum, HashBitmap(bitmap.get()));
2225 ASSERT_FALSE(FPDFBitmap_FillRect(
2227 std::numeric_limits<
int>::max(), kWidth,
2228 std::numeric_limits<
int>::max(), 0xFF0000FF));
2229 EXPECT_EQ(kExpectedChecksum, HashBitmap(bitmap.get()));
static bool UseSkiaRenderer()
uint32_t GetParsedPageCountForTesting()
static EmbedderTestEnvironment * GetInstance()
static void CompareBitmap(FPDF_BITMAP bitmap, int expected_width, int expected_height, const char *expected_md5sum)
static int BytesPerPixelForFormat(int format)
void TestRenderPageBitmapWithExternalMemoryAndNoStride(FPDF_PAGE page, int format, const char *expected_checksum)
void TestRenderPageBitmapWithMatrix(FPDF_PAGE page, int bitmap_width, int bitmap_height, const FS_MATRIX &matrix, const FS_RECTF &rect, const char *expected_checksum)
void TestRenderPageBitmapWithInternalMemoryAndStride(FPDF_PAGE page, int format, int bitmap_stride, const char *expected_checksum)
void TestRenderPageBitmapWithInternalMemory(FPDF_PAGE page, int format, const char *expected_checksum)
void TestRenderPageBitmapWithExternalMemory(FPDF_PAGE page, int format, const char *expected_checksum)
void TestRenderPageBitmapWithFlags(FPDF_PAGE page, int flags, const char *expected_checksum)
void SetWholeFileAvailable()
FX_FILEAVAIL * GetFileAvail() const
FPDF_FILEACCESS * GetFileAccess() const
static std::string GetTestFilePath(const std::string &file_name)
void UnsupportedHandler(int type) override
~RecordUnsupportedErrorDelegate() override=default
RecordUnsupportedErrorDelegate()=default
#define PDF_DATA_NOTAVAIL
#define FPDF_UNSP_DOC_PORTABLECOLLECTION
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_GetLastError()
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFBitmap_CreateEx(int width, int height, int format, void *first_scan, int stride)
FPDF_EXPORT void FPDF_CALLCONV FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int device_x, int device_y, double *page_x, double *page_y)
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_LoadCustomDocument(FPDF_FILEACCESS *pFileAccess, FPDF_BYTESTRING password)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, double page_x, double page_y, int *device_x, int *device_y)
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_LoadDocument(FPDF_STRING file_path, FPDF_BYTESTRING password)
FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_DocumentHasValidCrossReferenceTable(FPDF_DOCUMENT document)
FPDF_EXPORT float FPDF_CALLCONV FPDF_GetPageHeightF(FPDF_PAGE page)
FPDF_EXPORT void FPDF_CALLCONV FPDF_DestroyLibrary()
FPDF_EXPORT int FPDF_CALLCONV FPDF_GetXFAPacketCount(FPDF_DOCUMENT document)
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFBitmap_Create(int width, int height, int alpha)
FPDF_EXPORT int FPDF_CALLCONV FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double *width, double *height)
FPDF_EXPORT double FPDF_CALLCONV FPDF_GetPageWidth(FPDF_PAGE page)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height, FPDF_DWORD color)
FPDF_EXPORT void FPDF_CALLCONV FPDF_InitLibrary()
FPDF_EXPORT void FPDF_CALLCONV FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int flags)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_GetPageBoundingBox(FPDF_PAGE page, FS_RECTF *rect)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_GetPageSizeByIndexF(FPDF_DOCUMENT document, int page_index, FS_SIZEF *size)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_GetXFAPacketContent(FPDF_DOCUMENT document, int index, void *buffer, unsigned long buflen, unsigned long *out_buflen)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_GetXFAPacketName(FPDF_DOCUMENT document, int index, void *buffer, unsigned long buflen)
FPDF_EXPORT double FPDF_CALLCONV FPDF_GetPageHeight(FPDF_PAGE page)
FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)
FPDF_EXPORT unsigned long FPDF_CALLCONV FPDF_GetTrailerEnds(FPDF_DOCUMENT document, unsigned int *buffer, unsigned long length)
FPDF_EXPORT float FPDF_CALLCONV FPDF_GetPageWidthF(FPDF_PAGE page)
#define MAYBE_LargeImageDoesNotRenderBlank
TEST_F(FPDFViewEmbedderTest, DeviceCoordinatesToPageCoordinates)
#define FPDF_RENDER_LIMITEDIMAGECACHE
#define FPDF_RENDER_NO_SMOOTHTEXT
#define FPDF_RENDER_NO_SMOOTHIMAGE
#define FPDF_REVERSE_BYTE_ORDER
#define FPDF_POLICY_MACHINETIME_ACCESS
#define FPDF_RENDER_FORCEHALFTONE
#define FPDF_NO_NATIVETEXT
#define FPDF_RENDER_NO_SMOOTHPATH
TEST(FXCRYPT, MD5GenerateEmtpyData)
std::string GetPlatformString(FPDF_WIDESTRING wstr)
const char kBlankPage612By792Checksum[]
const char * RectanglesChecksum()
const char * HelloWorldChecksum()
const char * ManyRectanglesChecksum()
void(* AddSegment)(struct _FX_DOWNLOADHINTS *pThis, size_t offset, size_t size)