aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp.test/src/Colors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'meowpp.test/src/Colors.cpp')
-rw-r--r--meowpp.test/src/Colors.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/meowpp.test/src/Colors.cpp b/meowpp.test/src/Colors.cpp
new file mode 100644
index 0000000..3233cf6
--- /dev/null
+++ b/meowpp.test/src/Colors.cpp
@@ -0,0 +1,130 @@
+#include "meowpp/colors/RGB.h"
+#include "meowpp/colors/YUV.h"
+#include "meowpp/colors/HSL.h"
+#include "meowpp/colors/HSV.h"
+#include "meowpp/utility.h"
+
+#include "meowpp.h"
+
+TEST(Colors, "Transformations"){
+ 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.0, 1.0, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
+ rgb.g(meow::ratioMapping(0.0, 1.0, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
+ rgb.b(meow::ratioMapping(0.0, 1.0, 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.0, 1.0, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
+ rgb.g(meow::ratioMapping(0.0, 1.0, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
+ rgb.b(meow::ratioMapping(0.0, 1.0, 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.0, 1.0, 1.0 * rand() / RAND_MAX, rgb.rMin(), rgb.rMax()));
+ rgb.g(meow::ratioMapping(0.0, 1.0, 1.0 * rand() / RAND_MAX, rgb.gMin(), rgb.gMax()));
+ rgb.b(meow::ratioMapping(0.0, 1.0, 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.0, 1.0, 1.0 * rand() / RAND_MAX, hsl.hMin(), hsl.hMax()));
+ hsl.s(meow::ratioMapping(0.0, 1.0, 1.0 * rand() / RAND_MAX, hsl.sMin(), hsl.sMax()));
+ hsl.l(meow::ratioMapping(0.0, 1.0, 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;
+};