// Copyright 2017 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 CORE_FXGE_CFX_COLOR_H_
#define CORE_FXGE_CFX_COLOR_H_

#include "core/fxge/dib/fx_dib.h"

struct CFX_Color {
  // Ordered by increasing number of components.
  enum class Type { kTransparent = 0, kGray, kRGB, kCMYK };

  struct TypeAndARGB {
    TypeAndARGB(CFX_Color::Type type_in, FX_ARGB argb_in)
        : color_type(type_in), argb(argb_in) {}

    CFX_Color::Type color_type;
    FX_ARGB argb;
  };

  explicit CFX_Color(FX_COLORREF ref)
      : CFX_Color(FXARGB_R(ref), FXARGB_G(ref), FXARGB_B(ref)) {}

  CFX_Color(Type type = CFX_Color::Type::kTransparent,
            float color1 = 0.0f,
            float color2 = 0.0f,
            float color3 = 0.0f,
            float color4 = 0.0f)
      : nColorType(type),
        fColor1(color1),
        fColor2(color2),
        fColor3(color3),
        fColor4(color4) {}

  CFX_Color(int32_t r, int32_t g, int32_t b)
      : nColorType(CFX_Color::Type::kRGB),
        fColor1(r / 255.0f),
        fColor2(g / 255.0f),
        fColor3(b / 255.0f),
        fColor4(0) {}

  CFX_Color(const CFX_Color& that) = default;
  CFX_Color& operator=(const CFX_Color& that) = default;

  CFX_Color operator/(float fColorDivide) const;
  CFX_Color operator-(float fColorSub) const;

  CFX_Color ConvertColorType(Type nConvertColorType) const;
  FX_COLORREF ToFXColor(int32_t nTransparency) const;

  Type nColorType;
  float fColor1;
  float fColor2;
  float fColor3;
  float fColor4;
};

inline bool operator==(const CFX_Color& c1, const CFX_Color& c2) {
  return c1.nColorType == c2.nColorType && c1.fColor1 - c2.fColor1 < 0.0001 &&
         c1.fColor1 - c2.fColor1 > -0.0001 &&
         c1.fColor2 - c2.fColor2 < 0.0001 &&
         c1.fColor2 - c2.fColor2 > -0.0001 &&
         c1.fColor3 - c2.fColor3 < 0.0001 &&
         c1.fColor3 - c2.fColor3 > -0.0001 &&
         c1.fColor4 - c2.fColor4 < 0.0001 && c1.fColor4 - c2.fColor4 > -0.0001;
}

inline bool operator!=(const CFX_Color& c1, const CFX_Color& c2) {
  return !(c1 == c2);
}

#endif  // CORE_FXGE_CFX_COLOR_H_
