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/fpdfdoc.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int this_module = 0; 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic CPDF_Bookmark FindBookmark(CPDF_BookmarkTree& tree, CPDF_Bookmark This, const CFX_WideString& title) 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (This != NULL) { 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // First check this item 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString this_title = This.GetTitle(); 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (this_title.CompareNoCase(title) == 0) 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return This; 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // go into children items 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Bookmark Child = tree.GetFirstChild(This); 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (Child != NULL) { 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // check if this item 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Bookmark Found = FindBookmark(tree, Child, title); 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Found) return Found; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Child = tree.GetNextSibling(Child); 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title) 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (document == NULL) return NULL; 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (title == NULL || title[0] == 0) return NULL; 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)document; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_BookmarkTree tree(pDoc); 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wstr = CFX_WideString::FromUTF16LE(title); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FindBookmark(tree, NULL, wstr); 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark) 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (document == NULL) return NULL; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bookmark == NULL) return NULL; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)document; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dest dest = Bookmark.GetDest(pDoc); 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest != NULL) return dest; 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // If this bookmark is not directly associated with a dest, we try to get action 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Action Action = Bookmark.GetAction(); 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Action == NULL) return NULL; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Action.GetDest(pDoc); 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark) 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bookmark == NULL) return NULL; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Bookmark.GetAction(); 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action) 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (action == NULL) return 0; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Action Action = (CPDF_Dictionary*)action; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Action::ActionType type = Action.GetType(); 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (type) { 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CPDF_Action::GoTo: 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFACTION_GOTO; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CPDF_Action::GoToR: 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFACTION_REMOTEGOTO; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CPDF_Action::URI: 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFACTION_URI; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case CPDF_Action::Launch: 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFACTION_LAUNCH; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFACTION_UNSUPPORTED; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return PDFACTION_UNSUPPORTED; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action) 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (document == NULL) return NULL; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (action == NULL) return NULL; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)document; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Action Action = (CPDF_Dictionary*)action; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Action.GetDest(pDoc); 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action, 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* buffer, unsigned long buflen) 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (document == NULL) return 0; 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (action == NULL) return 0; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)document; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Action Action = (CPDF_Dictionary*)action; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString path = Action.GetURI(pDoc); 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long len = path.GetLength() + 1; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (buffer != NULL && buflen >= len) 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy(buffer, (FX_LPCSTR)path, len); 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return len; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest) 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (document == NULL) return 0; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest == NULL) return 0; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)document; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dest Dest = (CPDF_Array*)dest; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Dest.GetPageIndex(pDoc); 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void ReleaseLinkList(FX_LPVOID data) 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (CPDF_LinkList*)data; 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y) 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (page == NULL) return NULL; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Page* pPage = (CPDF_Page*)page; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Link list is stored with the document 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = pPage->m_pDocument; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&this_module); 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pLinkList == NULL) { 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLinkList = FX_NEW CPDF_LinkList(pDoc); 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDoc->SetPrivateData(&this_module, pLinkList, ReleaseLinkList); 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y); 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (document == NULL) return NULL; 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)document; 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (link == NULL) return NULL; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Link Link = (CPDF_Dictionary*)link; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FPDF_DEST dest = Link.GetDest(pDoc); 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dest) return dest; 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // If this link is not directly associated with a dest, we try to get action 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Action Action = Link.GetAction(); 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Action == NULL) return NULL; 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Action.GetDest(pDoc); 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link) 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (link == NULL) return NULL; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Link Link = (CPDF_Dictionary*)link; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Link.GetAction(); 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot) 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!page || !startPos || !linkAnnot) 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Page* pPage = (CPDF_Page*)page; 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pPage->m_pFormDict) return FALSE; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots"); 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pAnnots) return FALSE; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = *startPos; i < (int)pAnnots->GetCount(); i ++) { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) continue; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pDict->GetString(FX_BSTRC("Subtype")).Equal(FX_BSTRC("Link"))) 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *startPos = i+1; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *linkAnnot = (FPDF_LINK)pDict; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect) 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!linkAnnot || !rect) 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot; 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC("Rect")); 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect->left = rt.left; 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect->bottom = rt.bottom; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect->right = rt.right; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect->top = rt.top; 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot) 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!linkAnnot) 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints")); 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray == NULL) 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pArray->GetCount() / 8; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints) 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!linkAnnot || !quadPoints) 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot; 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints")); 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pArray) { 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (0 > quadIndex || quadIndex >= (int)pArray->GetCount()/8 || 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((quadIndex*8+7) >= (int)pArray->GetCount())) return FALSE; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->x1 = pArray->GetNumber(quadIndex*8); 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->y1 = pArray->GetNumber(quadIndex*8+1); 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->x2 = pArray->GetNumber(quadIndex*8+2); 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->y2 = pArray->GetNumber(quadIndex*8+3); 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->x3 = pArray->GetNumber(quadIndex*8+4); 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->y3 = pArray->GetNumber(quadIndex*8+5); 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->x4 = pArray->GetNumber(quadIndex*8+6); 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quadPoints->y4 = pArray->GetNumber(quadIndex*8+7); 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag, 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* buffer, unsigned long buflen) 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (doc == NULL || tag == NULL) return 0; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDoc = (CPDF_Document*)doc; 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Get info dictionary 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pInfo = pDoc->GetInfo(); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pInfo == NULL) return 0; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString text = pInfo->GetUnicodeText(tag); 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Use UTF-16LE encoding 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString bstr = text.UTF16LE_Encode(); 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long len = bstr.GetLength(); 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (buffer != NULL || buflen >= len+2) { 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy(buffer, (FX_LPCSTR)bstr, len); 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // use double zero as trailer 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FX_BYTE*)buffer)[len] = ((FX_BYTE*)buffer)[len+1] = 0; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return len+2; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 260