// 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_INCLUDE_PDFWINDOW_PWL_ICON_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_ICON_H_

#include "PWL_Wnd.h"
#include "core/include/fxcrt/fx_string.h"

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

  virtual CFX_ByteString GetImageAppStream();

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

 public:
  void SetPDFStream(CPDF_Stream* pStream);
  void GetImageSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight);
  CPDF_Matrix GetImageMatrix();
  CFX_ByteString GetImageAlias();
  void SetImageAlias(const FX_CHAR* sImageAlias);

 protected:
  CPDF_Stream* m_pPDFStream;
  CFX_ByteString m_sImageAlias;
};

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

  virtual CPDF_IconFit* GetIconFit() { return m_pIconFit; }

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

  int32_t GetScaleMethod();
  FX_BOOL IsProportionalScale();
  void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
  FX_BOOL GetFittingBounds();

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

 private:
  CPDF_IconFit* m_pIconFit;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_ICON_H_
