diff options
Diffstat (limited to 'meowpp.test/src/Colors.cpp')
-rw-r--r-- | meowpp.test/src/Colors.cpp | 130 |
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; +}; |