| // Copyright 2014 PDFium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| #include "../../include/fpdfdoc/fpdf_doc.h" | |
| CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent) | |
| { | |
| if (Parent.m_pDict == NULL) { | |
| CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict("Outlines"); | |
| if (pRoot == NULL) { | |
| return NULL; | |
| } | |
| return pRoot->GetDict("First"); | |
| } | |
| return Parent.m_pDict->GetDict("First"); | |
| } | |
| CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This) | |
| { | |
| if (This.m_pDict == NULL) { | |
| return NULL; | |
| } | |
| CPDF_Dictionary *pNext = This.m_pDict->GetDict("Next"); | |
| return pNext == This.m_pDict ? NULL : pNext; | |
| } | |
| FX_DWORD CPDF_Bookmark::GetColorRef() | |
| { | |
| if (!m_pDict) { | |
| return 0; | |
| } | |
| CPDF_Array* pColor = m_pDict->GetArray("C"); | |
| if (pColor == NULL) { | |
| return FXSYS_RGB(0, 0, 0); | |
| } | |
| int r = FXSYS_round(pColor->GetNumber(0) * 255); | |
| int g = FXSYS_round(pColor->GetNumber(1) * 255); | |
| int b = FXSYS_round(pColor->GetNumber(2) * 255); | |
| return FXSYS_RGB(r, g, b); | |
| } | |
| FX_DWORD CPDF_Bookmark::GetFontStyle() | |
| { | |
| if (!m_pDict) { | |
| return 0; | |
| } | |
| return m_pDict->GetInteger("F"); | |
| } | |
| CFX_WideString CPDF_Bookmark::GetTitle() | |
| { | |
| if (!m_pDict) { | |
| return CFX_WideString(); | |
| } | |
| CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue("Title"); | |
| if (pString == NULL || pString->GetType() != PDFOBJ_STRING) { | |
| return CFX_WideString(); | |
| } | |
| CFX_WideString title = pString->GetUnicodeText(); | |
| FX_LPWSTR buf = title.LockBuffer(); | |
| int len = title.GetLength(), i; | |
| for (i = 0; i < len; i ++) | |
| if (buf[i] < 0x20) { | |
| buf[i] = 0x20; | |
| } | |
| title.ReleaseBuffer(len); | |
| return title; | |
| } | |
| CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument) | |
| { | |
| if (!m_pDict) { | |
| return NULL; | |
| } | |
| CPDF_Object* pDest = m_pDict->GetElementValue("Dest"); | |
| if (pDest == NULL) { | |
| return NULL; | |
| } | |
| if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) { | |
| CPDF_NameTree name_tree(pDocument, FX_BSTRC("Dests")); | |
| CFX_ByteStringC name = pDest->GetString(); | |
| return name_tree.LookupNamedDest(pDocument, name); | |
| } else if (pDest->GetType() == PDFOBJ_ARRAY) { | |
| return (CPDF_Array*)pDest; | |
| } | |
| return NULL; | |
| } | |
| CPDF_Action CPDF_Bookmark::GetAction() | |
| { | |
| if (!m_pDict) { | |
| return NULL; | |
| } | |
| return m_pDict->GetDict("A"); | |
| } |