| Index: core/include/fpdfapi/fpdf_pageobj.h | 
| diff --git a/core/include/fpdfapi/fpdf_pageobj.h b/core/include/fpdfapi/fpdf_pageobj.h | 
| index 9190fd927047d55844dbf846eae12b41458e07b7..efb8e29becd079b85d318716ab79097d9cdce87d 100644 | 
| --- a/core/include/fpdfapi/fpdf_pageobj.h | 
| +++ b/core/include/fpdfapi/fpdf_pageobj.h | 
| @@ -288,13 +288,29 @@ class CPDF_PageObject : public CPDF_GraphicStates { | 
| FORM, | 
| }; | 
|  | 
| -  static CPDF_PageObject* Create(int type); | 
| +  static CPDF_PageObject* Create(Type type); | 
| virtual ~CPDF_PageObject(); | 
|  | 
| CPDF_PageObject* Clone() const; | 
| void Copy(const CPDF_PageObject* pSrcObject); | 
|  | 
| +  virtual Type GetType() const = 0; | 
| virtual void Transform(const CFX_Matrix& matrix) = 0; | 
| +  virtual bool IsText() const { return false; } | 
| +  virtual bool IsPath() const { return false; } | 
| +  virtual bool IsImage() const { return false; } | 
| +  virtual bool IsShading() const { return false; } | 
| +  virtual bool IsForm() const { return false; } | 
| +  virtual CPDF_TextObject* AsText() { return nullptr; } | 
| +  virtual const CPDF_TextObject* AsText() const { return nullptr; } | 
| +  virtual CPDF_PathObject* AsPath() { return nullptr; } | 
| +  virtual const CPDF_PathObject* AsPath() const { return nullptr; } | 
| +  virtual CPDF_ImageObject* AsImage() { return nullptr; } | 
| +  virtual const CPDF_ImageObject* AsImage() const { return nullptr; } | 
| +  virtual CPDF_ShadingObject* AsShading() { return nullptr; } | 
| +  virtual const CPDF_ShadingObject* AsShading() const { return nullptr; } | 
| +  virtual CPDF_FormObject* AsForm() { return nullptr; } | 
| +  virtual const CPDF_FormObject* AsForm() const { return nullptr; } | 
|  | 
| void RemoveClipPath(); | 
| void AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge); | 
| @@ -304,7 +320,6 @@ class CPDF_PageObject : public CPDF_GraphicStates { | 
| void SetColorState(CPDF_ColorState state) { m_ColorState = state; } | 
| FX_RECT GetBBox(const CFX_Matrix* pMatrix) const; | 
|  | 
| -  const Type m_Type; | 
| FX_FLOAT m_Left; | 
| FX_FLOAT m_Right; | 
| FX_FLOAT m_Top; | 
| @@ -315,7 +330,6 @@ class CPDF_PageObject : public CPDF_GraphicStates { | 
| virtual void CopyData(const CPDF_PageObject* pSrcObject) = 0; | 
|  | 
| void RecalcBBox(); | 
| -  CPDF_PageObject(Type type) : m_Type(type) {} | 
| }; | 
|  | 
| struct CPDF_TextObjectItem { | 
| @@ -329,6 +343,13 @@ class CPDF_TextObject : public CPDF_PageObject { | 
| CPDF_TextObject(); | 
| ~CPDF_TextObject() override; | 
|  | 
| +  // CPDF_PageObject: | 
| +  Type GetType() const override { return TEXT; }; | 
| +  void Transform(const CFX_Matrix& matrix) override; | 
| +  bool IsText() const override { return true; }; | 
| +  CPDF_TextObject* AsText() override { return this; }; | 
| +  const CPDF_TextObject* AsText() const override { return this; }; | 
| + | 
| int CountItems() const { return m_nChars; } | 
|  | 
| void GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const; | 
| @@ -365,9 +386,6 @@ class CPDF_TextObject : public CPDF_PageObject { | 
|  | 
| void SetTextState(CPDF_TextState TextState); | 
|  | 
| -  // CPDF_PageObject: | 
| -  void Transform(const CFX_Matrix& matrix) override; | 
| - | 
| void CalcCharPos(FX_FLOAT* pPosArray) const; | 
|  | 
| void SetData(int nChars, | 
| @@ -411,10 +429,15 @@ class CPDF_TextObject : public CPDF_PageObject { | 
|  | 
| class CPDF_PathObject : public CPDF_PageObject { | 
| public: | 
| -  CPDF_PathObject() : CPDF_PageObject(PATH) {} | 
| +  CPDF_PathObject() {} | 
| ~CPDF_PathObject() override {} | 
|  | 
| +  // CPDF_PageObject: | 
| +  Type GetType() const override { return PATH; }; | 
| void Transform(const CFX_Matrix& maxtrix) override; | 
| +  bool IsPath() const override { return true; }; | 
| +  CPDF_PathObject* AsPath() override { return this; }; | 
| +  const CPDF_PathObject* AsPath() const override { return this; }; | 
|  | 
| void SetGraphState(CPDF_GraphState GraphState); | 
|  | 
| @@ -437,7 +460,12 @@ class CPDF_ImageObject : public CPDF_PageObject { | 
| CPDF_ImageObject(); | 
| ~CPDF_ImageObject() override; | 
|  | 
| +  // CPDF_PageObject: | 
| +  Type GetType() const override { return IMAGE; }; | 
| void Transform(const CFX_Matrix& matrix) override; | 
| +  bool IsImage() const override { return true; }; | 
| +  CPDF_ImageObject* AsImage() override { return this; }; | 
| +  const CPDF_ImageObject* AsImage() const override { return this; }; | 
|  | 
| CPDF_Image* m_pImage; | 
|  | 
| @@ -454,24 +482,34 @@ class CPDF_ShadingObject : public CPDF_PageObject { | 
| CPDF_ShadingObject(); | 
| ~CPDF_ShadingObject() override; | 
|  | 
| -  CPDF_ShadingPattern* m_pShading; | 
| - | 
| -  CFX_Matrix m_Matrix; | 
| - | 
| +  // CPDF_PageObject: | 
| +  Type GetType() const override { return SHADING; }; | 
| void Transform(const CFX_Matrix& matrix) override; | 
| +  bool IsShading() const override { return true; }; | 
| +  CPDF_ShadingObject* AsShading() override { return this; }; | 
| +  const CPDF_ShadingObject* AsShading() const override { return this; }; | 
|  | 
| void CalcBoundingBox(); | 
|  | 
| +  CPDF_ShadingPattern* m_pShading; | 
| +  CFX_Matrix m_Matrix; | 
| + | 
| protected: | 
| void CopyData(const CPDF_PageObject* pSrcObject) override; | 
| }; | 
|  | 
| class CPDF_FormObject : public CPDF_PageObject { | 
| public: | 
| -  CPDF_FormObject() : CPDF_PageObject(FORM), m_pForm(nullptr) {} | 
| +  CPDF_FormObject() : m_pForm(nullptr) {} | 
| ~CPDF_FormObject() override; | 
|  | 
| +  // CPDF_PageObject: | 
| +  Type GetType() const override { return FORM; }; | 
| void Transform(const CFX_Matrix& matrix) override; | 
| +  bool IsForm() const override { return true; }; | 
| +  CPDF_FormObject* AsForm() override { return this; }; | 
| +  const CPDF_FormObject* AsForm() const override { return this; }; | 
| + | 
| void CalcBoundingBox(); | 
|  | 
| CPDF_Form* m_pForm; | 
|  |