Fix ownership inversion between CPWL_Icon and CPDF_Icon.
Remove methods to things the caller already knows.
-- Assert m_pIconFit always present.
-- Inline some private methods.
-- Don't allocate CPWL_Wnd subclasses on the stack.
Change-Id: Ie89867f3f2b622f925a5e3dfa8d1407ee5d094cd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/79651
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index e596ff1..e2b865c 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -689,25 +689,26 @@
CPWL_Wnd::CreateParams cp;
cp.dwFlags = PWS_VISIBLE;
- CPWL_Icon icon(cp, std::make_unique<CPDF_Icon>(pIconStream), &fit);
- icon.Realize();
- if (!icon.Move(rcIcon, false, false))
+ auto pPDFIcon = std::make_unique<CPDF_Icon>(pIconStream);
+ auto pIcon = std::make_unique<CPWL_Icon>(cp, pPDFIcon.get(), &fit);
+ pIcon->Realize();
+ if (!pIcon->Move(rcIcon, false, false))
return ByteString();
- ByteString sAlias = icon.GetImageAlias();
+ ByteString sAlias = pPDFIcon->GetImageAlias();
if (sAlias.GetLength() <= 0)
return ByteString();
- CFX_FloatRect rcPlate = icon.GetClientRect();
- CFX_Matrix mt = icon.GetImageMatrix().GetInverse();
+ CFX_FloatRect rcPlate = pIcon->GetClientRect();
+ CFX_Matrix mt = pPDFIcon->GetImageMatrix().GetInverse();
float fHScale;
float fVScale;
- std::tie(fHScale, fVScale) = icon.GetScale();
+ std::tie(fHScale, fVScale) = pIcon->GetScale();
float fx;
float fy;
- std::tie(fx, fy) = icon.GetImageOffset();
+ std::tie(fx, fy) = pIcon->GetImageOffset();
std::ostringstream str;
{
@@ -726,7 +727,7 @@
<< kSetLineWidthOperator << " /" << sAlias << " "
<< kInvokeNamedXObjectOperator << "\n";
}
- icon.Destroy();
+ pIcon->Destroy();
return ByteString(str);
}
diff --git a/fpdfsdk/pwl/cpwl_icon.cpp b/fpdfsdk/pwl/cpwl_icon.cpp
index d45d63c..b5a2e89 100644
--- a/fpdfsdk/pwl/cpwl_icon.cpp
+++ b/fpdfsdk/pwl/cpwl_icon.cpp
@@ -16,33 +16,15 @@
#include "third_party/base/check.h"
CPWL_Icon::CPWL_Icon(const CreateParams& cp,
- std::unique_ptr<CPDF_Icon> pIcon,
+ CPDF_Icon* pIcon,
CPDF_IconFit* pFit)
- : CPWL_Wnd(cp, nullptr), m_pIcon(std::move(pIcon)), m_pIconFit(pFit) {
+ : CPWL_Wnd(cp, nullptr), m_pIcon(pIcon), m_pIconFit(pFit) {
DCHECK(m_pIcon);
+ DCHECK(m_pIconFit);
}
CPWL_Icon::~CPWL_Icon() = default;
-CFX_SizeF CPWL_Icon::GetImageSize() {
- return m_pIcon->GetImageSize();
-}
-
-CFX_Matrix CPWL_Icon::GetImageMatrix() {
- return m_pIcon->GetImageMatrix();
-}
-
-ByteString CPWL_Icon::GetImageAlias() {
- return m_pIcon->GetImageAlias();
-}
-
-CFX_PointF CPWL_Icon::GetIconPosition() {
- if (!m_pIconFit)
- return CFX_PointF();
-
- return m_pIconFit->GetIconPosition();
-}
-
std::pair<float, float> CPWL_Icon::GetScale() {
float fHScale = 1.0f;
float fVScale = 1.0f;
@@ -51,13 +33,11 @@
float fPlateWidth = rcPlate.Width();
float fPlateHeight = rcPlate.Height();
- CFX_SizeF image_size = GetImageSize();
+ CFX_SizeF image_size = m_pIcon->GetImageSize();
float fImageWidth = image_size.width;
float fImageHeight = image_size.height;
- CPDF_IconFit::ScaleMethod scale_method =
- m_pIconFit ? m_pIconFit->GetScaleMethod()
- : CPDF_IconFit::ScaleMethod::kAlways;
+ CPDF_IconFit::ScaleMethod scale_method = m_pIconFit->GetScaleMethod();
switch (scale_method) {
case CPDF_IconFit::ScaleMethod::kAlways:
fHScale = fPlateWidth / std::max(fImageWidth, 1.0f);
@@ -79,7 +59,7 @@
break;
}
- if (m_pIconFit && m_pIconFit->IsProportionalScale()) {
+ if (m_pIconFit->IsProportionalScale()) {
float min_scale = std::min(fHScale, fVScale);
fHScale = min_scale;
fVScale = min_scale;
@@ -88,11 +68,11 @@
}
std::pair<float, float> CPWL_Icon::GetImageOffset() {
- CFX_PointF icon_position = GetIconPosition();
+ CFX_PointF icon_position = m_pIconFit->GetIconPosition();
float fLeft = icon_position.x;
float fBottom = icon_position.y;
- CFX_SizeF image_size = GetImageSize();
+ CFX_SizeF image_size = m_pIcon->GetImageSize();
float fImageWidth = image_size.width;
float fImageHeight = image_size.height;
diff --git a/fpdfsdk/pwl/cpwl_icon.h b/fpdfsdk/pwl/cpwl_icon.h
index aa9b3d7..dc6e624 100644
--- a/fpdfsdk/pwl/cpwl_icon.h
+++ b/fpdfsdk/pwl/cpwl_icon.h
@@ -7,10 +7,8 @@
#ifndef FPDFSDK_PWL_CPWL_ICON_H_
#define FPDFSDK_PWL_CPWL_ICON_H_
-#include <memory>
#include <utility>
-#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/unowned_ptr.h"
#include "fpdfsdk/pwl/cpwl_wnd.h"
@@ -19,9 +17,7 @@
class CPWL_Icon final : public CPWL_Wnd {
public:
- CPWL_Icon(const CreateParams& cp,
- std::unique_ptr<CPDF_Icon> pIcon,
- CPDF_IconFit* pFit);
+ CPWL_Icon(const CreateParams& cp, CPDF_Icon* pIcon, CPDF_IconFit* pFit);
~CPWL_Icon() override;
// horizontal scale, vertical scale
@@ -30,15 +26,9 @@
// x, y
std::pair<float, float> GetImageOffset();
- CFX_Matrix GetImageMatrix();
- ByteString GetImageAlias();
-
private:
- CFX_PointF GetIconPosition(); // left, bottom coordinates.
- CFX_SizeF GetImageSize();
-
- std::unique_ptr<CPDF_Icon> const m_pIcon;
- UnownedPtr<CPDF_IconFit> const m_pIconFit;
+ UnownedPtr<const CPDF_Icon> const m_pIcon;
+ UnownedPtr<const CPDF_IconFit> const m_pIconFit;
};
#endif // FPDFSDK_PWL_CPWL_ICON_H_