From 101535f463dda5766f99b66f383672d5898556fe Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 12 Jun 2018 13:36:05 +0000 Subject: Rework "Make common page base class." Re-landing of https://pdfium-review.googlesource.com/c/pdfium/+/32892 This time, however, we do not build on the previous CL which cached pages. This CL by itself should be OK but was reverted only because it was blocking earlier reverts. Change-Id: I067d5f07373eeac6cced5d0c113ea40e5f8dcd15 Reviewed-on: https://pdfium-review.googlesource.com/34910 Commit-Queue: dsinclair Reviewed-by: dsinclair --- core/fpdfapi/page/cpdf_page.cpp | 20 ++++++++++++++++ core/fpdfapi/page/cpdf_page.h | 38 ++++++++++++++---------------- core/fpdfapi/page/ipdf_page.h | 52 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 core/fpdfapi/page/ipdf_page.h (limited to 'core/fpdfapi/page') diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp index e730aee668..4cd58dddaa 100644 --- a/core/fpdfapi/page/cpdf_page.cpp +++ b/core/fpdfapi/page/cpdf_page.cpp @@ -75,6 +75,26 @@ CPDF_Page::CPDF_Page(CPDF_Document* pDocument, CPDF_Page::~CPDF_Page() {} +CPDF_Page* CPDF_Page::AsPDFPage() { + return this; +} + +CPDFXFA_Page* CPDF_Page::AsXFAPage() { + return nullptr; +} + +CPDF_Document* CPDF_Page::GetDocument() const { + return GetPDFDocument(); +} + +float CPDF_Page::GetPageWidth() const { + return m_PageSize.width; +} + +float CPDF_Page::GetPageHeight() const { + return m_PageSize.height; +} + bool CPDF_Page::IsPage() const { return true; } diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h index 1d0186181a..44bb6d8798 100644 --- a/core/fpdfapi/page/cpdf_page.h +++ b/core/fpdfapi/page/cpdf_page.h @@ -10,6 +10,7 @@ #include #include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/page/ipdf_page.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/retain_ptr.h" @@ -22,45 +23,43 @@ class CPDF_Object; class CPDF_PageRenderCache; class CPDF_PageRenderContext; -class CPDF_Page : public Retainable, public CPDF_PageObjectHolder { +class CPDF_Page : public IPDF_Page, public CPDF_PageObjectHolder { public: class View {}; // Caller implements as desired, empty here due to layering. - class Extension : public Retainable {}; // XFA page parent class, layering. template friend RetainPtr pdfium::MakeRetain(Args&&... args); + // IPDF_Page: + CPDF_Page* AsPDFPage() override; + CPDFXFA_Page* AsXFAPage() override; + CPDF_Document* GetDocument() const override; + float GetPageWidth() const override; + float GetPageHeight() const override; + CFX_Matrix GetDisplayMatrix(const FX_RECT& rect, int iRotate) const override; + Optional DeviceToPage( + const FX_RECT& rect, + int rotate, + const CFX_PointF& device_point) const override; + Optional PageToDevice( + const FX_RECT& rect, + int rotate, + const CFX_PointF& page_point) const override; + // CPDF_PageObjectHolder: bool IsPage() const override; void ParseContent(); - - Optional DeviceToPage(const FX_RECT& rect, - int rotate, - const CFX_PointF& device_point) const; - Optional PageToDevice(const FX_RECT& rect, - int rotate, - const CFX_PointF& page_point) const; - - CFX_Matrix GetDisplayMatrix(const FX_RECT& rect, int iRotate) const; - - float GetPageWidth() const { return m_PageSize.width; } - float GetPageHeight() const { return m_PageSize.height; } const CFX_SizeF& GetPageSize() const { return m_PageSize; } - int GetPageRotation() const; CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender.get(); } - CPDF_PageRenderContext* GetRenderContext() const { return m_pRenderContext.get(); } void SetRenderContext(std::unique_ptr pContext); - CPDF_Document* GetPDFDocument() const { return m_pPDFDocument.Get(); } View* GetView() const { return m_pView.Get(); } void SetView(View* pView) { m_pView = pView; } - Extension* GetPageExtension() const { return m_pPageExtension.Get(); } - void SetPageExtension(Extension* pExt) { m_pPageExtension = pExt; } private: CPDF_Page(CPDF_Document* pDocument, @@ -74,7 +73,6 @@ class CPDF_Page : public Retainable, public CPDF_PageObjectHolder { CFX_SizeF m_PageSize; CFX_Matrix m_PageMatrix; UnownedPtr m_pPDFDocument; - UnownedPtr m_pPageExtension; std::unique_ptr m_pPageRender; std::unique_ptr m_pRenderContext; UnownedPtr m_pView; diff --git a/core/fpdfapi/page/ipdf_page.h b/core/fpdfapi/page/ipdf_page.h new file mode 100644 index 0000000000..7c9fce7726 --- /dev/null +++ b/core/fpdfapi/page/ipdf_page.h @@ -0,0 +1,52 @@ +// Copyright 2018 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 CORE_FPDFAPI_PAGE_IPDF_PAGE_H_ +#define CORE_FPDFAPI_PAGE_IPDF_PAGE_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/retain_ptr.h" +#include "third_party/base/optional.h" + +class CPDF_Document; +class CPDF_Page; + +// Small layering violation, incomplete type and always null if non-XFA. +class CPDFXFA_Page; + +// Interface implemented by both page types (CPDF_Page and CPDFXFA_Page). +class IPDF_Page : public Retainable { + public: + virtual CPDF_Page* AsPDFPage() = 0; + virtual CPDFXFA_Page* AsXFAPage() = 0; + + virtual CPDF_Document* GetDocument() const = 0; + + virtual float GetPageWidth() const = 0; + virtual float GetPageHeight() const = 0; + virtual CFX_Matrix GetDisplayMatrix(const FX_RECT& rect, + int iRotate) const = 0; + + virtual Optional DeviceToPage( + const FX_RECT& rect, + int rotate, + const CFX_PointF& device_point) const = 0; + + virtual Optional PageToDevice( + const FX_RECT& rect, + int rotate, + const CFX_PointF& page_point) const = 0; +}; + +inline CPDF_Page* ToPDFPage(IPDF_Page* pBase) { + return pBase ? pBase->AsPDFPage() : nullptr; +} + +inline CPDFXFA_Page* ToXFAPage(IPDF_Page* pBase) { + return pBase ? pBase->AsXFAPage() : nullptr; +} + +#endif // CORE_FPDFAPI_PAGE_IPDF_PAGE_H_ -- cgit v1.2.3