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