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_