Browse Source

Math: improved HSV color tests.

Testing both RGB and RGBA implementation for both floating-point
and integral types.
pull/190/head
Vladimír Vondruš 10 years ago
parent
commit
8e576d9c73
  1. 201
      src/Magnum/Math/Test/ColorTest.cpp

201
src/Magnum/Math/Test/ColorTest.cpp

@ -82,17 +82,12 @@ struct ColorTest: Corrade::TestSuite::Tester {
void colors(); void colors();
void fromHue();
void fromSaturation();
void fromValue();
void hue(); void hue();
void saturation(); void saturation();
void value(); void value();
void hsv(); void hsv();
void hsvOverflow(); void fromHsvHueOverflow();
void hsvAlpha(); void fromHsvDefaultAlpha();
void swizzleType(); void swizzleType();
void debug(); void debug();
@ -127,17 +122,12 @@ ColorTest::ColorTest() {
&ColorTest::colors, &ColorTest::colors,
&ColorTest::fromHue,
&ColorTest::fromSaturation,
&ColorTest::fromValue,
&ColorTest::hue, &ColorTest::hue,
&ColorTest::saturation, &ColorTest::saturation,
&ColorTest::value, &ColorTest::value,
&ColorTest::hsv, &ColorTest::hsv,
&ColorTest::hsvOverflow, &ColorTest::fromHsvHueOverflow,
&ColorTest::hsvAlpha, &ColorTest::fromHsvDefaultAlpha,
&ColorTest::swizzleType, &ColorTest::swizzleType,
&ColorTest::debug, &ColorTest::debug,
@ -370,75 +360,154 @@ void ColorTest::colors() {
CORRADE_COMPARE(Color4ub::yellow(), Color4ub(255, 255, 0, 255)); CORRADE_COMPARE(Color4ub::yellow(), Color4ub(255, 255, 0, 255));
} }
void ColorTest::fromHue() {
CORRADE_COMPARE(Color3ub::fromHsv(27.0_degf, 1.0f, 1.0f), Color3ub(255, 114, 0));
CORRADE_COMPARE(Color3ub::fromHsv(86.0_degf, 1.0f, 1.0f), Color3ub(144, 255, 0));
CORRADE_COMPARE(Color3ub::fromHsv(134.0_degf, 1.0f, 1.0f), Color3ub(0, 255, 59));
CORRADE_COMPARE(Color3ub::fromHsv(191.0_degf, 1.0f, 1.0f), Color3ub(0, 208, 255));
CORRADE_COMPARE(Color3ub::fromHsv(269.0_degf, 1.0f, 1.0f), Color3ub(123, 0, 255));
CORRADE_COMPARE(Color3ub::fromHsv(317.0_degf, 1.0f, 1.0f), Color3ub(255, 0, 182));
}
void ColorTest::hue() { void ColorTest::hue() {
CORRADE_COMPARE(Color3ub(255, 115, 0).hue(), 27.058824_degf); CORRADE_COMPARE(Color3::fromHsv( 27.0_degf, 1.0f, 1.0f), (Color3{1.0f, 0.45f, 0.0f}));
CORRADE_COMPARE(Color3ub(145, 255, 0).hue(), 85.882353_degf); CORRADE_COMPARE(Color3::fromHsv( 86.0_degf, 1.0f, 1.0f), (Color3{0.566667f, 1.0f, 0.0f}));
CORRADE_COMPARE(Color3ub(0, 255, 60).hue(), 134.11765_degf); CORRADE_COMPARE(Color3::fromHsv(134.0_degf, 1.0f, 1.0f), (Color3{0.0f, 1.0f, 0.233333f}));
CORRADE_COMPARE(Color3ub(0, 208, 255).hue(), 191.05882_degf); CORRADE_COMPARE(Color3::fromHsv(191.0_degf, 1.0f, 1.0f), (Color3{0.0f, 0.816667f, 1.0f}));
CORRADE_COMPARE(Color3ub(123, 0, 255).hue(), 268.94117_degf); CORRADE_COMPARE(Color3::fromHsv(269.0_degf, 1.0f, 1.0f), (Color3{0.483333f, 0.0f, 1.0f}));
CORRADE_COMPARE(Color3ub(255, 0, 183).hue(), 316.94117_degf); CORRADE_COMPARE(Color3::fromHsv(317.0_degf, 1.0f, 1.0f), (Color3{1.0f, 0.0f, 0.716667f}));
}
CORRADE_COMPARE((Color3{1.0f, 0.45f, 0.0f}).hue(), 27.0_degf);
void ColorTest::fromSaturation() { CORRADE_COMPARE((Color3{0.566667f, 1.0f, 0.0f}).hue(), 86.0_degf);
CORRADE_COMPARE(Color3ub::fromHsv(0.0_degf, 0.702f, 1.0f), Color3ub(255, 75, 75)); CORRADE_COMPARE((Color3{0.0f, 1.0f, 0.233333f}).hue(), 134.0_degf);
CORRADE_COMPARE((Color3{0.0f, 0.816667f, 1.0f}).hue(), 191.0_degf);
CORRADE_COMPARE((Color3{0.483333f, 0.0f, 1.0f}).hue(), 269.0_degf);
CORRADE_COMPARE((Color3{1.0f, 0.0f, 0.716667f}).hue(), 317.0_degf);
/* RGBA */
CORRADE_COMPARE(Color4::fromHsv(27.0_degf, 1.0f, 1.0f, 0.175f), (Color4{1.0f, 0.45f, 0.0f, 0.175f}));
CORRADE_COMPARE((Color4{1.0f, 0.45f, 0.0f, 0.175f}).hue(), 27.0_degf);
/* Integral -- little precision loss */
CORRADE_COMPARE(Math::Color3<UnsignedShort>::fromHsv(27.0_degf, 1.0f, 1.0f),
(Math::Color3<UnsignedShort>{65535, 29490, 0}));
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(27.0_degf, 1.0f, 1.0f, 15239),
(Math::Color4<UnsignedShort>{65535, 29490, 0, 15239}));
CORRADE_COMPARE((Math::Color3<UnsignedShort>{65535, 29490, 0}).hue(), 26.9993_degf);
CORRADE_COMPARE((Math::Color4<UnsignedShort>{65535, 29490, 0, 15239}.hue()), 26.9993_degf);
} }
void ColorTest::saturation() { void ColorTest::saturation() {
CORRADE_COMPARE(Color3ub(255, 76, 76).saturation(), 0.701961f); CORRADE_COMPARE(Color3::fromHsv(0.0_degf, 0.702f, 1.0f), (Color3{1.0f, 0.298f, 0.298f}));
CORRADE_COMPARE(Color3ub().saturation(), 0.0f); CORRADE_COMPARE((Color3{1.0f, 0.298f, 0.298f}).saturation(), 0.702f);
}
/* Extremes */
void ColorTest::fromValue() { CORRADE_COMPARE((Color3{0.0f, 0.0f, 0.0f}).saturation(), 0.0f);
CORRADE_COMPARE(Color3ub::fromHsv(0.0_degf, 1.0f, 0.522f), Color3ub(133, 0, 0)); CORRADE_COMPARE((Color3{0.0f, 1.0f, 0.0f}).saturation(), 1.0f);
/* RGBA */
CORRADE_COMPARE(Color4::fromHsv(0.0_degf, 0.702f, 1.0f, 0.175f), (Color4{1.0f, 0.298f, 0.298f, 0.175f}));
CORRADE_COMPARE((Color4{1.0f, 0.298f, 0.298f, 0.175f}).saturation(), 0.702f);
/* Integral -- little precision loss */
CORRADE_COMPARE(Math::Color3<UnsignedShort>::fromHsv(0.0_degf, 0.702f, 1.0f),
(Math::Color3<UnsignedShort>{65535, 19529, 19529}));
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(0.0_degf, 0.702f, 1.0f, 15239),
(Math::Color4<UnsignedShort>{65535, 19529, 19529, 15239}));
CORRADE_COMPARE((Math::Color3<UnsignedShort>{65535, 19529, 19529}.saturation()), 0.702007f);
CORRADE_COMPARE((Math::Color4<UnsignedShort>{65535, 19529, 19529, 15239}.saturation()), 0.702007f);
} }
void ColorTest::value() { void ColorTest::value() {
CORRADE_COMPARE(Color3ub(133, 0, 0).value(), 0.521569f); CORRADE_COMPARE(Color3::fromHsv(0.0_degf, 1.0f, 0.522f), (Color3{0.522f, 0.0f, 0.0f}));
CORRADE_COMPARE((Color3{0.522f, 0.0f, 0.0f}).value(), 0.522f);
/* Extremes */
CORRADE_COMPARE((Color3{0.0f, 0.0f, 0.0f}).value(), 0.0f);
CORRADE_COMPARE((Color3{0.0f, 1.0f, 0.0f}).value(), 1.0f);
/* RGBA */
CORRADE_COMPARE(Color4::fromHsv(0.0_degf, 1.0f, 0.522f, 0.175f), (Color4{0.522f, 0.0f, 0.0f, 0.175f}));
CORRADE_COMPARE((Color4{0.522f, 0.0f, 0.0f, 0.175f}).value(), 0.522f);
/* Integral -- little precision loss */
CORRADE_COMPARE(Math::Color3<UnsignedShort>::fromHsv(0.0_degf, 1.0f, 0.522f),
(Math::Color3<UnsignedShort>{34209, 0, 0}));
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(0.0_degf, 1.0f, 0.522f, 15239),
(Math::Color4<UnsignedShort>{34209, 0, 0, 15239}));
CORRADE_COMPARE((Math::Color3<UnsignedShort>{34209, 0, 0}.value()), 0.521996f);
CORRADE_COMPARE((Math::Color4<UnsignedShort>{34209, 0, 0, 15239}.value()), 0.521996f);
} }
void ColorTest::hsv() { void ColorTest::hsv() {
CORRADE_COMPARE(Color3ub::fromHsv(230.0_degf, 0.749f, 0.427f), Color3ub(27, 40, 108)); CORRADE_COMPARE(Color3::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f)),
(Color3{0.107177f, 0.160481f, 0.427f}));
CORRADE_COMPARE(Color3::fromHsv(230.0_degf, 0.749f, 0.427f),
(Color3{0.107177f, 0.160481f, 0.427f}));
Deg hue; Deg hue;
Float saturation, value; Float saturation, value;
std::tie(hue, saturation, value) = Color3ub(27, 41, 109).toHsv(); std::tie(hue, saturation, value) = Color3{0.107177f, 0.160481f, 0.427f}.toHsv();
CORRADE_COMPARE(hue, 229.756106_degf); CORRADE_COMPARE(hue, 230.0_degf);
CORRADE_COMPARE(saturation, 0.752294f); CORRADE_COMPARE(saturation, 0.749f);
CORRADE_COMPARE(value, 0.427451f); CORRADE_COMPARE(value, 0.427f);
/* RGBA */
CORRADE_COMPARE(Color4::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f), 0.175f),
(Color4{0.107177f, 0.160481f, 0.427f, 0.175f}));
CORRADE_COMPARE(Color4::fromHsv(230.0_degf, 0.749f, 0.427f, 0.175f),
(Color4{0.107177f, 0.160481f, 0.427f, 0.175f}));
std::tie(hue, saturation, value) = Color4{0.107177f, 0.160481f, 0.427f, 0.175f}.toHsv();
CORRADE_COMPARE(hue, 230.0_degf);
CORRADE_COMPARE(saturation, 0.749f);
CORRADE_COMPARE(value, 0.427f);
/* Integral -- little precision loss */
CORRADE_COMPARE(Math::Color3<UnsignedShort>::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f)),
(Math::Color3<UnsignedShort>{7023, 10517, 27983}));
CORRADE_COMPARE(Math::Color3<UnsignedShort>::fromHsv(230.0_degf, 0.749f, 0.427f),
(Math::Color3<UnsignedShort>{7023, 10517, 27983}));
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f), 15239),
(Math::Color4<UnsignedShort>{7023, 10517, 27983, 15239}));
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(230.0_degf, 0.749f, 0.427f, 15239),
(Math::Color4<UnsignedShort>{7023, 10517, 27983, 15239}));
std::tie(hue, saturation, value) = Math::Color3<UnsignedShort>{7023, 10517, 27983}.toHsv();
CORRADE_COMPARE(hue, 230.0_degf);
CORRADE_COMPARE(saturation, 0.749026f);
CORRADE_COMPARE(value, 0.426993f);
std::tie(hue, saturation, value) = Math::Color4<UnsignedShort>{7023, 10517, 27983, 15239}.toHsv();
CORRADE_COMPARE(hue, 230.0_degf);
CORRADE_COMPARE(saturation, 0.749026f);
CORRADE_COMPARE(value, 0.426993f);
/* Round-trip */
CORRADE_COMPARE(Color3::fromHsv(230.0_degf, 0.749f, 0.427f).toHsv(),
std::make_tuple(230.0_degf, 0.749f, 0.427f));
CORRADE_COMPARE(Color4::fromHsv(230.0_degf, 0.749f, 0.427f, 0.175f).toHsv(),
std::make_tuple(230.0_degf, 0.749f, 0.427f));
} }
void ColorTest::hsvOverflow() { void ColorTest::fromHsvHueOverflow() {
CORRADE_COMPARE(Color3ub::fromHsv(27.0_degf - 360.0_degf, 1.0f, 1.0f), Color3ub(255, 114, 0)); CORRADE_COMPARE(Color3::fromHsv( 27.0_degf - 360.0_degf, 1.0f, 1.0f), (Color3{1.0f, 0.45f, 0.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(86.0_degf - 360.0_degf, 1.0f, 1.0f), Color3ub(144, 255, 0)); CORRADE_COMPARE(Color3::fromHsv( 86.0_degf - 360.0_degf, 1.0f, 1.0f), (Color3{0.566667f, 1.0f, 0.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(134.0_degf - 360.0_degf, 1.0f, 1.0f), Color3ub(0, 255, 59)); CORRADE_COMPARE(Color3::fromHsv(134.0_degf - 360.0_degf, 1.0f, 1.0f), (Color3{0.0f, 1.0f, 0.233333f}));
CORRADE_COMPARE(Color3ub::fromHsv(191.0_degf - 360.0_degf, 1.0f, 1.0f), Color3ub(0, 208, 255)); CORRADE_COMPARE(Color3::fromHsv(191.0_degf - 360.0_degf, 1.0f, 1.0f), (Color3{0.0f, 0.816667f, 1.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(269.0_degf - 360.0_degf, 1.0f, 1.0f), Color3ub(123, 0, 255)); CORRADE_COMPARE(Color3::fromHsv(269.0_degf - 360.0_degf, 1.0f, 1.0f), (Color3{0.483333f, 0.0f, 1.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(317.0_degf - 360.0_degf, 1.0f, 1.0f), Color3ub(255, 0, 182)); CORRADE_COMPARE(Color3::fromHsv(317.0_degf - 360.0_degf, 1.0f, 1.0f), (Color3{1.0f, 0.0f, 0.716667f}));
CORRADE_COMPARE(Color3ub::fromHsv(360.0_degf + 27.0_degf, 1.0f, 1.0f), Color3ub(255, 114, 0)); CORRADE_COMPARE(Color3::fromHsv( 27.0_degf + 360.0_degf, 1.0f, 1.0f), (Color3{1.0f, 0.45f, 0.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(360.0_degf + 86.0_degf, 1.0f, 1.0f), Color3ub(144, 255, 0)); CORRADE_COMPARE(Color3::fromHsv( 86.0_degf + 360.0_degf, 1.0f, 1.0f), (Color3{0.566667f, 1.0f, 0.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(360.0_degf + 134.0_degf, 1.0f, 1.0f), Color3ub(0, 255, 59)); CORRADE_COMPARE(Color3::fromHsv(134.0_degf + 360.0_degf, 1.0f, 1.0f), (Color3{0.0f, 1.0f, 0.233333f}));
CORRADE_COMPARE(Color3ub::fromHsv(360.0_degf + 191.0_degf, 1.0f, 1.0f), Color3ub(0, 208, 255)); CORRADE_COMPARE(Color3::fromHsv(191.0_degf + 360.0_degf, 1.0f, 1.0f), (Color3{0.0f, 0.816667f, 1.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(360.0_degf + 269.0_degf, 1.0f, 1.0f), Color3ub(123, 0, 255)); CORRADE_COMPARE(Color3::fromHsv(269.0_degf + 360.0_degf, 1.0f, 1.0f), (Color3{0.483333f, 0.0f, 1.0f}));
CORRADE_COMPARE(Color3ub::fromHsv(360.0_degf + 317.0_degf, 1.0f, 1.0f), Color3ub(255, 0, 182)); CORRADE_COMPARE(Color3::fromHsv(317.0_degf + 360.0_degf, 1.0f, 1.0f), (Color3{1.0f, 0.0f, 0.716667f}));
} }
void ColorTest::hsvAlpha() { void ColorTest::fromHsvDefaultAlpha() {
CORRADE_COMPARE(Color4ub::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f), 23), Color4ub(27, 40, 108, 23)); CORRADE_COMPARE(Color4::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f)),
CORRADE_COMPARE(Color4ub::fromHsv(230.0_degf, 0.749f, 0.427f, 23), Color4ub(27, 40, 108, 23)); (Color4{0.107177f, 0.160481f, 0.427f, 1.0f}));
CORRADE_COMPARE(Color4::fromHsv(230.0_degf, 0.749f, 0.427f),
/* Default alpha */ (Color4{0.107177f, 0.160481f, 0.427f, 1.0f}));
CORRADE_COMPARE(Color4ub::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f)), Color4ub(27, 40, 108, 255));
CORRADE_COMPARE(Color4ub::fromHsv(230.0_degf, 0.749f, 0.427f), Color4ub(27, 40, 108, 255)); /* Integral */
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(std::make_tuple(230.0_degf, 0.749f, 0.427f)),
(Math::Color4<UnsignedShort>{7023, 10517, 27983, 65535}));
CORRADE_COMPARE(Math::Color4<UnsignedShort>::fromHsv(230.0_degf, 0.749f, 0.427f),
(Math::Color4<UnsignedShort>{7023, 10517, 27983, 65535}));
} }
void ColorTest::swizzleType() { void ColorTest::swizzleType() {

Loading…
Cancel
Save