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