Introduce CPDF_Icon class to break CPWL_Icon dependence on parser/. The cpdfdoc/ layer should shield CPWL (window layer) from parser objects. - Move one method into the CPDF_IconFit class to remove last use of CPDF_Dictionary. Change-Id: I0fc6df01ac5e781fd4b1b29c60018e76e5ed9896 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64091 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/BUILD.gn b/core/fpdfdoc/BUILD.gn index 63bed74..edb2d58 100644 --- a/core/fpdfdoc/BUILD.gn +++ b/core/fpdfdoc/BUILD.gn
@@ -41,6 +41,8 @@ "cpdf_formcontrol.h", "cpdf_formfield.cpp", "cpdf_formfield.h", + "cpdf_icon.cpp", + "cpdf_icon.h", "cpdf_iconfit.cpp", "cpdf_iconfit.h", "cpdf_interactiveform.cpp",
diff --git a/core/fpdfdoc/cpdf_icon.cpp b/core/fpdfdoc/cpdf_icon.cpp new file mode 100644 index 0000000..a450e1e --- /dev/null +++ b/core/fpdfdoc/cpdf_icon.cpp
@@ -0,0 +1,39 @@ +// Copyright 2019 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 + +#include "core/fpdfdoc/cpdf_icon.h" + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream.h" + +CPDF_Icon::CPDF_Icon(CPDF_Stream* pStream) : m_pStream(pStream) {} + +CPDF_Icon::~CPDF_Icon() = default; + +CFX_SizeF CPDF_Icon::GetImageSize() const { + CPDF_Dictionary* pDict = m_pStream->GetDict(); + if (!pDict) + return CFX_SizeF(); + + CFX_FloatRect rect = pDict->GetRectFor("BBox"); + return {rect.right - rect.left, rect.top - rect.bottom}; +} + +CFX_Matrix CPDF_Icon::GetImageMatrix() const { + CPDF_Dictionary* pDict = m_pStream->GetDict(); + if (!pDict) + return CFX_Matrix(); + + return pDict->GetMatrixFor("Matrix"); +} + +ByteString CPDF_Icon::GetImageAlias() const { + CPDF_Dictionary* pDict = m_pStream->GetDict(); + if (!pDict) + return ByteString(); + + return pDict->GetStringFor("Name"); +}
diff --git a/core/fpdfdoc/cpdf_icon.h b/core/fpdfdoc/cpdf_icon.h new file mode 100644 index 0000000..519fcda --- /dev/null +++ b/core/fpdfdoc/cpdf_icon.h
@@ -0,0 +1,29 @@ +// Copyright 2019 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_FPDFDOC_CPDF_ICON_H_ +#define CORE_FPDFDOC_CPDF_ICON_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/retain_ptr.h" + +class CPDF_Stream; + +class CPDF_Icon final { + public: + CPDF_Icon(CPDF_Stream* pStream); + ~CPDF_Icon(); + + CFX_SizeF GetImageSize() const; + CFX_Matrix GetImageMatrix() const; + ByteString GetImageAlias() const; + + private: + RetainPtr<CPDF_Stream> const m_pStream; +}; + +#endif // CORE_FPDFDOC_CPDF_ICON_H_
diff --git a/core/fpdfdoc/cpdf_iconfit.cpp b/core/fpdfdoc/cpdf_iconfit.cpp index 801e908..55702a3 100644 --- a/core/fpdfdoc/cpdf_iconfit.cpp +++ b/core/fpdfdoc/cpdf_iconfit.cpp
@@ -61,3 +61,16 @@ bool CPDF_IconFit::GetFittingBounds() const { return m_pDict && m_pDict->GetBooleanFor("FB", false); } + +CFX_PointF CPDF_IconFit::GetIconPosition() const { + if (!m_pDict) + return CFX_PointF(); + + const CPDF_Array* pA = m_pDict->GetArrayFor("A"); + if (!pA) + return CFX_PointF(); + + size_t dwCount = pA->size(); + return {dwCount > 0 ? pA->GetNumberAt(0) : 0.0f, + dwCount > 1 ? pA->GetNumberAt(1) : 0.0f}; +}
diff --git a/core/fpdfdoc/cpdf_iconfit.h b/core/fpdfdoc/cpdf_iconfit.h index 3da3dde..86a4918 100644 --- a/core/fpdfdoc/cpdf_iconfit.h +++ b/core/fpdfdoc/cpdf_iconfit.h
@@ -23,9 +23,9 @@ ScaleMethod GetScaleMethod() const; bool IsProportionalScale() const; - CFX_PointF GetIconBottomLeftPosition() const; bool GetFittingBounds() const; - const CPDF_Dictionary* GetDict() const { return m_pDict.Get(); } + CFX_PointF GetIconBottomLeftPosition() const; + CFX_PointF GetIconPosition() const; private: RetainPtr<const CPDF_Dictionary> const m_pDict;
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp index 50cd8c1..b6600d2 100644 --- a/fpdfsdk/cpdfsdk_appstream.cpp +++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -20,6 +20,7 @@ #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfdoc/cba_fontmap.h" #include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fpdfdoc/cpdf_icon.h" #include "core/fpdfdoc/cpvt_word.h" #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_interactiveform.h" @@ -689,7 +690,7 @@ CPWL_Wnd::CreateParams cp; cp.dwFlags = PWS_VISIBLE; - CPWL_Icon icon(cp, pIconStream, &fit); + CPWL_Icon icon(cp, pdfium::MakeUnique<CPDF_Icon>(pIconStream), &fit); icon.Realize(); if (!icon.Move(rcIcon, false, false)) return ByteString();
diff --git a/fpdfsdk/pwl/BUILD.gn b/fpdfsdk/pwl/BUILD.gn index 71bbf09..ea26c13 100644 --- a/fpdfsdk/pwl/BUILD.gn +++ b/fpdfsdk/pwl/BUILD.gn
@@ -38,7 +38,6 @@ "../../:pdfium_public_headers", "../../constants", "../../core/fpdfapi/font", - "../../core/fpdfapi/parser", "../../core/fpdfapi/render", "../../core/fpdfdoc", "../../core/fxcrt",
diff --git a/fpdfsdk/pwl/cpwl_icon.cpp b/fpdfsdk/pwl/cpwl_icon.cpp index a720af4..67df09e 100644 --- a/fpdfsdk/pwl/cpwl_icon.cpp +++ b/fpdfsdk/pwl/cpwl_icon.cpp
@@ -10,76 +10,49 @@ #include <sstream> #include <utility> -#include "core/fpdfapi/parser/cpdf_array.h" -#include "core/fpdfapi/parser/cpdf_dictionary.h" -#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfdoc/cpdf_icon.h" #include "core/fpdfdoc/cpdf_iconfit.h" #include "fpdfsdk/pwl/cpwl_wnd.h" CPWL_Icon::CPWL_Icon(const CreateParams& cp, - CPDF_Stream* pStream, + std::unique_ptr<CPDF_Icon> pIcon, CPDF_IconFit* pFit) - : CPWL_Wnd(cp, nullptr), m_pPDFStream(pStream), m_pIconFit(pFit) {} + : CPWL_Wnd(cp, nullptr), m_pIcon(std::move(pIcon)), m_pIconFit(pFit) { + ASSERT(m_pIcon); +} CPWL_Icon::~CPWL_Icon() = default; -std::pair<float, float> CPWL_Icon::GetImageSize() { - if (!m_pPDFStream) - return {0.0f, 0.0f}; - - CPDF_Dictionary* pDict = m_pPDFStream->GetDict(); - if (!pDict) - return {0.0f, 0.0f}; - - CFX_FloatRect rect = pDict->GetRectFor("BBox"); - return {rect.right - rect.left, rect.top - rect.bottom}; +CFX_SizeF CPWL_Icon::GetImageSize() { + return m_pIcon->GetImageSize(); } CFX_Matrix CPWL_Icon::GetImageMatrix() { - if (!m_pPDFStream) - return CFX_Matrix(); - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) - return pDict->GetMatrixFor("Matrix"); - return CFX_Matrix(); + return m_pIcon->GetImageMatrix(); } ByteString CPWL_Icon::GetImageAlias() { - if (!m_pPDFStream) - return ByteString(); - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) - return pDict->GetStringFor("Name"); - return ByteString(); + return m_pIcon->GetImageAlias(); } -std::pair<float, float> CPWL_Icon::GetIconPosition() { +CFX_PointF CPWL_Icon::GetIconPosition() { if (!m_pIconFit) - return {0.0f, 0.0f}; + return CFX_PointF(); - const CPDF_Array* pA = - m_pIconFit->GetDict() ? m_pIconFit->GetDict()->GetArrayFor("A") : nullptr; - if (!pA) - return {0.0f, 0.0f}; - - size_t dwCount = pA->size(); - return {dwCount > 0 ? pA->GetNumberAt(0) : 0.0f, - dwCount > 1 ? pA->GetNumberAt(1) : 0.0f}; + return m_pIconFit->GetIconPosition(); } std::pair<float, float> CPWL_Icon::GetScale() { float fHScale = 1.0f; float fVScale = 1.0f; - if (!m_pPDFStream) - return {fHScale, fVScale}; - CFX_FloatRect rcPlate = GetClientRect(); float fPlateWidth = rcPlate.Width(); float fPlateHeight = rcPlate.Height(); - float fImageWidth; - float fImageHeight; - std::tie(fImageWidth, fImageHeight) = GetImageSize(); - + CFX_SizeF image_size = GetImageSize(); + float fImageWidth = image_size.width; + float fImageHeight = image_size.height; int32_t nScaleMethod = m_pIconFit ? m_pIconFit->GetScaleMethod() : 0; switch (nScaleMethod) { @@ -114,13 +87,13 @@ } std::pair<float, float> CPWL_Icon::GetImageOffset() { - float fLeft; - float fBottom; - std::tie(fLeft, fBottom) = GetIconPosition(); + CFX_PointF icon_position = GetIconPosition(); + float fLeft = icon_position.x; + float fBottom = icon_position.y; - float fImageWidth; - float fImageHeight; - std::tie(fImageWidth, fImageHeight) = GetImageSize(); + CFX_SizeF image_size = GetImageSize(); + float fImageWidth = image_size.width; + float fImageHeight = image_size.height; float fHScale, fVScale; std::tie(fHScale, fVScale) = GetScale();
diff --git a/fpdfsdk/pwl/cpwl_icon.h b/fpdfsdk/pwl/cpwl_icon.h index 3e19f84..aa9b3d7 100644 --- a/fpdfsdk/pwl/cpwl_icon.h +++ b/fpdfsdk/pwl/cpwl_icon.h
@@ -14,12 +14,14 @@ #include "core/fxcrt/unowned_ptr.h" #include "fpdfsdk/pwl/cpwl_wnd.h" +class CPDF_Icon; class CPDF_IconFit; -class CPDF_Stream; class CPWL_Icon final : public CPWL_Wnd { public: - CPWL_Icon(const CreateParams& cp, CPDF_Stream* pStream, CPDF_IconFit* pFit); + CPWL_Icon(const CreateParams& cp, + std::unique_ptr<CPDF_Icon> pIcon, + CPDF_IconFit* pFit); ~CPWL_Icon() override; // horizontal scale, vertical scale @@ -32,13 +34,10 @@ ByteString GetImageAlias(); private: - // left, bottom - std::pair<float, float> GetIconPosition(); + CFX_PointF GetIconPosition(); // left, bottom coordinates. + CFX_SizeF GetImageSize(); - // width, height - std::pair<float, float> GetImageSize(); - - RetainPtr<CPDF_Stream> const m_pPDFStream; + std::unique_ptr<CPDF_Icon> const m_pIcon; UnownedPtr<CPDF_IconFit> const m_pIconFit; };