C++程序  |  1766行  |  70.59 KB

// 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_