blob: ce195ade26fc0618cee2e5905653e3a7ca6b73b4 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Lei Zhangb4e7f302015-11-06 15:52:32 -08007#include "public/fpdf_text.h"
8
dsinclair41872fa2016-10-04 11:29:35 -07009#include "core/fpdfapi/page/cpdf_page.h"
dsinclair1727aee2016-09-29 13:12:56 -070010#include "core/fpdfdoc/cpdf_viewerpreferences.h"
dsinclaire0307862016-09-29 13:25:38 -070011#include "core/fpdftext/cpdf_linkextract.h"
12#include "core/fpdftext/cpdf_textpage.h"
13#include "core/fpdftext/cpdf_textpagefind.h"
dsinclair114e46a2016-09-29 17:18:21 -070014#include "fpdfsdk/fsdk_define.h"
tsepez69141182016-04-21 10:43:39 -070015#include "third_party/base/numerics/safe_conversions.h"
tsepezdf964df2016-04-21 12:09:41 -070016#include "third_party/base/stl_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070017
Tom Sepez40e9ff32015-11-30 12:39:54 -080018#ifdef PDF_ENABLE_XFA
dsinclair521b7502016-11-02 13:02:28 -070019#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
dsinclair4d29e782016-10-04 14:02:47 -070020#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
Tom Sepez40e9ff32015-11-30 12:39:54 -080021#endif // PDF_ENABLE_XFA
22
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070023#ifdef _WIN32
24#include <tchar.h>
25#endif
26
dsinclaira28ae382016-04-19 10:39:24 -070027namespace {
28
29CPDF_TextPage* CPDFTextPageFromFPDFTextPage(FPDF_TEXTPAGE text_page) {
30 return static_cast<CPDF_TextPage*>(text_page);
31}
32
33CPDF_TextPageFind* CPDFTextPageFindFromFPDFSchHandle(FPDF_SCHHANDLE handle) {
34 return static_cast<CPDF_TextPageFind*>(handle);
35}
36
37CPDF_LinkExtract* CPDFLinkExtractFromFPDFPageLink(FPDF_PAGELINK link) {
38 return static_cast<CPDF_LinkExtract*>(link);
39}
40
41} // namespace
42
Nico Weber9d8ec5a2015-08-04 13:00:21 -070043DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page) {
Tom Sepez1b246282015-11-25 15:15:31 -080044 CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page);
45 if (!pPDFPage)
46 return nullptr;
dsinclaira28ae382016-04-19 10:39:24 -070047
Tom Sepez40e9ff32015-11-30 12:39:54 -080048#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -070049 CPDFXFA_Page* pPage = (CPDFXFA_Page*)page;
dsinclair521b7502016-11-02 13:02:28 -070050 CPDFXFA_Context* pContext = pPage->GetContext();
51 CPDF_ViewerPreferences viewRef(pContext->GetPDFDoc());
Tom Sepez40e9ff32015-11-30 12:39:54 -080052#else // PDF_ENABLE_XFA
53 CPDF_ViewerPreferences viewRef(pPDFPage->m_pDocument);
54#endif // PDF_ENABLE_XFA
dsinclaira28ae382016-04-19 10:39:24 -070055
dsinclair8f4bf9a2016-05-04 13:51:51 -070056 CPDF_TextPage* textpage = new CPDF_TextPage(
57 pPDFPage, viewRef.IsDirectionR2L() ? FPDFText_Direction::Right
58 : FPDFText_Direction::Left);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070059 textpage->ParseTextPage();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070060 return textpage;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070061}
dsinclaira28ae382016-04-19 10:39:24 -070062
Nico Weber9d8ec5a2015-08-04 13:00:21 -070063DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page) {
dsinclaira28ae382016-04-19 10:39:24 -070064 delete CPDFTextPageFromFPDFTextPage(text_page);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065}
dsinclaira28ae382016-04-19 10:39:24 -070066
Nico Weber9d8ec5a2015-08-04 13:00:21 -070067DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page) {
68 if (!text_page)
69 return -1;
dsinclaira28ae382016-04-19 10:39:24 -070070
71 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072 return textpage->CountChars();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073}
Lei Zhang0f2ea022016-01-11 12:01:23 -080074
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page,
76 int index) {
77 if (!text_page)
Wei Lid4e8f122016-03-21 11:20:44 -070078 return 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070079
dsinclaira28ae382016-04-19 10:39:24 -070080 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070081 if (index < 0 || index >= textpage->CountChars())
82 return 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070083
Nico Weber9d8ec5a2015-08-04 13:00:21 -070084 FPDF_CHAR_INFO charinfo;
Lei Zhang0f2ea022016-01-11 12:01:23 -080085 textpage->GetCharInfo(index, &charinfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070086 return charinfo.m_Unicode;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070087}
Lei Zhang0f2ea022016-01-11 12:01:23 -080088
Nico Weber9d8ec5a2015-08-04 13:00:21 -070089DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page,
90 int index) {
91 if (!text_page)
92 return 0;
dsinclaira28ae382016-04-19 10:39:24 -070093 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070094
Nico Weber9d8ec5a2015-08-04 13:00:21 -070095 if (index < 0 || index >= textpage->CountChars())
96 return 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070097
Nico Weber9d8ec5a2015-08-04 13:00:21 -070098 FPDF_CHAR_INFO charinfo;
Lei Zhang0f2ea022016-01-11 12:01:23 -080099 textpage->GetCharInfo(index, &charinfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700100 return charinfo.m_FontSize;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700101}
102
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700103DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page,
104 int index,
105 double* left,
106 double* right,
107 double* bottom,
108 double* top) {
109 if (!text_page)
110 return;
dsinclaira28ae382016-04-19 10:39:24 -0700111 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700112
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700113 if (index < 0 || index >= textpage->CountChars())
114 return;
115 FPDF_CHAR_INFO charinfo;
Lei Zhang0f2ea022016-01-11 12:01:23 -0800116 textpage->GetCharInfo(index, &charinfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700117 *left = charinfo.m_CharBox.left;
118 *right = charinfo.m_CharBox.right;
119 *bottom = charinfo.m_CharBox.bottom;
120 *top = charinfo.m_CharBox.top;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700121}
122
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700123// select
124DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,
125 double x,
126 double y,
Lei Zhang38a5a392015-08-13 17:52:16 -0700127 double xTolerance,
128 double yTolerance) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700129 if (!text_page)
130 return -3;
dsinclaira28ae382016-04-19 10:39:24 -0700131
132 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Lei Zhang38a5a392015-08-13 17:52:16 -0700133 return textpage->GetIndexAtPos((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)xTolerance,
134 (FX_FLOAT)yTolerance);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700135}
136
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700137DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page,
138 int start,
139 int count,
140 unsigned short* result) {
141 if (!text_page)
142 return 0;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700143
dsinclaira28ae382016-04-19 10:39:24 -0700144 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700145 if (start >= textpage->CountChars())
146 return 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700148 CFX_WideString str = textpage->GetPageText(start, count);
149 if (str.GetLength() > count)
150 str = str.Left(count);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700151
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700152 CFX_ByteString cbUTF16str = str.UTF16LE_Encode();
153 FXSYS_memcpy(result, cbUTF16str.GetBuffer(cbUTF16str.GetLength()),
154 cbUTF16str.GetLength());
155 cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700156
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700157 return cbUTF16str.GetLength() / sizeof(unsigned short);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700158}
159
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700160DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page,
161 int start,
162 int count) {
163 if (!text_page)
164 return 0;
dsinclaira28ae382016-04-19 10:39:24 -0700165
166 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700167 return textpage->CountRects(start, count);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700168}
dsinclaira28ae382016-04-19 10:39:24 -0700169
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700170DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page,
171 int rect_index,
172 double* left,
173 double* top,
174 double* right,
175 double* bottom) {
176 if (!text_page)
177 return;
dsinclaira28ae382016-04-19 10:39:24 -0700178
179 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700180 CFX_FloatRect rect;
181 textpage->GetRect(rect_index, rect.left, rect.top, rect.right, rect.bottom);
182 *left = rect.left;
183 *top = rect.top;
184 *right = rect.right;
185 *bottom = rect.bottom;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700186}
187
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700188DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,
189 double left,
190 double top,
191 double right,
192 double bottom,
193 unsigned short* buffer,
194 int buflen) {
195 if (!text_page)
196 return 0;
dsinclaira28ae382016-04-19 10:39:24 -0700197
198 CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700199 CFX_FloatRect rect((FX_FLOAT)left, (FX_FLOAT)bottom, (FX_FLOAT)right,
200 (FX_FLOAT)top);
201 CFX_WideString str = textpage->GetTextByRect(rect);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700202
dsinclaira28ae382016-04-19 10:39:24 -0700203 if (buflen <= 0 || !buffer)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700204 return str.GetLength();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700205
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700206 CFX_ByteString cbUTF16Str = str.UTF16LE_Encode();
207 int len = cbUTF16Str.GetLength() / sizeof(unsigned short);
208 int size = buflen > len ? len : buflen;
209 FXSYS_memcpy(buffer, cbUTF16Str.GetBuffer(size * sizeof(unsigned short)),
210 size * sizeof(unsigned short));
211 cbUTF16Str.ReleaseBuffer(size * sizeof(unsigned short));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700212
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 return size;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700214}
215
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700216// Search
Dan Sinclair50cce602016-02-24 09:51:16 -0500217// -1 for end
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700218DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page,
219 FPDF_WIDESTRING findwhat,
220 unsigned long flags,
221 int start_index) {
222 if (!text_page)
dsinclaira28ae382016-04-19 10:39:24 -0700223 return nullptr;
224
225 CPDF_TextPageFind* textpageFind =
226 new CPDF_TextPageFind(CPDFTextPageFromFPDFTextPage(text_page));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700227 FX_STRSIZE len = CFX_WideString::WStringLength(findwhat);
228 textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat, len), flags,
229 start_index);
230 return textpageFind;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700231}
dsinclaira28ae382016-04-19 10:39:24 -0700232
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700233DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle) {
234 if (!handle)
tsepez4cf55152016-11-02 14:37:54 -0700235 return false;
dsinclaira28ae382016-04-19 10:39:24 -0700236
237 CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238 return textpageFind->FindNext();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700239}
dsinclaira28ae382016-04-19 10:39:24 -0700240
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700241DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle) {
242 if (!handle)
tsepez4cf55152016-11-02 14:37:54 -0700243 return false;
dsinclaira28ae382016-04-19 10:39:24 -0700244
245 CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700246 return textpageFind->FindPrev();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700247}
dsinclaira28ae382016-04-19 10:39:24 -0700248
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700249DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle) {
250 if (!handle)
251 return 0;
dsinclaira28ae382016-04-19 10:39:24 -0700252
253 CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700254 return textpageFind->GetCurOrder();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700255}
dsinclaira28ae382016-04-19 10:39:24 -0700256
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700257DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle) {
258 if (!handle)
259 return 0;
dsinclaira28ae382016-04-19 10:39:24 -0700260
261 CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700262 return textpageFind->GetMatchedCount();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700263}
dsinclaira28ae382016-04-19 10:39:24 -0700264
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700265DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle) {
266 if (!handle)
267 return;
dsinclaira28ae382016-04-19 10:39:24 -0700268
269 CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700270 delete textpageFind;
dsinclaira28ae382016-04-19 10:39:24 -0700271 handle = nullptr;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700272}
273
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700274// web link
275DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page) {
276 if (!text_page)
dsinclaira28ae382016-04-19 10:39:24 -0700277 return nullptr;
278
tsepez69141182016-04-21 10:43:39 -0700279 CPDF_LinkExtract* pageLink =
280 new CPDF_LinkExtract(CPDFTextPageFromFPDFTextPage(text_page));
281 pageLink->ExtractLinks();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700282 return pageLink;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700283}
dsinclaira28ae382016-04-19 10:39:24 -0700284
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700285DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page) {
286 if (!link_page)
287 return 0;
dsinclaira28ae382016-04-19 10:39:24 -0700288
289 CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page);
tsepez69141182016-04-21 10:43:39 -0700290 return pdfium::base::checked_cast<int>(pageLink->CountLinks());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700291}
dsinclaira28ae382016-04-19 10:39:24 -0700292
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700293DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page,
294 int link_index,
295 unsigned short* buffer,
296 int buflen) {
tsepez69141182016-04-21 10:43:39 -0700297 CFX_WideString wsUrl(L"");
298 if (link_page && link_index >= 0) {
299 CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page);
300 wsUrl = pageLink->GetURL(link_index);
301 }
302 CFX_ByteString cbUTF16URL = wsUrl.UTF16LE_Encode();
303 int required = cbUTF16URL.GetLength() / sizeof(unsigned short);
Lei Zhang412e9082015-12-14 18:34:00 -0800304 if (!buffer || buflen <= 0)
tsepez69141182016-04-21 10:43:39 -0700305 return required;
dsinclaira28ae382016-04-19 10:39:24 -0700306
tsepez69141182016-04-21 10:43:39 -0700307 int size = std::min(required, buflen);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700308 if (size > 0) {
dsinclaira28ae382016-04-19 10:39:24 -0700309 int buf_size = size * sizeof(unsigned short);
310 FXSYS_memcpy(buffer, cbUTF16URL.GetBuffer(buf_size), buf_size);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700311 }
312 return size;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700313}
dsinclaira28ae382016-04-19 10:39:24 -0700314
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700315DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page,
316 int link_index) {
tsepez69141182016-04-21 10:43:39 -0700317 if (!link_page || link_index < 0)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700318 return 0;
dsinclaira28ae382016-04-19 10:39:24 -0700319
320 CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page);
tsepezdf964df2016-04-21 12:09:41 -0700321 return pdfium::CollectionSize<int>(pageLink->GetRects(link_index));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700322}
dsinclaira28ae382016-04-19 10:39:24 -0700323
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700324DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,
325 int link_index,
326 int rect_index,
327 double* left,
328 double* top,
329 double* right,
330 double* bottom) {
tsepez69141182016-04-21 10:43:39 -0700331 if (!link_page || link_index < 0 || rect_index < 0)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700332 return;
dsinclaira28ae382016-04-19 10:39:24 -0700333
tsepez69141182016-04-21 10:43:39 -0700334 CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page);
tsepezdf964df2016-04-21 12:09:41 -0700335 std::vector<CFX_FloatRect> rectArray = pageLink->GetRects(link_index);
336 if (rect_index >= pdfium::CollectionSize<int>(rectArray))
tsepez69141182016-04-21 10:43:39 -0700337 return;
338
tsepezdf964df2016-04-21 12:09:41 -0700339 *left = rectArray[rect_index].left;
340 *right = rectArray[rect_index].right;
341 *top = rectArray[rect_index].top;
342 *bottom = rectArray[rect_index].bottom;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700343}
tsepez69141182016-04-21 10:43:39 -0700344
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700345DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) {
dsinclaira28ae382016-04-19 10:39:24 -0700346 delete CPDFLinkExtractFromFPDFPageLink(link_page);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700347}