aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/colors/HSV.h
blob: d5e21a40136db7caaa4194f07338d913b8058f1f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#ifndef   HSV_H_
#define   HSV_H_

#include "RGB.h"
#include "YUV.h"
#include "HSL.h"

namespace meow{
  template<class T>
  class HSV{
    protected:
      T hsv_[3];
      HSV();
      HSV(T const& h, T const& s, T const& v);
      HSV(T const* hsv);
    public:
      virtual ~HSV(){ }
      ///////////////// **# not force #** ////////////////
      virtual T hMax() const = 0;
      virtual T hMin() const = 0;
      virtual T sMax() const = 0;
      virtual T sMin() const = 0;
      virtual T vMax() const = 0;
      virtual T vMin() const = 0;
      /////////////////// **# access #** /////////////////
      T h()           const;
      T s()           const;
      T v()           const;
      T hsv(size_t i) const;
      T vsh(size_t i) const;
      /////////////////// **# setting #** ////////////////
      T h(T const& val);
      T s(T const& val);
      T v(T const& val);
      T hsv(size_t i, T const& val);
      T vsh(size_t i, T const& val);
  };

  class HSVf: public HSV<double>{
    public:
      HSVf();
      ~HSVf();
      HSVf(double const&h,double const&s,double const&v);
      HSVf(double const* hsv);
      double hMin() const;
      double hMax() const;
      double sMin() const;
      double sMax() const;
      double vMin() const;
      double vMax() const;
  };

  template<class RGB_T, class HSV_T>
  inline void RGB_to_HSV(RGB<RGB_T> const& rgb, HSV<HSV_T>* hsv);
  template<class HSV_T, class RGB_T>
  inline void HSV_to_RGB(HSV<HSV_T> const& hsv, RGB<RGB_T>* rgb);
  template<class YUV_T, class HSV_T>
  inline void YUV_to_HSV(YUV<YUV_T> const& yuv, HSV<HSV_T>* hsv);
  template<class HSV_T, class YUV_T>
  inline void HSV_to_YUV(HSV<HSV_T> const& hsv, YUV<YUV_T>* yuv);
  template<class HSL_T, class HSV_T>
  inline void HSL_to_HSV(HSL<HSL_T> const& hsl, HSV<HSV_T>* hsv);
  template<class HSV_T, class HSL_T>
  inline void HSV_to_HSL(HSV<HSV_T> const& hsv, HSL<HSL_T>* hsl);
}

#include "HSV.hpp"

#endif // HSV_H_