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/fpdfdoc/fpdf_doc.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent)
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (Parent.m_pDict == NULL) {
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict("Outlines");
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pRoot == NULL) {
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRoot->GetDict("First");
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return Parent.m_pDict->GetDict("First");
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This)
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (This.m_pDict == NULL) {
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary *pNext = This.m_pDict->GetDict("Next");
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pNext == This.m_pDict ? NULL : pNext;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Bookmark::GetColorRef()
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDict) {
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pColor = m_pDict->GetArray("C");
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pColor == NULL) {
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_RGB(0, 0, 0);
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int r = FXSYS_round(pColor->GetNumber(0) * 255);
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int g = FXSYS_round(pColor->GetNumber(1) * 255);
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int b = FXSYS_round(pColor->GetNumber(2) * 255);
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FXSYS_RGB(r, g, b);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Bookmark::GetFontStyle()
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDict) {
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pDict->GetInteger("F");
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CPDF_Bookmark::GetTitle()
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDict) {
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_WideString();
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue("Title");
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pString == NULL || pString->GetType() != PDFOBJ_STRING) {
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_WideString();
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString title = pString->GetUnicodeText();
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPWSTR buf = title.LockBuffer();
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int len = title.GetLength(), i;
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i < len; i ++)
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (buf[i] < 0x20) {
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            buf[i] = 0x20;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    title.ReleaseBuffer(len);
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return title;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument)
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDict) {
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDest == NULL) {
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_NameTree name_tree(pDocument, FX_BSTRC("Dests"));
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteStringC name = pDest->GetString();
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return name_tree.LookupNamedDest(pDocument, name);
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (pDest->GetType() == PDFOBJ_ARRAY) {
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Array*)pDest;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Action CPDF_Bookmark::GetAction()
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDict) {
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pDict->GetDict("A");
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
92