|
|
|
@ -2,6 +2,7 @@ |
|
|
|
#define MONOFORMAT_STRUCTURED_HPP |
|
|
|
#define MONOFORMAT_STRUCTURED_HPP |
|
|
|
|
|
|
|
|
|
|
|
#include "monoformat_parsehelpers.hpp" |
|
|
|
#include "monoformat_parsehelpers.hpp" |
|
|
|
|
|
|
|
#include "monoformat_schema.hpp" |
|
|
|
|
|
|
|
|
|
|
|
#include <cstddef> |
|
|
|
#include <cstddef> |
|
|
|
#include <cstdint> |
|
|
|
#include <cstdint> |
|
|
|
@ -11,12 +12,6 @@ |
|
|
|
|
|
|
|
|
|
|
|
namespace monoformat { |
|
|
|
namespace monoformat { |
|
|
|
|
|
|
|
|
|
|
|
enum class SectionType { |
|
|
|
|
|
|
|
AlwaysDrawn = 1, |
|
|
|
|
|
|
|
TimeBasedDrawn = 2, |
|
|
|
|
|
|
|
CustomFont = 32, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Section { |
|
|
|
struct Section { |
|
|
|
virtual ~Section() = default; |
|
|
|
virtual ~Section() = default; |
|
|
|
virtual SectionType sectionType() const = 0; |
|
|
|
virtual SectionType sectionType() const = 0; |
|
|
|
@ -26,58 +21,18 @@ protected: |
|
|
|
Section() = default; |
|
|
|
Section() = default; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum class ElementType { |
|
|
|
class CustomFontSection; |
|
|
|
Image = 1, |
|
|
|
|
|
|
|
Animation = 2, |
|
|
|
|
|
|
|
HScrollImage = 3, |
|
|
|
|
|
|
|
VScrollImage = 4, |
|
|
|
|
|
|
|
Line = 5, |
|
|
|
|
|
|
|
ClippedText = 16, |
|
|
|
|
|
|
|
HScrollText = 17, |
|
|
|
|
|
|
|
//VScrollText = 18,
|
|
|
|
|
|
|
|
CurrentTime = 32, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct OneBitBufferInterface { |
|
|
|
|
|
|
|
using Color = bool; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
virtual ~OneBitBufferInterface() = default; |
|
|
|
|
|
|
|
virtual bool isPixelSet(std::uint16_t x, std::uint16_t y) const = 0; |
|
|
|
|
|
|
|
virtual void setPixel(std::uint16_t x, std::uint16_t y, bool value) = 0; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Element { |
|
|
|
struct Element { |
|
|
|
virtual ~Element() = default; |
|
|
|
virtual ~Element() = default; |
|
|
|
virtual ElementType elementType() const = 0; |
|
|
|
virtual ElementType elementType() const = 0; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const = 0; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const = 0; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) = 0; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) = 0; |
|
|
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
protected: |
|
|
|
Element() = default; |
|
|
|
Element() = default; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct MemoryOneBitBuffer : public OneBitBufferInterface { |
|
|
|
|
|
|
|
MemoryOneBitBuffer(std::span<std::byte> buffer, std::uint16_t width, std::uint16_t height); |
|
|
|
|
|
|
|
virtual ~MemoryOneBitBuffer() override; |
|
|
|
|
|
|
|
virtual bool isPixelSet(std::uint16_t x, std::uint16_t y) const override; |
|
|
|
|
|
|
|
virtual void setPixel(std::uint16_t x, std::uint16_t y, bool value) override; |
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
std::uint16_t m_width{}; |
|
|
|
|
|
|
|
std::uint16_t m_height{}; |
|
|
|
|
|
|
|
std::span<std::byte> m_buffer; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ConstMemoryOneBitBuffer : public OneBitBufferInterface { |
|
|
|
|
|
|
|
ConstMemoryOneBitBuffer(std::span<std::byte const> buffer, std::uint16_t width, std::uint16_t height); |
|
|
|
|
|
|
|
virtual ~ConstMemoryOneBitBuffer() override; |
|
|
|
|
|
|
|
virtual bool isPixelSet(std::uint16_t x, std::uint16_t y) const override; |
|
|
|
|
|
|
|
virtual void setPixel(std::uint16_t x, std::uint16_t y, bool value) override; |
|
|
|
|
|
|
|
private: |
|
|
|
|
|
|
|
std::uint16_t m_width{}; |
|
|
|
|
|
|
|
std::uint16_t m_height{}; |
|
|
|
|
|
|
|
std::span<std::byte const> m_buffer; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ImageElement : public Element { |
|
|
|
struct ImageElement : public Element { |
|
|
|
ImageElement(std::uint16_t x, std::uint16_t y, std::uint16_t width, std::uint16_t height); |
|
|
|
ImageElement(std::uint16_t x, std::uint16_t y, std::uint16_t width, std::uint16_t height); |
|
|
|
|
|
|
|
|
|
|
|
@ -89,11 +44,12 @@ struct ImageElement : public Element { |
|
|
|
std::span<std::byte const> buffer() const noexcept; |
|
|
|
std::span<std::byte const> buffer() const noexcept; |
|
|
|
MemoryOneBitBuffer image() noexcept; |
|
|
|
MemoryOneBitBuffer image() noexcept; |
|
|
|
ConstMemoryOneBitBuffer image() const noexcept; |
|
|
|
ConstMemoryOneBitBuffer image() const noexcept; |
|
|
|
|
|
|
|
void updateBuffer(std::span<std::byte const> newBufferData); |
|
|
|
|
|
|
|
|
|
|
|
virtual ~ImageElement() override; |
|
|
|
virtual ~ImageElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<ImageElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<ImageElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -120,11 +76,12 @@ struct AnimationElement : public Element { |
|
|
|
std::span<std::byte const> buffer(std::uint16_t frameIndex) const noexcept; |
|
|
|
std::span<std::byte const> buffer(std::uint16_t frameIndex) const noexcept; |
|
|
|
MemoryOneBitBuffer image(std::uint16_t frameIndex) noexcept; |
|
|
|
MemoryOneBitBuffer image(std::uint16_t frameIndex) noexcept; |
|
|
|
ConstMemoryOneBitBuffer image(std::uint16_t frameIndex) const noexcept; |
|
|
|
ConstMemoryOneBitBuffer image(std::uint16_t frameIndex) const noexcept; |
|
|
|
|
|
|
|
void updateBuffer(std::span<std::byte const> newBufferData); |
|
|
|
|
|
|
|
|
|
|
|
virtual ~AnimationElement() override; |
|
|
|
virtual ~AnimationElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<AnimationElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<AnimationElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -152,11 +109,12 @@ struct HScrollImageElement : public Element { |
|
|
|
std::span<std::byte const> buffer() const noexcept; |
|
|
|
std::span<std::byte const> buffer() const noexcept; |
|
|
|
MemoryOneBitBuffer image() noexcept; |
|
|
|
MemoryOneBitBuffer image() noexcept; |
|
|
|
ConstMemoryOneBitBuffer image() const noexcept; |
|
|
|
ConstMemoryOneBitBuffer image() const noexcept; |
|
|
|
|
|
|
|
void updateBuffer(std::span<std::byte const> newBufferData); |
|
|
|
|
|
|
|
|
|
|
|
virtual ~HScrollImageElement() override; |
|
|
|
virtual ~HScrollImageElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<HScrollImageElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<HScrollImageElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -185,11 +143,12 @@ struct VScrollImageElement : public Element { |
|
|
|
std::span<std::byte const> buffer() const noexcept; |
|
|
|
std::span<std::byte const> buffer() const noexcept; |
|
|
|
MemoryOneBitBuffer image() noexcept; |
|
|
|
MemoryOneBitBuffer image() noexcept; |
|
|
|
ConstMemoryOneBitBuffer image() const noexcept; |
|
|
|
ConstMemoryOneBitBuffer image() const noexcept; |
|
|
|
|
|
|
|
void updateBuffer(std::span<std::byte const> newBufferData); |
|
|
|
|
|
|
|
|
|
|
|
virtual ~VScrollImageElement() override; |
|
|
|
virtual ~VScrollImageElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<VScrollImageElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<VScrollImageElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -204,10 +163,6 @@ private: |
|
|
|
std::vector<std::byte> m_buffer; |
|
|
|
std::vector<std::byte> m_buffer; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum class LineStyle : std::uint8_t { |
|
|
|
|
|
|
|
Solid = 0, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct LineElement : public Element { |
|
|
|
struct LineElement : public Element { |
|
|
|
LineElement(std::uint16_t originX, std::uint16_t originY, std::uint16_t targetX, std::uint16_t targetY, LineStyle lineStyle, std::uint8_t flags); |
|
|
|
LineElement(std::uint16_t originX, std::uint16_t originY, std::uint16_t targetX, std::uint16_t targetY, LineStyle lineStyle, std::uint8_t flags); |
|
|
|
|
|
|
|
|
|
|
|
@ -221,7 +176,7 @@ struct LineElement : public Element { |
|
|
|
virtual ~LineElement() override; |
|
|
|
virtual ~LineElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<LineElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<LineElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -247,7 +202,7 @@ struct ClippedTextElement : public Element { |
|
|
|
virtual ~ClippedTextElement() override; |
|
|
|
virtual ~ClippedTextElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<ClippedTextElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<ClippedTextElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -275,7 +230,7 @@ struct HScrollTextElement : public Element { |
|
|
|
virtual ~HScrollTextElement() override; |
|
|
|
virtual ~HScrollTextElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<HScrollTextElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<HScrollTextElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -304,7 +259,7 @@ struct CurrentTimeElement : public Element { |
|
|
|
virtual ~CurrentTimeElement() override; |
|
|
|
virtual ~CurrentTimeElement() override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual ElementType elementType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp) override; |
|
|
|
virtual void drawTo(OneBitBufferInterface* imageBuffer, std::size_t animationTick, std::int64_t currentTimestamp, std::span<CustomFontSection const*> customFonts) override; |
|
|
|
|
|
|
|
|
|
|
|
static std::expected<std::unique_ptr<CurrentTimeElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
static std::expected<std::unique_ptr<CurrentTimeElement>, ParseError> parse(std::span<std::byte const>& buffer); |
|
|
|
|
|
|
|
|
|
|
|
@ -331,7 +286,7 @@ struct AlwaysDrawnSection : public Section { |
|
|
|
void setClearBeforeDrawing(bool value) noexcept; |
|
|
|
void setClearBeforeDrawing(bool value) noexcept; |
|
|
|
|
|
|
|
|
|
|
|
std::size_t elementCount() const noexcept; |
|
|
|
std::size_t elementCount() const noexcept; |
|
|
|
std::unique_ptr<Element> elementAt(std::size_t index) const; |
|
|
|
Element* elementAt(std::size_t index) const; |
|
|
|
|
|
|
|
|
|
|
|
void appendElement(std::unique_ptr<Element> element); |
|
|
|
void appendElement(std::unique_ptr<Element> element); |
|
|
|
void insertElement(std::size_t index, std::unique_ptr<Element> element); |
|
|
|
void insertElement(std::size_t index, std::unique_ptr<Element> element); |
|
|
|
@ -363,17 +318,17 @@ struct TimeBasedDrawnSection : public Section { |
|
|
|
void setClearBeforeDrawing(bool value) noexcept; |
|
|
|
void setClearBeforeDrawing(bool value) noexcept; |
|
|
|
|
|
|
|
|
|
|
|
std::size_t elementCount() const noexcept; |
|
|
|
std::size_t elementCount() const noexcept; |
|
|
|
std::unique_ptr<Element> elementAt(std::size_t index) const; |
|
|
|
Element* elementAt(std::size_t index) const; |
|
|
|
|
|
|
|
|
|
|
|
void appendElement(std::unique_ptr<Element> element); |
|
|
|
void appendElement(std::unique_ptr<Element> element); |
|
|
|
void insertElement(std::size_t index, std::unique_ptr<Element> element); |
|
|
|
void insertElement(std::size_t index, std::unique_ptr<Element> element); |
|
|
|
std::unique_ptr<Element> replaceElement(std::size_t index, std::unique_ptr<Element> element); |
|
|
|
std::unique_ptr<Element> replaceElement(std::size_t index, std::unique_ptr<Element> element); |
|
|
|
std::unique_ptr<Element> eraseElement(std::size_t index); |
|
|
|
std::unique_ptr<Element> eraseElement(std::size_t index); |
|
|
|
|
|
|
|
|
|
|
|
std::uint64_t startTimestamp() const noexcept; |
|
|
|
std::int64_t startTimestamp() const noexcept; |
|
|
|
std::uint64_t endTimestamp() const noexcept; |
|
|
|
std::int64_t endTimestamp() const noexcept; |
|
|
|
void setStartTimestamp(std::uint64_t value); |
|
|
|
void setStartTimestamp(std::int64_t value); |
|
|
|
void setEndTimestamp(std::uint64_t value); |
|
|
|
void setEndTimestamp(std::int64_t value); |
|
|
|
|
|
|
|
|
|
|
|
virtual SectionType sectionType() const override; |
|
|
|
virtual SectionType sectionType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
@ -382,8 +337,8 @@ struct TimeBasedDrawnSection : public Section { |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
private: |
|
|
|
std::vector<std::unique_ptr<Element>> m_elements; |
|
|
|
std::vector<std::unique_ptr<Element>> m_elements; |
|
|
|
std::uint64_t m_startTimestamp{}; |
|
|
|
std::int64_t m_startTimestamp{}; |
|
|
|
std::uint64_t m_endTimestamp{}; |
|
|
|
std::int64_t m_endTimestamp{}; |
|
|
|
bool m_drawOnFront{true}; |
|
|
|
bool m_drawOnFront{true}; |
|
|
|
bool m_drawOnBack{true}; |
|
|
|
bool m_drawOnBack{true}; |
|
|
|
bool m_clearBeforeDrawing{true}; |
|
|
|
bool m_clearBeforeDrawing{true}; |
|
|
|
@ -393,6 +348,9 @@ struct CustomFontSection : public Section { |
|
|
|
CustomFontSection() = default; |
|
|
|
CustomFontSection() = default; |
|
|
|
virtual ~CustomFontSection() override; |
|
|
|
virtual ~CustomFontSection() override; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::span<std::byte const> fontData() const; |
|
|
|
|
|
|
|
void setFontData(std::span<std::byte const> fontData); |
|
|
|
|
|
|
|
|
|
|
|
virtual SectionType sectionType() const override; |
|
|
|
virtual SectionType sectionType() const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
virtual std::size_t serializeTo(std::span<std::byte> target) const override; |
|
|
|
|
|
|
|
|
|
|
|
@ -406,8 +364,8 @@ struct File { |
|
|
|
std::vector<std::unique_ptr<Section>> sections; |
|
|
|
std::vector<std::unique_ptr<Section>> sections; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern std::size_t serializeFile(std::span<std::byte>& buffer, File const& file); |
|
|
|
extern std::expected<File, ParseError> parseFile(std::span<std::byte const> data); |
|
|
|
extern std::expected<File, ParseError> parseFile(std::span<std::byte const> data); |
|
|
|
extern std::size_t serializeFile(std::span<std::byte> buffer); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace monoformat
|
|
|
|
} // namespace monoformat
|
|
|
|
|
|
|
|
|
|
|
|
|