Add frame() method.

This commit is contained in:
King_DuckZ 2020-03-20 01:43:50 +01:00
parent 55427a71d6
commit d475003215
2 changed files with 20 additions and 4 deletions

View file

@ -33,6 +33,9 @@ public:
const data_type* begin() const { return m_begin; }
const data_type* end() const { return m_begin + size(); }
data_type* frame(unsigned int idx);
const data_type* frame(unsigned int idx) const;
static constexpr std::size_t size() { return 8192; }
const std::vector<uint8_t>& palette() const { return m_icon_palette; }

View file

@ -85,27 +85,40 @@ BasicBlock<Const>::BasicBlock (data_type* beg) :
template <bool Const>
BasicBlock<Const>::~BasicBlock() = default;
template <bool Const>
auto BasicBlock<Const>::frame(unsigned int idx) -> data_type* {
return const_cast<data_type*>(const_cast<const BasicBlock<Const>*>(this)->frame(idx));
}
template <bool Const>
auto BasicBlock<Const>::frame(unsigned int idx) const -> const data_type* {
const constexpr unsigned int framesize = 128;
assert(idx * framesize + framesize <= this->size());
return this->begin() + framesize * idx;
}
template <bool Const>
bool BasicBlock<Const>::has_magic() const {
const constexpr uint16_t magic = ('S' << 8) | 'C'; //0x5343 "SC"
return magic == static_cast<uint16_t>((m_begin[0] << 8) | m_begin[1]);
const data_type* const ptr = frame(0);
return magic == static_cast<uint16_t>((ptr[0] << 8) | ptr[1]);
}
template <bool Const>
IconDisplayFlag BasicBlock<Const>::icon_display_flag() const {
const uint8_t val = m_begin[2];
const uint8_t val = frame(0)[2];
return static_cast<IconDisplayFlag>(val);
}
template <bool Const>
int BasicBlock<Const>::block_count() const {
return m_begin[3];
return frame(0)[3];
}
template <bool Const>
std::string BasicBlock<Const>::title() const {
char mem[64 + 1];
std::strncpy(mem, reinterpret_cast<const char*>(m_begin + 4), sizeof(mem) / sizeof(mem[0]));
std::strncpy(mem, reinterpret_cast<const char*>(frame(0) + 4), sizeof(mem) / sizeof(mem[0]));
std::string_view temp(mem, std::strlen(mem));
auto name = full_to_halfwidth_ascii(shiftjis_to_utf8(temp));