Use override in more classes in core/
[pdfium.git] / core / src / fpdfdoc / doc_link.cpp
1 // 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.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../include/fpdfdoc/fpdf_doc.h"
8
9 CPDF_LinkList::~CPDF_LinkList() {
10   FX_POSITION pos = m_PageMap.GetStartPosition();
11   while (pos) {
12     void* key;
13     void* value;
14     m_PageMap.GetNextAssoc(pos, key, value);
15     delete (CFX_PtrArray*)value;
16   }
17 }
18 CFX_PtrArray* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage) {
19   FX_DWORD objnum = pPage->m_pFormDict->GetObjNum();
20   if (objnum == 0) {
21     return NULL;
22   }
23   CFX_PtrArray* pPageLinkList = NULL;
24   if (!m_PageMap.Lookup((void*)(uintptr_t)objnum, (void*&)pPageLinkList)) {
25     pPageLinkList = new CFX_PtrArray;
26     m_PageMap.SetAt((void*)(uintptr_t)objnum, pPageLinkList);
27     LoadPageLinks(pPage, pPageLinkList);
28   }
29   return pPageLinkList;
30 }
31 int CPDF_LinkList::CountLinks(CPDF_Page* pPage) {
32   CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
33   if (pPageLinkList == NULL) {
34     return 0;
35   }
36   return pPageLinkList->GetSize();
37 }
38 CPDF_Link CPDF_LinkList::GetLink(CPDF_Page* pPage, int index) {
39   CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
40   if (!pPageLinkList) {
41     return CPDF_Link();
42   }
43   return CPDF_Link((CPDF_Dictionary*)pPageLinkList->GetAt(index));
44 }
45 CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage,
46                                         FX_FLOAT pdf_x,
47                                         FX_FLOAT pdf_y) {
48   CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
49   if (!pPageLinkList) {
50     return CPDF_Link();
51   }
52   int size = pPageLinkList->GetSize();
53   for (int i = size - 1; i >= 0; --i) {
54     CPDF_Link link((CPDF_Dictionary*)pPageLinkList->GetAt(i));
55     CPDF_Rect rect = link.GetRect();
56     if (rect.Contains(pdf_x, pdf_y)) {
57       return link;
58     }
59   }
60   return CPDF_Link();
61 }
62 void CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList) {
63   CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
64   if (pAnnotList == NULL) {
65     return;
66   }
67   for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i++) {
68     CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
69     if (pAnnot == NULL) {
70       continue;
71     }
72     if (pAnnot->GetString("Subtype") != "Link") {
73       continue;
74     }
75     pList->Add(pAnnot);
76   }
77 }
78 CPDF_Rect CPDF_Link::GetRect() {
79   return m_pDict->GetRect("Rect");
80 }
81 CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc) {
82   CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
83   if (pDest == NULL) {
84     return CPDF_Dest();
85   }
86   if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
87     CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
88     CFX_ByteStringC name = pDest->GetString();
89     return CPDF_Dest(name_tree.LookupNamedDest(pDoc, name));
90   }
91   if (pDest->GetType() == PDFOBJ_ARRAY) {
92     return CPDF_Dest((CPDF_Array*)pDest);
93   }
94   return CPDF_Dest();
95 }
96 CPDF_Action CPDF_Link::GetAction() {
97   return CPDF_Action(m_pDict->GetDict("A"));
98 }