#ifndef FS_FLD_PAGE_H_
#define FS_FLD_PAGE_H_

#include "common/fs_common.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
 * @brief fld命名空间。
 */
namespace fld {
/** 此类表示和FLD页面相关的方法。*/
class FLDPage FS_FINAL : public Base {
 public:
  /** @brief 析构函数。 */
  ~FLDPage();

  /**
   * @brief 构造函数，通过另一个FLD页面对象。
   *
   * @param[in] other  另一个FLD页面对象。
   */
  FLDPage(const FLDPage& other);

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other  另一个FLD页面对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  FLDPage& operator = (const FLDPage& other);

  /**
   * @brief 相等操作符。
   *
   * @param[in] other  另一个FLD页面对象。此函数将检查当前对象是否等于这个对象。
   *
   * @return <b>true</b> 表示相等，<b>false</b> 表示不相等。
   */
  bool operator == (const FLDPage& other) const;

  /**
   * @brief 不相等操作符。
   *
   * @param[in] other  另一个FLD页面对象。此函数将检查当前对象是否不等于这个对象。
   *
   * @return <b>true</b> 表示不相等，<b>false</b> 表示相等。
   */
  bool operator != (const FLDPage& other) const;

  /**
   * @brief 检查当前对象是否为空。
   *
   * @details 当前对象为空时，表示当前对象是无用的。
   *
   * @return <b>true</b> 表示当前对象为空，<b>false</b> 表示不为空。
   */
  bool IsEmpty() const;

  /**
   * @brief 检查当前对象是否已解析。
   *
   * @return <b>true</b> 表示已解析，<b>false</b> 表示未解析。
   */
  bool IsParsed() const;

  /**
   * @brief 解析当前对象。
   *
   * @return 错误码，表示解析结果。
   */
  ErrorCode Parse() const;

  /**
   * @brief 获取页面宽度。单位为1/72英寸。
   *
   * @return 页面宽度。
   */
  float GetWidth() const;

  /**
   * @brief 获取页面高度。单位为1/72英寸。
   *
   * @return 页面高度。
   */
  float GetHeight() const;

  /**
    * @brief 获取页面旋转角度。
    *
    * @return 页面旋转角度。
    */
  foxit::common::Rotation GetRotation() const;

  /**
   * @brief 计算渲染矩阵。
   *
   * @param[in] left              设备区域左上角X坐标。
   * @param[in] top               设备区域左上角Y坐标。
   * @param[in] width             设备区域宽度。
   * @param[in] height            设备区域高度。
   * @param[in] rotate            旋转角度。
   *
   * @return 页面显示矩阵。
   */
  foxit::Matrix GetDisplayMatrix(int left, int top, int width, int height, foxit::common::Rotation rotate) const;

  /**
   * @brief 获取页面区域。
   *
   * @return 页面区域。坐标系为PDF坐标系。
   */
  foxit::RectF GetBox() const;

  // User is strongly recommended NOT to use this method; otherwise unknown situation may occur.
  explicit FLDPage(FS_HANDLE handle = NULL);
};

}  // namespace fld
}  // namespace foxit

#endif  // FS_FLD_PAGE_H_
