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