Utility/ImageStream: Use Time class instead of UInt64 for frametime

This commit is contained in:
SirLynix 2023-02-02 13:27:21 +01:00
parent c144435d4a
commit 88a0bf95ca
3 changed files with 24 additions and 21 deletions

View File

@ -11,6 +11,7 @@
#include <Nazara/Core/Resource.hpp>
#include <Nazara/Core/ResourceLoader.hpp>
#include <Nazara/Core/ResourceParameters.hpp>
#include <Nazara/Core/Time.hpp>
#include <Nazara/Math/Vector2.hpp>
#include <Nazara/Utility/Config.hpp>
#include <Nazara/Utility/Enums.hpp>
@ -35,7 +36,7 @@ namespace Nz
ImageStream() = default;
virtual ~ImageStream();
virtual bool DecodeNextFrame(void* frameBuffer, UInt64* frameTime) = 0;
virtual bool DecodeNextFrame(void* frameBuffer, Time* frameTime) = 0;
virtual UInt64 GetFrameCount() const = 0;
virtual PixelFormat GetPixelFormat() const = 0;

View File

@ -51,7 +51,7 @@ namespace Nz
return true;
}
bool DecodeNextFrame(void* frameBuffer, UInt64* frameTime) override
bool DecodeNextFrame(void* frameBuffer, Time* frameTime) override
{
if (m_currentFrame >= m_frames.size())
{
@ -288,7 +288,7 @@ namespace Nz
bool hasPartialRendering = false;
bool terminated = false;
UInt64 frameTime = 0;
Time frameTime = Time::Zero();
FrameMetadata nextFrame;
while (!terminated)
@ -384,7 +384,7 @@ namespace Nz
nextFrame.disposalMethod = (flags & 0b0001'1100) >> 2;
nextFrame.time = frameTime;
frameTime += delay * 10;
frameTime += Time::Milliseconds(delay * 10);
if (flags & 0b0000'0001)
{
@ -651,7 +651,7 @@ namespace Nz
struct FrameMetadata
{
std::size_t transparentIndex = std::numeric_limits<std::size_t>::max();
UInt64 time;
Time time;
UInt64 streamOffset;
UInt8 disposalMethod = 0;
};
@ -700,7 +700,7 @@ namespace Nz
Bitset<UInt64> m_affectedPixels;
ByteStream m_byteStream;
LogicalScreenDescriptor m_header;
UInt64 m_endFrameTime;
Time m_endFrameTime;
bool m_requiresFrameHistory;
};

View File

@ -19,12 +19,14 @@ void CompareFrames(const Nz::ImageStream& gif, std::vector<Nz::UInt8>& frameData
SCENARIO("Streamed images", "[Utility][ImageStream]")
{
using namespace Nz::Literals;
std::vector<Nz::UInt8> frameData;
struct ExpectedFrame
{
std::shared_ptr<Nz::Image> referenceImage;
Nz::UInt64 time;
Nz::Time time;
};
std::filesystem::path resourcePath = GetAssetDir();
@ -36,23 +38,23 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
std::array expectedFrames = {
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/0.png"),
0
0_ms
},
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/1.png"),
1000
1000_ms
},
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/2.png"),
2000
2000_ms
},
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_bgnd/3.png"),
3000
3000_ms
},
ExpectedFrame{
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));
// Decode all frames in order
Nz::UInt64 frameTime;
Nz::Time frameTime;
for (ExpectedFrame& expectedFrame : expectedFrames)
{
REQUIRE(expectedFrame.referenceImage);
@ -80,7 +82,7 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
// Decoding the post-the-end frame fails but gives the end 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
for (std::size_t frameIndex : { 2, 0, 3, 1, 4 })
@ -102,23 +104,23 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
std::array expectedFrames = {
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/0.png"),
0
0_ms
},
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/1.png"),
100
100_ms
},
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/2.png"),
1100
1100_ms
},
ExpectedFrame{
Nz::Image::LoadFromFile(resourcePath / "Utility/GIF/canvas_prev/3.png"),
2100
2100_ms
},
ExpectedFrame{
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));
// Decode all frames in order
Nz::UInt64 frameTime;
Nz::Time frameTime;
for (ExpectedFrame& expectedFrame : expectedFrames)
{
REQUIRE(expectedFrame.referenceImage);
@ -146,7 +148,7 @@ SCENARIO("Streamed images", "[Utility][ImageStream]")
// Decoding the post-the-end frame fails but gives the end 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
for (std::size_t frameIndex : { 2, 0, 3, 1, 4 })