2025-07-06 20:43:53 +03:00
|
|
|
#pragma once
|
|
|
|
|
#include "ResourceDisplay.hpp"
|
|
|
|
|
#include <include/core/SkImage.h>
|
|
|
|
|
#include <vector>
|
2025-10-10 18:41:08 +03:00
|
|
|
#include <thread>
|
|
|
|
|
#include <include/codec/SkCodec.h>
|
2025-07-06 20:43:53 +03:00
|
|
|
|
|
|
|
|
class ImageResourceDisplay : public ResourceDisplay {
|
|
|
|
|
public:
|
|
|
|
|
virtual void update(World& w) override;
|
2025-08-07 17:45:10 +03:00
|
|
|
virtual bool load(ResourceManager& rMan, const std::string& fileName, const std::string& fileData) override;
|
2025-07-06 20:43:53 +03:00
|
|
|
virtual bool update_draw() const override;
|
|
|
|
|
virtual void draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) override;
|
|
|
|
|
virtual Vector2f get_dimensions() const override;
|
|
|
|
|
virtual float get_dimension_scale() const override;
|
2025-10-09 16:56:05 +03:00
|
|
|
virtual Type get_type() const override;
|
2025-10-10 18:41:08 +03:00
|
|
|
virtual ~ImageResourceDisplay() override;
|
2025-07-06 20:43:53 +03:00
|
|
|
private:
|
2026-02-17 14:41:08 +03:00
|
|
|
struct MipmapLevelData {
|
|
|
|
|
sk_sp<SkImage> imageData;
|
|
|
|
|
std::chrono::steady_clock::time_point timeLastUsed;
|
|
|
|
|
};
|
2025-07-06 20:43:53 +03:00
|
|
|
struct FrameData {
|
|
|
|
|
sk_sp<SkImage> data;
|
|
|
|
|
float duration;
|
2026-02-17 14:41:08 +03:00
|
|
|
std::unordered_map<unsigned, MipmapLevelData> mipmapLevels;
|
2025-07-06 20:43:53 +03:00
|
|
|
};
|
|
|
|
|
std::vector<FrameData> frames;
|
2025-10-10 18:41:08 +03:00
|
|
|
|
|
|
|
|
SkImageInfo imageInfo;
|
|
|
|
|
|
|
|
|
|
void load_thread();
|
|
|
|
|
|
|
|
|
|
int totalFramesToLoad;
|
|
|
|
|
std::atomic<int> loadedFrames = 0;
|
|
|
|
|
sk_sp<SkData> imageRawData;
|
|
|
|
|
std::unique_ptr<SkCodec> codec;
|
|
|
|
|
std::atomic<bool> shutdownLoadThread = false;
|
|
|
|
|
std::unique_ptr<std::thread> loadThread;
|
|
|
|
|
|
2025-07-06 20:43:53 +03:00
|
|
|
float currentTime = 0.0f;
|
2025-10-10 18:41:08 +03:00
|
|
|
int frameIndex = 0;
|
2025-07-06 20:43:53 +03:00
|
|
|
bool mustUpdateDraw = false;
|
2025-10-10 18:41:08 +03:00
|
|
|
bool loadedFirstFrame = false;
|
2025-07-06 20:43:53 +03:00
|
|
|
};
|