#ifndef FS_OFD_WATERMARK_H_
#define FS_OFD_WATERMARK_H_

#include "common/fs_common.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
 * @brief ofd 命名空间。
 */
namespace ofd {
class OFDPage;

/** 此类表示和OFD文字水印相关的属性。*/
class TextProperties FS_FINAL : public Object {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] text        水印文本内容。
   * @param[in] font_name   水印文本字体名称。
   * @param[in] font_size   水印文本字体大小。
   * @param[in] char_space  水印文本字符间距。
   * @param[in] text_color  水印文本颜色。
   */
  explicit TextProperties(const String& text, const String& font_name, float font_size, float char_space, foxit::RGB text_color) :
    text(text),
    font_name(font_name),
    font_size(font_size),
    char_space(char_space),
    text_color(text_color) {}

  /**
   * @brief 构造函数，通过另一个文字水印属性对象。
   *
   * @param[in] settings 另一个文字水印属性对象。
   */
  TextProperties(const TextProperties& settings) {
    this->text = settings.text;
    this->font_name = settings.font_name;
    this->font_size = settings.font_size;
    this->char_space = settings.char_space;
    this->text_color = settings.text_color;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] settings 另一个文字水印属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  TextProperties& operator = (const TextProperties& settings) {
    this->text = settings.text;
    this->font_name = settings.font_name;
    this->font_size = settings.font_size;
    this->char_space = settings.char_space;
    this->text_color = settings.text_color;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] text        水印文本内容。
   * @param[in] font_name   水印文本字体名称。
   * @param[in] font_size   水印文本字体大小。
   * @param[in] char_space  水印文本字符间距。
   * @param[in] text_color  水印文本颜色。
   *
   * @return 无。
   */
  void Set(const String& text, const String& font_name, float font_size, float char_space, foxit::RGB text_color) {
    this->text = text;
    this->font_name = font_name;
    this->font_size = font_size;
    this->char_space = char_space;
    this->text_color = text_color;
  }

  /**
   * @brief 检查当前对象是否有效。
   *
   * @details 当前对象有效时，表示当前对象包含合法的水印文本属性信息。
   *
   * @return <b>true</b> 表示当前对象有效，<b>false</b> 表示无效。
   */
  bool IsValid() const {
    return !text.IsEmpty() && !font_name.IsEmpty() && font_size > 0;
  }

  /**
   * @brief 水印文本内容。
   *
   */
  String text;

  /**
   * @brief 水印文本字体名称。
   *
   */
  String font_name;

  /**
   * @brief 水印文本字体大小，单位为毫米。
   *
   */
  float font_size;

  /**
   * @brief 水印文本字符间距。
   *
   */
  float char_space;

  /**
   * @brief 水印文本颜色。
   *
   */
  foxit::RGB text_color;
};

/** 此类表示和OFD图片水印相关的属性。*/
class ImageProperties FS_FINAL : public Object {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] image_id 图片资源ID。
   */
  explicit ImageProperties(foxit::uint32 image_id)
    : image_id(image_id) {}

  /**
   * @brief 构造函数，通过另一个图片水印属性对象。
   *
   * @param[in] settings 另一个图片水印属性对象。
   */
  ImageProperties(const ImageProperties& settings) {
    this->image_id = settings.image_id;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] settings 另一个图片水印属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  ImageProperties& operator = (const ImageProperties& settings) {
    this->image_id = settings.image_id;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] image_id 图片资源ID。
   *
   * @return 无。
   */
  void Set(foxit::uint32 image_id) {
    this->image_id = image_id;
  }

  /**
   * @brief 检查当前对象是否有效。
   *
   * @details 当前对象有效时，表示当前对象包含合法的图片水印属性信息。
   *
   * @return <b>true</b> 表示当前对象有效，<b>false</b> 表示无效。
   */
  bool IsValid() const {
    return image_id != 0;
  }

  /**
   * @brief 图片资源ID。
   *
   */
  foxit::uint32 image_id;
};

/** 此类表示和OFD水印相关的基本属性。*/
class BaseWatermarkSettings : public Object {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   */
  explicit BaseWatermarkSettings(float width, float height, float rotation, foxit::uint8 opacity, bool visible = true, bool printable = true) :
    width(width),
    height(height),
    rotation(rotation),
    opacity(opacity),
    visible(visible),
    printable(printable) {}

  /**
   * @brief 构造函数，通过另一个水印基本属性对象。
   *
   * @param[in] settings 另一个水印基本属性对象。
   */
  BaseWatermarkSettings(const BaseWatermarkSettings& settings) {
    this->width = settings.width;
    this->height = settings.height;
    this->rotation = settings.rotation;
    this->opacity = settings.opacity;
    this->visible = settings.visible;
    this->printable = settings.printable;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] settings 另一个水印基本属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  BaseWatermarkSettings& operator = (const BaseWatermarkSettings& settings) {
    this->width = settings.width;
    this->height = settings.height;
    this->rotation = settings.rotation;
    this->opacity = settings.opacity;
    this->visible = settings.visible;
    this->printable = settings.printable;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   *
   * @return 无。
   */
  void Set(float width, float height, float rotation, foxit::uint8 opacity, bool visible = true, bool printable = true) {
    this->width = width;
    this->height = height;
    this->rotation = rotation;
    this->opacity = opacity;
    this->visible = visible;
    this->printable = printable;
  }

  /**
   * @brief 检查当前对象是否有效。
   *
   * @details 当前对象有效时，表示当前对象包含合法的水印基本属性信息。
   *
   * @return <b>true</b> 表示当前对象有效，<b>false</b> 表示无效。
   */
  virtual bool IsValid() const {
    return width > 0.0f && height > 0.0f && opacity >= 0 && opacity <= 255 && rotation >= 0.0f && rotation < 360.0f;
  }

  /**
   * @brief 水印宽度，单位为毫米。
   *
   */
  float width;

  /**
   * @brief 水印高度，单位为毫米。
   *
   */
  float height;

  /**
   * @brief 水印顺时针旋转角度，范围为0-360。
   *
   */
  float rotation;

  /**
   * @brief 水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   *
   */
  foxit::uint8 opacity;

  /**
   * @brief 水印是否可见。
   *
   */
  bool visible;

  /**
   * @brief 水印是否可打印。
   *
   */
  bool printable;
};

/** 此类表示和OFD水印相关的位置属性。*/
class WatermarkSettings : public BaseWatermarkSettings {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] x_pos       水印X坐标，单位为毫米。
   * @param[in] y_pos       水印Y坐标，单位为毫米。
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   */
  explicit WatermarkSettings(float x_pos, float y_pos, float width, float height, float rotation, foxit::uint8 opacity, bool visible = true, bool printable = true) :
    x_pos(x_pos),
    y_pos(y_pos),
    BaseWatermarkSettings(width, height, rotation, opacity, visible, printable) {}

  /**
   * @brief 构造函数，通过另一个水印位置属性对象。
   *
   * @param[in] settings 另一个水印位置属性对象。
   */
  WatermarkSettings(const WatermarkSettings& settings) :
    BaseWatermarkSettings(settings) {
    this->x_pos = settings.x_pos;
    this->y_pos = settings.y_pos;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] settings 另一个水印位置属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  WatermarkSettings& operator = (const WatermarkSettings& settings) {
    this->x_pos = settings.x_pos;
    this->y_pos = settings.y_pos;
    this->width = settings.width;
    this->height = settings.height;
    this->rotation = settings.rotation;
    this->opacity = settings.opacity;
    this->visible = settings.visible;
    this->printable = settings.printable;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] x_pos       水印X坐标，单位为毫米。
   * @param[in] y_pos       水印Y坐标，单位为毫米。
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   *
   * @return 无。
   */
  void Set(float x_pos, float y_pos, float width, float height, float rotation, foxit::uint8 opacity, bool visible = true, bool printable = true) {
    this->x_pos = x_pos;
    this->y_pos = y_pos;
    this->width = width;
    this->height = height;
    this->rotation = rotation;
    this->opacity = opacity;
    this->visible = visible;
    this->printable = printable;
  }

  /**
   * @brief 检查当前对象是否有效。
   *
   * @details 当前对象有效时，表示当前对象包含合法的水印基本属性信息。
   *
   * @return <b>true</b> 表示当前对象有效，<b>false</b> 表示无效。
   */
  virtual bool IsValid() const {
    return BaseWatermarkSettings::IsValid();
  }

  /**
   * @brief 水印X坐标，单位为毫米。
   *
   */
  float x_pos;

  /**
   * @brief 水印Y坐标，单位为毫米。
   *
   */
  float y_pos;
};

/** 此类表示和OFD水印相关的对齐属性。*/
class AlignmentWatermarkSettings FS_FINAL : public BaseWatermarkSettings {
 public:
  /**
   * @brief OFD水印水平对齐方式定义枚举类型.
   *
   * @details 该枚举值应单独使用.
   */
  typedef enum _WatermarkHAlign {
    /** @brief 水平对齐方式：左对齐。 */
    e_WatermarkHAlignLeft   =  0,
    /** @brief 水平对齐方式：居中对齐。 */
    e_WatermarkHAlignCenter  =  1,
    /** @brief 水平对齐方式：右对齐。 */
    e_WatermarkHAlignRight   =  2
  } WatermarkHAlign;
  
  /**
   * @brief OFD水印垂直对齐方式定义枚举类型.
   *
   * @details 该枚举值应单独使用.
   */
  typedef enum _WatermarkVAlign {
    /** @brief 垂直对齐方式：上对齐。 */
    e_WatermarkVAlignTop     =  0,
    /** @brief 垂直对齐方式：居中对齐。 */
    e_WatermarkVAlignMiddle  =  1,
    /** @brief 垂直对齐方式：下对齐。 */
    e_WatermarkVAlignBottom  =  2
  } WatermarkVAlign;
  

  /** @brief 带参数的构造函数。
   *
   * @param[in] h_align     水印水平对齐方式。请参考从 @link foxit::ofd::AlignmentWatermarkSettings::e_WatermarkHAlignLeft @endlink 开始的值，
   *                        这应该是这些值中的一个。
   * @param[in] v_align     水印垂直对齐方式。请参考从 @link foxit::ofd::AlignmentWatermarkSettings::e_WatermarkVAlignTop @endlink 开始的值，
   *                        这应该是这些值中的一个。
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   */
  explicit AlignmentWatermarkSettings(WatermarkHAlign h_align, WatermarkVAlign v_align, float width, float height, float rotation, foxit::uint8 opacity,
    bool visible = true, bool printable = true) :
    h_align(h_align),
    v_align(v_align),
    BaseWatermarkSettings(width, height, rotation, opacity, visible, printable) {}

  /**
   * @brief 构造函数，通过另一个水印对齐属性对象。
   *
   * @param[in] settings 另一个水印对齐属性对象。
   */
  AlignmentWatermarkSettings(const AlignmentWatermarkSettings& settings) :
    BaseWatermarkSettings(settings) {
    this->h_align = settings.h_align;
    this->v_align = settings.v_align;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] settings 另一个水印对齐属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  AlignmentWatermarkSettings& operator = (const AlignmentWatermarkSettings& settings) {
    this->h_align = settings.h_align;
    this->v_align = settings.v_align;
    this->width = settings.width;
    this->height = settings.height;
    this->rotation = settings.rotation;
    this->opacity = settings.opacity;
    this->visible = settings.visible;
    this->printable = settings.printable;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] h_align     水印水平对齐方式。请参考从 @link foxit::ofd::AlignmentWatermarkSettings::e_WatermarkHAlignLeft @endlink 开始的值，
   *                        这应该是这些值中的一个。
   * @param[in] v_align     水印垂直对齐方式。请参考从 @link foxit::ofd::AlignmentWatermarkSettings::e_WatermarkVAlignTop @endlink 开始的值，
   *                        这应该是这些值中的一个。
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   *
   * @return 无。
   */
  void Set(WatermarkHAlign h_align, WatermarkVAlign v_align, float width, float height, float rotation, foxit::uint8 opacity,
    bool visible = true, bool printable = true) {
    this->h_align = h_align;
    this->v_align = v_align;
    this->width = width;
    this->height = height;
    this->rotation = rotation;
    this->opacity = opacity;
    this->visible = visible;
    this->printable = printable;
  }

  /**
   * @brief 检查当前对象是否有效。
   *
   * @details 当前对象有效时，表示当前对象包含合法的水印基本属性信息。
   *
   * @return <b>true</b> 表示当前对象有效，<b>false</b> 表示无效。
   */
  virtual bool IsValid() const {
    return BaseWatermarkSettings::IsValid();
  }

  /**
   * @brief 水印水平对齐方式。请参考从 @link foxit::ofd::AlignmentWatermarkSettings::e_WatermarkHAlignLeft @endlink 开始的值，
   *        这应该是这些值中的一个。
   *
   */
  WatermarkHAlign h_align;

  /**
   * @brief 水印垂直对齐方式。请参考从 @link foxit::ofd::AlignmentWatermarkSettings::e_WatermarkVAlignTop @endlink 开始的值，
   *        这应该是这些值中的一个。
   *
   */
  WatermarkVAlign v_align;
};

/** 此类表示和OFD水印相关的平铺属性。*/
class TiledWatermarkSettings FS_FINAL : public WatermarkSettings {
 public:
  /** @brief 带参数的构造函数。
   *
   * @param[in] x_pos       水印X坐标，单位为毫米。
   * @param[in] y_pos       水印Y坐标，单位为毫米。
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] x_step      水印在X轴方向的平铺间距，单位为毫米。
   * @param[in] y_step      水印在Y轴方向的平铺间距，单位为毫米。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   */
  explicit TiledWatermarkSettings(float x_pos, float y_pos, float width, float height, float rotation, foxit::uint8 opacity,
    float x_step, float y_step, bool visible = true, bool printable = true) :
    x_step(x_step),
    y_step(y_step),
    WatermarkSettings(x_pos, y_pos, width, height, rotation, opacity, visible, printable) {}

  /**
   * @brief 构造函数，通过另一个水印平铺属性对象。
   *
   * @param[in] settings 另一个水印平铺属性对象。
   */
  TiledWatermarkSettings(const TiledWatermarkSettings& settings) :
    WatermarkSettings(settings) {
    this->x_step = settings.x_step;
    this->y_step = settings.y_step;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] settings 另一个水印平铺属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  TiledWatermarkSettings& operator = (const TiledWatermarkSettings& settings) {
    this->x_step = settings.x_step;
    this->y_step = settings.y_step;
    this->x_pos = settings.x_pos;
    this->y_pos = settings.y_pos;
    this->width = settings.width;
    this->height = settings.height;
    this->rotation = settings.rotation;
    this->opacity = settings.opacity;
    this->visible = settings.visible;
    this->printable = settings.printable;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] x_pos       水印X坐标，单位为毫米。
   * @param[in] y_pos       水印Y坐标，单位为毫米。
   * @param[in] width       水印宽度，单位为毫米。
   * @param[in] height      水印高度，单位为毫米。
   * @param[in] rotation    水印顺时针旋转角度，范围为0-360。
   * @param[in] opacity     水印透明度，范围为0-255，0表示完全透明，255表示不透明。
   * @param[in] x_step      水印在X轴方向的平铺间距，单位为毫米。
   * @param[in] y_step      水印在Y轴方向的平铺间距，单位为毫米。
   * @param[in] visible     水印是否可见，默认值为true。
   * @param[in] printable   水印是否可打印，默认值为true。
   *
   * @return 无。
   */
  void Set(float x_pos, float y_pos, float width, float height, float rotation, foxit::uint8 opacity,
    float x_step, float y_step, bool visible = true, bool printable = true) {
    this->x_pos = x_pos;
    this->y_pos = y_pos;
    this->width = width;
    this->height = height;
    this->rotation = rotation;
    this->opacity = opacity;
    this->visible = visible;
    this->printable = printable;
    this->x_step = x_step;
    this->y_step = y_step;
  }

  /**
   * @brief 检查当前对象是否有效。
   *
   * @details 当前对象有效时，表示当前对象包含合法的水印基本属性信息。
   *
   * @return <b>true</b> 表示当前对象有效，<b>false</b> 表示无效。
   */
  virtual bool IsValid() const {
    return WatermarkSettings::IsValid() && x_step > 0 && y_step > 0;
  }

  /**
   * @brief 水印在X轴方向的平铺间距，单位为毫米。
   *
   */
  float x_step;

  /**
   * @brief 水印在Y轴方向的平铺间距，单位为毫米。
   *
   */
  float y_step;
};

/** 此类表示OFD水印对象相关的操作。 */
class Watermark FS_FINAL : public Base {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] page  OFD页面对象。
   */
  explicit Watermark(OFDPage page);

  /** @brief 析构函数。*/
  ~Watermark();

  /**
   * @brief 用另一个水印对象构造当前水印对象。
   *
   * @param[in] other 另一个水印对象。
   */
  Watermark(const Watermark& other);

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

  /**
   * @brief 相等操作符。
   *
   * @param[in] other 另一个水印对象。
   *
   * @return <b>true</b> 表示两个水印对象相等，<b>false</b> 表示不相等。
   */
  bool operator == (const Watermark& other) const;

  /**
   * @brief 不等操作符。
   *
   * @param[in] other 另一个水印对象。
   *
   * @return <b>true</b> 表示两个水印对象不等，<b>false</b> 表示相等。
   */
  bool operator != (const Watermark& other) const;

  /**
   * @brief 添加文字水印。
   *
   * @param[in] properties  文字水印属性。详见 @link foxit::ofd::TextProperties @endlink 。
   * @param[in] settings    水印位置属性。详见 @link foxit::ofd::WatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddTextWatermark(const TextProperties& properties, const WatermarkSettings& settings);

  /**
   * @brief 添加对齐文字水印。
   *
   * @param[in] properties  文字水印属性。详见 @link foxit::ofd::TextProperties @endlink 。
   * @param[in] settings    对齐水印属性。详见 @link foxit::ofd::AlignmentWatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddAlignTextWatermark(const TextProperties& properties, const AlignmentWatermarkSettings& settings);

  /**
   * @brief 添加平铺文字水印。
   *
   * @param[in] properties  文字水印属性。详见 @link foxit::ofd::TextProperties @endlink 。
   * @param[in] settings    平铺水印属性。详见 @link foxit::ofd::TiledWatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddTiledTextWatermark(const TextProperties& properties, const TiledWatermarkSettings& settings);

  /**
   * @brief 添加图片水印。
   *
   * @param[in] properties  图片水印属性。详见 @link foxit::ofd::ImageProperties @endlink 。
   * @param[in] settings    水印位置属性。详见 @link foxit::ofd::WatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddImageWatermark(const ImageProperties& properties, const WatermarkSettings& settings);

  /**
   * @brief 添加对齐图片水印。
   *
   * @param[in] properties  图片水印属性。详见 @link foxit::ofd::ImageProperties @endlink 。
   * @param[in] settings    对齐水印属性。详见 @link foxit::ofd::AlignmentWatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddAlignImageWatermark(const ImageProperties& properties, const AlignmentWatermarkSettings& settings);

  /**
   * @brief 添加平铺图片水印。
   *
   * @param[in] properties  图片水印属性。详见 @link foxit::ofd::ImageProperties @endlink 。
   * @param[in] settings    平铺水印属性。详见 @link foxit::ofd::TiledWatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddTiledImageWatermark(const ImageProperties& properties, const TiledWatermarkSettings& settings);

  /** @brief 添加区域平铺文字水印。
   *
   * @param[in] region      文字水印区域，坐标系为OFD坐标系。
   * @param[in] properties  文字水印属性。详见 @link foxit::ofd::TextProperties @endlink 。
   * @param[in] settings    平铺水印属性。详见 @link foxit::ofd::TiledWatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddRegionTextWatermark(foxit::RectF region, const TextProperties& properties, const TiledWatermarkSettings& settings);

  /** @brief 添加区域平铺图片水印。
   *
   * @param[in] region      图片水印区域，坐标系为OFD坐标系。
   * @param[in] properties  图片水印属性。详见 @link foxit::ofd::ImageProperties @endlink 。
   * @param[in] settings    平铺水印属性。详见 @link foxit::ofd::TiledWatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddRegionImageWatermark(foxit::RectF region, const ImageProperties& properties, const TiledWatermarkSettings& settings);

  /** @brief 添加多区域文字水印。
   *
   * @param[in] h_layout_num  水印在水平方向的区域数量。
   * @param[in] v_layout_num  水印在垂直方向的区域数量。
   * @param[in] properties    文字水印属性。详见 @link foxit::ofd::TextProperties @endlink 。
   * @param[in] settings      水印位置属性。详见 @link foxit::ofd::WatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddMultiAreaTextWatermark(int h_layout_num, int v_layout_num, const TextProperties& properties, const WatermarkSettings& settings);

  /** @brief 添加多区域图片水印。
   *
   * @param[in] h_layout_num  水印在水平方向的区域数量。
   * @param[in] v_layout_num  水印在垂直方向的区域数量。
   * @param[in] properties    图片水印属性。详见 @link foxit::ofd::ImageProperties @endlink 。
   * @param[in] settings      水印位置属性。详见 @link foxit::ofd::WatermarkSettings @endlink 。
   *
   * @return <b>true</b> 表示添加成功，<b>false</b> 表示添加失败。
   */
  bool AddMultiAreaImageWatermark(int h_layout_num, int v_layout_num, const ImageProperties& properties, const WatermarkSettings& settings);

  explicit Watermark(FS_HANDLE handle);
};

}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_WATERMARK_H_
