5#include "testing/embedder_test.h"
13#include "core/fdrm/fx_crypt.h"
14#include "core/fxcrt/check.h"
15#include "core/fxcrt/check_op.h"
16#include "core/fxcrt/containers/contains.h"
17#include "core/fxcrt/fx_memcpy_wrappers.h"
18#include "core/fxcrt/numerics/checked_math.h"
19#include "core/fxcrt/numerics/safe_conversions.h"
20#include "fpdfsdk/cpdfsdk_helpers.h"
21#include "public/cpp/fpdf_scopers.h"
22#include "public/fpdf_dataavail.h"
23#include "public/fpdf_edit.h"
24#include "public/fpdf_text.h"
25#include "public/fpdfview.h"
26#include "testing/embedder_test_environment.h"
27#include "testing/gmock/include/gmock/gmock.h"
28#include "testing/test_loader.h"
29#include "testing/utils/bitmap_saver.h"
30#include "testing/utils/file_util.h"
31#include "testing/utils/hash.h"
32#include "testing/utils/path_service.h"
36int GetBitmapBytesPerPixel(FPDF_BITMAP bitmap) {
41int CALLBACK GetRecordProc(HDC hdc,
42 HANDLETABLE* handle_table,
43 const ENHMETARECORD* record,
46 auto& records = *
reinterpret_cast<std::vector<
const ENHMETARECORD*>*>(param);
47 records.push_back(record);
53void UnsupportedHandlerTrampoline(UNSUPPORT_INFO* info,
int type) {
58int AlertTrampoline(IPDF_JSPLATFORM* platform,
59 FPDF_WIDESTRING message,
60 FPDF_WIDESTRING title,
67int SetTimerTrampoline(FPDF_FORMFILLINFO* info,
int msecs,
TimerCallback fn) {
72void KillTimerTrampoline(FPDF_FORMFILLINFO* info,
int id) {
77FPDF_PAGE GetPageTrampoline(FPDF_FORMFILLINFO* info,
78 FPDF_DOCUMENT document,
84void DoURIActionTrampoline(FPDF_FORMFILLINFO* info, FPDF_BYTESTRING uri) {
89void DoGoToActionTrampoline(FPDF_FORMFILLINFO* info,
99void OnFocusChangeTrampoline(FPDF_FORMFILLINFO* info,
100 FPDF_ANNOTATION annot,
106void DoURIActionWithKeyboardModifierTrampoline(FPDF_FORMFILLINFO* info,
114void InvalidateStub(FPDF_FORMFILLINFO* pThis,
121void OutputSelectedRectStub(FPDF_FORMFILLINFO* pThis,
128void SetCursorStub(FPDF_FORMFILLINFO* pThis,
int nCursorType) {}
130FPDF_SYSTEMTIME GetLocalTimeStub(FPDF_FORMFILLINFO* pThis) {
131 return {122, 11, 6, 28, 12, 59, 59, 500};
134void OnChangeStub(FPDF_FORMFILLINFO* pThis) {}
136FPDF_PAGE GetCurrentPageStub(FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document) {
137 return GetPageTrampoline(pThis, document, 0);
140int GetRotationStub(FPDF_FORMFILLINFO* pThis, FPDF_PAGE page) {
144void ExecuteNamedActionStub(FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING name) {}
146void SetTextFieldFocusStub(FPDF_FORMFILLINFO* pThis,
147 FPDF_WIDESTRING value,
149 FPDF_BOOL is_focus) {}
152void DisplayCaretStub(FPDF_FORMFILLINFO* pThis,
160int GetCurrentPageIndexStub(FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document) {
164void SetCurrentPageStub(FPDF_FORMFILLINFO* pThis,
165 FPDF_DOCUMENT document,
168void GotoURLStub(FPDF_FORMFILLINFO* pThis,
169 FPDF_DOCUMENT document,
170 FPDF_WIDESTRING wsURL) {}
172void GetPageViewRectStub(FPDF_FORMFILLINFO* pThis,
184void PageEventStub(FPDF_FORMFILLINFO* pThis,
186 FPDF_DWORD event_type) {}
188FPDF_BOOL PopupMenuStub(FPDF_FORMFILLINFO* pThis,
197FPDF_FILEHANDLER* OpenFileStub(FPDF_FORMFILLINFO* pThis,
199 FPDF_WIDESTRING wsURL,
204void EmailToStub(FPDF_FORMFILLINFO* pThis,
205 FPDF_FILEHANDLER* fileHandler,
207 FPDF_WIDESTRING pSubject,
209 FPDF_WIDESTRING pBcc,
210 FPDF_WIDESTRING pMsg) {}
212void UploadToStub(FPDF_FORMFILLINFO* pThis,
213 FPDF_FILEHANDLER* fileHandler,
215 FPDF_WIDESTRING uploadTo) {}
217int GetPlatformStub(FPDF_FORMFILLINFO* pThis,
void* platform,
int length) {
221int GetLanguageStub(FPDF_FORMFILLINFO* pThis,
void* language,
int length) {
225FPDF_FILEHANDLER* DownloadFromURLStub(FPDF_FORMFILLINFO* pThis,
226 FPDF_WIDESTRING URL) {
227 static const char kString[] =
"<body>secrets</body>";
228 static FPDF_FILEHANDLER kFakeFileHandler = {
230 [](
void*) ->
void {},
231 [](
void*) -> FPDF_DWORD {
return sizeof(kString) - 1; },
232 [](
void*, FPDF_DWORD off,
void* buffer, FPDF_DWORD size) -> FPDF_RESULT {
233 FXSYS_memcpy(buffer, kString,
234 std::min<size_t>(size,
sizeof(kString) - 1));
237 [](
void*, FPDF_DWORD,
const void*, FPDF_DWORD) -> FPDF_RESULT {
240 [](
void*) -> FPDF_RESULT {
return 0; },
241 [](
void*, FPDF_DWORD) -> FPDF_RESULT {
return 0; }};
242 return &kFakeFileHandler;
245FPDF_BOOL PostRequestURLStub(FPDF_FORMFILLINFO* pThis,
246 FPDF_WIDESTRING wsURL,
247 FPDF_WIDESTRING wsData,
248 FPDF_WIDESTRING wsContentType,
249 FPDF_WIDESTRING wsEncode,
250 FPDF_WIDESTRING wsHeader,
251 FPDF_BSTR* response) {
252 const char kString[] =
"p\0o\0s\0t\0e\0d\0";
253 FPDF_BStr_Set(response, kString,
sizeof(kString) - 1);
257FPDF_BOOL PutRequestURLStub(FPDF_FORMFILLINFO* pThis,
258 FPDF_WIDESTRING wsURL,
259 FPDF_WIDESTRING wsData,
260 FPDF_WIDESTRING wsEncode) {
277 UNSUPPORT_INFO* info =
static_cast<UNSUPPORT_INFO*>(
this);
287 EXPECT_EQ(0U, page_map_.size());
288 EXPECT_EQ(0U, saved_page_map_.size());
295 form_handle_.reset(SetupFormFillEnvironment(
296 document(), JavaScriptOption::kEnableJavaScript));
300 document_.reset(FPDF_CreateNewDocument());
305 return OpenDocumentWithOptions(filename,
nullptr,
311 return OpenDocumentWithOptions(filename,
nullptr,
317 const char* password) {
318 return OpenDocumentWithOptions(filename, password,
324 return OpenDocumentWithOptions(filename,
nullptr,
330 const char* password,
333 std::string file_path = PathService::GetTestFilePath(filename);
334 if (file_path.empty()) {
338 file_contents_ = GetFileContents(file_path.c_str());
339 if (file_contents_.empty()) {
343 EXPECT_TRUE(!loader_);
344 loader_ = std::make_unique<TestLoader>(file_contents_);
347 file_access_.m_FileLen =
348 pdfium::checked_cast<
unsigned long>(file_contents_.size());
350 file_access_.m_Param = loader_.get();
352 fake_file_access_ = std::make_unique<FakeFileAccess>(&file_access_);
353 return OpenDocumentHelper(password, linearize_option, javascript_option,
354 fake_file_access_.get(), &document_, &avail_,
362 ScopedFPDFDocument* document,
363 ScopedFPDFAvail* avail,
364 ScopedFPDFFormHandle* form_handle) {
365 network_simulator->AddSegment(0, 1024);
369 FPDF_AVAIL avail_ptr = avail->get();
370 FPDF_DOCUMENT document_ptr =
nullptr;
382 document_ptr = document->get();
396 for (
int i = 0; i < page_count; ++i) {
412 document_ptr = document->get();
427 form_handle_.reset();
430 fake_file_access_.reset();
439 IPDF_JSPLATFORM* platform =
static_cast<IPDF_JSPLATFORM*>(
this);
444 FPDF_FORMFILLINFO* formfillinfo =
static_cast<FPDF_FORMFILLINFO*>(
this);
446 formfillinfo
->version = form_fill_info_version_;
452 formfillinfo->FFI_GetLocalTime = GetLocalTimeStub;
454 formfillinfo->FFI_GetPage = GetPageTrampoline;
455 formfillinfo->FFI_GetCurrentPage = GetCurrentPageStub;
462 formfillinfo->FFI_DisplayCaret = DisplayCaretStub;
463 formfillinfo->FFI_GetCurrentPageIndex = GetCurrentPageIndexStub;
464 formfillinfo->FFI_SetCurrentPage = SetCurrentPageStub;
465 formfillinfo->FFI_GotoURL = GotoURLStub;
466 formfillinfo->FFI_GetPageViewRect = GetPageViewRectStub;
467 formfillinfo->FFI_PageEvent = PageEventStub;
468 formfillinfo->FFI_PopupMenu = PopupMenuStub;
469 formfillinfo->FFI_OpenFile = OpenFileStub;
470 formfillinfo->FFI_EmailTo = EmailToStub;
471 formfillinfo->FFI_UploadTo = UploadToStub;
472 formfillinfo->FFI_GetPlatform = GetPlatformStub;
473 formfillinfo->FFI_GetLanguage = GetLanguageStub;
474 formfillinfo->FFI_DownloadFromURL = DownloadFromURLStub;
475 formfillinfo->FFI_PostRequestURL = PostRequestURLStub;
476 formfillinfo->FFI_PutRequestURL = PutRequestURLStub;
480 DoURIActionWithKeyboardModifierTrampoline;
485 FPDF_FORMHANDLE form_handle =
499 (
void)FPDFAvail_IsPageAvail(avail(), first_page,
500 fake_file_access_->GetDownloadHints());
506 for (
int i = 0; i < page_count; ++i)
507 (
void)FPDFAvail_IsPageAvail(avail(), i,
508 fake_file_access_->GetDownloadHints());
518 return LoadPageCommon(page_index,
true);
522 return LoadPageCommon(page_index,
false);
525FPDF_PAGE
EmbedderTest::LoadPageCommon(
int page_index,
bool do_events) {
528 CHECK(!pdfium::Contains(page_map_, page_index));
538 page_map_[page_index] = page;
543 UnloadPageCommon(page,
true);
547 UnloadPageCommon(page,
false);
550void EmbedderTest::UnloadPageCommon(FPDF_PAGE page,
bool do_events) {
552 int page_index = GetPageNumberForLoadedPage(page);
560 page_map_.erase(page_index);
569 return RenderLoadedPageWithFlags(page, 0);
574 int page_index = GetPageNumberForLoadedPage(page);
580 return RenderSavedPageWithFlags(page, 0);
585 int page_index = GetPageNumberForSavedPage(page);
592 FPDF_FORMHANDLE handle,
598 FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF;
599 if (!FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, fill_color)) {
602 FPDF_RenderPageBitmap(bitmap.get(), page, 0, 0, width, height, 0, flags);
603 FPDF_FFLDraw(handle, bitmap.get(), page, 0, 0, width, height, 0, flags);
609 return RenderPageWithFlags(page,
nullptr, 0);
614std::vector<uint8_t> EmbedderTest::RenderPageWithFlagsToEmf(FPDF_PAGE page,
616 HDC dc = CreateEnhMetaFileA(
nullptr,
nullptr,
nullptr,
nullptr);
618 int width =
static_cast<
int>(FPDF_GetPageWidthF(page));
619 int height =
static_cast<
int>(FPDF_GetPageHeightF(page));
620 HRGN rgn = CreateRectRgn(0, 0, width, height);
621 SelectClipRgn(dc, rgn);
624 SelectObject(dc, GetStockObject(NULL_PEN));
625 SelectObject(dc, GetStockObject(WHITE_BRUSH));
627 Rectangle(dc, 0, 0, width + 1, height + 1);
629 FPDF_RenderPage(dc, page, 0, 0, width, height, 0, flags);
631 HENHMETAFILE emf = CloseEnhMetaFile(dc);
632 UINT size_in_bytes = GetEnhMetaFileBits(emf, 0,
nullptr);
633 std::vector<uint8_t> buffer(size_in_bytes);
634 GetEnhMetaFileBits(emf, size_in_bytes, buffer.data());
635 DeleteEnhMetaFile(emf);
640std::string EmbedderTest::GetPostScriptFromEmf(
641 pdfium::span<
const uint8_t> emf_data) {
643 HENHMETAFILE emf = SetEnhMetaFileBits(
644 pdfium::checked_cast<UINT>(emf_data.size()), emf_data.data());
646 return std::string();
649 std::vector<
const ENHMETARECORD*> records;
650 if (!EnumEnhMetaFile(
nullptr, emf, &GetRecordProc, &records,
nullptr)) {
651 DeleteEnhMetaFile(emf);
652 return std::string();
657 for (
const auto* record : records) {
658 if (record->iType != EMR_GDICOMMENT)
664 const auto* comment =
reinterpret_cast<
const EMRGDICOMMENT*>(record);
665 const char* data =
reinterpret_cast<
const char*>(comment->Data);
666 uint16_t size = *
reinterpret_cast<
const uint16_t*>(data);
668 ps_data.append(data, size);
670 DeleteEnhMetaFile(emf);
687 const char* password) {
689 saved_file_access_.m_FileLen =
690 pdfium::checked_cast<
unsigned long>(data_string_.size());
693 saved_document_file_data_ = data_string_;
694 saved_file_access_.m_Param = &saved_document_file_data_;
696 saved_fake_file_access_ =
697 std::make_unique<FakeFileAccess>(&saved_file_access_);
699 EXPECT_TRUE(OpenDocumentHelper(
700 password, LinearizeOption::kDefaultLinearize,
701 JavaScriptOption::kEnableJavaScript, saved_fake_file_access_.get(),
702 &saved_document_, &saved_avail_, &saved_form_handle_));
709 saved_form_handle_.reset();
710 saved_document_.reset();
711 saved_avail_.reset();
717 CHECK(!pdfium::Contains(saved_page_map_, page_index));
725 saved_page_map_[page_index] = page;
732 int page_index = GetPageNumberForSavedPage(page);
739 saved_page_map_.erase(page_index);
749 ScopedFPDFBitmap bitmap = RenderSavedPageWithFlags(page,
FPDF_ANNOT);
762 CHECK(fake_file_access_);
763 fake_file_access_->SetWholeFileAvailable();
767 document_.reset(FPDFAvail_GetDocument(avail(),
nullptr));
771 FPDF_FILEACCESS* file) {
772 avail_.reset(FPDFAvail_Create(file_avail, file));
776 FPDF_DOCUMENT document,
779 auto it = test->page_map_.find(page_index);
780 return it != test->page_map_.end() ? it->second :
nullptr;
786 int usable_bytes_per_row =
791 static_cast<size_t>(stride) * height);
794 for (
int i = 0; i < height; ++i)
795 CRYPT_MD5Update(&context, span.subspan(i * stride, usable_bytes_per_row));
797 CRYPT_MD5Finish(&context, digest);
798 return CryptToBase16(digest);
803 const std::string& filename) {
811 const char* expected_md5sum) {
817 const int expected_stride =
818 (expected_width * GetBitmapBytesPerPixel(bitmap) * 8 + 31) / 32 * 4;
821 if (!expected_md5sum)
824 std::string actual_md5sum = HashBitmap(bitmap);
825 EXPECT_EQ(expected_md5sum, actual_md5sum);
827 WriteBitmapToPng(bitmap, actual_md5sum +
".png");
832int EmbedderTest::WriteBlockCallback(FPDF_FILEWRITE* pFileWrite,
834 unsigned long size) {
837 pThis->data_string_.append(
static_cast<
const char*>(data), size);
839 if (pThis->filestream_.is_open())
840 pThis->filestream_.write(
static_cast<
const char*>(data), size);
849 unsigned long size) {
850 std::string* new_file =
static_cast<
std::string*>(param);
853 pdfium::CheckedNumeric<size_t> end = pos;
855 CHECK_LE(end.ValueOrDie(), new_file->size());
857 FXSYS_memcpy(buf, new_file->data() + pos, size);
862int EmbedderTest::GetPageNumberForPage(
const PageNumberToHandleMap& page_map,
864 for (
const auto& it : page_map) {
865 if (it.second == page) {
866 int page_index = it.first;
874int EmbedderTest::GetPageNumberForLoadedPage(FPDF_PAGE page)
const {
875 return GetPageNumberForPage(page_map_, page);
878int EmbedderTest::GetPageNumberForSavedPage(FPDF_PAGE page)
const {
879 return GetPageNumberForPage(saved_page_map_, page);
884 filestream_.open(filename,
std::ios_base::binary);
903 test_ = std::move(that.test_);
904 page_ =
std::exchange(that.page_,
nullptr);
910 test_->UnloadPage(page_);
static void WriteBitmapToPng(FPDF_BITMAP bitmap, const std::string &filename)
static EmbedderTestEnvironment * GetInstance()
virtual void UnsupportedHandler(int type)
virtual void DoGoToAction(FPDF_FORMFILLINFO *info, int page_index, int zoom_mode, float *pos_arry, int array_size)
virtual int SetTimer(int msecs, TimerCallback fn)
virtual int Alert(FPDF_WIDESTRING message, FPDF_WIDESTRING title, int type, int icon)
virtual void DoURIAction(FPDF_BYTESTRING uri)
virtual FPDF_PAGE GetPage(FPDF_FORMFILLINFO *info, FPDF_DOCUMENT document, int page_index)
virtual void KillTimer(int id)
virtual void OnFocusChange(FPDF_FORMFILLINFO *info, FPDF_ANNOTATION annot, int page_index)
virtual void DoURIActionWithKeyboardModifier(FPDF_FORMFILLINFO *info, FPDF_BYTESTRING uri, int modifiers)
ScopedEmbedderTestPage(EmbedderTest *test, int page_index)
ScopedEmbedderTestPage & operator=(ScopedEmbedderTestPage &&) noexcept
ScopedEmbedderTestPage(ScopedEmbedderTestPage &&) noexcept
~ScopedEmbedderTestPage()
ScopedFPDFBitmap RenderLoadedPage(FPDF_PAGE page)
ScopedFPDFBitmap RenderLoadedPageWithFlags(FPDF_PAGE page, int flags)
ScopedEmbedderTestPage LoadScopedPage(int page_index)
void SetWholeFileAvailable()
void VerifySavedDocument(int width, int height, const char *md5)
FPDF_DOCUMENT OpenSavedDocumentWithPassword(const char *password)
void VerifySavedRendering(FPDF_PAGE page, int width, int height, const char *md5)
void SetInitialFormFieldHighlight(FPDF_FORMHANDLE form)
FPDF_DOCUMENT saved_document() const
void CloseSavedDocument()
FPDF_DOCUMENT OpenSavedDocument()
ScopedFPDFBitmap RenderSavedPageWithFlags(FPDF_PAGE page, int flags)
FPDF_FORMHANDLE SetupFormFillEnvironment(FPDF_DOCUMENT doc, JavaScriptOption javascript_option)
FPDF_PAGE LoadPageNoEvents(int page_index)
FPDF_PAGE LoadPage(int page_index)
FPDF_FORMHANDLE saved_form_handle() const
static void CompareBitmap(FPDF_BITMAP bitmap, int expected_width, int expected_height, const char *expected_md5sum)
void UnloadPage(FPDF_PAGE page)
bool OpenDocumentHelper(const char *password, LinearizeOption linearize_option, JavaScriptOption javascript_option, FakeFileAccess *network_simulator, ScopedFPDFDocument *document, ScopedFPDFAvail *avail, ScopedFPDFFormHandle *form_handle)
void ClosePDFFileForWrite()
static int GetBlockFromString(void *param, unsigned long pos, unsigned char *buf, unsigned long size)
FPDF_DOCUMENT document() const
ScopedFPDFBitmap RenderSavedPage(FPDF_PAGE page)
void UnloadPageNoEvents(FPDF_PAGE page)
void CreateAvail(FX_FILEAVAIL *file_avail, FPDF_FILEACCESS *file)
void CloseSavedPage(FPDF_PAGE page)
static std::string HashBitmap(FPDF_BITMAP bitmap)
void SetDocumentFromAvail()
FPDF_FORMHANDLE form_handle() const
static int BytesPerPixelForFormat(int format)
void CreateEmptyDocument()
FPDF_PAGE LoadSavedPage(int page_index)
void CreateEmptyDocumentWithoutFormFillEnvironment()
void SetRequestedDataAvailable()
void SetWholeFileAvailable()
FX_DOWNLOADHINTS * GetDownloadHints() const
FX_FILEAVAIL * GetFileAvail() const
FPDF_FILEACCESS * GetFileAccess() const
static int GetBlock(void *param, unsigned long pos, unsigned char *pBuf, unsigned long size)
FXDIB_Format FXDIBFormatFromFPDFFormat(int format)
#define PDF_DATA_NOTAVAIL
FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS *hints)
FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS *hints)
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password)
FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS *hints)
FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc)
FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsLinearized(FPDF_AVAIL avail)
FPDF_EXPORT FPDF_AVAIL FPDF_CALLCONV FPDFAvail_Create(FX_FILEAVAIL *file_avail, FPDF_FILEACCESS *file)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_HasTransparency(FPDF_PAGE page)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO *unsp_info)
FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV FPDF_LoadPage(FPDF_DOCUMENT document, int page_index)
FPDF_EXPORT int FPDF_CALLCONV FPDF_GetPageCount(FPDF_DOCUMENT document)
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_LoadCustomDocument(FPDF_FILEACCESS *pFileAccess, FPDF_BYTESTRING password)
FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)
FPDF_EXPORT float FPDF_CALLCONV FPDF_GetPageHeightF(FPDF_PAGE page)
FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFBitmap_Create(int width, int height, int alpha)
FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetStride(FPDF_BITMAP bitmap)
FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetFormat(FPDF_BITMAP bitmap)
FPDF_EXPORT void *FPDF_CALLCONV FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap)
FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)
FPDF_EXPORT float FPDF_CALLCONV FPDF_GetPageWidthF(FPDF_PAGE page)
FPDF_EXPORT void FPDF_CALLCONV FPDF_ClosePage(FPDF_PAGE page)
CRYPT_md5_context CRYPT_MD5Start()
int GetCompsFromFormat(FXDIB_Format format)
UNSAFE_BUFFER_USAGE void * FXSYS_memset(void *ptr1, int val, size_t len)
int(* WriteBlock)(struct FPDF_FILEWRITE_ *pThis, const void *pData, unsigned long size)
void(* FSDK_UnSupport_Handler)(struct _UNSUPPORT_INFO *pThis, int nType)