// Copyright 2014 The PDFium Authors
// 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 CORE_FXCRT_CSS_CFX_CSS_H_
#define CORE_FXCRT_CSS_CFX_CSS_H_

#include <stdint.h>

#include <type_traits>

enum CFX_CSSVALUETYPE {
  CFX_CSSVALUETYPE_Primitive = 1 << 0,
  CFX_CSSVALUETYPE_List = 1 << 1,
  CFX_CSSVALUETYPE_Shorthand = 1 << 2,
  // Note the values below this comment must be > 0x0F so we can mask the above.
  CFX_CSSVALUETYPE_MaybeNumber = 1 << 4,
  CFX_CSSVALUETYPE_MaybeEnum = 1 << 5,
  CFX_CSSVALUETYPE_MaybeString = 1 << 7,
  CFX_CSSVALUETYPE_MaybeColor = 1 << 8
};
using CFX_CSSValueTypeMask = std::underlying_type<CFX_CSSVALUETYPE>::type;

#undef CSS_PROP____
#define CSS_PROP____(a, b, c, d) a,
enum class CFX_CSSProperty : uint8_t {
#include "core/fxcrt/css/properties.inc"
};
#undef CSS_PROP____

#undef CSS_PROP_VALUE____
#define CSS_PROP_VALUE____(a, b, c) a,
enum class CFX_CSSPropertyValue : uint8_t {
#include "core/fxcrt/css/property_values.inc"
};
#undef CSS_PROP_VALUE____

enum class CFX_CSSLengthUnit : uint8_t {
  Auto,
  None,
  Normal,
  Point,
  Percent,
};

enum class CFX_CSSDisplay : uint8_t {
  None,
  ListItem,
  Block,
  Inline,
  InlineBlock,
  InlineTable,
};

enum class CFX_CSSFontStyle : uint8_t {
  Normal,
  Italic,
};

enum class CFX_CSSTextAlign : uint8_t {
  Left,
  Right,
  Center,
  Justify,
  JustifyAll,
};

enum class CFX_CSSVerticalAlign : uint8_t {
  Baseline,
  Sub,
  Super,
  Top,
  TextTop,
  Middle,
  Bottom,
  TextBottom,
  Number,
};

enum class CFX_CSSFontVariant : uint8_t {
  Normal,
  SmallCaps,
};

enum class CFX_CSSTEXTDECORATION : uint8_t {
  kNone = 0,
  kUnderline = 1 << 0,
  kOverline = 1 << 1,
  kLineThrough = 1 << 2,
  kBlink = 1 << 3,
  kDouble = 1 << 4,
};

class CFX_CSSLength {
 public:
  CFX_CSSLength() = default;

  CFX_CSSLength(CFX_CSSLengthUnit eUnit, float fValue)
      : unit_(eUnit), value_(fValue) {}

  CFX_CSSLength& Set(CFX_CSSLengthUnit eUnit) {
    unit_ = eUnit;
    return *this;
  }

  CFX_CSSLength& Set(CFX_CSSLengthUnit eUnit, float fValue) {
    unit_ = eUnit;
    value_ = fValue;
    return *this;
  }

  CFX_CSSLengthUnit GetUnit() const { return unit_; }

  float GetValue() const { return value_; }
  bool NonZero() const { return static_cast<int>(value_) != 0; }

 private:
  CFX_CSSLengthUnit unit_;
  float value_;
};

class CFX_CSSRect {
 public:
  CFX_CSSRect() = default;

  CFX_CSSRect(CFX_CSSLengthUnit eUnit, float val)
      : left(eUnit, val),
        top(eUnit, val),
        right(eUnit, val),
        bottom(eUnit, val) {}

  CFX_CSSRect& Set(CFX_CSSLengthUnit eUnit) {
    left.Set(eUnit);
    top.Set(eUnit);
    right.Set(eUnit);
    bottom.Set(eUnit);
    return *this;
  }
  CFX_CSSRect& Set(CFX_CSSLengthUnit eUnit, float fValue) {
    left.Set(eUnit, fValue);
    top.Set(eUnit, fValue);
    right.Set(eUnit, fValue);
    bottom.Set(eUnit, fValue);
    return *this;
  }

  CFX_CSSLength left;
  CFX_CSSLength top;
  CFX_CSSLength right;
  CFX_CSSLength bottom;
};

#endif  // CORE_FXCRT_CSS_CFX_CSS_H_
