Utility/ImageStream: Use Time class instead of UInt64 for frametime
This commit is contained in:
parent
c144435d4a
commit
88a0bf95ca
|
|
@ -11,6 +11,7 @@
|
||||||
#include <Nazara/Core/Resource.hpp>
|
#include <Nazara/Core/Resource.hpp>
|
||||||
#include <Nazara/Core/ResourceLoader.hpp>
|
#include <Nazara/Core/ResourceLoader.hpp>
|
||||||
#include <Nazara/Core/ResourceParameters.hpp>
|
#include <Nazara/Core/ResourceParameters.hpp>
|
||||||
|
#include <Nazara/Core/Time.hpp>
|
||||||
#include <Nazara/Math/Vector2.hpp>
|
#include <Nazara/Math/Vector2.hpp>
|
||||||
#include <Nazara/Utility/Config.hpp>
|
#include <Nazara/Utility/Config.hpp>
|
||||||
#include <Nazara/Utility/Enums.hpp>
|
#include <Nazara/Utility/Enums.hpp>
|
||||||
|
|
@ -35,7 +36,7 @@ namespace Nz
|
||||||
ImageStream() = default;
|
ImageStream() = default;
|
||||||
virtual ~ImageStream();
|
virtual ~ImageStream();
|
||||||
|
|
||||||
virtual bool DecodeNextFrame(void* frameBuffer, UInt64* frameTime) = 0;
|
virtual bool DecodeNextFrame(void* frameBuffer, Time* frameTime) = 0;
|
||||||
|
|
||||||
virtual UInt64 GetFrameCount() const = 0;
|
virtual UInt64 GetFrameCount() const = 0;
|
||||||
virtual PixelFormat GetPixelFormat() const = 0;
|
virtual PixelFormat GetPixelFormat() const = 0;
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ namespace Nz
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DecodeNextFrame(void* frameBuffer, UInt64* frameTime) override
|
bool DecodeNextFrame(void* frameBuffer, Time* frameTime) override
|
||||||
{
|
{
|
||||||
if (m_currentFrame >= m_frames.size())
|
if (m_currentFrame >= m_frames.size())
|
||||||
{
|
{
|
||||||
|
|
@ -288,7 +288,7 @@ namespace Nz
|
||||||
bool hasPartialRendering = false;
|
bool hasPartialRendering = false;
|
||||||
bool terminated = false;
|
bool terminated = false;
|
||||||
|
|
||||||
UInt64 frameTime = 0;
|
Time frameTime = Time::Zero();
|
||||||
|
|
||||||
FrameMetadata nextFrame;
|
FrameMetadata nextFrame;
|
||||||
while (!terminated)
|
while (!terminated)
|
||||||
|
|
@ -384,7 +384,7 @@ namespace Nz
|
||||||
|
|
||||||
nextFrame.disposalMethod = (flags & 0b0001'1100) >> 2;
|
nextFrame.disposalMethod = (flags & 0b0001'1100) >> 2;
|
||||||
nextFrame.time = frameTime;
|
nextFrame.time = frameTime;
|
||||||
frameTime += delay * 10;
|
frameTime += Time::Milliseconds(delay * 10);
|
||||||
|
|
||||||
if (flags & 0b0000'0001)
|
if (flags & 0b0000'0001)
|
||||||
{
|
{
|
||||||
|
|
@ -651,7 +651,7 @@ namespace Nz
|
||||||
struct FrameMetadata
|
struct FrameMetadata
|
||||||
{
|
{
|
||||||
std::size_t transparentIndex = std::numeric_limits<std::size_t>::max();
|
std::size_t transparentIndex = std::numeric_limits<std::size_t>::max();
|
||||||
UInt64 time;
|
Time time;
|
||||||
UInt64 streamOffset;
|
UInt64 streamOffset;
|
||||||
UInt8 disposalMethod = 0;
|
UInt8 disposalMethod = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -700,7 +700,7 @@ namespace Nz
|
||||||
Bitset<UInt64> m_affectedPixels;
|
Bitset<UInt64> m_affectedPixels;
|
||||||
ByteStream m_byteStream;
|
ByteStream m_byteStream;
|
||||||
LogicalScreenDescriptor m_header;
|
LogicalScreenDescriptor m_header;
|
||||||
UInt64 m_endFrameTime;
|
Time m_endFrameTime;
|
||||||
bool m_requiresFrameHistory;
|
bool m_requiresFrameHistory;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,14 @@ void CompareFrames(const Nz::ImageStream& gif, std::vector<Nz::UInt8>& frameData
|
||||||
|
|
||||||
SCENARIO("Streamed images", "[Utility][ImageStream]")
|
SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
{
|
{
|
||||||
|
using namespace Nz::Literals;
|
||||||
|
|
||||||
std::vector<Nz::UInt8> frameData;
|
std::vector<Nz::UInt8> frameData;
|
||||||
|
|
||||||
struct ExpectedFrame
|
struct ExpectedFrame
|
||||||
{
|
{
|
||||||
std::shared_ptr<Nz::Image> referenceImage;
|
std::shared_ptr<Nz::Image> referenceImage;
|
||||||
Nz::UInt64 time;
|
Nz::Time time;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::filesystem::path resourcePath = GetAssetDir();
|
std::filesystem::path resourcePath = GetAssetDir();
|
||||||
|
|
@ -36,23 +38,23 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
std::array expectedFrames = {
|
std::array expectedFrames = {
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/0.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/0.png"),
|
||||||
0
|
0_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/1.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/1.png"),
|
||||||
1000
|
1000_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/2.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/2.png"),
|
||||||
2000
|
2000_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/3.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/3.png"),
|
||||||
3000
|
3000_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/4.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/4.png"),
|
||||||
4000
|
4000_ms
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -67,7 +69,7 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
frameData.resize(Nz::PixelFormatInfo::ComputeSize(gif->GetPixelFormat(), size.x, size.y, 1));
|
frameData.resize(Nz::PixelFormatInfo::ComputeSize(gif->GetPixelFormat(), size.x, size.y, 1));
|
||||||
|
|
||||||
// Decode all frames in order
|
// Decode all frames in order
|
||||||
Nz::UInt64 frameTime;
|
Nz::Time frameTime;
|
||||||
for (ExpectedFrame& expectedFrame : expectedFrames)
|
for (ExpectedFrame& expectedFrame : expectedFrames)
|
||||||
{
|
{
|
||||||
REQUIRE(expectedFrame.referenceImage);
|
REQUIRE(expectedFrame.referenceImage);
|
||||||
|
|
@ -80,7 +82,7 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
|
|
||||||
// Decoding the post-the-end frame fails but gives the end frametime
|
// Decoding the post-the-end frame fails but gives the end frametime
|
||||||
REQUIRE_FALSE(gif->DecodeNextFrame(frameData.data(), &frameTime));
|
REQUIRE_FALSE(gif->DecodeNextFrame(frameData.data(), &frameTime));
|
||||||
CHECK(frameTime == 5000);
|
CHECK(frameTime == 5000_ms);
|
||||||
|
|
||||||
// Decode frames in arbitrary order, to ensure results are corrects
|
// Decode frames in arbitrary order, to ensure results are corrects
|
||||||
for (std::size_t frameIndex : { 2, 0, 3, 1, 4 })
|
for (std::size_t frameIndex : { 2, 0, 3, 1, 4 })
|
||||||
|
|
@ -102,23 +104,23 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
std::array expectedFrames = {
|
std::array expectedFrames = {
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/0.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/0.png"),
|
||||||
0
|
0_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/1.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/1.png"),
|
||||||
100
|
100_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/2.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/2.png"),
|
||||||
1100
|
1100_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/3.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/3.png"),
|
||||||
2100
|
2100_ms
|
||||||
},
|
},
|
||||||
ExpectedFrame{
|
ExpectedFrame{
|
||||||
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/4.png"),
|
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/4.png"),
|
||||||
3100
|
3100_ms
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -133,7 +135,7 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
frameData.resize(Nz::PixelFormatInfo::ComputeSize(gif->GetPixelFormat(), size.x, size.y, 1));
|
frameData.resize(Nz::PixelFormatInfo::ComputeSize(gif->GetPixelFormat(), size.x, size.y, 1));
|
||||||
|
|
||||||
// Decode all frames in order
|
// Decode all frames in order
|
||||||
Nz::UInt64 frameTime;
|
Nz::Time frameTime;
|
||||||
for (ExpectedFrame& expectedFrame : expectedFrames)
|
for (ExpectedFrame& expectedFrame : expectedFrames)
|
||||||
{
|
{
|
||||||
REQUIRE(expectedFrame.referenceImage);
|
REQUIRE(expectedFrame.referenceImage);
|
||||||
|
|
@ -146,7 +148,7 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
|
||||||
|
|
||||||
// Decoding the post-the-end frame fails but gives the end frametime
|
// Decoding the post-the-end frame fails but gives the end frametime
|
||||||
REQUIRE_FALSE(gif->DecodeNextFrame(frameData.data(), &frameTime));
|
REQUIRE_FALSE(gif->DecodeNextFrame(frameData.data(), &frameTime));
|
||||||
CHECK(frameTime == 4100);
|
CHECK(frameTime == 4100_ms);
|
||||||
|
|
||||||
// Decode frames in arbitrary order, to ensure results are corrects
|
// Decode frames in arbitrary order, to ensure results are corrects
|
||||||
for (std::size_t frameIndex : { 2, 0, 3, 1, 4 })
|
for (std::size_t frameIndex : { 2, 0, 3, 1, 4 })
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue