Browse Source

It makes no sense to call isPixelFormatSrgb() on a depth/stencil format.

Doing so usually points to some error in user code, so directly disallow
it, instead of returning false. Such behavior is consistent with
pixelFormatChannelCount() and other helper APIs.
pull/620/head
Vladimír Vondruš 3 years ago
parent
commit
332bcb62fa
  1. 3
      src/Magnum/PixelFormat.cpp
  2. 3
      src/Magnum/PixelFormat.h
  3. 12
      src/Magnum/Test/PixelFormatTest.cpp

3
src/Magnum/PixelFormat.cpp

@ -352,6 +352,7 @@ bool isPixelFormatSrgb(const PixelFormat format) {
case PixelFormat::RG32F: case PixelFormat::RG32F:
case PixelFormat::RGB32F: case PixelFormat::RGB32F:
case PixelFormat::RGBA32F: case PixelFormat::RGBA32F:
return false;
case PixelFormat::Depth16Unorm: case PixelFormat::Depth16Unorm:
case PixelFormat::Depth24Unorm: case PixelFormat::Depth24Unorm:
case PixelFormat::Depth32F: case PixelFormat::Depth32F:
@ -359,7 +360,7 @@ bool isPixelFormatSrgb(const PixelFormat format) {
case PixelFormat::Depth16UnormStencil8UI: case PixelFormat::Depth16UnormStencil8UI:
case PixelFormat::Depth24UnormStencil8UI: case PixelFormat::Depth24UnormStencil8UI:
case PixelFormat::Depth32FStencil8UI: case PixelFormat::Depth32FStencil8UI:
return false; CORRADE_ASSERT_UNREACHABLE("isPixelFormatSrgb(): can't determine colorspace of" << format, {});
} }
#ifdef CORRADE_TARGET_GCC #ifdef CORRADE_TARGET_GCC
#pragma GCC diagnostic pop #pragma GCC diagnostic pop

3
src/Magnum/PixelFormat.h

@ -814,7 +814,8 @@ MAGNUM_EXPORT UnsignedInt pixelFormatChannelCount(PixelFormat format);
@m_since_latest @m_since_latest
Returns @cpp true @ce for `*Srgb` formats, @cpp false @ce otherwise. Expects Returns @cpp true @ce for `*Srgb` formats, @cpp false @ce otherwise. Expects
that the pixel format is *not* implementation-specific. that the pixel format is *not* implementation-specific and not a
depth/stencil format.
@see @ref isPixelFormatImplementationSpecific() @see @ref isPixelFormatImplementationSpecific()
*/ */
MAGNUM_EXPORT bool isPixelFormatSrgb(PixelFormat format); MAGNUM_EXPORT bool isPixelFormatSrgb(PixelFormat format);

12
src/Magnum/Test/PixelFormatTest.cpp

@ -50,7 +50,7 @@ struct PixelFormatTest: TestSuite::Tester {
void isSrgb(); void isSrgb();
void isSrgbInvalid(); void isSrgbInvalid();
void isSrgbImplementationSpecific(); void isSrgbDepthStencilImplementationSpecific();
void isDepthOrStencil(); void isDepthOrStencil();
void isDepthOrStencilInvalid(); void isDepthOrStencilInvalid();
@ -100,7 +100,7 @@ PixelFormatTest::PixelFormatTest() {
&PixelFormatTest::isSrgb, &PixelFormatTest::isSrgb,
&PixelFormatTest::isSrgbInvalid, &PixelFormatTest::isSrgbInvalid,
&PixelFormatTest::isSrgbImplementationSpecific, &PixelFormatTest::isSrgbDepthStencilImplementationSpecific,
&PixelFormatTest::isDepthOrStencil, &PixelFormatTest::isDepthOrStencil,
&PixelFormatTest::isDepthOrStencilInvalid, &PixelFormatTest::isDepthOrStencilInvalid,
@ -319,8 +319,8 @@ void PixelFormatTest::channelFormatCountDepthStencilImplementationSpecific() {
void PixelFormatTest::isSrgb() { void PixelFormatTest::isSrgb() {
CORRADE_VERIFY(isPixelFormatSrgb(PixelFormat::RG8Srgb)); CORRADE_VERIFY(isPixelFormatSrgb(PixelFormat::RG8Srgb));
CORRADE_VERIFY(!isPixelFormatSrgb(PixelFormat::RG8Snorm));
CORRADE_VERIFY(!isPixelFormatSrgb(PixelFormat::RGB16F)); CORRADE_VERIFY(!isPixelFormatSrgb(PixelFormat::RGB16F));
CORRADE_VERIFY(!isPixelFormatSrgb(PixelFormat::Stencil8UI));
} }
void PixelFormatTest::isSrgbInvalid() { void PixelFormatTest::isSrgbInvalid() {
@ -335,14 +335,16 @@ void PixelFormatTest::isSrgbInvalid() {
"isPixelFormatSrgb(): invalid format PixelFormat(0xdead)\n"); "isPixelFormatSrgb(): invalid format PixelFormat(0xdead)\n");
} }
void PixelFormatTest::isSrgbImplementationSpecific() { void PixelFormatTest::isSrgbDepthStencilImplementationSpecific() {
CORRADE_SKIP_IF_NO_ASSERT(); CORRADE_SKIP_IF_NO_ASSERT();
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
isPixelFormatSrgb(pixelFormatWrap(0xdead)); isPixelFormatSrgb(pixelFormatWrap(0xdead));
isPixelFormatSrgb(PixelFormat::Depth16Unorm);
CORRADE_COMPARE(out.str(), CORRADE_COMPARE(out.str(),
"isPixelFormatSrgb(): can't determine colorspace of an implementation-specific format 0xdead\n"); "isPixelFormatSrgb(): can't determine colorspace of an implementation-specific format 0xdead\n"
"isPixelFormatSrgb(): can't determine colorspace of PixelFormat::Depth16Unorm\n");
} }
void PixelFormatTest::isDepthOrStencil() { void PixelFormatTest::isDepthOrStencil() {

Loading…
Cancel
Save