1 // Copyright 2016 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_FPDFAPI_PAGE_CPDF_PAGE_H_ 8 #define CORE_FPDFAPI_PAGE_CPDF_PAGE_H_ 9 10 #include <memory> 11 #include <utility> 12 13 #include "core/fpdfapi/page/cpdf_pageobjectholder.h" 14 #include "core/fpdfapi/page/ipdf_page.h" 15 #include "core/fxcrt/fx_coordinates.h" 16 #include "core/fxcrt/fx_system.h" 17 #include "core/fxcrt/observed_ptr.h" 18 #include "core/fxcrt/retain_ptr.h" 19 #include "core/fxcrt/unowned_ptr.h" 20 #include "third_party/base/optional.h" 21 22 class CPDF_Dictionary; 23 class CPDF_Document; 24 class CPDF_Image; 25 class CPDF_Object; 26 27 class CPDF_Page final : public IPDF_Page, public CPDF_PageObjectHolder { 28 public: 29 // Caller implements as desired, empty here due to layering. 30 class View : public Observable {}; 31 32 // Data for the render layer to attach to this page. 33 class RenderContextIface { 34 public: ~RenderContextIface()35 virtual ~RenderContextIface() {} 36 }; 37 38 // Cache for the render layer to attach to this page. 39 class RenderCacheIface { 40 public: ~RenderCacheIface()41 virtual ~RenderCacheIface() {} 42 virtual void ResetBitmapForImage(const RetainPtr<CPDF_Image>& pImage) = 0; 43 }; 44 45 class RenderContextClearer { 46 public: 47 explicit RenderContextClearer(CPDF_Page* pPage); 48 ~RenderContextClearer(); 49 50 private: 51 UnownedPtr<CPDF_Page> const m_pPage; 52 }; 53 54 template <typename T, typename... Args> 55 friend RetainPtr<T> pdfium::MakeRetain(Args&&... args); 56 57 // IPDF_Page: 58 CPDF_Page* AsPDFPage() override; 59 CPDFXFA_Page* AsXFAPage() override; 60 CPDF_Document* GetDocument() const override; 61 float GetPageWidth() const override; 62 float GetPageHeight() const override; 63 CFX_Matrix GetDisplayMatrix(const FX_RECT& rect, int iRotate) const override; 64 Optional<CFX_PointF> DeviceToPage( 65 const FX_RECT& rect, 66 int rotate, 67 const CFX_PointF& device_point) const override; 68 Optional<CFX_PointF> PageToDevice( 69 const FX_RECT& rect, 70 int rotate, 71 const CFX_PointF& page_point) const override; 72 73 // CPDF_PageObjectHolder: 74 bool IsPage() const override; 75 76 void ParseContent(); GetPageSize()77 const CFX_SizeF& GetPageSize() const { return m_PageSize; } 78 int GetPageRotation() const; GetRenderCache()79 RenderCacheIface* GetRenderCache() const { return m_pRenderCache.get(); } SetRenderCache(std::unique_ptr<RenderCacheIface> pCache)80 void SetRenderCache(std::unique_ptr<RenderCacheIface> pCache) { 81 m_pRenderCache = std::move(pCache); 82 } 83 GetRenderContext()84 RenderContextIface* GetRenderContext() const { 85 return m_pRenderContext.get(); 86 } SetRenderContext(std::unique_ptr<RenderContextIface> pContext)87 void SetRenderContext(std::unique_ptr<RenderContextIface> pContext) { 88 m_pRenderContext = std::move(pContext); 89 } 90 GetPDFDocument()91 CPDF_Document* GetPDFDocument() const { return m_pPDFDocument.Get(); } GetView()92 View* GetView() const { return m_pView.Get(); } SetView(View * pView)93 void SetView(View* pView) { m_pView.Reset(pView); } 94 void UpdateDimensions(); 95 96 private: 97 CPDF_Page(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict); 98 ~CPDF_Page() override; 99 100 CPDF_Object* GetPageAttr(const ByteString& name) const; 101 CFX_FloatRect GetBox(const ByteString& name) const; 102 103 CFX_SizeF m_PageSize; 104 CFX_Matrix m_PageMatrix; 105 UnownedPtr<CPDF_Document> m_pPDFDocument; 106 std::unique_ptr<RenderCacheIface> m_pRenderCache; 107 std::unique_ptr<RenderContextIface> m_pRenderContext; 108 ObservedPtr<View> m_pView; 109 }; 110 111 #endif // CORE_FPDFAPI_PAGE_CPDF_PAGE_H_ 112