From 2c1c731cae3fa03bcfdc42426d5c0f618f6beddd Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Sat, 10 Aug 2019 20:48:45 +0100 Subject: [PATCH] Fix displaying animated icons. --- epsxe000_xa2.mcr | Bin 0 -> 131072 bytes src/gui/block.cpp | 12 ++++++++++++ src/gui/block.hpp | 33 +++++++++++++++++++++++++++++++++ src/gui/icon_fetch.cpp | 11 +++++++---- src/gui/main.cpp | 9 ++++++--- 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 epsxe000_xa2.mcr diff --git a/epsxe000_xa2.mcr b/epsxe000_xa2.mcr new file mode 100644 index 0000000000000000000000000000000000000000..44ac69e1880b01a0cb482950b3b590a0bcb72f58 GIT binary patch literal 131072 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%0A66$i51fgy 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 e5Kssx1QY@a0fm4::BasicBlock (data_type* beg) : template BasicBlock::~BasicBlock() = default; +template +bool BasicBlock::has_magic() const { + const constexpr uint16_t magic = ('S' << 8) | 'C'; //0x5343 "SC" + return magic == static_cast((m_begin[0] << 8) | m_begin[1]); +} + +template +IconDisplayFlag BasicBlock::icon_display_flag() const { + const uint8_t val = m_begin[2]; + return static_cast(val); +} + template class BasicBlock; template class BasicBlock; diff --git a/src/gui/block.hpp b/src/gui/block.hpp index b5c50bd..41977fa 100644 --- a/src/gui/block.hpp +++ b/src/gui/block.hpp @@ -4,6 +4,18 @@ #include #include +//see: https://www.psdevwiki.com/ps3/PS1_Savedata#Memory_Card_Formats_PS1 + +enum class IconDisplayFlag { + NoIcon = 0x00, + OneFrame = 0x11, + TwoFrames = 0x12, + ThreeFrames = 0x13, + OneFrameAlt = 0x16, + TwoFramesAlt = 0x17, + ThreeFramesAlt = 0x18 +}; + template class BasicBlock { public: @@ -22,11 +34,32 @@ public: static constexpr std::size_t size() { return 8192; } const std::vector& palette() const { return m_icon_palette; } + bool has_magic() const; + IconDisplayFlag icon_display_flag() const; private: std::vector m_icon_palette; data_type* m_begin; }; +[[gnu::const]] +inline int32_t calc_icon_count (IconDisplayFlag idf) { + switch (idf) { + case IconDisplayFlag::OneFrame: + case IconDisplayFlag::OneFrameAlt: + return 1; + case IconDisplayFlag::TwoFrames: + case IconDisplayFlag::TwoFramesAlt: + return 2; + case IconDisplayFlag::ThreeFrames: + case IconDisplayFlag::ThreeFramesAlt: + return 3; + + case IconDisplayFlag::NoIcon: + default: + return 0; + } +} + using Block = BasicBlock; using ConstBlock = BasicBlock; diff --git a/src/gui/icon_fetch.cpp b/src/gui/icon_fetch.cpp index f6336eb..44c21ee 100644 --- a/src/gui/icon_fetch.cpp +++ b/src/gui/icon_fetch.cpp @@ -116,7 +116,7 @@ namespace { } //unnamed namespace std::vector> icon_fetch (const ConstBlock& block, int width, int height) { - const int in_height = 16, in_width = 16; + const constexpr int in_height = 16, in_width = 16; const bool scale = (in_width != width or in_height != height); const auto slot_begin = block.cbegin(); const std::vector& palette = block.palette(); @@ -142,10 +142,13 @@ std::vector> icon_fetch (const ConstBlock& block, int width, i ihead.biClrImportant = ihead.biClrUsed; ihead.biSizeImage = scan_sz * height; - std::vector> retval(3); - int32_t icon_num = 0; + const auto icon_count = calc_icon_count(block.icon_display_flag()); + std::vector> retval; + retval.reserve(icon_count); std::vector orig_rgb; - for (auto& frame : retval) { + for (int32_t icon_num = 0; icon_num < icon_count; ++icon_num) { + retval.emplace_back(); + auto& frame = retval.back(); frame.reserve(bmp_byte_size); std::copy(reinterpret_cast(&bmp::g_signature), reinterpret_cast(&bmp::g_signature + 1), std::back_inserter(frame)); diff --git a/src/gui/main.cpp b/src/gui/main.cpp index b07a010..3b999e3 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -16,7 +16,8 @@ namespace { int main() { nana::form frm; - const MemoryCard mc(std::ifstream("/home/michele/dev/code/cpp/memoserv/michele_epsxe000.mcr", std::ios::binary)); + const MemoryCard mc1(std::ifstream("/home/michele/dev/code/cpp/memoserv/epsxe000_xa2.mcr", std::ios::binary)); + const MemoryCard mc2(std::ifstream("/home/michele/dev/code/cpp/memoserv/michele_epsxe000.mcr", std::ios::binary)); #if !defined(NDEBUG) //grid1.bgcolor(nana::colors::azure); @@ -26,8 +27,10 @@ int main() { duck::widget::BlockGrid grid2{frm, 3, true}; for (int z = 0; z < 15; ++z) { - grid1.emplace_back(duck::make_nana_animation(mc[z], g_def_icon_size, g_def_icon_size, g_def_icon_fps)); - grid2.emplace_back(duck::make_nana_animation(mc[z], g_def_icon_size, g_def_icon_size, g_def_icon_fps)); + if (mc1[z].has_magic()) + grid1.emplace_back(duck::make_nana_animation(mc1[z], g_def_icon_size, g_def_icon_size, g_def_icon_fps)); + if (mc2[z].has_magic()) + grid2.emplace_back(duck::make_nana_animation(mc2[z], g_def_icon_size, g_def_icon_size, g_def_icon_fps)); } std::cout << "Hello world\n";