// Copyright 2016 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 XFA_FXGRAPHICS_CFX_COLOR_H_
#define XFA_FXGRAPHICS_CFX_COLOR_H_

#include "core/fxge/include/fx_dib.h"
#include "xfa/fxgraphics/include/cfx_graphics.h"

class CFX_Pattern;
class CFX_Shading;

enum { FX_COLOR_None = 0, FX_COLOR_Solid, FX_COLOR_Pattern, FX_COLOR_Shading };

class CFX_Color {
 public:
  CFX_Color();
  explicit CFX_Color(const FX_ARGB argb);
  explicit CFX_Color(CFX_Shading* shading);
  CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb);
  virtual ~CFX_Color();

  FWL_Error Set(const FX_ARGB argb);
  FWL_Error Set(CFX_Pattern* pattern, const FX_ARGB argb);
  FWL_Error Set(CFX_Shading* shading);

 private:
  friend class CFX_Graphics;

  int32_t m_type;
  union {
    struct {
      FX_ARGB argb;
      CFX_Pattern* pattern;
    } m_info;
    CFX_Shading* m_shading;
  };
};

#endif  // XFA_FXGRAPHICS_CFX_COLOR_H_
