#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; };