diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
commit | ae2c20f398933a9e86c387dcc465ec0f71065ffc (patch) | |
tree | de668b1411e2ee0b4e49b6d8f8b68183134ac990 /skia/images/fpdfemb.h | |
parent | 09911bf300f1a419907a9412154760efd0b7abc3 (diff) | |
download | chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.zip chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.gz chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.bz2 |
Add skia to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/images/fpdfemb.h')
-rw-r--r-- | skia/images/fpdfemb.h | 1765 |
1 files changed, 1765 insertions, 0 deletions
diff --git a/skia/images/fpdfemb.h b/skia/images/fpdfemb.h new file mode 100644 index 0000000..3c77116 --- /dev/null +++ b/skia/images/fpdfemb.h @@ -0,0 +1,1765 @@ +// FPDFEMB.H - Header file for FPDFEMB SDK +// Copyright (c) 2007-2008 Foxit Software Company, All Right Reserved. + +// Date: 2008-04-07 + +// Embedded platforms have many different aspects from desktop platforms, +// among them, the followings are most important for PDF processing: +// +// 1. Embedded platforms have only limited memory, and there is no virtual memory. +// PDF is a very complicated format, processing PDF may consumes quite +// large amount of memory, even for some smaller PDFs. And, in order to +// increase the performance of PDF parsing and rendering, cache memory +// is often used. For some big PDFs with many pages, the cache may grow +// while user browing through pages, eventually, for some PDFs, the memory +// on the device may run out. +// +// FPDFEMB SDK allows graceful out-of-memory (OOM) handling by returning +// OOM error code for all functions that may involve memory allocation. +// When an application detects OOM situation, it can do one of the followings: +// +// a) Give user some prompt and quit the application or close the document; +// b) Or better, try to recover from the error. Sometimes OOM can be caused +// by ever-growing cache. For example, when user browses a 1000-page +// document, let's say OOM happen at page #300. In this case, the +// application might close the whole document (cache will be gone with +// it), reopen the document, then go directly to page #300. It's likely +// the process will go through this time. This is called "OOM recovery". +// If OOM happens again during a recovery, then, it's not possible to finish +// the process, the application must quit of close the document. +// +// 2. Embedded platforms has only limited computing power. Since some PDFs +// can be very complicated and require a lot of processing to be displayed, +// it may take a lot of time for the process to finish. This may cause +// some problem with user experience, especially for devices like mobile +// phones, when an application may need to be put on hold any time. Therefore, +// it's important to break lengthy process into small steps which can be +// stopped or resumed at any time. We call this kind of process as +// "progressive process". +// +// FPDFEMB SDK allows progressive page parsing and rendering, the most time- +// consuming part of PDF processing. +// +// IMPORTANT: +// FPDFEMB module is not intended to run in multi-threaded environment. + +// Components inside FPDFEMB: +// * Library Memory Management +// * Document Operations +// * Page Basic Operations +// * Page Parsing +// * Page Rendering +// * Coordination Conversion +// * Text Search +// * Text Information +// * Device Independant Bitmap +// * Custom Font Handler and CJK Support +// * Bookmark Information +// * Hyperlink Information +// * Graphic Output + +#ifndef _FPDFEMB_H_ +#define _FPDFEMB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// Standard return type for many FPDFEMB functions: FPDFERR_SUCCESS for success, otherwise error code +typedef int FPDFEMB_RESULT; + +// Standard boolean type: 0 for false, non-zero for true +typedef int FPDFEMB_BOOL; + +// Unicode character. FPDFEMB uses UTF16LE format for unicode string. +typedef unsigned short FPDFEMB_WCHAR; + +// Error codes +#define FPDFERR_SUCCESS 0 +#define FPDFERR_MEMORY 1 // Out of memory +#define FPDFERR_ERROR 2 // Error of any kind, without specific reason +#define FPDFERR_PASSWORD 3 // Incorrect password +#define FPDFERR_FORMAT 4 // Not PDF format +#define FPDFERR_FILE 5 // File access error +#define FPDFERR_PARAM 6 // Parameter error +#define FPDFERR_STATUS 7 // Not in correct status +#define FPDFERR_TOBECONTINUED 8 // To be continued +#define FPDFERR_NOTFOUND 9 // Search result not found + +/******************************************************************************************** +**** +**** Library Memory Management +**** +********************************************************************************************/ + +// Structure: FPDFEMB_MEMMGR +// Including interfaces implemented by host application, providing memory allocation +// facilities. All members are required. +// A memory manager structure is required to be valid during the entire period +// when an application using FPDFEMB module. +// +// IMPORTANT NOTE: using of this interface is strongly not recommended, because +// FPDFEMB now internally use FPDFEMB_MEMMGR_EX interface, which allows more +// advanced memory management. This interface is retained for backward compatibility +// only, and maybe discontinued in the future. +// +struct FPDFEMB_MEMMGR { + // Interface: Alloc + // Allocate a memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // size - Number of bytes for the memory block. + // Return Value: + // The pointer to allocated memory block. NULL if no memory available. + // Comments: + // In order to handle OOM situation, application can use longjmp() inside + // implementation of this function. If underlying memory manager fails to + // allocate enough memory, then application can use longjmp() to jump to + // OOM handling codes. + // + void* (*Alloc)(struct FPDFEMB_MEMMGR* pMgr, unsigned int size); + + // Interface: AllocNL + // Allocate a memory block, without leaving + // Parameters: + // pMgr - Pointer to the memory manager. + // size - Number of bytes for the memory block. + // Return Value: + // The pointer to allocated memory block. NULL if no memory available. + // Comments: + // Implementation MUST return NULL if no memory available, no exception + // or longjmp() can be used. + // + void* (*AllocNL)(struct FPDFEMB_MEMMGR* pMgr, unsigned int size); + + // Interfce: Realloc + // Reallocate a memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // pointer - An existing memory block, or NULL. + // new_size - New size (number of bytes) of the memory block. Can be zero. + // Return value: + // The pointer of reallocated memory block, it could be a new block, or just + // the previous block with size modified. + // Comments: + // If an existing memory block specified, the data in the memory block will + // be copied to the new block, if reallocated. + // + // In order to handle OOM situation, application can use longjmp() inside + // implementation of this function. If underlying memory manager fails to + // allocate enough memory, then application can use longjmp() to jump to + // OOM handling codes. + // + void* (*Realloc)(struct FPDFEMB_MEMMGR* pMgr, void* pointer, unsigned int new_size); + + // Interface: Free + // Free a memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // pointer - An existing memory block. + // Return Value: + // None. + // + void (*Free)(struct FPDFEMB_MEMMGR* pMgr, void* pointer); +}; + +// Function: FPDFEMB_Init +// Initialize the FPDFEMB module +// Parameters: +// mem_mgr - Pointer to memory manager structure +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// This function will allocate necessary internal data structure for +// the whole module to operate. +FPDFEMB_RESULT FPDFEMB_Init(FPDFEMB_MEMMGR* mem_mgr); + +typedef void (*FPDFEMB_FIXED_OOM_HANDLER)(void* memory, int size); + +// Function: FPDFEMB_InitFixedMemory +// Initialize the FPDFEMB module, providing a fixed memory heap +// Parameters: +// memory - Pointer to a pre-allocated memory block +// size - Number of bytes in the memory block +// oom_handler - Pointer to a function which will be called when OOM happens. Can be +// NULL if application doesn't want to be notified om OOM. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// In many embedded system, memory usage are predetermined. The application +// is assigned with fixed size of available memory, then it can pre-allocate +// a memory block with maximum size and pass to this function to initialize +// FPDFEMB module. In this case, FPDFEMB won't need any additional memory +// allocation. +// +// In case the pre-allocated memory has run out, the "oom_proc" callback +// function will be called to notify the application that an OOM recovery +// procedure needs to be performed. +// +FPDFEMB_RESULT FPDFEMB_InitFixedMemory(void* memory, int size, FPDFEMB_FIXED_OOM_HANDLER oom_handler); + +// Memory Management Flags +#define FPDFEMB_NONLEAVE 1 +#define FPDFEMB_MOVABLE 2 +#define FPDFEMB_DISCARDABLE 4 + +// Structure: FPDFEMB_MEMMGR_EX +// This is an extended version of memory manager interface, allowing advanced +// memory management, including movable and discardable memory blocks. +// +// Use this interface with FPDFEMB_InitExt function. +// +struct FPDFEMB_MEMMGR_EX { + // Interface: Alloc + // Allocate a memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // size - Number of bytes for the memory block. + // flags - A combination of flags defined above. + // Return Value: + // The pointer to allocated memory block. NULL if no memory available. + // If FPDFEMB_MOVABLE flag is used, implementation should return a handle + // to the memory block, if it supports movable block allocation. + // Comments: + // The implementation should not do any action if no memory available, + // just return NULL. OOM handling can be done in OOM_Handler interface. + // + void* (*Alloc)(struct FPDFEMB_MEMMGR_EX* pMgr, unsigned int size, int flags); + + // Interface: OOM_Handler + // OOM (out-of-memory) situation handler + // Parameters: + // pMgr - Pointer to the memory manager. + // Return Value: + // None. + // Comments: + // In order to handle OOM situation, application can use longjmp() inside + // implementation of this function. + // + void (*OOM_Handler)(struct FPDFEMB_MEMMGR_EX* pMgr); + + // Interfce: Realloc + // Reallocate a memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // pointer - Pointer to an existing memory block, or handle to a movable + // block. Can not be NULL. + // new_size - New size (number of bytes) of the memory block. Can not be zero. + // Return value: + // The pointer of reallocated memory block, it could be a new block, or just + // the previous block with size modified. + // If FPDFEMB_MOVABLE flag is used, implementation should return a handle + // to the memory block, if it supports movable block allocation. + // Comments: + // If an existing memory block specified, the data in the memory block should + // be copied to the new block, if reallocated. + // + // The implementation should not do any action if no memory available, + // just return NULL. OOM handling can be done in OOM_Handler interface. + // + void* (*Realloc)(struct FPDFEMB_MEMMGR_EX* pMgr, void* pointer, unsigned int new_size, int flags); + + // Interface: Lock + // Lock a movable memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // handle - Handle to movable memory block, returned by Alloc or Realloc. + // Return Value: + // The pointer of the memory block. NULL if the block was discarded. + // Comments: + // This interface is optional, if implementation doesn't support movable memory + // block, then this interface can be set to NULL. + // + void* (*Lock)(struct FPDFEMB_MEMMGR_EX* pMgr, void* handle); + + // Interface: Unlock + // Unlock a locked movable memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // handle - Handle to movable memory block, returned by Alloc or Realloc. + // Return Value: + // None. + // Comments: + // This interface is optional, if implementation doesn't support movable memory + // block, then this interface can be set to NULL. + // + void (*Unlock)(struct FPDFEMB_MEMMGR_EX* pMgr, void* handle); + + // Interface: Free + // Free a memory block + // Parameters: + // pMgr - Pointer to the memory manager. + // pointer - Pointer to an existing memory block, or handle to a movable block. + // Return Value: + // None. + // + void (*Free)(struct FPDFEMB_MEMMGR_EX* pMgr, void* pointer, int flags); + + void* user; // A user pointer, used by the application +}; + +// Function: FPDFEMB_LoadJbig2Decoder +// Function: FPDFEMB_LoadJpeg2000Decoder +// Enable JBIG2 or JPEG2000 image decoder +// Parameters: +// None. +// Return Value: +// None. +// Comments: +// If you want to display JBIG2 or JPEG2000 encoded images, you need to call +// these functions after FPDFEMB initialized. +// +// Calling these functions will increase code size by about 200K-400K bytes. +// Also JPEG2000 decoder may not be available on some platforms. +// +void FPDFEMB_LoadJbig2Decoder(); +void FPDFEMB_LoadJpeg2000Decoder(); + +// Function: FPDFEMB_InitEx +// Initialize the FPDFEMB module with the extended memory manager +// Parameters: +// mem_mgr - Pointer to memory manager structure +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// This function will allocate necessary internal data structure for +// the whole module to operate. +FPDFEMB_RESULT FPDFEMB_InitEx(FPDFEMB_MEMMGR_EX* mem_mgr); + +// Function: FPDFEMB_Exit +// Stop using FPDFEMB module and release all resources +// Parameters: +// None. +// Return Value: +// None. +// Comments: +// All loaded documents and pages will become invalid after this call. +// +// This function is useful for OOM recovery: when your application hits +// an OOM situation, calling this function will clear all memory allocated +// by FPDFEMB module, then you can call one of the initialization functions, +// reopen the document and recovery from OOM. +// +void FPDFEMB_Exit(); + +// Function: FPDFEMB_AllocMemory +// Allocate memory +// Parameters: +// size - Number of bytes +// Return Value: +// The allocated buffer pointer. NULL for out of memory. +// +void* FPDFEMB_AllocMemory(unsigned int size); + +// Function: FPDFEMB_FreeMemory +// Free allocated memory +// Parameters: +// pointer - Pointer returned by FPDFEMB_AllocMemory +// Return Value: +// None. +// +void FPDFEMB_FreeMemory(void* pointer); + +// Function: FPDFEMB_FreeCaches +// Free all expendable caches used by FPDFEMB in order to save memory +// Parameters: +// None. +// Return Value: +// None. +// Comments: +// When an application memory manager runs out of memory, before an OOM situation +// is raised, the application can try this +// +void FPDFEMB_FreeCaches(); + +/******************************************************************************************** +**** +**** Document Operations +**** +********************************************************************************************/ + +// Structure: FPDFEMB_FILE_ACCESS +// Describe the way to access a file (readonly). +struct FPDFEMB_FILE_ACCESS { + // Inteface: GetSize + // Get total size of the file + // Parameters: + // file - Pointer to this file access structure + // Return Value: + // File size, in bytes. Implementation can return 0 for any error. + // + unsigned int (*GetSize)(struct FPDFEMB_FILE_ACCESS* file); + + // Interface: ReadBlock + // Read a data block from the file + // Parameters: + // file - Pointer to this file access structure + // buffer - Pointer to a buffer receiving read data + // offset - Byte offset for the block, from beginning of the file + // size - Number of bytes for the block. + // Return Value: + // Error code, or FPDFERR_SUCCESS for success. + // + FPDFEMB_RESULT (*ReadBlock)(struct FPDFEMB_FILE_ACCESS* file, void* buffer, + unsigned int offset, unsigned int size); + + void* user; // A user pointer, used by the application +}; + +// Structure: FPDFEMB_PAUSE +// An interface for pausing a progressive process. +struct FPDFEMB_PAUSE { + // Interface: NeedPauseNow + // Check if we need to pause a progressive proccess now + // Parameters: + // pause - Pointer to the pause structure + // Return Value: + // Non-zero for pause now, 0 for continue. + // Comments: + // Typically implementation of this interface compares the current system tick + // with the previous one, if the time elapsed exceeds certain threshold, then + // the implementation returns TRUE, indicating a pause is needed. + // + FPDFEMB_BOOL (*NeedPauseNow)(struct FPDFEMB_PAUSE* pause); + + void* user; // A user pointer, used by the application +}; + +typedef void* FPDFEMB_DOCUMENT; + +// Function: FPDFEMB_StartLoadDocument +// Start loading a PDF document +// Parameters: +// file - Pointer to file access structure. +// This structure must be kept valid as long as the document is open. +// password - Pointer to a zero-terminated byte string, for the password. +// Or NULL for no password. +// document - Receiving the document handle +// pause - A callback mechanism allowing the document loading process +// to be paused before it's finished. This can be NULL if you +// don't want to pause. +// Return Value: +// FPDFERR_SUCCESS: document successfully loaded. +// FPDFERR_TOBECONTINUED: The document loading can't be finished now. +// See comments below. +// FPDFERR_PASSWORD: incorrect password. +// FPDFERR_FORMAT: not a PDF or corrupted PDF. +// FPDFERR_FILE: file access error. +// FPDFERR_MEMORY: out of memory. +// Comments: +// Document loading is a progressive process. It might take a long time to +// load a document, especiall when a file is corrupted, FPDFEMB will try to +// recover the document contents by scanning the whole file. If "pause" parameter +// is provided, this function may return FPDFERR_TOBECONTINUED any time during +// the document loading. +// +// When FPDFERR_TOBECONTINUED is returned, the "document" parameter will +// still receive a valid document handle, however, no further operations can +// be performed on the document, except the "FPDFEMB_ContineLoadDocument" function +// call, which resume the document loading. +// +FPDFEMB_RESULT FPDFEMB_StartLoadDocument(FPDFEMB_FILE_ACCESS* file, const char* password, + FPDFEMB_DOCUMENT* document, FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_ContinueLoadDocument +// Continue loading a PDF document +// Parameters: +// document - Document handle returned by FPDFEMB_StartLoadDocument function +// pause - A callback mechanism allowing the document loading process +// to be paused before it's finished. This can be NULL if you +// don't want to pause. +// Return Value: +// FPDFERR_SUCCESS: document successfully loaded. +// FPDFERR_TOBECONTINUED: The document loading can't be finished now. +// Further call to this function is needed. +// FPDFERR_PASSWORD: incorrect password. +// FPDFERR_FORMAT: not a PDF or corrupted PDF. +// FPDFERR_FILE: file access error. +// FPDFERR_MEMORY: out of memory. +// FPDFERR_STATUS: document already loaded. +// FPDFERR_PARAM: invalid parameter (like NULL document handle) +// +FPDFEMB_RESULT FPDFEMB_ContinueLoadDocument(FPDFEMB_DOCUMENT document, FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_CloseDocument +// Close a PDF document and free all associated resources +// Parameters: +// document - Document handle +// Return Value: +// Error code. FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_CloseDocument(FPDFEMB_DOCUMENT document); + +// Function: Get page count +// Get number of pages in the document +// Parameters: +// document - Document handle +// Return Value: +// Number of pages. +// +int FPDFEMB_GetPageCount(FPDFEMB_DOCUMENT document); + +// Function: FPDFEMB_SetFileBufferSize +// Set size of internal buffer used to read from source file. +// Parameters: +// size - Number of bytes +// Return Value: +// None. +// Comments: +// Currently FPDFEMB uses 512 bytes as default buffer size. The new buffer size +// takes effect next time you call FPDFEMB_StartLoadDocument. +// +void FPDFEMB_SetFileBufferSize(int size); + +/******************************************************************************************** +**** +**** Page Basic Operations +**** +********************************************************************************************/ + +typedef void* FPDFEMB_PAGE; + +// Function: FPDFEMB_LoadPage +// Load a page +// Parameters: +// document - Document handle +// index - Page index, starting from zero +// page - Receiving the loaded page handler +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_LoadPage(FPDFEMB_DOCUMENT document, int index, FPDFEMB_PAGE* page); + +// Function: FPDFEMB_ClosePage +// Close a page and release all related resources +// Parameters: +// page - Page handle +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_ClosePage(FPDFEMB_PAGE page); + +// Function: FPDFEMB_GetPageSize +// Get size of a page +// Parameters: +// page - Page handle +// width - Receiving page width, in hundredth of points +// height - Receiving page height, in hundredth of points +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// +FPDFEMB_RESULT FPDFEMB_GetPageSize(FPDFEMB_PAGE page, int* width, int* height); + +// Structure: FPDFEMB_RECT +// Rectangle area in device or page coordination system +// +struct FPDFEMB_RECT +{ + // For device system, coordinations are measured in pixels; + // For page system, coordinations are measured in hundredth of points. + int left; + int top; + int right; + int bottom; +}; + +// Function: FPDFEMB_GetPageBBox +// Get displayable area (bounding box) of a page +// Parameters: +// page - Page handle +// rect - Pointer to a structure receiving the rectangle +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// +FPDFEMB_RESULT FPDFEMB_GetPageBBox(FPDFEMB_PAGE page, FPDFEMB_RECT* rect); + +/******************************************************************************************** +**** +**** Page Parsing +**** +********************************************************************************************/ + +// Function: FPDFEMB_StartParse +// Start parsing a page, so it can get rendered or searched +// Parameters: +// page - Page handle +// text_only - flag for parsing texts only (used for searching) +// pause - A structure that can pause the parsing process. +// Or NULL if you don't want to pause the process. +// Return Value: +// FPDFERR_SUCCESS: parsing successfully finished; +// FPDFERR_TOBECONTINUED: parsing started successfully, but not finished; +// FPDFERR_STATUS: page already parsed, or parsing already started. +// Other return value: error code. +// Comments: +// Parsing is a progressive process. This function starts the parsing process, +// and may return before parsing is finished, if a pause structure is provided. +// +// Application should call FPDFEMB_ContinueParse repeatedly to finish the parsing +// when return value is FPDFERR_TOBECONTINUED. +// +// There can be only one parsing procedure active for a page, and if a page +// has already been parsed, you can't start a parsing again. +// +FPDFEMB_RESULT FPDFEMB_StartParse(FPDFEMB_PAGE page, FPDFEMB_BOOL text_only, + FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_ContinueParse +// Continue the page parsing +// Parameters: +// page - Page handle +// pause - A structure that can pause the parsing process. +// Or NULL if you don't want to pause the process. +// Return Value: +// FPDFERR_SUCCESS: parsing successfully finished; +// FPDFERR_TOBECONTINUED: parsing performed successfully, but not finished; +// FPDFERR_STATUS: page already parsed (or parsing not started). +// Other return value: error code. +// Comments: +// FPDFEMB_StartParse should be called before on the page. +// +// Application should call FPDFEMB_ContinueParse repeatedly to finish the parsing +// when return value is FPDFERR_TOBECONTINUED. +// +FPDFEMB_RESULT FPDFEMB_ContinueParse(FPDFEMB_PAGE page, FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_GetParseProgress +// Get an estimated parsing progress in percentage +// Parameters: +// page - Page handle +// Return Value: +// An integer between 0 and 100 (inclusive) indicating the parsing progress. +// The result is just a rough estimation. +// +int FPDFEMB_GetParseProgress(FPDFEMB_PAGE page); + +/******************************************************************************************** +**** +**** Page Rendering +**** +********************************************************************************************/ + +typedef void* FPDFEMB_BITMAP; + +// Function: FPDFEMB_StartQuickDraw +// Start drawing a quick preview of a page +// Parameters: +// dib - DIB handle, as the rendering device +// page - Page handle. The page has to be parsed first. +// start_x - Left pixel position of the display area in the device coordination +// start_y - Top pixel position of the display area in the device coordination +// size_x - Horizontal size (in pixels) for displaying the page +// size_y - Vertical size (in pixels) for displaying the page +// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise), +// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise). +// flags - Reserved, must be zero. +// pause - Pointer to a structure that can pause the rendering process. +// Can be NULL if no pausing is needed. +// Return Value: +// FPDFERR_SUCCESS: quickdraw successly finished; +// FPDFERR_TOBECONTINUED: quickdraw started successfully, but not finished. +// FPDFEMB_ContinueQuickDraw needs to be called to finish the quickdraw; +// FPDFERR_STATUS: quickdraw already in progress, or page not parsed; +// Other return value: error code. +// Comments: +// It's often useful to present user a quick preview of a page, right after the +// page is parsed. This preview renders only a limited set of easy features in the +// page, so it'll be rather quick to finish this process. +// +FPDFEMB_RESULT FPDFEMB_StartQuickDraw(FPDFEMB_BITMAP dib, FPDFEMB_PAGE page, + int start_x, int start_y, int size_x, int size_y, int rotate, + int flags, FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_ContinueQuickDraw +// Continue a quick draw processing +// Parameters: +// page - Page handle. The page has to be parsed first. +// pause - Pointer to a structure that can pause the rendering process. +// Can be NULL if no pausing is needed. +// Return Value: +// FPDFERR_SUCCESS: quickdraw successly finished; +// FPDFERR_TOBECONTINUED: quickdraw started successfully, but not finished. +// more calls to this function needed to finish the quickdraw; +// FPDFERR_STATUS: quickdraw not started yet; +// Other return value: error code. +// +FPDFEMB_RESULT FPDFEMB_ContinueQuickDraw(FPDFEMB_PAGE page, FPDFEMB_PAUSE* pause); + +#define FPDFEMB_ANNOT 0x01 // Set if annotations are to be rendered +#define FPDFEMB_LCD_TEXT 0x02 // Set if using text rendering optimized for LCD display +#define FPDFEMB_BGR_STRIPE 0x04 // Set if the device is using BGR LCD stripe + +// Function: FPDFEMB_StartRender +// Start rendering of a page. +// Parameter: +// dib - DIB handle, as the rendering device +// page - Page handle. The page has to be parsed first. +// start_x - Left pixel position of the display area in the device coordination +// start_y - Top pixel position of the display area in the device coordination +// size_x - Horizontal size (in pixels) for displaying the page +// size_y - Vertical size (in pixels) for displaying the page +// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise), +// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise). +// flags - 0 for normal display, or combination of flags defined above +// clip - Pointer to clip rectangle (in DIB device coordinations), +// or NULL if no clipping needed. +// pause - Pointer to a structure that can pause the rendering process. +// Can be NULL if no pausing is needed. +// Return Value: +// FPDFERR_SUCCESS: rendering successfully finished; +// FPDFERR_TOBECONTINUED: rendering started successfully, but not finished; +// Other return value: error code. +// Comments: +// Rendering is a progressive process. This function starts the rendering process, +// and may return before rendering is finished, if a pause structure is provided. +// +// Application should call FPDFEMB_ContinueRender repeatedly to finish the rendering +// when return value is FPDFERR_TOBECONTINUED. +// +// There can be only one rendering procedure for a page at any time. And rendering +// can be started over and over again for the same page. If a page rendering is already +// active, starting another one will cancel the previous rendering. +// +// Rendering of a page doesn't draw the page background, therefore, you usually need +// to draw the background in the DIB yourself. +// +FPDFEMB_RESULT FPDFEMB_StartRender(FPDFEMB_BITMAP dib, FPDFEMB_PAGE page, + int start_x, int start_y, int size_x, int size_y, int rotate, int flags, + FPDFEMB_RECT* clip, FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_ContinueRender +// Continue the page rendering +// Parameters: +// page - Page handle +// pause - Pointer to a structure that can pause the rendering process. +// Can be NULL if no pausing is needed. +// Return Value: +// FPDFERR_SUCCESS: rendering successfully finished. +// FPDFERR_TOBECONTINUED: rendering needs to be continued; +// Other return value: error code. +// Comments: +// This function may return any time when the pause interface indicates +// a pause is needed. Application can call FPDFEMB_ContinueRender any number +// of times, until FPDFERR_TOBECONTINUED is not returned. +// +FPDFEMB_RESULT FPDFEMB_ContinueRender(FPDFEMB_PAGE page, FPDFEMB_PAUSE* pause); + +// Function: FPDFEMB_GetRenderProgress +// Get an estimated rendering progress in percentage +// Parameters: +// page - Page handle +// Return Value: +// An integer between 0 and 100 (inclusive) indicating the rendering progress. +// The result is just a rough estimation. +// If the rendering just finished, this function will return 0. +// +int FPDFEMB_GetRenderProgress(FPDFEMB_PAGE page); + +// Function: FPDFEMB_SetHalftoneLimit +// Set pixel count limit for using halftone when display image +// Parameter: +// limit - Number of pixels for the limit +// Return Value: +// None. +// Comments: +// By default, FPDFEMB displays all bitmaps using downsamping, which means +// if the image is shrinked onto screen, only part of pixels will be picked +// and displayed. This saves a lot of calculation, especially for big images +// with millions of pixels. However the display quality can be bad. In order to +// reach a balance between performance and quality, application can use this +// function to set a limit, if number of pixels in an image is more than this +// limit, then FPDFEMB will use downsampling for quick drawing, otherwise, if +// the image has less pixels, FPDFEMB will use halftoning for better quality. +// +void FPDFEMB_SetHalftoneLimit(int limit); + +/******************************************************************************************** +**** +**** Coordination Conversion +**** +********************************************************************************************/ + +// Structure: FPDFEMB_POINT +// A point in device or page coordination system +// +struct FPDFEMB_POINT +{ + // For device system, coordinations are measured in pixels; + // For page system, coordinations are measured hundredth of points. + int x; + int y; +}; + +// Function: FPDFEMB_DeviceToPagePoint, FPDFEMB_DeviceToPageRect +// Convert the device coordinations of a point or a rectangle to page coordinations. +// Parameters: +// page - Handle to the page. Returned by FPDFEMB_LoadPage function. +// start_x - Left pixel position of the display area in the device coordination +// start_y - Top pixel position of the display area in the device coordination +// size_x - Horizontal size (in pixels) for displaying the page +// size_y - Vertical size (in pixels) for displaying the page +// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise), +// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise). +// point - A point structure with device coordinations upon the call, +// also receiving the result page coordinations. +// rect - A rectangle structure with device coordinations upon the call, +// also receiving the result page coordinations. +// Return value: +// None. +// Comments: +// The page coordination system has its origin at left-bottom corner of the page, +// with X axis goes along the bottom side to the right, and Y axis goes along the +// left side upward. No matter how you zoom, scroll, or rotate a page, a particular +// element (like text or image) on the page should always have the same coordination +// values in the page coordination system. +// +// The device coordination system is device dependant. For bitmap device, its origin +// is at left-top corner of the window. You must make sure the start_x, start_y, size_x, +// size_y and rotate parameters have exactly same values as you used in +// FPDFEMB_StartRender() function call. +// +// For rectangle conversion, the result rectangle is always "normalized", meaning for +// page coordinations, left is always smaller than right, bottom is smaller than top. +// +void FPDFEMB_DeviceToPagePoint(FPDFEMB_PAGE page, + int start_x, int start_y, int size_x, int size_y, int rotate, + FPDFEMB_POINT* point); + +void FPDFEMB_DeviceToPageRect(FPDFEMB_PAGE page, + int start_x, int start_y, int size_x, int size_y, int rotate, + FPDFEMB_RECT* rect); + +// Function: FPDFEMB_PageToDevicePoint, FPDFEMB_PageToDeviceRect +// Convert the page coordinations of a point or a rectangle to device coordinations. +// Parameters: +// page - Handle to the page. Returned by FPDFEMB_LoadPage function. +// start_x - Left pixel position of the display area in the device coordination +// start_y - Top pixel position of the display area in the device coordination +// size_x - Horizontal size (in pixels) for displaying the page +// size_y - Vertical size (in pixels) for displaying the page +// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise), +// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise). +// point - A point structure with page coordinations upon the call, +// also receiving the result device coordinations. +// rect - A rectangle structure with page coordinations upon the call, +// also receiving the result device coordinations. +// Return value: +// None +// Comments: +// For rectangle conversion, the result rectangle is always "normalized", meaning for +// device coordinations, left is always smaller than right, top is smaller than bottom. +// +void FPDFEMB_PageToDevicePoint(FPDFEMB_PAGE page, + int start_x, int start_y, int size_x, int size_y, int rotate, + FPDFEMB_POINT* point); + +void FPDFEMB_PageToDeviceRect(FPDFEMB_PAGE page, + int start_x, int start_y, int size_x, int size_y, int rotate, + FPDFEMB_RECT* rect); + +/******************************************************************************************** +**** +**** Text Search +**** +********************************************************************************************/ + +// Search flags for FPDFEMB_FindFirst function +#define FPDFEMB_MATCHCASE 1 // whether matching case +#define FPDFEMB_MATCHWHOLEWORD 2 // whether matching whole word +#define FPDFEMB_CONSECUTIVE 4 // whether matching consecutively (for example, "CC" will + // match twice in "CCC"). + +// Function: FPDFEMB_FindFirst +// Find first occurance of a pattern string in a page +// Parameters: +// page - Page handle. +// pattern - A zero-terminated unicode string to be found. +// from_last - Whether we start from the end of page +// flags - Search flags, see above defined constants +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Is not found, FPDFERR_NOTFOUND is returned. +// Comments: +// A page must be parsed first before it can be searched. +// There can be only one search in progress for a page. A new search will +// cancel the previous one. +// +// IMPORTANT: this function is now obsolete and kept for back compatibility +// only, please use FPDFEMB_FindFrom function below. +// +FPDFEMB_RESULT FPDFEMB_FindFirst(FPDFEMB_PAGE page, const FPDFEMB_WCHAR* pattern, + FPDFEMB_BOOL from_last, unsigned int flags); + +// Function: FPDFEMB_FindFrom +// Find first occurance of a pattern string in a page, from a particular position +// Parameters: +// page - Page handle. +// pattern - A zero-terminated unicode string to be found. +// pos - The position, returned from FPDFEMB_GetSearchPos. +// Or 0 from the beginning of page, -1 from the end of page. +// flags - Search flags, see above defined constants +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Is not found, FPDFERR_NOTFOUND is returned. +// Comments: +// A page must be parsed first before it can be searched. +// There can be only one search in progress for a page. A new search will +// cancel the previous one. +// +FPDFEMB_RESULT FPDFEMB_FindFrom(FPDFEMB_PAGE page, const FPDFEMB_WCHAR* pattern, + int pos, unsigned int flags); + +// Function: FPDFEMB_FindNext +// Find next occurance of a search +// Parameters: +// page - Page handle. +// FPDFEMB_FindFirst must be called for this page first. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Is not found, FPDFERR_NOTFOUND is returned. +// +FPDFEMB_RESULT FPDFEMB_FindNext(FPDFEMB_PAGE page); + +// Function: FPDFEMB_FindPrev +// Find previous occurance of a search +// Parameters: +// page - Page handle. +// FPDFEMB_FindFirst must be called for this page first. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Is not found, FPDFERR_NOTFOUND is returned. +// +FPDFEMB_RESULT FPDFEMB_FindPrev(FPDFEMB_PAGE page); + +// Function: FPDFEMB_CountFoundRects +// Get number of rectangles for last found result +// Parameters: +// page - Page handle. +// Return Value: +// Number of rectangles for last found result. 0 for not found or failure. +// +int FPDFEMB_CountFoundRects(FPDFEMB_PAGE page); + +// Function: FPDFEMB_GetFoundRect +// Get a particular found rectangle +// Parameters: +// page - Page handle. +// index - Zero-based index for the rectangle. +// rect - Receiving the result rectangle, in hundredth of points +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// Application should always call FPDFEMB_CountFoundRects first to get +// number of rectangles, then use this function to get each rectangle. +// +// The returned rectangle uses page coordination system. +// +FPDFEMB_RESULT FPDFEMB_GetFoundRect(FPDFEMB_PAGE page, int index, FPDFEMB_RECT* rect); + +// Function: FPDFEMB_GetSearchPos +// Return position of current search result +// Parameters: +// page - Page handle. +// Return Value: +// Zero based character index for the current search result. -1 if not found. +// +int FPDFEMB_GetSearchPos(FPDFEMB_PAGE page); + +// Function: FPDFEMB_QuickSearch +// Search a pattern in a page quickly, without the page to be parsed +// Parameters: +// document - Document handle returned by FPDFEMB_StartLoadDocument function +// page_index - Zero-based index of the page +// pattern - A zero-terminated unicode string to be found. +// case_sensitive - Non-zero for case-sensitive searching, zero for case-insensitive +// Return Value: +// FPDFERR_SUCCESS if pattern found, FPDFERR_NOTFOUND if pattern not found. +// Otherwise error code is returned. +// Comments: +// This function does a rough and quick search in a page, before the page is loaded. +// The quick search will not generate an exact result saying where the pattern is +// found, and, it might be possible if a quick search result is "pattern found", and +// a real search for the same pattern, in the same page, will result in "not found". +// +// However, if quick search doesn't find a pattern in a page, then we can be sure the +// pattern won't be found in this page when we do a real search. So, this function is +// very useful when we search in a multiple-page document, and we want to quickly skip +// those pages in which the pattern can't possibly be found. +// +FPDFEMB_RESULT FPDFEMB_QuickSearch(FPDFEMB_DOCUMENT document, int page_index, + const FPDFEMB_WCHAR* pattern, int case_sensitive); + +/******************************************************************************************** +**** +**** Text Information +**** +********************************************************************************************/ + +// Function: FPDFEMB_GetCharCount +// Get number of characters in the page +// Parameters: +// page - Page handle +// count - Receiving number of characters +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_GetCharCount(FPDFEMB_PAGE page, int* count); + +// Structure: FPDFEMB_CHAR_INFO +// Character information. +struct FPDFEMB_CHAR_INFO { + int unicode; // Unicode for the character. 0 if not available. + // Space and new line charcters (U+0020 and U+000A) may be generated + // according to the text formatting. + FPDFEMB_POINT origin; // X/Y position for the character origin, in hundredth of points + FPDFEMB_RECT bbox; // Bounding box of the character, in hundredth of points + // Maybe an empty box (left == right or top == bottom). +}; + +// Function: FPDFEMB_GetCharInfo +// Get character information +// Parameters: +// page - Page handle +// index - Character index, starting from zero +// char_info - Receiving the character info +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// Application must call FPDFEMB_GetCharCount first before it can call this function +// for any particular characters. +// +FPDFEMB_RESULT FPDFEMB_GetCharInfo(FPDFEMB_PAGE page, int index, FPDFEMB_CHAR_INFO* char_info); + +// Function: FPDFEMB_GetCharIndexAtPos() +// Get index of character nearest to a certain position on the page +// Parameters: +// page - Page handle +// x - X position in PDF page coordination system +// y - Y position in PDF page coordination system +// index - Pointer to an integer receiving zero-based character index. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// This function finds the character that's nearest to the particular page position. +// If there is no character, the output index will be -1. +// +FPDFEMB_RESULT FPDFEMB_GetCharIndexAtPos(FPDFEMB_PAGE page, double x, double y, int* index); + +/******************************************************************************************** +**** +**** Device Independant Bitmap +**** +********************************************************************************************/ + +#define FPDFDIB_BGR 1 // 3 bytes per pixel, byte order: Blue, Green, Red +#define FPDFDIB_BGRx 2 // 4 bytes per pixel, byte order: Blue, Green, Red, not used +#define FPDFDIB_BGRA 3 // 4 bytes per pixel, byte order: Blue, Green, Red, Alpha +#define FPDFDIB_GRAY 4 // 1 byte per pixel (grayscale) + +// Function: FPDFEMB_CreateDIB +// Create a DIB (Device Independant Bitmap) +// Parameters: +// width - Width pixels; +// height - Height pixels; +// format - Format type. See FPDFDIB_xxx constants +// buffer - External buffer provided for the DIB, +// or NULL if new buffer is to be allocated. +// stride - Number of bytes for each scan line, for external buffer only. +// If not specified, 4-byte alignment assumed. +// dib - Receiving the created DIB handle +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// If "buffer" parameter is not NULL, then the provided buffer must conform +// to standard DIB format (see comments of FPDFEMB_GetDIBData function below). +// +// This function doesn't initialize the pixels inside the DIB buffer. So if you +// want to use the DIB to display a PDF page, you usually need to initialize +// the DIB to white background by youself. +// +FPDFEMB_RESULT FPDFEMB_CreateDIB(int width, int height, int format, + void* buffer, int stride, FPDFEMB_BITMAP* dib); + +// Function: FPDFEMB_DestroyDIB +// Destroy a DIB +// Parameters: +// dib - DIB handle +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// If external buffer is used (specified in "buffer" parameter when calling +// FPDFEMB_CreateDIB), the buffer will not be destroyed. +// +FPDFEMB_RESULT FPDFEMB_DestroyDIB(FPDFEMB_BITMAP dib); + +// Function: FPDFEMB_GetDIBWidth +// Get width (in pixels) of a DIB +// Parameters: +// dib - DIB handle +// Return Value: +// DIB width in pixels. +// +int FPDFEMB_GetDIBWidth(FPDFEMB_BITMAP dib); + +// Function: FPDFEMB_GetDIBHeight +// Get height (in pixels) of a DIB +// Parameters: +// dib - DIB handle +// Return Value: +// DIB height in pixels. +// +int FPDFEMB_GetDIBHeight(FPDFEMB_BITMAP dib); + +// Function: FPDFEMB_GetDIBData +// Get data pointer to a DIB +// Parameters: +// dib - DIB handle +// Return Value: +// Pointer to the DIB data. +// Comments: +// DIB data are organized in scanlines, from top down. +// +void* FPDFEMB_GetDIBData(FPDFEMB_BITMAP dib); + +// Function: FPDFEMB_GetDIBStride +// Get scan line stride of a DIB +// Parameters: +// dib - DIB handle +// Return Value: +// Number of bytes occupied by a scanline +// +int FPDFEMB_GetDIBStride(FPDFEMB_BITMAP dib); + +// Function: FPDFEMB_GetRotatedDIB +// Swap X/Y dimensions of a DIB to generate a rotated new DIB +// Parameters: +// dib - DIB handle +// flip_x - Whether flip pixels on the destination X dimension (left/right) +// flip_y - Whether flip pixels on the destination Y dimension (up/down) +// result_dib - Receiving the result DIB handle +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// +FPDFEMB_RESULT FPDFEMB_GetRotatedDIB(FPDFEMB_BITMAP dib, + FPDFEMB_BOOL bFlipX, FPDFEMB_BOOL bFlipY, + FPDFEMB_BITMAP* result_dib); + +// Function: FPDFEMB_StretchDIB +// Stretch a source DIB into another destination DIB +// Parameters: +// dest_dib - The destination DIB handle +// dest_left - Left position in the destination DIB +// dest_top - Top position in the destination DIB +// dest_width - Destination width, in pixels. Can be negative for horizontal flipping +// dest_height - Destination height, in pixels. Can be negative for vertical flipping +// clip - Destination clipping rectangle, or NULL for no clipping. +// The coordinations are measured in destination bitmap. +// src_dib - Source DIB handle. +// interpol - Whether we use interpolation to improve the result quality +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// +FPDFEMB_RESULT FPDFEMB_StretchDIB(FPDFEMB_BITMAP dest_dib, int dest_left, int dest_top, + int dest_width, int dest_height, FPDFEMB_RECT* clip_rect, + FPDFEMB_BITMAP src_dib, FPDFEMB_BOOL interpol); + +// Function: FPDFEMB_TransformDIB +// Transform a source DIB into another destination DIB +// Parameters: +// dest_dib - The destination DIB handle +// clip - Destination clipping rectangle, or NULL for no clipping. +// The coordinations are measured in destination bitmap. +// src_dib - Source DIB handle. +// x - X coordination of the dest origin +// y - Y coordination of the dest origin +// xx - X distance of the dest X vector +// yx - Y distance of the dest X vector +// xy - X distance of the dest Y vector +// yy - Y distance of the dest Y vector +// interpol - Whether we use interpolation to improve the result quality +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// All coordinations and distances are measured in destination bitmap system. +// +// This function places the bottom-left pixel of the image at the destination +// origin, then the bottom sideline along the destination X vector, and left +// sideline along the destination Y vector. +// +FPDFEMB_RESULT FPDFEMB_TransformDIB(FPDFEMB_BITMAP dest_dib, FPDFEMB_RECT* clip_rect, + FPDFEMB_BITMAP src_dib, int x, int y, int xx, int yx, + int xy, int yy, FPDFEMB_BOOL interpol); + +/******************************************************************************************** +**** +**** Custom Font Handler and CJK Support +**** +********************************************************************************************/ + +// FPDFEMB comes with standard fonts for Latin characters. If your device is targeted to +// Eastern Asian markets, then system fonts must be provided and registered with FPDFEMB. +// Depending on your device configuration, those system fonts might be in TrueType or Type1 +// format, or some other non-standard compact format. For the first case, you should register +// a font mapper so FPDFEMB can pick the right font file, and for the second case, you +// should register a glyph provider so FPDFEMB can get glyph bitmap for each character. + +#define FPDFEMB_CHARSET_DEFAULT 0 +#define FPDFEMB_CHARSET_GB 936 +#define FPDFEMB_CHARSET_BIG5 950 +#define FPDFEMB_CHARSET_JIS 932 +#define FPDFEMB_CHARSET_KOREA 949 +#define FPDFEMB_CHARSET_UNICODE 1200 + +#define FPDFEMB_FONT_FIXEDPITCH 1 +#define FPDFEMB_FONT_SERIF 2 +#define FPDFEMB_FONT_SYMBOLIC 4 +#define FPDFEMB_FONT_SCRIPT 8 +#define FPDFEMB_FONT_NONSYMBOLIC 32 +#define FPDFEMB_FONT_ITALIC 64 +#define FPDFEMB_FONT_ALLCAP 0x10000 +#define FPDFEMB_FONT_SMALLCAP 0x20000 +#define FPDFEMB_FONT_FORCEBOLD 0x40000 + +// Structure: FPDFEMB_FONT_MAPPER +// Defines interface for system font mapper. +// +struct FPDFEMB_FONT_MAPPER +{ + // Interface: MapFont + // Find font file path for a particular PDF font + // Parameters: + // mapper - Pointer to the FPDFEMB_FONT_MAPPER structure + // name - Font name + // charset - Charset ID (see above FPDFEMB_CHARSET_xxx constants) + // flags - Font flags (see above FPDFEMB_FONT_xxx constants) + // weight - Weight of the font. Range from 100 to 900. 400 is normal, + // 700 is bold. + // path - Receiving the full file path. The buffer size is 512 bytes. + // face_index - Receiving an zero-based index value for the font face, if the + // mapped font file is a "collection" (meaning a number of faces + // are stored in the same file). If the font file is not a + // collection, the index value should be zero. + // Return Value: + // Non-zero for success, 0 for failure. + // + FPDFEMB_BOOL (*MapFont)(struct FPDFEMB_FONT_MAPPER* mapper, const char* name, int charset, + unsigned int flags, int weight, + char* path, int* face_index); + + void* user; // A user pointer, used by the application +}; + +// Function: FPDFEMB_SetFontMapper +// Use a system font mapper (typically for Chinese/Japanese/Korean charsets) +// Parameters: +// mapper - Pointer to FPDFEMB_FONT_MAPPER structure. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// This function is used with devices that come with one or more system fonts, +// and those fonts are in standard TT or T1 format. +// +FPDFEMB_RESULT FPDFEMB_SetFontMapper(FPDFEMB_FONT_MAPPER* mapper); + +// Structure: FPDFEMB_GLYPH_PROVIDER +// Interface for providing glyph bitmap of non-latin characters. +// This is usually used for embedded devices with Chinese/Japanese/Korean +// fonts installed, but those fonts are not in TrueType or Type1 format. +// +struct FPDFEMB_GLYPH_PROVIDER +{ + // Interface: MapFont + // Return an internal handle for a font + // Parameters: + // provider - Pointer to this structure + // name - Font name + // charset - Charset ID (see above FPDFEMB_CHARSET_xxx constants) + // flags - Font flags (see above FPDFEMB_FONT_xxx constants) + // weight - Weight of the font. Range from 100 to 900. 400 is normal, + // 700 is bold. + // Return Value: + // An internal handle to the mapped font. If the embedded device supports + // multiple fonts, then this value can serve as an identifier to differentiate + // among them. If the device supports only one font, then implementation of + // this function can simply return NULL. + // + void* (*MapFont)(struct FPDFEMB_GLYPH_PROVIDER* provider, const char* name, int charset, + unsigned int flags, int weight); + // Interface: GetGlyphBBox + // Get glyph bounding box + // Parameters: + // provider - Pointer to this structure + // font - Internal handle to the font. Returned by MapFont interface. + // unicode - Unicode of the character + // CID - Adobe CID for this character. Or zero if not available. + // bbox - Receiving the result bounding box. See comments below. + // Return Value: + // None. + // Comments: + // The bounding box is measure in a glyph coordination system, in which the + // origin is set to character origin, and unit is set to one-thousandth of + // "em size" (representing the font size). + // + // In most CJK fonts, all CJK characters (except some symbols or western + // characters) have same glyph bounding box: + // left = 0, right = 1000, bottom = -220, top = 780. + // + // It's OK to return a box that's larger than the actual glyph box. + // + void (*GetGlyphBBox)(struct FPDFEMB_GLYPH_PROVIDER* provider, void* font, + FPDFEMB_WCHAR unicode, unsigned short CID, + FPDFEMB_RECT* bbox); + + // Interface: GetGlyphBitmap + // Get bitmap of a glyph + // Parameters: + // provider - Pointer to this structure + // font - Internal handle to the font. Returned by MapFont interface. + // unicode - Unicode of the character + // CID - Adobe CID for this character. Or zero if not available. + // font_width - Width of the font em square, measured in device units. + // font_height - Height of the font em square, measured in device units. + // left - Receiving the left offset, from the character origin, of the + // result glyph bitmap. Positive value will move the bitmap to + // the right side, negative to the left. + // top - Receiving the top offset, from the character origin, of the + // result glyph bitmap. Positive value will move the bitmap upward, + // negative downward. + // bitmap_width - Receiving number of width pixels in the result bitmap + // bitmap_height - Receiving number of height pixels in the result bitmap + // buffer - Receiving a data buffer pointer, allocated by the implementation. + // See comments below. + // stride - Receiving number of bytes per scanline, in the data buffer. + // pdf_width - Width of the character specified in PDF. It is measured in one- + // thousandth of the font width. It can be 0 if width not specified + // in PDF. See comments below. + // Return Value: + // Non-zero for success. 0 for failure. In this case the glyph can not be displayed. + // Comments: + // The buffer should be allocated by implemenation. And it must be allocated + // using FPDFEMB_AllocMemory function. The result buffer will be destroyed by + // FPDFEMB SDK, so implementation should not destroy it. + // + // The implementation should write "coverage" data into allocated buffer, one byte + // for each pixel, from top scanline to bottom scanline, within each scan line, + // from left pixel to right. Coverage 0 means the pixel is outside the glyph, + // coverage 255 means the pixel is inside the glyph. + // + // The "pdf_width" parameter can be used to scale the character in system font + // horizontally to match the font width specified in PDF. For example, if we have + // a PDF file which requires a character in half-width (pdf_width is 500), but + // in the system font the character has full-width (1000), then the glyph provider + // implementation should scale the font horizontally to half of its original width. + // + FPDFEMB_BOOL (*GetGlyphBitmap)(struct FPDFEMB_GLYPH_PROVIDER* provider, void* font, + FPDFEMB_WCHAR unicode, unsigned short CID, + double font_width, double font_height, int* left, int* top, + int* bitmap_width, int* bitmap_height, + void** buffer, int* stride, int pdf_width); + + void* user; // A user pointer, used by the application +}; + +// Function: FPDFEMB_SetGlyphProvider +// Make use of a glyph provider: generating glyph bitmap for non-Latin characters +// Parameters: +// provider - Pointer to the glyph provider structure. +// This structure must stay valid throughout usage of FPDFEMB module. +// Return Value: +// None. +// Comments: +// FPDFEMB embeds some standard fonts for Latin characters and symbols, like +// Times, Courier and Helvetica (Arial). For non-Latin characters, however, +// FPDFEMB has to ask glyph provide for help. +// +// If an embedded device carries fonts for non-Latin character sets, especially +// those for CJK markets, then the application can implement a glyph provider, +// allowing PDFs using non-embedded CJK fonts to be properly displayed. +// +void FPDFEMB_SetGlyphProvider(FPDFEMB_GLYPH_PROVIDER* provider); + +// Function: FPDFEMB_LoadCMap_GB +// Function: FPDFEMB_LoadCMap_GB_Ext +// Function: FPDFEMB_LoadCMap_CNS +// Function: FPDFEMB_LoadCMap_Korean +// Function: FPDFEMB_LoadCMap_Japan +// Function: FPDFEMB_LoadCMap_Japan_Ext +// Make use of character encoding maps embedded with FPDFEMB +// Parameters: +// None. +// Return Value: +// None. +// Comments: +// These functions add character encoding data to your application. Each call +// will increase the code size of your application. Total data size for all +// character sets is 151K bytes. +void FPDFEMB_LoadCMap_GB(); +void FPDFEMB_LoadCMap_GB_Ext(); // Load full code table for GB +void FPDFEMB_LoadCMap_CNS(); +void FPDFEMB_LoadCMap_Korea(); +void FPDFEMB_LoadCMap_Japan(); +void FPDFEMB_LoadCMap_Japan_Ext(); // Load full code table for Japan + +/******************************************************************************************** +**** +**** Document Information +**** +********************************************************************************************/ + +// Function: PDFEMB_GetDocInfoString +// Get information string about the document, like creator, modifcation date, etc. +// Parameters: +// document - Handle to the document +// key - A byte string for the information key. Currently can be one of the followings: +// "Title", "Author", "Subject", "Keywords", "Creator", "Producer", "CreationDate", +// "ModDate", or some custom information key, if supported by the PDF file. +// buffer - A buffer allocated by the application, or NULL. +// bufsize - [IN/OUT] A pointer to a number indicating the buffer size (number of bytes), +// before this function call. After return, this place will store +// number of bytes used by the output (including terminator). +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// The string is output in Unicode, using UTF-16LE format. It's terminated by +// two consecutive zero bytes. +// +// If the "buffer" parameter is NULL, then the "bufsize" parameter will receive +// number of bytes required to store the string (including the two-byte terminator). +// +FPDFEMB_RESULT FPDFEMB_GetDocInfoString(FPDFEMB_DOCUMENT document, const char* key, void* buffer, unsigned int* bufsize); + +/******************************************************************************************** +**** +**** Action (Destination) Information +**** +********************************************************************************************/ + +typedef void* FPDFEMB_ACTION; + +// Action types supported by FPDFEMB +#define FPDFEMB_DEST_NONE 0 // No or unsupported destination +#define FPDFEMB_DEST_PAGE 1 // A page inside the same document +#define FPDFEMB_DEST_DOC 2 // An external PDF document +#define FPDFEMB_DEST_URL 3 // An external URL +#define FPDFEMB_ACTION_LAUNCH 4 // Launch an external file or command + +// Zoom mode for destination +#define FPDFEMB_ZOOM_NONE 0 // Zoom mode not specified +#define FPDFEMB_ZOOM_FACTOR 1 // Specific zoom factor is used +#define FPDFEMB_ZOOM_FITPAGE 2 // Fit the whole page on screen +#define FPDFEMB_ZOOM_FITWIDTH 3 // Fit width of the page on screen +#define FPDFEMB_ZOOM_FITHEIGHT 4 // Fit height of the page on screen +#define FPDFEMB_ZOOM_FITRECT 5 // Fit a particular rectangle on screen +#define FPDFEMB_ZOOM_FITCONTENT 6 // Fit whole content of page on screen +#define FPDFEMB_ZOOM_FITCONTENTW 7 // Fit content width of page on screen +#define FPDFEMB_ZOOM_FITCONTENTH 8 // Fit content height of page on screen + +// Data structure for page destination +struct FPDFEMB_PAGEDEST +{ + int page_index; // Zero based index for the page + int zoom_mode; // See FPDFEMB_ZOOM_xxx definition above + int zoom_factor; // For FPDFEMB_ZOOM_FACTOR only: the zoom factor (in percentage) + FPDFEMB_RECT position; // Specify position inside the page. Depends on the zoom mode, + // different members of the rectangle are used: + // FPDFEMB_ZOOM_NONE: left, top + // FPDFEMB_ZOOM_FACTOR: left, top + // FPDFEMB_ZOOM_FITPAGE: none + // FPDFEMB_ZOOM_FITWIDTH: top + // FPDFEMB_ZOOM_FITHEIGHT: left + // FPDFEMB_ZOOM_FITRECT: left, top, bottom, right + // FPDFEMB_ZOOM_FITCONTENT: none + // FPDFEMB_ZOOM_FITCONTENTW: top + // FPDFEMB_ZOOM_FITCONTENTH: left +}; + +// Data structure for document destination +struct FPDFEMB_DOCDEST +{ + FPDFEMB_PAGEDEST page_data; // page data + char* file_name; // The file name, encoded in original charset (maybe MBCS) +}; + +// Data structure for URL destination +struct FPDFEMB_URLDEST +{ + char* url; // URL encoded in 7-bit ASCII +}; + +// Data structure for Launch action +struct FPDFEMB_LAUNCHACTION +{ + int new_window; // Whether a new window should be opened + char* file_name; // The file name, encoded in original charset (maybe MBCS) +}; + +// Function: FPDFEMB_Action_GetType +// Get type of an action +// Parameters: +// document - Handle to the document +// action - Handle to the action +// dest_type - Pointer to an integer receiving type of the destination. See the above +// FPDFEMB_DEST_xxx definitions +// data_size - Pointer to an integer receiving data block size for the destination. +// If this parameter is NULL, then data size won't be retrieved. +// Comments: +// Each different type of destination has different data structure. The "data_size" result +// indicates how many bytes is required to hold the destination data structure. The application +// can then allocate sufficient buffer and then call FPDFEMB_Bookmark_GetDest function to +// get the real data. +// +FPDFEMB_RESULT FPDFEMB_Action_GetType(FPDFEMB_DOCUMENT document, FPDFEMB_ACTION action, int* dest_type, int* data_size); + +// Function: FPDFEMB_Action_GetData +// Get detailed data of a particular action +// Parameters: +// document - Handle to the document +// action - Handle to the action +// buffer - Application allocated buffer receiving the destination data +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// See data structure definition for different action type above. Please note +// the actual action data might use more space than the structure definition +// shows, to store things like file name or URL. So you should always call +// FPDFEMB_Action_GetType first to get data size then allocate enough buffer +// for this call. +// +FPDFEMB_RESULT FPDFEMB_Action_GetData(FPDFEMB_DOCUMENT document, FPDFEMB_ACTION action, void* buffer); + +// Function: FPDFEMB_Action_GetNext +// Get next action in an action chain +// Parameters: +// document - Handle to the document +// action - Handle to current action +// next - Receiving handle to next action. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// If there is no next action, the "next" parameter will be set to NULL after the function returns. +// +FPDFEMB_RESULT FPDFEMB_Action_GetNext(FPDFEMB_ACTION action, FPDFEMB_ACTION* next); + +/******************************************************************************************** +**** +**** Bookmark Information +**** +********************************************************************************************/ + +typedef void* FPDFEMB_BOOKMARK; + +// Function: FPDFEMB_Bookmark_GetFirstChild +// Get first child of a bookmark item, or first top level bookmark item +// Parameters: +// document - Handle to the document +// parent - Handle to the parent bookmark. +// Can be NULL if you want to get the first top level item. +// bookmark - Receiving handle to the first child or top level bookmark item. +// If result is NULL, then bookmark not found. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// +FPDFEMB_RESULT FPDFEMB_Bookmark_GetFirstChild(FPDFEMB_DOCUMENT document, FPDFEMB_BOOKMARK parent, + FPDFEMB_BOOKMARK* bookmark); + +// Function: FPDFEMB_Bookmark_GetFirstChild +// Get next sibling of a bookmark item +// Parameters: +// document - Handle to the document +// bookmark - Handle to the bookmark +// sibling - Receiving the handle of next sibling. +// If result is NULL, then this is the last bookmark in this level. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// +FPDFEMB_RESULT FPDFEMB_Bookmark_GetNextSibling(FPDFEMB_DOCUMENT document, FPDFEMB_BOOKMARK bookmark, + FPDFEMB_BOOKMARK* sibling); + +// Function: FPDFEMB_Bookmark_GetTitle +// Get title of a bookmark +// Parameters: +// bookmark - Handle to the bookmark +// buffer - A buffer allocated by the application, or NULL. +// bufsize - [IN/OUT] A pointer to a number indicating the buffer size, +// before this function call. After return, this place will store +// number of bytes used by the output (including terminator). +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// The title is output in Unicode, using UTF-16LE format. It's terminated by +// two consecutive zero bytes. +// +// If the "buffer" parameter is NULL, then the "bufsize" parameter will receive +// number of bytes required to store the bookmark title (including the two- +// byte terminator). +// +// If the buffer provided is smaller than the required size, then this function +// will not copy any data, return FPDFEMB_PARAM, and the required buffer size will +// also be put in "bufsize" parameter. +// +FPDFEMB_RESULT FPDFEMB_Bookmark_GetTitle(FPDFEMB_BOOKMARK bookmark, void* buffer, unsigned int* bufsize); + +// Function: FPDFEMB_Bookmark_GetPage +// Get page number of a bookmark pointing to +// Parameters: +// document - Handle to the document +// bookmark - Handle to the bookmark +// page - Receiving the page number. -1 if this bookmark doesn't actually +// point to a page inside the document. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success +// Comments: +// Some bookmark might not point to a page, some bookmark might have more than one destination +// (action), for detailed information about a bookmark, you should call FPDFEMB_Bookmark_GetAction. +// +FPDFEMB_RESULT FPDFEMB_Bookmark_GetPage(FPDFEMB_DOCUMENT document, FPDFEMB_BOOKMARK bookmark, int* page); + +// Function: FPDFEMB_Bookmark_GetAction +// Get action(s) associated with a particular bookmark +// Parameters: +// document - Handle to the document +// bookmark - Handle to the bookmark +// action - Receiving handle of first action +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_Bookmark_GetAction(FPDFEMB_DOCUMENT document, FPDFEMB_BOOKMARK bookmark, FPDFEMB_ACTION* action); + +/******************************************************************************************** +**** +**** Hyperlink Information +**** +********************************************************************************************/ + +// Function: FPDFEMB_Link_GetCount +// Get number of hyperlinks inside a page +// Parameters: +// page - Page handle. +// link_count - Pointer to an integer receiving the number of links +// reserved - Must be zero now. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// This function must be called before any other link related function can +// be called for the page. +// +FPDFEMB_RESULT FPDFEMB_Link_GetCount(FPDFEMB_PAGE page, int* link_count, int reserved); + +// Function: FPDFEMB_Link_GetAction +// Get action(s) associated with a particular hyperlink +// Parameters: +// page - Page handle +// link_index - Zero-based index for the link +// action - Receiving handle of first action +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_Link_GetAction(FPDFEMB_PAGE page, int link_index, FPDFEMB_ACTION* action); + +// Function: FPDFEMB_Link_GetAreaCount +// Get number of area (quadrilaterals) for a link +// Parameters: +// page - Page handle +// link_index - Zero-based index for the link +// count - Pointer to an integer receiving number of quadrilaterals +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_Link_GetAreaCount(FPDFEMB_PAGE page, int link_index, int* count); + +// Function: FPDFEMB_Link_GetArea +// Get a particular quadrilateral for a link +// Parameters: +// page - Page handle +// link_index - Zero-based index for the link +// area_index - Zero-based index for the quadrilateral +// points - Pointer to an array consists 4 points, receiving coordinations +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// The result in "points" array are the X/Y coordinations for the four vertices +// of the quadrilateral. Vertices are in the following order: lower left, lower +// right, upper right, upper left. +// +FPDFEMB_RESULT FPDFEMB_Link_GetArea(FPDFEMB_PAGE page, int link_index, int area_index, + FPDFEMB_POINT* points); + +/******************************************************************************************** +**** +**** Graphic Output (onto DIB) +**** +********************************************************************************************/ + +typedef void* FPDFEMB_FONT; + +// Function: FPDFEMB_OpenStandardFont +// Get ready to use a standard PDF font +// Parameters: +// font_name - Name of the font. See a list of supported fonts below. +// font_handle - Receiving the font handle. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// Currently supported standard fonts: +// Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique, +// Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique, +// Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, +// Symbol, ZapfDingbats. +// +FPDFEMB_RESULT FPDFEMB_OpenStandardFont(const char* font_name, FPDFEMB_FONT* font_handle); + +// Function: FPDFEMB_OpenSystemFont +// Get ready to use a system font +// Parameters: +// font_name - Font name +// charset - Charset ID (see above FPDFEMB_CHARSET_xxx constants) +// flags - Font flags (see above FPDFEMB_FONT_xxx constants) +// weight - Weight of the font. Range from 100 to 900. 400 is normal, +// 700 is bold. +// font_handle - Receiving the font handle. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// Comments: +// System font is supported only if either FPDFEMB_SetFontMapper or +// FPDFEMB_SetGlyphProvider is called. +// Font attributes (name, charset, flags and weight) can be all optional, if the +// font mapper or glyph provider doesn't make use of them. +// +FPDFEMB_RESULT FPDFEMB_OpenSystemFont(const char* font_name, int charset, unsigned int flags, int weight, + FPDFEMB_FONT* font_handle); + +// Function: FPDFEMB_CloseFont +// Close a font handle. +// Parameters: +// font_handle - Handle to the font. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_CloseFont(FPDFEMB_FONT font_handle); + +struct FPDFEMB_TEXTMATRIX +{ + double a, b, c, d; +}; + +// Function: FPDFEMB_OutputText +// Output text string onto a DIB device. +// Parameters: +// dib - DIB handle, as the output device +// x, y - DIB coordinations for the origin point of the first character. +// font_handle - Handle to the font +// font_size - Font size in pixels +// matrix - Matrix for the text output. Can be NULL. +// text - Zero-terminated unicode text string +// argb - Color of the text, in 0xaarrggbb format. +// Return Value: +// Error code, or FPDFERR_SUCCESS for success. +// +FPDFEMB_RESULT FPDFEMB_OutputText(FPDFEMB_BITMAP dib, int x, int y, FPDFEMB_FONT font_handle, double font_size, + FPDFEMB_TEXTMATRIX* matrix, const FPDFEMB_WCHAR* text, unsigned long argb); + +#ifdef __cplusplus +}; +#endif + +#endif // #ifdef _FPDFEMB_H_ |