aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/colors/RGB.hpp
blob: f61b7fc784c50f4f8653bf4ed2ab99ea6e684645 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <algorithm>

namespace meow{
  template<class T>
  inline RGB<T>::RGB(){ }
  template<class T>
  inline RGB<T>::RGB(T const& r, T const& g, T const& b){
    rgb_[0] = r; rgb_[1] = g; rgb_[2] = b;
  }
  template<class T>
  inline RGB<T>::RGB(T const* rgb){
    for(int i = 0; i < 3; i++){
      rgb_[i] = rgb[i];
    }
  }
  template<class T>
  inline T RGB<T>::r()        const { return rgb_[0]; }
  template<class T>
  inline T RGB<T>::g()        const { return rgb_[1]; }
  template<class T>
  inline T RGB<T>::b()        const { return rgb_[2]; }
  template<class T>
  inline T RGB<T>::rgb(size_t i) const {
    return rgb_[std::min((size_t)3 - 1, i)];
  }
  template<class T>
  inline T RGB<T>::bgr(size_t i) const { return rgb(2 - i); }
  /////////////////// **# setting #** ////////////////
  template<class T>
  inline T RGB<T>::r(T const& val){ return (rgb_[0] = val); }
  template<class T>
  inline T RGB<T>::g(T const& val){ return (rgb_[1] = val); }
  template<class T>
  inline T RGB<T>::b(T const& val){ return (rgb_[2] = val); }
  template<class T>
  inline T RGB<T>::rgb(size_t i, T const& val){
    i = std::min((size_t)3 - 1, i);
    return (rgb_[i] = val);
  }
  template<class T>
  inline T RGB<T>::bgr(size_t i, T const& val){
    return rgb(2 - i, val);
  }



  inline RGBf::RGBf(): RGB(0.0, 0.0, 0.0){ }
  inline RGBf::~RGBf(){ }
  inline RGBf::RGBf(double const&r,double const&g,double const&b):RGB(r,g,b){}
  inline RGBf::RGBf(double const* rgb): RGB(rgb){ }
  inline double RGBf::rMin() const { return 0.0; }
  inline double RGBf::rMax() const { return 1.0; }
  inline double RGBf::gMin() const { return 0.0; }
  inline double RGBf::gMax() const { return 1.0; }
  inline double RGBf::bMin() const { return 0.0; }
  inline double RGBf::bMax() const { return 1.0; }




  inline RGBi::RGBi (): RGB(0.0, 0.0, 0.0){ }
  inline RGBi::~RGBi(){ }
  inline RGBi::RGBi(int32_t const&r,int32_t const&g,int32_t const&b):RGB(r,g,b)
  {}
  inline RGBi::RGBi(int32_t const* rgb): RGB(rgb){ }
  inline int32_t RGBi::rMin() const { return   0; }
  inline int32_t RGBi::rMax() const { return 255; }
  inline int32_t RGBi::gMin() const { return   0; }
  inline int32_t RGBi::gMax() const { return 255; }
  inline int32_t RGBi::bMin() const { return   0; }
  inline int32_t RGBi::bMax() const { return 255; }
  
  
  template<class RGB_T1, class RGB_T2>
  inline void RGB_to_RGB(RGB<RGB_T1> const& a, RGB<RGB_T2>* b){
    double r = normalize(a.rMin(), a.rMax(), a.r());
    double g = normalize(a.gMin(), a.gMax(), a.g());
    double x = normalize(a.bMin(), a.bMax(), a.b());
    b->r(denormalize(b->rMin(), b->rMax(), r));
    b->g(denormalize(b->gMin(), b->gMax(), g));
    b->b(denormalize(b->bMin(), b->bMax(), x));
  }
}