Home | History | Annotate | Download | only in fpdfdoc
      1 // Copyright 2017 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 #ifndef CORE_FPDFDOC_CPDF_STRUCTELEMENT_H_
      8 #define CORE_FPDFDOC_CPDF_STRUCTELEMENT_H_
      9 
     10 #include <vector>
     11 
     12 #include "core/fxcrt/fx_string.h"
     13 #include "core/fxcrt/retain_ptr.h"
     14 #include "core/fxcrt/unowned_ptr.h"
     15 #include "core/fxge/fx_dib.h"
     16 
     17 class CPDF_Dictionary;
     18 class CPDF_Object;
     19 class CPDF_StructElement;
     20 class CPDF_StructTree;
     21 
     22 class CPDF_StructKid {
     23  public:
     24   CPDF_StructKid();
     25   CPDF_StructKid(const CPDF_StructKid& that);
     26   ~CPDF_StructKid();
     27 
     28   enum { Invalid, Element, PageContent, StreamContent, Object } m_Type;
     29 
     30   RetainPtr<CPDF_StructElement> m_pElement;      // For Element.
     31   UnownedPtr<CPDF_Dictionary> m_pDict;           // For Element.
     32   uint32_t m_PageObjNum;  // For PageContent, StreamContent, Object.
     33   uint32_t m_RefObjNum;   // For StreamContent, Object.
     34   uint32_t m_ContentId;   // For PageContent, StreamContent.
     35 };
     36 
     37 class CPDF_StructElement : public Retainable {
     38  public:
     39   template <typename T, typename... Args>
     40   friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
     41 
     42   const ByteString& GetType() const { return m_Type; }
     43   const ByteString& GetTitle() const { return m_Title; }
     44   CPDF_Dictionary* GetDict() const { return m_pDict.Get(); }
     45 
     46   size_t CountKids() const;
     47   CPDF_StructElement* GetKidIfElement(size_t index) const;
     48   std::vector<CPDF_StructKid>* GetKids() { return &m_Kids; }
     49 
     50  private:
     51   CPDF_StructElement(CPDF_StructTree* pTree,
     52                      CPDF_StructElement* pParent,
     53                      CPDF_Dictionary* pDict);
     54   ~CPDF_StructElement() override;
     55 
     56   void LoadKids(CPDF_Dictionary* pDict);
     57   void LoadKid(uint32_t PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
     58 
     59   UnownedPtr<CPDF_StructTree> const m_pTree;
     60   UnownedPtr<CPDF_StructElement> const m_pParent;
     61   UnownedPtr<CPDF_Dictionary> const m_pDict;
     62   ByteString m_Type;
     63   ByteString m_Title;
     64   std::vector<CPDF_StructKid> m_Kids;
     65 };
     66 
     67 #endif  // CORE_FPDFDOC_CPDF_STRUCTELEMENT_H_
     68