aboutsummaryrefslogtreecommitdiffstats
path: root/_test/meowpp_Colors.cpp
blob: 847f838f347d28b0c4d305c89874df2c7d2fbc90 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "meowpp.h"

TEST(Colors){
  meow::RGBf rgb, rgb2;
  meow::YUVf yuv, yuv2;
  meow::HSLf hsl, hsl2;
  meow::HSVf hsv, hsv2;
  bool ok = true;
  double eps;
  eps = 1e-8;
  meow::messagePrintf(1, "rgb ---> hsl ---> rgb ---> hsl (eps = %e)", eps);
  for(int i = 0; ok && i < 100000; i++){
    rgb.r(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
    rgb.g(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
    rgb.b(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.bMin(), rgb.bMax()));
    meow::RGB_to_HSL(rgb , &hsl );
    meow::HSL_to_RGB(hsl , &rgb2);
    meow::RGB_to_HSL(rgb2, &hsl2);
    if(meow::noEPS(rgb.r() - rgb2.r(), eps) != 0 ||
       meow::noEPS(rgb.g() - rgb2.g(), eps) != 0 ||
       meow::noEPS(rgb.b() - rgb2.b(), eps) != 0) ok = false;
    if(meow::noEPS(hsl.h() - hsl2.h(), eps) != 0 ||
       meow::noEPS(hsl.s() - hsl2.s(), eps) != 0 ||
       meow::noEPS(hsl.l() - hsl2.l(), eps) != 0) ok = false;
  }
  if(ok) meow::messagePrintf(-1, "ok!");
  else{  meow::messagePrintf(-1, "fail"); return false; }
  //
  eps = 1e-8;
  meow::messagePrintf(1, "rgb ---> hsv ---> rgb ---> hsv (eps = %e)", eps);
  for(int i = 0; ok && i < 100000; i++){
    rgb.r(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
    rgb.g(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
    rgb.b(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.bMin(), rgb.bMax()));
    meow::RGB_to_HSV(rgb , &hsv );
    meow::HSV_to_RGB(hsv , &rgb2);
    meow::RGB_to_HSV(rgb2, &hsv2);
    if(meow::noEPS(rgb.r() - rgb2.r(), eps) != 0 ||
       meow::noEPS(rgb.g() - rgb2.g(), eps) != 0 ||
       meow::noEPS(rgb.b() - rgb2.b(), eps) != 0) ok = false;
    if(meow::noEPS(hsv.h() - hsv2.h(), eps) != 0 ||
       meow::noEPS(hsv.s() - hsv2.s(), eps) != 0 ||
       meow::noEPS(hsv.v() - hsv2.v(), eps) != 0) ok = false;
  }
  if(ok) meow::messagePrintf(-1, "ok!");
  else{  meow::messagePrintf(-1, "fail"); return false; }
  //
  /*
  eps = 1e-3;
  meow::messagePrintf(1, "yuv ---> hsl ---> yuv ---> hsl");
  for(int i = 0; ok && i < 100000; i++){
    yuv.y(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.yMin(), yuv.yMax()));
    yuv.u(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.uMin(), yuv.uMax()));
    yuv.v(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.vMin(), yuv.vMax()));
    meow::YUV_to_HSL(yuv , &hsl );
    meow::HSL_to_YUV(hsl , &yuv2);
    meow::YUV_to_HSL(yuv2, &hsl2);
    if(meow::noEPS(yuv.y() - yuv2.y(), eps) != 0 ||
       meow::noEPS(yuv.u() - yuv2.u(), eps) != 0 ||
       meow::noEPS(yuv.v() - yuv2.v(), eps) != 0) ok = false;
    if(meow::noEPS(hsl.h() - hsl2.h(), eps) != 0 ||
       meow::noEPS(hsl.s() - hsl2.s(), eps) != 0 ||
       meow::noEPS(hsl.l() - hsl2.l(), eps) != 0) ok = false;
  }
  if(ok) meow::messagePrintf(-1, "ok!");
  else{  meow::messagePrintf(-1, "fail"); return false; }
  // */
  /*
  meow::messagePrintf(1, "yuv ---> hsv ---> yuv ---> hsv");
  for(int i = 0; ok && i < 100000; i++){
    yuv.y(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.yMin(), yuv.yMax()));
    yuv.u(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.uMin(), yuv.uMax()));
    yuv.v(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, yuv.vMin(), yuv.vMax()));
    meow::YUV_to_HSV(yuv , &hsv );
    meow::HSV_to_YUV(hsv , &yuv2);
    meow::YUV_to_HSV(yuv2, &hsv2);
    if(meow::noEPS(yuv.y() - yuv2.y(), eps) != 0 ||
       meow::noEPS(yuv.u() - yuv2.u(), eps) != 0 ||
       meow::noEPS(yuv.v() - yuv2.v(), eps) != 0) ok = false;
    if(meow::noEPS(hsv.h() - hsv2.h(), eps) != 0 ||
       meow::noEPS(hsv.s() - hsv2.s(), eps) != 0 ||
       meow::noEPS(hsv.v() - hsv2.v(), eps) != 0) ok = false;
  }
  if(ok) meow::messagePrintf(-1, "ok!");
  else{  meow::messagePrintf(-1, "fail"); return false; }
  // */
  eps = 1e-3;
  meow::messagePrintf(1, "rgb ---> yuv ---> rgb ---> yuv (eps = %e)", eps);
  for(int i = 0; ok && i < 100000; i++){
    rgb.r(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
    rgb.g(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
    rgb.b(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, rgb.bMin(), rgb.bMax()));
    meow::RGB_to_YUV(rgb , &yuv );
    meow::YUV_to_RGB(yuv , &rgb2);
    meow::RGB_to_YUV(rgb2, &yuv2);
    if(meow::noEPS(rgb.r() - rgb2.r(), eps) != 0 ||
       meow::noEPS(rgb.g() - rgb2.g(), eps) != 0 ||
       meow::noEPS(rgb.b() - rgb2.b(), eps) != 0) ok = false;
    if(meow::noEPS(yuv.y() - yuv2.y(), eps) != 0 ||
       meow::noEPS(yuv.u() - yuv2.u(), eps) != 0 ||
       meow::noEPS(yuv.v() - yuv2.v(), eps) != 0) ok = false;
  }
  if(ok) meow::messagePrintf(-1, "ok!");
  else{  meow::messagePrintf(-1, "fail"); return false; }
  eps = 1e-8;
  meow::messagePrintf(1, "hsl ---> hsv ---> hsl ---> hsv (eps = %e)", eps);
  for(int i = 0; ok && i < 100000; i++){
    hsl.h(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, hsl.hMin(), hsl.hMax()));
    hsl.s(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, hsl.sMin(), hsl.sMax()));
    hsl.l(meow::ratioMapping(0, 1, 1.0 * rand() / RAND_MAX, hsl.lMin(), hsl.lMax()));
    meow::HSL_to_HSV(hsl , &hsv );
    meow::HSV_to_HSL(hsv , &hsl2);
    meow::HSL_to_HSV(hsl2, &hsv2);
    if(meow::noEPS(hsl.h() - hsl2.h(), eps) != 0 ||
       meow::noEPS(hsl.s() - hsl2.s(), eps) != 0 ||
       meow::noEPS(hsl.l() - hsl2.l(), eps) != 0) ok = false;
    if(meow::noEPS(hsv.h() - hsv2.h(), eps) != 0 ||
       meow::noEPS(hsv.s() - hsv2.s(), eps) != 0 ||
       meow::noEPS(hsv.v() - hsv2.v(), eps) != 0) ok = false;
  }
  if(ok) meow::messagePrintf(-1, "ok!");
  else{  meow::messagePrintf(-1, "fail"); return false; }
  return true;
};