// Copyright 2014 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 FPDFSDK_PDFWINDOW_CPWL_ICON_H_
#define FPDFSDK_PDFWINDOW_CPWL_ICON_H_

#include "core/fxcrt/cfx_unowned_ptr.h"
#include "core/fxcrt/fx_string.h"
#include "fpdfsdk/pdfwindow/cpwl_wnd.h"

class CPWL_Image : public CPWL_Wnd {
 public:
  CPWL_Image();
  ~CPWL_Image() override;

  virtual CFX_ByteString GetImageAppStream();

  virtual void GetScale(float& fHScale, float& fVScale);
  virtual void GetImageOffset(float& x, float& y);
  virtual CPDF_Stream* GetPDFStream() const;

 public:
  void SetPDFStream(CPDF_Stream* pStream);
  void GetImageSize(float& fWidth, float& fHeight);
  CFX_Matrix GetImageMatrix();
  CFX_ByteString GetImageAlias();
  void SetImageAlias(const char* sImageAlias);

 protected:
  CFX_UnownedPtr<CPDF_Stream> m_pPDFStream;
  CFX_ByteString m_sImageAlias;
};

class CPWL_Icon : public CPWL_Image {
 public:
  CPWL_Icon();
  ~CPWL_Icon() override;

  virtual CPDF_IconFit* GetIconFit() const;

  // CPWL_Image
  void GetScale(float& fHScale, float& fVScale) override;
  void GetImageOffset(float& x, float& y) override;

  int32_t GetScaleMethod();
  bool IsProportionalScale();
  void GetIconPosition(float& fLeft, float& fBottom);

  void SetIconFit(CPDF_IconFit* pIconFit) { m_pIconFit = pIconFit; }

 private:
  CFX_UnownedPtr<CPDF_IconFit> m_pIconFit;
};

#endif  // FPDFSDK_PDFWINDOW_CPWL_ICON_H_
