1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fsdk_define.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fpdftext.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _WIN32
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <tchar.h>
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        // jabdelmalek: commented out to build on Linux.  Not used.
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	// extern HANDLE g_hModule;
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page)
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!page) return NULL;
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=NULL;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_ViewerPreferences viewRef(((CPDF_Page*)page)->m_pDocument);
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		textpage=IPDF_TextPage::CreateTextPage((CPDF_Page*)page,viewRef.IsDirectionR2L());
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		textpage->ParseTextPage();
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (textpage)
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete textpage;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return textpage;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page)
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (text_page){
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete textpage;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		text_page=NULL;
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page)
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return	-1;
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return  textpage->CountChars();
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index)
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return -1;
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (index<0 || index>=textpage->CountChars()) return 0;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FPDF_CHAR_INFO	charinfo;
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	textpage->GetCharInfo(index,charinfo);
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return charinfo.m_Unicode;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index)
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return 0;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (index<0 || index>=textpage->CountChars()) return 0;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FPDF_CHAR_INFO	charinfo;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	textpage->GetCharInfo(index,charinfo);
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return charinfo.m_FontSize;
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index,double* left,
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov													double* right, double* bottom, double* top)
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return;
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (index<0 || index>=textpage->CountChars()) return ;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FPDF_CHAR_INFO	charinfo;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	textpage->GetCharInfo(index,charinfo);
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*left=charinfo.m_CharBox.left;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*right=charinfo.m_CharBox.right;
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*bottom=charinfo.m_CharBox.bottom;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*top=charinfo.m_CharBox.top;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//select
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,double x,double y,double xTorelance,double yTorelance)
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return -3;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return textpage->GetIndexAtPos((FX_FLOAT)x,(FX_FLOAT)y,(FX_FLOAT)xTorelance,(FX_FLOAT)yTorelance);
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page,int start,int count,unsigned short* result)
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return 0;
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (start>=textpage->CountChars()) return 0;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString str=textpage->GetPageText(start,count);
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(str.GetLength()>count)
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		str = str.Left(count);
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString cbUTF16str = str.UTF16LE_Encode();
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXSYS_memcpy(result,cbUTF16str.GetBuffer(cbUTF16str.GetLength()),cbUTF16str.GetLength());
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength());
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return cbUTF16str.GetLength()/sizeof(unsigned short);
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page,int start,int count)
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return 0;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return	textpage->CountRects(start,count);
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page,int rect_index, double* left,double*  top,
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov										double*  right, double*  bottom)
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return;
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_FloatRect	rect;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	textpage->GetRect(rect_index,rect.left,rect.top,rect.right,rect.bottom);
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*left=rect.left;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*top=rect.top;
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*right=rect.right;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*bottom=rect.bottom;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top,
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov											  double right, double bottom,unsigned short* buffer,int buflen)
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return 0;
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_FloatRect rect((FX_FLOAT)left,(FX_FLOAT)bottom,(FX_FLOAT)right,(FX_FLOAT)top);
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString str=textpage->GetTextByRect(rect);
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (buflen<=0 || buffer==NULL)
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return str.GetLength();
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString cbUTF16Str = str.UTF16LE_Encode();
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int len = cbUTF16Str.GetLength()/sizeof(unsigned short);
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int size = buflen > len ? len : buflen;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXSYS_memcpy(buffer,cbUTF16Str.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	cbUTF16Str.ReleaseBuffer(size*sizeof(unsigned short));
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return size;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//Search
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//-1 for end
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page,FPDF_WIDESTRING findwhat,unsigned long flags,int start_index)
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return NULL;
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPageFind* textpageFind=NULL;
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		textpageFind=IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page);
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat),flags,start_index);
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (textpageFind)
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete textpageFind;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return textpageFind;
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL	STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle)
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!handle) return FALSE;
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return	textpageFind->FindNext();
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle)
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!handle) return FALSE;
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return	textpageFind->FindPrev();
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle)
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!handle) return 0;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return textpageFind->GetCurOrder();
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle)
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!handle) return 0;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return textpageFind->GetMatchedCount();
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle)
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!handle) return;
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete	textpageFind;
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	handle=NULL;
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//web link
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page)
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!text_page) return NULL;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_LinkExtract* pageLink=NULL;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	try
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pageLink=IPDF_LinkExtract::CreateLinkExtract();
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pageLink->ExtractLinks((IPDF_TextPage*)text_page);
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	catch (...)
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (pageLink)
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			delete pageLink;
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pageLink;
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page)
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!link_page) return 0;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return	pageLink->CountLinks();
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page,int link_index, unsigned short* buffer,int buflen)
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!link_page) return 0;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString url=pageLink->GetURL(link_index);
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString cbUTF16URL = url.UTF16LE_Encode();
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int len= cbUTF16URL.GetLength()/sizeof(unsigned short);
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (buffer==NULL || buflen<=0)
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return len;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int size=len<buflen ? len :buflen;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (size>0)
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FXSYS_memcpy(buffer,cbUTF16URL.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		cbUTF16URL.ReleaseBuffer(size*sizeof(unsigned short));
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return size;
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page,int link_index)
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!link_page) return 0;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_RectArray rectArray;
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pageLink->GetRects(link_index,rectArray);
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return rectArray.GetSize();
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,int link_index,  int rect_index, double* left,
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov										double*  top,double*  right, double*  bottom)
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!link_page) return;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_RectArray rectArray;
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pageLink->GetRects(link_index,rectArray);
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_FloatRect rect;
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	rect=rectArray.GetAt(rect_index);
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*left=rect.left;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*right=rect.right;
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*top=rect.top;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*bottom=rect.bottom;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void	STDCALL	FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page)
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!link_page) return;
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pageLink;
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pageLink =NULL;
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
279