// 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_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"

class CPDF_IconFit;
class CPDF_Stream;

class CPWL_Icon final : public CPWL_Wnd {
 public:
  CPWL_Icon(const CreateParams& cp,
            std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
  ~CPWL_Icon() override;

  void SetIconFit(CPDF_IconFit* pIconFit) { m_pIconFit = pIconFit; }
  void SetPDFStream(CPDF_Stream* pStream) { m_pPDFStream.Reset(pStream); }

  // horizontal scale, vertical scale
  std::pair<float, float> GetScale();

  // x, y
  std::pair<float, float> GetImageOffset();

  CFX_Matrix GetImageMatrix();
  ByteString GetImageAlias();

 private:
  // left, bottom
  std::pair<float, float> GetIconPosition();

  // width, height
  std::pair<float, float> GetImageSize();

  RetainPtr<CPDF_Stream> m_pPDFStream;
  UnownedPtr<CPDF_IconFit> m_pIconFit;
};

#endif  // FPDFSDK_PWL_CPWL_ICON_H_
