Add type cast definitions for CPDF_Stream.
[pdfium.git] / core / include / fpdfapi / fpdf_objects.h
index ec052af..45ca665 100644 (file)
 // 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
 
-#ifndef _FPDF_OBJECTS_
-#define _FPDF_OBJECTS_
-#ifndef _FXCRT_EXTENSION_
-#include "../fxcrt/fx_ext.h"
-#endif
+#ifndef CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_
+#define CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_
+
+#include "../fxcrt/fx_coordinates.h"
+#include "../fxcrt/fx_system.h"
+
+class CPDF_Array;
+class CPDF_Boolean;
+class CPDF_CryptoHandler;
+class CPDF_Dictionary;
 class CPDF_Document;
 class CPDF_IndirectObjects;
+class CPDF_Name;
 class CPDF_Null;
-class CPDF_Boolean;
 class CPDF_Number;
-class CPDF_String;
+class CPDF_Parser;
+class CPDF_Reference;
 class CPDF_Stream;
 class CPDF_StreamAcc;
 class CPDF_StreamFilter;
-class CPDF_Array;
-class CPDF_Dictionary;
-class CPDF_Reference;
-class IPDF_DocParser;
+class CPDF_String;
 class IFX_FileRead;
-class CPDF_CryptoHandler;
-#define PDFOBJ_INVALID         0
-#define        PDFOBJ_BOOLEAN          1
-#define PDFOBJ_NUMBER          2
-#define PDFOBJ_STRING          3
-#define PDFOBJ_NAME                    4
-#define PDFOBJ_ARRAY           5
-#define PDFOBJ_DICTIONARY      6
-#define PDFOBJ_STREAM          7
-#define PDFOBJ_NULL                    8
-#define PDFOBJ_REFERENCE       9
-typedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream *pStream, FX_LPVOID pUserData);
-class CPDF_Object : public CFX_Object
-{
-public:
-
-    int                                                GetType() const
-    {
-        return m_Type;
-    }
-
-    FX_DWORD                           GetObjNum() const
-    {
-        return m_ObjNum;
-    }
-
-    FX_DWORD                            GetGenNum() const
-    {
-        return m_GenNum;
-    }
-
-    FX_BOOL                                    IsIdentical(CPDF_Object* pObj) const;
-
-    CPDF_Object*                       Clone(FX_BOOL bDirect = FALSE) const;
-
-    CPDF_Object*                       CloneRef(CPDF_IndirectObjects* pObjs) const;
-
-    CPDF_Object*                       GetDirect() const;
-
-    void                                       Release();
-
-    CFX_ByteString                     GetString() const;
-
-    CFX_ByteStringC                    GetConstString() const;
-
-    CFX_WideString                     GetUnicodeText(CFX_CharMap* pCharMap = NULL) const;
 
-    FX_FLOAT                           GetNumber() const;
+#define PDFOBJ_INVALID 0
+#define PDFOBJ_BOOLEAN 1
+#define PDFOBJ_NUMBER 2
+#define PDFOBJ_STRING 3
+#define PDFOBJ_NAME 4
+#define PDFOBJ_ARRAY 5
+#define PDFOBJ_DICTIONARY 6
+#define PDFOBJ_STREAM 7
+#define PDFOBJ_NULL 8
+#define PDFOBJ_REFERENCE 9
 
-    FX_FLOAT                           GetNumber16() const;
+class CPDF_Object {
+ public:
+  int GetType() const { return m_Type; }
 
-    int                                                GetInteger() const;
+  FX_DWORD GetObjNum() const { return m_ObjNum; }
 
-    CPDF_Dictionary*           GetDict() const;
+  FX_DWORD GetGenNum() const { return m_GenNum; }
 
-    CPDF_Array*                                GetArray() const;
+  FX_BOOL IsIdentical(CPDF_Object* pObj) const;
 
-    void                                       SetString(const CFX_ByteString& str);
+  CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const;
 
-    void                                       SetUnicodeText(FX_LPCWSTR pUnicodes, int len = -1);
+  CPDF_Object* CloneRef(CPDF_IndirectObjects* pObjs) const;
 
-    int                                                GetDirectType() const;
+  CPDF_Object* GetDirect() const;
 
-    FX_BOOL                                    IsModified() const
-    {
-        return FALSE;
-    }
-protected:
-    FX_DWORD                           m_Type;
-    CPDF_Object()
-    {
-        m_ObjNum = 0;
-        m_GenNum = 0;
-    }
+  void Release();
 
-    FX_DWORD                           m_ObjNum;
-    FX_DWORD                           m_GenNum;
+  CFX_ByteString GetString() const;
 
-    void                                       Destroy();
+  CFX_ByteStringC GetConstString() const;
 
+  CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = NULL) const;
+  FX_FLOAT GetNumber() const;
 
-    ~CPDF_Object() {}
-    friend class                       CPDF_IndirectObjects;
-    friend class                       CPDF_Parser;
-    friend class                       CPDF_SyntaxParser;
-private:
-    CPDF_Object(const CPDF_Object& src) {}
-    CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;
-};
-class CPDF_Boolean : public CPDF_Object
-{
-public:
-
-    static CPDF_Boolean*       Create(FX_BOOL value)
-    {
-        return FX_NEW CPDF_Boolean(value);
-    }
-
-    CPDF_Boolean()
-    {
-        m_Type = PDFOBJ_BOOLEAN;
-    }
-
-    CPDF_Boolean(FX_BOOL value)
-    {
-        m_Type = PDFOBJ_BOOLEAN;
-        m_bValue = value;
-    }
-
-    FX_BOOL                                    Identical(CPDF_Boolean* pOther) const
-    {
-        return m_bValue == pOther->m_bValue;
-    }
-protected:
-
-    FX_BOOL                                    m_bValue;
-    friend class                       CPDF_Object;
-};
-class CPDF_Number : public CPDF_Object
-{
-public:
-
-    static CPDF_Number*                Create(int value)
-    {
-        return FX_NEW CPDF_Number(value);
-    }
-
-    static CPDF_Number*                Create(FX_FLOAT value)
-    {
-        return FX_NEW CPDF_Number(value);
-    }
+  FX_FLOAT GetNumber16() const;
 
-    static CPDF_Number*                Create(FX_BSTR str)
-    {
-        return FX_NEW CPDF_Number(str);
-    }
+  int GetInteger() const;
 
-    static CPDF_Number*                Create(FX_BOOL bInteger, void* pData)
-    {
-        return FX_NEW CPDF_Number(bInteger, pData);
-    }
+  CPDF_Dictionary* GetDict() const;
 
-    CPDF_Number(): m_Integer(0) 
-    {
-        m_Type = PDFOBJ_NUMBER;
-    } 
+  CPDF_Array* GetArray() const;
 
-    CPDF_Number(FX_BOOL bInteger, void* pData);
+  void SetString(const CFX_ByteString& str);
 
-    CPDF_Number(int value);
+  void SetUnicodeText(const FX_WCHAR* pUnicodes, int len = -1);
 
-    CPDF_Number(FX_FLOAT value);
+  int GetDirectType() const;
 
-    CPDF_Number(FX_BSTR str);
+  FX_BOOL IsModified() const { return FALSE; }
 
-    FX_BOOL                                    Identical(CPDF_Number* pOther) const;
+  bool IsArray() const { return m_Type == PDFOBJ_ARRAY; }
+  bool IsBoolean() const { return m_Type == PDFOBJ_BOOLEAN; }
+  bool IsDictionary() const { return m_Type == PDFOBJ_DICTIONARY; }
+  bool IsName() const { return m_Type == PDFOBJ_NAME; }
+  bool IsNumber() const { return m_Type == PDFOBJ_NUMBER; }
+  bool IsStream() const { return m_Type == PDFOBJ_STREAM; }
+  bool IsString() const { return m_Type == PDFOBJ_STRING; }
 
-    CFX_ByteString                     GetString() const;
+  CPDF_Array* AsArray();
+  const CPDF_Array* AsArray() const;
 
-    void                                       SetString(FX_BSTR str);
+  CPDF_Boolean* AsBoolean();
+  const CPDF_Boolean* AsBoolean() const;
 
-    FX_BOOL                                    IsInteger() const
-    {
-        return m_bInteger;
-    }
+  CPDF_Dictionary* AsDictionary();
+  const CPDF_Dictionary* AsDictionary() const;
 
-    int                                                GetInteger() const
-    {
-        return m_bInteger ? m_Integer : (int)m_Float;
-    }
+  CPDF_Name* AsName();
+  const CPDF_Name* AsName() const;
 
-    FX_FLOAT                           GetNumber() const
-    {
-        return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
-    }
+  CPDF_Number* AsNumber();
+  const CPDF_Number* AsNumber() const;
 
-    void                                       SetNumber(FX_FLOAT value);
+  CPDF_Stream* AsStream();
+  const CPDF_Stream* AsStream() const;
 
-    FX_FLOAT                   GetNumber16() const
-    {
-        return GetNumber();
-    }
+  CPDF_String* AsString();
+  const CPDF_String* AsString() const;
 
-    FX_FLOAT                           GetFloat() const
-    {
-        return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
-    }
-protected:
+ protected:
+  CPDF_Object(FX_DWORD type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
+  ~CPDF_Object() {}
+  void Destroy();
 
-    FX_BOOL                                    m_bInteger;
+  static const int OBJECT_REF_MAX_DEPTH = 128;
+  static int s_nCurRefDepth;
+  FX_DWORD m_Type;
+  FX_DWORD m_ObjNum;
+  FX_DWORD m_GenNum;
 
-    union {
+  friend class CPDF_IndirectObjects;
+  friend class CPDF_Parser;
+  friend class CPDF_SyntaxParser;
 
-        int                                    m_Integer;
-
-        FX_FLOAT                       m_Float;
-    };
-    friend class                       CPDF_Object;
-};
-class CPDF_String : public CPDF_Object
-{
-public:
-
-    static CPDF_String*                Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE)
-    {
-        return FX_NEW CPDF_String(str, bHex);
-    }
-
-    static CPDF_String*                Create(const CFX_WideString& str)
-    {
-        return FX_NEW CPDF_String(str);
-    }
-
-    CPDF_String()
-    {
-        m_Type = PDFOBJ_STRING;
-        m_bHex = FALSE;
-    }
-
-    CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE) : m_String(str)
-    {
-        m_Type = PDFOBJ_STRING;
-        m_bHex = bHex;
-    }
-
-    CPDF_String(const CFX_WideString& str);
-
-    CFX_ByteString&                    GetString()
-    {
-        return m_String;
-    }
-
-    FX_BOOL                                    Identical(CPDF_String* pOther) const
-    {
-        return m_String == pOther->m_String;
-    }
-
-    FX_BOOL                                    IsHex() const
-    {
-        return m_bHex;
-    }
-protected:
-
-    CFX_ByteString                     m_String;
-
-    FX_BOOL                                    m_bHex;
-    friend class                       CPDF_Object;
-};
-class CPDF_Name : public CPDF_Object
-{
-public:
-
-    static CPDF_Name*          Create(const CFX_ByteString& str)
-    {
-        return FX_NEW CPDF_Name(str);
-    }
-
-    static CPDF_Name*          Create(FX_BSTR str)
-    {
-        return FX_NEW CPDF_Name(str);
-    }
-
-    static CPDF_Name*          Create(FX_LPCSTR str)
-    {
-        return FX_NEW CPDF_Name(str);
-    }
-
-    CPDF_Name(const CFX_ByteString& str) : m_Name(str)
-    {
-        m_Type = PDFOBJ_NAME;
-    }
-
-    CPDF_Name(FX_BSTR str) : m_Name(str)
-    {
-        m_Type = PDFOBJ_NAME;
-    }
-
-    CPDF_Name(FX_LPCSTR str) : m_Name(str)
-    {
-        m_Type = PDFOBJ_NAME;
-    }
-
-    CFX_ByteString&                    GetString()
-    {
-        return m_Name;
-    }
-
-    FX_BOOL                                    Identical(CPDF_Name* pOther) const
-    {
-        return m_Name == pOther->m_Name;
-    }
-protected:
-
-    CFX_ByteString                     m_Name;
-    friend class                       CPDF_Object;
+ private:
+  CPDF_Object(const CPDF_Object& src) {}
+  CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;
 };
-class CPDF_Array : public CPDF_Object
-{
-public:
+class CPDF_Boolean : public CPDF_Object {
+ public:
+  static CPDF_Boolean* Create(FX_BOOL value) { return new CPDF_Boolean(value); }
 
-    static CPDF_Array*         Create()
-    {
-        return FX_NEW CPDF_Array();
-    }
+  CPDF_Boolean() : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(false) {}
+  CPDF_Boolean(FX_BOOL value) : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(value) {}
 
-    CPDF_Array()
-    {
-        m_Type = PDFOBJ_ARRAY;
-    }
+  FX_BOOL Identical(CPDF_Boolean* pOther) const {
+    return m_bValue == pOther->m_bValue;
+  }
 
-    FX_DWORD                           GetCount() const
-    {
-        return m_Objects.GetSize();
-    }
-
-    CPDF_Object*                       GetElement(FX_DWORD index) const;
-
-    CPDF_Object*                       GetElementValue(FX_DWORD index) const;
+ protected:
+  FX_BOOL m_bValue;
+  friend class CPDF_Object;
+};
+inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) {
+  return obj ? obj->AsBoolean() : nullptr;
+}
+inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) {
+  return obj ? obj->AsBoolean() : nullptr;
+}
 
+class CPDF_Number : public CPDF_Object {
+ public:
+  static CPDF_Number* Create(int value) { return new CPDF_Number(value); }
 
+  static CPDF_Number* Create(FX_FLOAT value) { return new CPDF_Number(value); }
 
-    CFX_AffineMatrix           GetMatrix();
+  static CPDF_Number* Create(const CFX_ByteStringC& str) {
+    return new CPDF_Number(str);
+  }
 
-    CFX_FloatRect                      GetRect();
+  CPDF_Number() : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(0) {}
 
+  CPDF_Number(int value);
 
+  CPDF_Number(FX_FLOAT value);
 
+  CPDF_Number(const CFX_ByteStringC& str);
 
-    CFX_ByteString                     GetString(FX_DWORD index) const;
+  FX_BOOL Identical(CPDF_Number* pOther) const;
 
-    CFX_ByteStringC                    GetConstString(FX_DWORD index) const;
+  CFX_ByteString GetString() const;
 
-    int                                                GetInteger(FX_DWORD index) const;
+  void SetString(const CFX_ByteStringC& str);
 
-    FX_FLOAT                           GetNumber(FX_DWORD index) const;
+  FX_BOOL IsInteger() const { return m_bInteger; }
 
-    CPDF_Dictionary*           GetDict(FX_DWORD index) const;
+  int GetInteger() const { return m_bInteger ? m_Integer : (int)m_Float; }
 
-    CPDF_Stream*                       GetStream(FX_DWORD index) const;
+  FX_FLOAT GetNumber() const {
+    return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
+  }
 
-    CPDF_Array*                                GetArray(FX_DWORD index) const;
+  void SetNumber(FX_FLOAT value);
 
-    FX_FLOAT                           GetFloat(FX_DWORD index) const
-    {
-        return GetNumber(index);
-    }
+  FX_FLOAT GetNumber16() const { return GetNumber(); }
 
+  FX_FLOAT GetFloat() const {
+    return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
+  }
 
+ protected:
+  FX_BOOL m_bInteger;
 
+  union {
+    int m_Integer;
 
-    void                                       SetAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+    FX_FLOAT m_Float;
+  };
+  friend class CPDF_Object;
+};
+inline CPDF_Number* ToNumber(CPDF_Object* obj) {
+  return obj ? obj->AsNumber() : nullptr;
+}
+inline const CPDF_Number* ToNumber(const CPDF_Object* obj) {
+  return obj ? obj->AsNumber() : nullptr;
+}
 
+class CPDF_String : public CPDF_Object {
+ public:
+  static CPDF_String* Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE) {
+    return new CPDF_String(str, bHex);
+  }
 
-    void                                       InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+  static CPDF_String* Create(const CFX_WideString& str) {
+    return new CPDF_String(str);
+  }
 
-    void                                       RemoveAt(FX_DWORD index);
+  CPDF_String() : CPDF_Object(PDFOBJ_STRING), m_bHex(FALSE) {}
 
+  CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE)
+      : CPDF_Object(PDFOBJ_STRING), m_String(str), m_bHex(bHex) {}
 
-    void                                       Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+  CPDF_String(const CFX_WideString& str);
 
+  CFX_ByteString& GetString() { return m_String; }
 
+  FX_BOOL Identical(CPDF_String* pOther) const {
+    return m_String == pOther->m_String;
+  }
 
-    void                                       AddNumber(FX_FLOAT f);
+  FX_BOOL IsHex() const { return m_bHex; }
 
-    void                                       AddInteger(int i);
+ protected:
+  CFX_ByteString m_String;
 
-    void                                       AddString(const CFX_ByteString& str);
+  FX_BOOL m_bHex;
+  friend class CPDF_Object;
+};
+inline CPDF_String* ToString(CPDF_Object* obj) {
+  return obj ? obj->AsString() : nullptr;
+}
+inline const CPDF_String* ToString(const CPDF_Object* obj) {
+  return obj ? obj->AsString() : nullptr;
+}
+
+class CPDF_Name : public CPDF_Object {
+ public:
+  static CPDF_Name* Create(const CFX_ByteString& str) {
+    return new CPDF_Name(str);
+  }
+
+  static CPDF_Name* Create(const CFX_ByteStringC& str) {
+    return new CPDF_Name(str);
+  }
+
+  static CPDF_Name* Create(const FX_CHAR* str) { return new CPDF_Name(str); }
+
+  CPDF_Name(const CFX_ByteString& str)
+      : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
+  CPDF_Name(const CFX_ByteStringC& str)
+      : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
+  CPDF_Name(const FX_CHAR* str) : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
+
+  CFX_ByteString& GetString() { return m_Name; }
+
+  FX_BOOL Identical(CPDF_Name* pOther) const {
+    return m_Name == pOther->m_Name;
+  }
+
+ protected:
+  CFX_ByteString m_Name;
+  friend class CPDF_Object;
+};
+inline CPDF_Name* ToName(CPDF_Object* obj) {
+  return obj ? obj->AsName() : nullptr;
+}
+inline const CPDF_Name* ToName(const CPDF_Object* obj) {
+  return obj ? obj->AsName() : nullptr;
+}
 
-    void                                       AddName(const CFX_ByteString& str);
+class CPDF_Array : public CPDF_Object {
+ public:
+  static CPDF_Array* Create() { return new CPDF_Array(); }
 
-    void                                       AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+  CPDF_Array() : CPDF_Object(PDFOBJ_ARRAY) {}
 
-    void                                       AddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj)
-    {
-        AddReference(pDoc, obj->GetObjNum());
-    }
+  FX_DWORD GetCount() const { return m_Objects.GetSize(); }
 
+  CPDF_Object* GetElement(FX_DWORD index) const;
 
-    FX_FLOAT                   GetNumber16(FX_DWORD index) const
-    {
-        return GetNumber(index);
-    }
+  CPDF_Object* GetElementValue(FX_DWORD index) const;
 
-    void                                       AddNumber16(FX_FLOAT value)
-    {
-        AddNumber(value);
-    }
+  CFX_AffineMatrix GetMatrix();
 
-    FX_BOOL                                    Identical(CPDF_Array* pOther) const;
-protected:
+  CFX_FloatRect GetRect();
 
-    ~CPDF_Array();
+  CFX_ByteString GetString(FX_DWORD index) const;
 
-    CFX_PtrArray                       m_Objects;
-    friend class                       CPDF_Object;
-};
-class CPDF_Dictionary : public CPDF_Object
-{
-public:
+  CFX_ByteStringC GetConstString(FX_DWORD index) const;
 
-    static CPDF_Dictionary*    Create()
-    {
-        return FX_NEW CPDF_Dictionary();
-    }
+  int GetInteger(FX_DWORD index) const;
 
-    CPDF_Dictionary()
-    {
-        m_Type = PDFOBJ_DICTIONARY;
-    }
+  FX_FLOAT GetNumber(FX_DWORD index) const;
 
+  CPDF_Dictionary* GetDict(FX_DWORD index) const;
 
+  CPDF_Stream* GetStream(FX_DWORD index) const;
 
-    CPDF_Object*                       GetElement(FX_BSTR key) const;
+  CPDF_Array* GetArray(FX_DWORD index) const;
 
-    CPDF_Object*                       GetElementValue(FX_BSTR key) const;
+  FX_FLOAT GetFloat(FX_DWORD index) const { return GetNumber(index); }
 
+  void SetAt(FX_DWORD index,
+             CPDF_Object* pObj,
+             CPDF_IndirectObjects* pObjs = NULL);
 
+  void InsertAt(FX_DWORD index,
+                CPDF_Object* pObj,
+                CPDF_IndirectObjects* pObjs = NULL);
 
+  void RemoveAt(FX_DWORD index);
 
+  void Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
 
-    CFX_ByteString                     GetString(FX_BSTR key) const;
+  void AddNumber(FX_FLOAT f);
 
-    CFX_ByteStringC                    GetConstString(FX_BSTR key) const;
+  void AddInteger(int i);
 
-    CFX_ByteString                     GetString(FX_BSTR key, FX_BSTR default_str) const;
+  void AddString(const CFX_ByteString& str);
 
-    CFX_ByteStringC                    GetConstString(FX_BSTR key, FX_BSTR default_str) const;
+  void AddName(const CFX_ByteString& str);
 
-    CFX_WideString                     GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap = NULL) const;
+  void AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
 
-    int                                                GetInteger(FX_BSTR key) const;
+  void AddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj) {
+    AddReference(pDoc, obj->GetObjNum());
+  }
 
-    int                                                GetInteger(FX_BSTR key, int default_int) const;
+  FX_FLOAT GetNumber16(FX_DWORD index) const { return GetNumber(index); }
 
-    FX_BOOL                                    GetBoolean(FX_BSTR key, FX_BOOL bDefault = FALSE) const;
+  void AddNumber16(FX_FLOAT value) { AddNumber(value); }
 
-    FX_FLOAT                           GetNumber(FX_BSTR key) const;
+  FX_BOOL Identical(CPDF_Array* pOther) const;
 
-    CPDF_Dictionary*           GetDict(FX_BSTR key) const;
+ protected:
+  ~CPDF_Array();
 
-    CPDF_Stream*                       GetStream(FX_BSTR key) const;
+  CFX_PtrArray m_Objects;
+  friend class CPDF_Object;
+};
+inline CPDF_Array* ToArray(CPDF_Object* obj) {
+  return obj ? obj->AsArray() : nullptr;
+}
+inline const CPDF_Array* ToArray(const CPDF_Object* obj) {
+  return obj ? obj->AsArray() : nullptr;
+}
 
-    CPDF_Array*                                GetArray(FX_BSTR key) const;
+class CPDF_Dictionary : public CPDF_Object {
+ public:
+  static CPDF_Dictionary* Create() { return new CPDF_Dictionary(); }
 
-    CFX_FloatRect                      GetRect(FX_BSTR key) const;
+  CPDF_Dictionary() : CPDF_Object(PDFOBJ_DICTIONARY) {}
 
-    CFX_AffineMatrix           GetMatrix(FX_BSTR key) const;
+  CPDF_Object* GetElement(const CFX_ByteStringC& key) const;
 
-    FX_FLOAT                           GetFloat(FX_BSTR key) const
-    {
-        return GetNumber(key);
-    }
+  CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const;
 
+  CFX_ByteString GetString(const CFX_ByteStringC& key) const;
 
-    FX_BOOL                                    KeyExist(FX_BSTR key) const;
+  CFX_ByteStringC GetConstString(const CFX_ByteStringC& key) const;
 
-    FX_POSITION                                GetStartPos() const;
+  CFX_ByteString GetString(const CFX_ByteStringC& key,
+                           const CFX_ByteStringC& default_str) const;
 
-    CPDF_Object*                       GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;
+  CFX_ByteStringC GetConstString(const CFX_ByteStringC& key,
+                                 const CFX_ByteStringC& default_str) const;
 
-    void                                       SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+  CFX_WideString GetUnicodeText(const CFX_ByteStringC& key,
+                                CFX_CharMap* pCharMap = NULL) const;
 
+  int GetInteger(const CFX_ByteStringC& key) const;
 
+  int GetInteger(const CFX_ByteStringC& key, int default_int) const;
 
-    void                                       SetAtName(FX_BSTR key, const CFX_ByteString& name);
+  FX_BOOL GetBoolean(const CFX_ByteStringC& key,
+                     FX_BOOL bDefault = FALSE) const;
 
+  FX_FLOAT GetNumber(const CFX_ByteStringC& key) const;
 
-    void                                       SetAtString(FX_BSTR key, const CFX_ByteString& string);
+  CPDF_Dictionary* GetDict(const CFX_ByteStringC& key) const;
 
+  CPDF_Stream* GetStream(const CFX_ByteStringC& key) const;
 
-    void                                       SetAtInteger(FX_BSTR key, int i);
+  CPDF_Array* GetArray(const CFX_ByteStringC& key) const;
 
+  CFX_FloatRect GetRect(const CFX_ByteStringC& key) const;
 
-    void                                       SetAtNumber(FX_BSTR key, FX_FLOAT f);
+  CFX_AffineMatrix GetMatrix(const CFX_ByteStringC& key) const;
 
-    void                                       SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+  FX_FLOAT GetFloat(const CFX_ByteStringC& key) const { return GetNumber(key); }
 
-    void                                       SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)
-    {
-        SetAtReference(key, pDoc, obj->GetObjNum());
-    }
+  FX_BOOL KeyExist(const CFX_ByteStringC& key) const;
 
-    void                                       AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+  FX_POSITION GetStartPos() const;
 
-    void                                       AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)
-    {
-        AddReference(key, pDoc, obj->GetObjNum());
-    }
+  CPDF_Object* GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;
 
-    void                                       SetAtRect(FX_BSTR key, const CFX_FloatRect& rect);
+  void SetAt(const CFX_ByteStringC& key,
+             CPDF_Object* pObj,
+             CPDF_IndirectObjects* pObjs = NULL);
 
-    void                                       SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix);
+  void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name);
 
-    void                                       SetAtBoolean(FX_BSTR key, FX_BOOL bValue);
+  void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string);
 
+  void SetAtInteger(const CFX_ByteStringC& key, int i);
 
+  void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f);
 
-    void                                       RemoveAt(FX_BSTR key);
+  void SetAtReference(const CFX_ByteStringC& key,
+                      CPDF_IndirectObjects* pDoc,
+                      FX_DWORD objnum);
 
+  void SetAtReference(const CFX_ByteStringC& key,
+                      CPDF_IndirectObjects* pDoc,
+                      CPDF_Object* obj) {
+    SetAtReference(key, pDoc, obj->GetObjNum());
+  }
 
-    void                                       ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey);
+  void AddReference(const CFX_ByteStringC& key,
+                    CPDF_IndirectObjects* pDoc,
+                    FX_DWORD objnum);
 
-    FX_BOOL                                    Identical(CPDF_Dictionary* pDict) const;
+  void AddReference(const CFX_ByteStringC& key,
+                    CPDF_IndirectObjects* pDoc,
+                    CPDF_Object* obj) {
+    AddReference(key, pDoc, obj->GetObjNum());
+  }
 
-    int                                                GetCount() const
-    {
-        return m_Map.GetCount();
-    }
+  void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect);
 
-    void                                       AddValue(FX_BSTR key, CPDF_Object* pObj);
-protected:
+  void SetAtMatrix(const CFX_ByteStringC& key, const CFX_AffineMatrix& matrix);
 
-    ~CPDF_Dictionary();
+  void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue);
 
-    CFX_CMapByteStringToPtr    m_Map;
+  void RemoveAt(const CFX_ByteStringC& key);
 
-    friend class                       CPDF_Object;
-};
-class CPDF_Stream : public CPDF_Object
-{
-public:
+  void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey);
 
-    static CPDF_Stream*                Create(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
-    {
-        return FX_NEW CPDF_Stream(pData, size, pDict);
-    }
+  FX_BOOL Identical(CPDF_Dictionary* pDict) const;
 
-    CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict);
+  int GetCount() const { return m_Map.GetCount(); }
 
-    CPDF_Dictionary*           GetDict() const
-    {
-        return m_pDict;
-    }
+  void AddValue(const CFX_ByteStringC& key, CPDF_Object* pObj);
 
-    void                                       SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf);
+ protected:
+  ~CPDF_Dictionary();
 
-    void                                       InitStream(FX_BYTE* pData, FX_DWORD size, CPDF_Dictionary* pDict);
+  CFX_CMapByteStringToPtr m_Map;
 
-    void                                       InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict);
+  friend class CPDF_Object;
+};
+inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) {
+  return obj ? obj->AsDictionary() : nullptr;
+}
+inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) {
+  return obj ? obj->AsDictionary() : nullptr;
+}
 
-    FX_BOOL                                    Identical(CPDF_Stream* pOther) const;
+class CPDF_Stream : public CPDF_Object {
+ public:
+  static CPDF_Stream* Create(uint8_t* pData,
+                             FX_DWORD size,
+                             CPDF_Dictionary* pDict) {
+    return new CPDF_Stream(pData, size, pDict);
+  }
 
-    CPDF_StreamFilter*         GetStreamFilter(FX_BOOL bRaw = FALSE) const;
+  CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict);
 
+  CPDF_Dictionary* GetDict() const { return m_pDict; }
 
+  void SetData(const uint8_t* pData,
+               FX_DWORD size,
+               FX_BOOL bCompressed,
+               FX_BOOL bKeepBuf);
 
-    FX_DWORD                           GetRawSize() const
-    {
-        return m_dwSize;
-    }
+  void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict);
 
-    FX_BOOL                                    ReadRawData(FX_FILESIZE start_pos, FX_LPBYTE pBuf, FX_DWORD buf_size) const;
+  void InitStream(IFX_FileRead* pFile, CPDF_Dictionary* pDict);
 
+  FX_BOOL Identical(CPDF_Stream* pOther) const;
 
-    FX_BOOL                                    IsMemoryBased() const
-    {
-        return m_GenNum == (FX_DWORD) - 1;
-    }
+  FX_DWORD GetRawSize() const { return m_dwSize; }
 
-    CPDF_Stream*                       Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const;
-protected:
+  FX_BOOL ReadRawData(FX_FILESIZE start_pos,
+                      uint8_t* pBuf,
+                      FX_DWORD buf_size) const;
 
-    ~CPDF_Stream();
+  FX_BOOL IsMemoryBased() const { return m_GenNum == (FX_DWORD)-1; }
 
-    CPDF_Dictionary*           m_pDict;
+ protected:
+  ~CPDF_Stream();
 
-    FX_DWORD                           m_dwSize;
+  CPDF_Dictionary* m_pDict;
 
-    FX_DWORD                           m_GenNum;
+  FX_DWORD m_dwSize;
 
-    union {
+  FX_DWORD m_GenNum;
 
-        FX_LPBYTE                      m_pDataBuf;
+  union {
+    uint8_t* m_pDataBuf;
 
-        IFX_FileRead*          m_pFile;
-    };
+    IFX_FileRead* m_pFile;
+  };
 
-    FX_FILESIZE                                m_FileOffset;
+  FX_FILESIZE m_FileOffset;
 
-    CPDF_CryptoHandler*                m_pCryptoHandler;
+  CPDF_CryptoHandler* m_pCryptoHandler;
 
-    void                                       InitStream(CPDF_Dictionary* pDict);
-    friend class                       CPDF_Object;
-    friend class                       CPDF_StreamAcc;
-    friend class                       CPDF_AttachmentAcc;
+  void InitStream(CPDF_Dictionary* pDict);
+  friend class CPDF_Object;
+  friend class CPDF_StreamAcc;
+  friend class CPDF_AttachmentAcc;
 };
-class CPDF_StreamAcc : public CFX_Object
-{
-public:
+inline CPDF_Stream* ToStream(CPDF_Object* obj) {
+  return obj ? obj->AsStream() : nullptr;
+}
+inline const CPDF_Stream* ToStream(const CPDF_Object* obj) {
+  return obj ? obj->AsStream() : nullptr;
+}
 
-    CPDF_StreamAcc();
+class CPDF_StreamAcc {
+ public:
+  CPDF_StreamAcc();
 
-    ~CPDF_StreamAcc();
+  ~CPDF_StreamAcc();
 
-    void                                       LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess = FALSE,
-                                        FX_DWORD estimated_size = 0, FX_BOOL bImageAcc = FALSE);
+  void LoadAllData(const CPDF_Stream* pStream,
+                   FX_BOOL bRawAccess = FALSE,
+                   FX_DWORD estimated_size = 0,
+                   FX_BOOL bImageAcc = FALSE);
 
-    const CPDF_Stream*         GetStream() const
-    {
-        return m_pStream;
-    }
+  const CPDF_Stream* GetStream() const { return m_pStream; }
 
-    CPDF_Dictionary*           GetDict() const
-    {
-        return m_pStream? m_pStream->GetDict() : NULL;
-    }
+  CPDF_Dictionary* GetDict() const {
+    return m_pStream ? m_pStream->GetDict() : NULL;
+  }
 
-    FX_LPCBYTE                         GetData() const;
+  const uint8_t* GetData() const;
 
-    FX_DWORD                           GetSize() const;
+  FX_DWORD GetSize() const;
 
-    FX_LPBYTE                          DetachData();
+  uint8_t* DetachData();
 
-    const CFX_ByteString&      GetImageDecoder()
-    {
-        return m_ImageDecoder;
-    }
+  const CFX_ByteString& GetImageDecoder() { return m_ImageDecoder; }
 
-    const CPDF_Dictionary*     GetImageParam()
-    {
-        return m_pImageParam;
-    }
-protected:
+  const CPDF_Dictionary* GetImageParam() { return m_pImageParam; }
 
-    FX_LPBYTE                          m_pData;
+ protected:
+  uint8_t* m_pData;
 
-    FX_DWORD                           m_dwSize;
+  FX_DWORD m_dwSize;
 
-    FX_BOOL                                    m_bNewBuf;
+  FX_BOOL m_bNewBuf;
 
-    CFX_ByteString                     m_ImageDecoder;
+  CFX_ByteString m_ImageDecoder;
 
-    CPDF_Dictionary*           m_pImageParam;
+  CPDF_Dictionary* m_pImageParam;
 
-    const CPDF_Stream*         m_pStream;
+  const CPDF_Stream* m_pStream;
 
-    FX_LPBYTE                          m_pSrcData;
+  uint8_t* m_pSrcData;
 };
-CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width = 0, int height = 0);
-#define FPDF_FILTER_BUFFER_SIZE                20480
-class CPDF_StreamFilter : public CFX_Object
-{
-public:
-
-    ~CPDF_StreamFilter();
-
-    FX_DWORD                   ReadBlock(FX_LPBYTE buffer, FX_DWORD size);
-
-    FX_DWORD                   GetSrcPos()
-    {
-        return m_SrcOffset;
-    }
 
-    const CPDF_Stream* GetStream()
-    {
-        return m_pStream;
-    }
-protected:
+class CPDF_Null : public CPDF_Object {
+ public:
+  static CPDF_Null* Create() { return new CPDF_Null(); }
 
-    CPDF_StreamFilter() {}
-
-    FX_DWORD                   ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size);
+  CPDF_Null() : CPDF_Object(PDFOBJ_NULL) {}
+};
+class CPDF_Reference : public CPDF_Object {
+ public:
+  CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)
+      : CPDF_Object(PDFOBJ_REFERENCE), m_pObjList(pDoc), m_RefObjNum(objnum) {}
 
-    const CPDF_Stream* m_pStream;
+  CPDF_IndirectObjects* GetObjList() const { return m_pObjList; }
 
-    CFX_DataFilter*            m_pFilter;
+  FX_DWORD GetRefObjNum() const { return m_RefObjNum; }
 
-    CFX_BinaryBuf*             m_pBuffer;
+  void SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
 
-    FX_DWORD                   m_BufOffset;
+  FX_BOOL Identical(CPDF_Reference* pOther) const {
+    return m_RefObjNum == pOther->m_RefObjNum;
+  }
 
-    FX_DWORD                   m_SrcOffset;
+ protected:
+  CPDF_IndirectObjects* m_pObjList;
 
-    FX_BYTE                            m_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];
-    friend class CPDF_Stream;
-};
-class CPDF_Null : public CPDF_Object
-{
-public:
-
-    static CPDF_Null*          Create()
-    {
-        return FX_NEW CPDF_Null();
-    }
-
-    CPDF_Null()
-    {
-        m_Type = PDFOBJ_NULL;
-    }
+  FX_DWORD m_RefObjNum;
+  friend class CPDF_Object;
 };
-class CPDF_Reference : public CPDF_Object
-{
-public:
-
-    static CPDF_Reference*     Create(CPDF_IndirectObjects* pDoc, int objnum)
-    {
-        return FX_NEW CPDF_Reference(pDoc, objnum);
-    }
-
-    CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)
-    {
-        m_Type = PDFOBJ_REFERENCE;
-        m_pObjList = pDoc;
-        m_RefObjNum = objnum;
-    }
-
-    CPDF_IndirectObjects*      GetObjList() const
-    {
-        return m_pObjList;
-    }
-
-    FX_DWORD                           GetRefObjNum() const
-    {
-        return m_RefObjNum;
-    }
-
-    void                                       SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
-
-    FX_BOOL                                    Identical(CPDF_Reference* pOther) const
-    {
-        return m_RefObjNum == pOther->m_RefObjNum;
-    }
-protected:
-
-    CPDF_IndirectObjects*      m_pObjList;
-
-    FX_DWORD                           m_RefObjNum;
-    friend class                       CPDF_Object;
-};
-class CPDF_IndirectObjects : public CFX_Object
-{
-public:
-
-    CPDF_IndirectObjects(IPDF_DocParser* pParser);
+class CPDF_IndirectObjects {
+ public:
+  CPDF_IndirectObjects(CPDF_Parser* pParser);
 
-    ~CPDF_IndirectObjects();
+  ~CPDF_IndirectObjects();
 
-    CPDF_Object*                       GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext = NULL);
+  CPDF_Object* GetIndirectObject(FX_DWORD objnum,
+                                 struct PARSE_CONTEXT* pContext = NULL);
 
-    int                                                GetIndirectType(FX_DWORD objnum);
+  int GetIndirectType(FX_DWORD objnum);
 
-    FX_DWORD                           AddIndirectObject(CPDF_Object* pObj);
+  FX_DWORD AddIndirectObject(CPDF_Object* pObj);
 
-    void                                       ReleaseIndirectObject(FX_DWORD objnum);
+  void ReleaseIndirectObject(FX_DWORD objnum);
 
-    void                                       InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);
+  void InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);
 
-    FX_DWORD                           GetLastObjNum() const;
+  FX_DWORD GetLastObjNum() const;
 
-    FX_POSITION                                GetStartPosition() const
-    {
-        return m_IndirectObjs.GetStartPosition();
-    }
+  FX_POSITION GetStartPosition() const {
+    return m_IndirectObjs.GetStartPosition();
+  }
 
-    void                                       GetNextAssoc(FX_POSITION& rPos, FX_DWORD& objnum, CPDF_Object*& pObject) const
-    {
-        m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);
-    }
-protected:
+  void GetNextAssoc(FX_POSITION& rPos,
+                    FX_DWORD& objnum,
+                    CPDF_Object*& pObject) const {
+    m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);
+  }
 
-    CFX_MapPtrToPtr                    m_IndirectObjs;
+ protected:
+  CFX_MapPtrToPtr m_IndirectObjs;
 
-    IPDF_DocParser*                    m_pParser;
+  CPDF_Parser* m_pParser;
 
-    FX_DWORD                           m_LastObjNum;
+  FX_DWORD m_LastObjNum;
 };
-#endif
+
+#endif  // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_