// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _FPDFTEXT_H_
#define _FPDFTEXT_H_

#include "fpdfview.h"

// Exported Functions
#ifdef __cplusplus
extern "C" {
#endif

// Function: FPDFText_LoadPage
//			Prepare information about all characters in a page.
// Parameters: 
//			page	-	Handle to the page. Returned by FPDF_LoadPage function (in FPDFVIEW module).	
// Return value:
//			A handle to the text page information structure.
//			NULL if something goes wrong.
// Comments:
//			Application must call FPDFText_ClosePage to release the text page information.
//			If you don't purchase Text Module , this function will return NULL.
//	
DLLEXPORT FPDF_TEXTPAGE	STDCALL FPDFText_LoadPage(FPDF_PAGE page);

// Function: FPDFText_ClosePage
//			Release all resources allocated for a text page information structure.
// Parameters: 
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
// Return Value:
//			None.
//
DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page);
	
// Function: FPDFText_CountChars
//			Get number of characters in a page.
// Parameters: 
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
// Return value:
//			Number of characters in the page. Return -1 for error. 
//			Generated characters, like additional space characters, new line characters, are also counted.
// Comments:
//			Characters in a page form a "stream", inside the stream, each character has an index.
//			We will use the index parameters in many of FPDFTEXT functions. The first character in the page
//			has an index value of zero.
//
DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page);

// Function: FPDFText_GetUnicode
//			Get Unicode of a character in a page.
// Parameters: 
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			index		-	Zero-based index of the character.
// Return value:
//			The Unicode of the particular character.
//			If a character is not encoded in Unicode and Foxit engine can't convert to Unicode,
//			the return value will be zero.
//
DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index);

// Function: FPDFText_GetFontSize
//			Get the font size of a particular character.
// Parameters: 
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			index		-	Zero-based index of the character.
// Return value:
//			The font size of the particular character, measured in points (about 1/72 inch).
//			This is the typographic size of the font (so called "em size").
//
DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index);

// Function: FPDFText_GetCharBox
//			Get bounding box of a particular character.
// Parameters: 
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			index		-	Zero-based index of the character.
//			left		-	Pointer to a double number receiving left position of the character box.
//			right		-	Pointer to a double number receiving right position of the character box.
//			bottom		-	Pointer to a double number receiving bottom position of the character box.
//			top			-	Pointer to a double number receiving top position of the character box.
// Return Value:
//			None.
// Comments:
//			All positions are measured in PDF "user space".
//
DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index, double* left,
													double* right, double* bottom, double* top);

// Function: FPDFText_GetCharIndexAtPos
//			Get the index of a character at or nearby a certain position on the page.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			x			-	X position in PDF "user space".
//			y			-	Y position in PDF "user space".
//			xTolerance	-	An x-axis tolerance value for character hit detection, in point unit.
//			yTolerance	-	A y-axis tolerance value for character hit detection, in point unit.
// Return Value:
//			The zero-based index of the character at, or nearby the point (x,y).
//			If there is no character at or nearby the point, return value will be -1.
//			If an error occurs, -3 will be returned.
//
DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,
												 double x, double y, double xTorelance, double yTolerance);

// Function: FPDFText_GetText
//			Extract unicode text string from the page.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			start_index	-	Index for the start characters.
//			count		-	Number of characters to be extracted.
//			result		-	A buffer (allocated by application) receiving the extracted unicodes.
//							The size of the buffer must be able to hold the number of characters plus a terminator.
// Return Value:
//			Number of characters written into the result buffer, including the trailing terminator.
// Comments:
//			This function ignores characters without unicode information.
//			
DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, int start_index, int count, unsigned short* result);

// Function: FPDFText_CountRects
//			Count number of rectangular areas occupied by a segment of texts.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			start_index	-	Index for the start characters.
//			count		-	Number of characters.
// Return value:
//			Number of rectangles. Zero for error.
// Comments:
//			This function, along with FPDFText_GetRect can be used by applications to detect the position
//			on the page for a text segment, so proper areas can be highlighted or something.
//			FPDFTEXT will automatically merge small character boxes into bigger one if those characters
//			are on the same line and use same font settings.
//
DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, int start_index, int count);

// Function: FPDFText_GetRect
//			Get a rectangular area from the result generated by FPDFText_CountRects.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			rect_index	-	Zero-based index for the rectangle.
//			left		-	Pointer to a double value receiving the rectangle left boundary.
//			top			-	Pointer to a double value receiving the rectangle top boundary.
//			right		-	Pointer to a double value receiving the rectangle right boundary.
//			bottom		-	Pointer to a double value receiving the rectangle bottom boundary.
// Return Value:
//			None.
//
DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, int rect_index, double* left, double* top,
											double* right, double* bottom);

// Function: FPDFText_GetBoundedText
//			Extract unicode text within a rectangular boundary on the page.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			left		-	Left boundary.
//			top			-	Top boundary.
//			right		-	Right boundary.
//			bottom		-	Bottom boundary.
//			buffer		-	A unicode buffer.
//			buflen		-	Number of characters (not bytes) for the buffer, excluding an additional terminator.
// Return Value:
//			If buffer is NULL or buflen is zero, return number of characters (not bytes) needed,
//			otherwise, return number of characters copied into the buffer.
//
DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top, 
											  double right, double bottom,unsigned short* buffer,int buflen);


// Flags used by FPDFText_FindStart function.
#define FPDF_MATCHCASE      0x00000001		//If not set, it will not match case by default.
#define FPDF_MATCHWHOLEWORD 0x00000002		//If not set, it will not match the whole word by default.

// Function: FPDFText_FindStart
//			Start a search.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
//			findwhat	-	A unicode match pattern.
//			flags		-	Option flags.
//			start_index	-	Start from this character. -1 for end of the page.
// Return Value:
//			A handle for the search context. FPDFText_FindClose must be called to release this handle.
//
DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, FPDF_WIDESTRING findwhat,
													unsigned long flags, int start_index);

// Function: FPDFText_FindNext
//			Search in the direction from page start to end.
// Parameters:
//			handle		-	A search context handle returned by FPDFText_FindStart.
// Return Value:
//			Whether a match is found.
//
DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle);

// Function: FPDFText_FindPrev
//			Search in the direction from page end to start.
// Parameters:
//			handle		-	A search context handle returned by FPDFText_FindStart.
// Return Value:
//			Whether a match is found.
//
DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle);

// Function: FPDFText_GetSchResultIndex
//			Get the starting character index of the search result.
// Parameters:
//			handle		-	A search context handle returned by FPDFText_FindStart.
// Return Value:
//			Index for the starting character.
//
DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle);

// Function: FPDFText_GetSchCount
//			Get the number of matched characters in the search result.
// Parameters:
//			handle		-	A search context handle returned by FPDFText_FindStart.
// Return Value:
//			Number of matched characters.
//
DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle);

// Function: FPDFText_FindClose
//			Release a search context.
// Parameters:
//			handle		-	A search context handle returned by FPDFText_FindStart.
// Return Value:
//			None.
//
DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle);

// Function: FPDFLink_LoadWebLinks
//			Prepare information about weblinks in a page.
// Parameters:
//			text_page	-	Handle to a text page information structure. Returned by FPDFText_LoadPage function.
// Return Value:	
//			A handle to the page's links information structure.
//			NULL if something goes wrong.
// Comments:
//			Weblinks are those links implicitly embedded in PDF pages. PDF also has a type of
//			annotation called "link", FPDFTEXT doesn't deal with that kind of link.
//			FPDFTEXT weblink feature is useful for automatically detecting links in the page
//			contents. For example, things like "http://www.foxitsoftware.com" will be detected,
//			so applications can allow user to click on those characters to activate the link,
//			even the PDF doesn't come with link annotations.
//
//			FPDFLink_CloseWebLinks must be called to release resources.
//
DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page);

// Function: FPDFLink_CountWebLinks
//			Count number of detected web links.
// Parameters:
//			link_page	-	Handle returned by FPDFLink_LoadWebLinks.
// Return Value:
//			Number of detected web links.
//
DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page);

// Function: FPDFLink_GetURL
//			Fetch the URL information for a detected web link.
// Parameters:
//			link_page	-	Handle returned by FPDFLink_LoadWebLinks.
//			link_index	-	Zero-based index for the link.
//			buffer		-	A unicode buffer.
//			buflen		-	Number of characters (not bytes) for the buffer, including an additional terminator.
// Return Value:
//			If buffer is NULL or buflen is zero, return number of characters (not bytes and an additional terminator is also counted) needed,
//			otherwise, return number of characters copied into the buffer.
//
DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, int link_index, unsigned short* buffer,int buflen);

// Function: FPDFLink_CountRects
//			Count number of rectangular areas for the link.
// Parameters:
//			link_page	-	Handle returned by FPDFLink_LoadWebLinks.
//			link_index	-	Zero-based index for the link.
// Return Value:
//			Number of rectangular areas for the link.
//
DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, int link_index);

// Function: FPDFLink_GetRect
//			Fetch the boundaries of a rectangle for a link.
// Parameters:
//			link_page	-	Handle returned by FPDFLink_LoadWebLinks.
//			link_index	-	Zero-based index for the link.
//			rect_index	-	Zero-based index for a rectangle.
//			left		-	Pointer to a double value receiving the rectangle left boundary.
//			top			-	Pointer to a double value receiving the rectangle top boundary.
//			right		-	Pointer to a double value receiving the rectangle right boundary.
//			bottom		-	Pointer to a double value receiving the rectangle bottom boundary.
// Return Value:
//			None.
//
DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, int link_index, int rect_index, 
										double* left, double* top,double* right, double* bottom);

// Function: FPDFLink_CloseWebLinks
//			Release resources used by weblink feature.
// Parameters:
//			link_page	-	Handle returned by FPDFLink_LoadWebLinks.
// Return Value:
//			None.
//
DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page);


#ifdef __cplusplus
};
#endif

#endif//_FPDFTEXT_H_
