Browse Source

Math: add [Unsigned]Byte/[Unsigned]Short variants of castInto().

pull/494/head
Vladimír Vondruš 5 years ago
parent
commit
41b59d8176
  1. 5
      doc/changelog.dox
  2. 16
      src/Magnum/Math/PackingBatch.cpp
  3. 24
      src/Magnum/Math/PackingBatch.h
  4. 50
      src/Magnum/Math/Test/PackingBatchTest.cpp

5
doc/changelog.dox

@ -171,6 +171,11 @@ See also:
isn't available on ES3 or desktop GL, but NVidia drivers are known to emit isn't available on ES3 or desktop GL, but NVidia drivers are known to emit
it, which is why it got added. it, which is why it got added.
@subsubsection changelog-latest-changes-math Math library
- Added @ref Math::castInto() overloads for casting between @ref UnsignedByte
and @ref UnsignedShort or @ref Byte and @ref Short
@subsubsection changelog-latest-changes-meshtools MeshTools library @subsubsection changelog-latest-changes-meshtools MeshTools library
- Added a `--bounds` option to @ref magnum-sceneconverter "magnum-sceneconverter", - Added a `--bounds` option to @ref magnum-sceneconverter "magnum-sceneconverter",

16
src/Magnum/Math/PackingBatch.cpp

@ -272,6 +272,22 @@ void castInto(const Corrade::Containers::StridedArrayView2D<const Int>& src, con
castIntoImplementation(src, dst); castIntoImplementation(src, dst);
} }
void castInto(const Corrade::Containers::StridedArrayView2D<const UnsignedByte>& src, const Corrade::Containers::StridedArrayView2D<UnsignedShort>& dst) {
castIntoImplementation(src, dst);
}
void castInto(const Corrade::Containers::StridedArrayView2D<const Byte>& src, const Corrade::Containers::StridedArrayView2D<Short>& dst) {
castIntoImplementation(src, dst);
}
void castInto(const Corrade::Containers::StridedArrayView2D<const UnsignedShort>& src, const Corrade::Containers::StridedArrayView2D<UnsignedByte>& dst) {
castIntoImplementation(src, dst);
}
void castInto(const Corrade::Containers::StridedArrayView2D<const Short>& src, const Corrade::Containers::StridedArrayView2D<Byte>& dst) {
castIntoImplementation(src, dst);
}
static_assert(sizeof(HalfMantissaTable) + sizeof(HalfOffsetTable) + sizeof(HalfExponentTable) == 8576, static_assert(sizeof(HalfMantissaTable) + sizeof(HalfOffsetTable) + sizeof(HalfExponentTable) == 8576,
"improper size of half->float conversion tables"); "improper size of half->float conversion tables");

24
src/Magnum/Math/PackingBatch.h

@ -324,6 +324,30 @@ MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const
*/ */
MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const Int>& src, const Corrade::Containers::StridedArrayView2D<Byte>& dst); MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const Int>& src, const Corrade::Containers::StridedArrayView2D<Byte>& dst);
/**
* @overload
* @m_since_latest
*/
MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const UnsignedByte>& src, const Corrade::Containers::StridedArrayView2D<UnsignedShort>& dst);
/**
* @overload
* @m_since_latest
*/
MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const Byte>& src, const Corrade::Containers::StridedArrayView2D<Short>& dst);
/**
* @overload
* @m_since_latest
*/
MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const UnsignedShort>& src, const Corrade::Containers::StridedArrayView2D<UnsignedByte>& dst);
/**
* @overload
* @m_since_latest
*/
MAGNUM_EXPORT void castInto(const Corrade::Containers::StridedArrayView2D<const Short>& src, const Corrade::Containers::StridedArrayView2D<Byte>& dst);
/* Since 1.8.17, the original short-hand group closing doesn't work anymore. /* Since 1.8.17, the original short-hand group closing doesn't work anymore.
FFS. */ FFS. */
/** /**

50
src/Magnum/Math/Test/PackingBatchTest.cpp

@ -54,8 +54,8 @@ struct PackingBatchTest: Corrade::TestSuite::Tester {
template<class T> void castUnsignedFloat(); template<class T> void castUnsignedFloat();
template<class T> void castSignedFloat(); template<class T> void castSignedFloat();
template<class T> void castUnsignedInteger(); template<class T, class U> void castUnsignedInteger();
template<class T> void castSignedInteger(); template<class T, class U> void castSignedInteger();
template<class T> void assertionsPackUnpack(); template<class T> void assertionsPackUnpack();
void assertionsPackUnpackHalf(); void assertionsPackUnpackHalf();
@ -82,10 +82,12 @@ PackingBatchTest::PackingBatchTest() {
&PackingBatchTest::castSignedFloat<Short>, &PackingBatchTest::castSignedFloat<Short>,
&PackingBatchTest::castSignedFloat<Int>, &PackingBatchTest::castSignedFloat<Int>,
&PackingBatchTest::castUnsignedInteger<UnsignedByte>, &PackingBatchTest::castUnsignedInteger<UnsignedByte, UnsignedInt>,
&PackingBatchTest::castUnsignedInteger<UnsignedShort>, &PackingBatchTest::castUnsignedInteger<UnsignedShort, UnsignedInt>,
&PackingBatchTest::castSignedInteger<Byte>, &PackingBatchTest::castUnsignedInteger<UnsignedByte, UnsignedShort>,
&PackingBatchTest::castSignedInteger<Short>, &PackingBatchTest::castSignedInteger<Byte, Int>,
&PackingBatchTest::castSignedInteger<Short, Int>,
&PackingBatchTest::castSignedInteger<Byte, Short>,
&PackingBatchTest::assertionsPackUnpack<UnsignedByte>, &PackingBatchTest::assertionsPackUnpack<UnsignedByte>,
&PackingBatchTest::assertionsPackUnpack<Byte>, &PackingBatchTest::assertionsPackUnpack<Byte>,
@ -100,8 +102,10 @@ PackingBatchTest::PackingBatchTest() {
&PackingBatchTest::assertionsCast<Float, Int>, &PackingBatchTest::assertionsCast<Float, Int>,
&PackingBatchTest::assertionsCast<UnsignedInt, UnsignedByte>, &PackingBatchTest::assertionsCast<UnsignedInt, UnsignedByte>,
&PackingBatchTest::assertionsCast<UnsignedInt, UnsignedShort>, &PackingBatchTest::assertionsCast<UnsignedInt, UnsignedShort>,
&PackingBatchTest::assertionsCast<UnsignedShort, UnsignedByte>,
&PackingBatchTest::assertionsCast<Int, Byte>, &PackingBatchTest::assertionsCast<Int, Byte>,
&PackingBatchTest::assertionsCast<Int, Short>}); &PackingBatchTest::assertionsCast<Int, Short>,
&PackingBatchTest::assertionsCast<Short, Byte>});
} }
typedef Math::Constants<Float> Constants; typedef Math::Constants<Float> Constants;
@ -493,21 +497,19 @@ template<class T> void PackingBatchTest::castSignedFloat() {
Corrade::TestSuite::Compare::Container); Corrade::TestSuite::Compare::Container);
} }
template<class T> void PackingBatchTest::castUnsignedInteger() { template<class T, class U> void PackingBatchTest::castUnsignedInteger() {
setTestCaseTemplateName(TypeTraits<T>::name()); setTestCaseTemplateName({TypeTraits<T>::name(), TypeTraits<U>::name()});
struct Data { struct Data {
Math::Vector2<T> src; Math::Vector2<T> src;
Vector2ui dst; Math::Vector2<U> dst;
} data[]{ } data[]{
{{0, 89}, {}}, {{0, 89}, {}},
{{149, 22}, {}}, {{149, 22}, {}},
{{13, 255}, {}} {{13, 255}, {}}
}; };
/* GCC 4.8 doesn't like constexpr here (cannot initialize aggregate of type constexpr Math::Vector2<U> expectedTargetType[] {
const Vector2 [3] with a compound literal), wtf */
const Vector2ui expectedTargetType[] {
{0, 89}, {0, 89},
{149, 22}, {149, 22},
{13, 255} {13, 255}
@ -520,34 +522,32 @@ template<class T> void PackingBatchTest::castUnsignedInteger() {
}; };
Corrade::Containers::StridedArrayView1D<Math::Vector2<T>> src{data, &data[0].src, 3, sizeof(Data)}; Corrade::Containers::StridedArrayView1D<Math::Vector2<T>> src{data, &data[0].src, 3, sizeof(Data)};
Corrade::Containers::StridedArrayView1D<Vector2ui> dst{data, &data[0].dst, 3, sizeof(Data)}; Corrade::Containers::StridedArrayView1D<Math::Vector2<U>> dst{data, &data[0].dst, 3, sizeof(Data)};
castInto(Corrade::Containers::arrayCast<2, T>(src), castInto(Corrade::Containers::arrayCast<2, T>(src),
Corrade::Containers::arrayCast<2, UnsignedInt>(dst)); Corrade::Containers::arrayCast<2, U>(dst));
CORRADE_COMPARE_AS(dst, Corrade::Containers::stridedArrayView(expectedTargetType), CORRADE_COMPARE_AS(dst, Corrade::Containers::stridedArrayView(expectedTargetType),
Corrade::TestSuite::Compare::Container); Corrade::TestSuite::Compare::Container);
/* Test the other way around as well */ /* Test the other way around as well */
castInto(Corrade::Containers::arrayCast<2, UnsignedInt>(dst), castInto(Corrade::Containers::arrayCast<2, U>(dst),
Corrade::Containers::arrayCast<2, T>(src)); Corrade::Containers::arrayCast<2, T>(src));
CORRADE_COMPARE_AS(src, Corrade::Containers::stridedArrayView(expectedOriginalType), CORRADE_COMPARE_AS(src, Corrade::Containers::stridedArrayView(expectedOriginalType),
Corrade::TestSuite::Compare::Container); Corrade::TestSuite::Compare::Container);
} }
template<class T> void PackingBatchTest::castSignedInteger() { template<class T, class U> void PackingBatchTest::castSignedInteger() {
setTestCaseTemplateName(TypeTraits<T>::name()); setTestCaseTemplateName({TypeTraits<T>::name(), TypeTraits<U>::name()});
struct Data { struct Data {
Math::Vector2<T> src; Math::Vector2<T> src;
Vector2i dst; Math::Vector2<U> dst;
} data[]{ } data[]{
{{0, -89}, {}}, {{0, -89}, {}},
{{-119, 22}, {}}, {{-119, 22}, {}},
{{13, 127}, {}} {{13, 127}, {}}
}; };
/* GCC 4.8 doesn't like constexpr here (cannot initialize aggregate of type constexpr Math::Vector2<U> expectedTargetType[] {
const Vector2 [3] with a compound literal), wtf */
const Vector2i expectedTargetType[] {
{0, -89}, {0, -89},
{-119, 22}, {-119, 22},
{13, 127} {13, 127}
@ -560,14 +560,14 @@ template<class T> void PackingBatchTest::castSignedInteger() {
}; };
Corrade::Containers::StridedArrayView1D<Math::Vector2<T>> src{data, &data[0].src, 3, sizeof(Data)}; Corrade::Containers::StridedArrayView1D<Math::Vector2<T>> src{data, &data[0].src, 3, sizeof(Data)};
Corrade::Containers::StridedArrayView1D<Vector2i> dst{data, &data[0].dst, 3, sizeof(Data)}; Corrade::Containers::StridedArrayView1D<Math::Vector2<U>> dst{data, &data[0].dst, 3, sizeof(Data)};
castInto(Corrade::Containers::arrayCast<2, T>(src), castInto(Corrade::Containers::arrayCast<2, T>(src),
Corrade::Containers::arrayCast<2, Int>(dst)); Corrade::Containers::arrayCast<2, U>(dst));
CORRADE_COMPARE_AS(dst, Corrade::Containers::stridedArrayView(expectedTargetType), CORRADE_COMPARE_AS(dst, Corrade::Containers::stridedArrayView(expectedTargetType),
Corrade::TestSuite::Compare::Container); Corrade::TestSuite::Compare::Container);
/* Test the other way around as well */ /* Test the other way around as well */
castInto(Corrade::Containers::arrayCast<2, Int>(dst), castInto(Corrade::Containers::arrayCast<2, U>(dst),
Corrade::Containers::arrayCast<2, T>(src)); Corrade::Containers::arrayCast<2, T>(src));
CORRADE_COMPARE_AS(src, Corrade::Containers::stridedArrayView(expectedOriginalType), CORRADE_COMPARE_AS(src, Corrade::Containers::stridedArrayView(expectedOriginalType),
Corrade::TestSuite::Compare::Container); Corrade::TestSuite::Compare::Container);

Loading…
Cancel
Save