@ -1,6 +1,7 @@
# include "monoformat_parseonly.hpp"
# include "monoformat_parseonly.hpp"
# include "monoformat_parsehelpers.hpp"
# include "monoformat_parsehelpers.hpp"
# include "monoformat_fontreader.hpp"
# include "monoformat_fontreader.hpp"
# include "monoformat_bithelpers.hpp"
# include <string_view>
# include <string_view>
# include <string>
# include <string>
@ -22,16 +23,18 @@ struct TimeBasedDrawnSectionMetaData {
std : : int64_t endTimestamp { } ;
std : : int64_t endTimestamp { } ;
} ;
} ;
static std : : expected < void , ParseError > handleImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleAnimation ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleAnimation ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleHScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleHScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleVScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleVScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleLine ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleLine ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleClippedText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleClippedText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleHScrollText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleHScrollText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < void , ParseError > handleCurrentTime ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) ;
static std : : expected < void , ParseError > handleCurrentTime ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) ;
static std : : expected < AlwaysDrawnSectionMetaData , ParseError > parseAlwaysDrawnSection ( std : : span < std : : byte const > & data , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
static std : : expected < AlwaysDrawnSectionMetaData , ParseError > parseAlwaysDrawnSection ( std : : span < std : : byte const > & data ) {
auto type = readU8LE ( data ) ;
auto type = readU8LE ( data ) ;
if ( ! type ) {
if ( ! type ) {
return std : : unexpected ( type . error ( ) ) ;
return std : : unexpected ( type . error ( ) ) ;
@ -58,14 +61,21 @@ static std::expected<AlwaysDrawnSectionMetaData, ParseError> parseAlwaysDrawnSec
data = data . subspan ( * size - 8 ) ;
data = data . subspan ( * size - 8 ) ;
AlwaysDrawnSectionMetaData result ;
AlwaysDrawnSectionMetaData result ;
result . drawOnFront = ( ( ( * flags ) > > 0u ) & 0x01u ) = = 0x01u ;
result . drawOnFront = isBitSet ( * flags , 0 ) ;
result . drawOnBack = ( ( ( * flags ) > > 0u ) & 0x02u ) = = 0x02u ;
result . drawOnBack = isBitSet ( * flags , 1 ) ;
result . clearBeforeDrawing = ( ( ( * flags ) > > 0u ) & 0x04u ) = = 0x04u ;
result . clearBeforeDrawing = isBitSet ( * flags , 2 ) ;
result . elementData = sectionData ;
result . elementData = sectionData ;
# if defined(DEBUG)
std : : cerr < < " [Debug] AlwaysDrawnSection, drawOnFront = " < < result . drawOnFront < < " , drawOnBack = " < < result . drawOnBack < < " , clearBeforeDrawing = " < < result . clearBeforeDrawing < < " , element data size = " < < result . elementData . size ( ) < < " bytes " < < std : : endl ;
# endif
return result ;
return result ;
}
}
static std : : expected < TimeBasedDrawnSectionMetaData , ParseError > parseTimeBasedDrawnSection ( std : : span < std : : byte const > & data ) {
static std : : expected < TimeBasedDrawnSectionMetaData , ParseError > parseTimeBasedDrawnSection ( std : : span < std : : byte const > & data , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
auto type = readU8LE ( data ) ;
auto type = readU8LE ( data ) ;
if ( ! type ) {
if ( ! type ) {
return std : : unexpected ( type . error ( ) ) ;
return std : : unexpected ( type . error ( ) ) ;
@ -100,16 +110,23 @@ static std::expected<TimeBasedDrawnSectionMetaData, ParseError> parseTimeBasedDr
data = data . subspan ( * size - 24 ) ;
data = data . subspan ( * size - 24 ) ;
TimeBasedDrawnSectionMetaData result ;
TimeBasedDrawnSectionMetaData result ;
result . base . drawOnFront = ( ( ( * flags ) > > 0u ) & 0x01u ) = = 0x01u ;
result . base . drawOnFront = isBitSet ( * flags , 0 ) ;
result . base . drawOnBack = ( ( ( * flags ) > > 0u ) & 0x02u ) = = 0x02u ;
result . base . drawOnBack = isBitSet ( * flags , 1 ) ;
result . base . clearBeforeDrawing = ( ( ( * flags ) > > 0u ) & 0x04u ) = = 0x04u ;
result . base . clearBeforeDrawing = isBitSet ( * flags , 2 ) ;
result . base . elementData = sectionData ;
result . base . elementData = sectionData ;
result . startTimestamp = std : : bit_cast < std : : int64_t > ( * startTimestamp ) ;
result . startTimestamp = std : : bit_cast < std : : int64_t > ( * startTimestamp ) ;
result . endTimestamp = std : : bit_cast < std : : int64_t > ( * endTimestamp ) ;
result . endTimestamp = std : : bit_cast < std : : int64_t > ( * endTimestamp ) ;
# if defined(DEBUG)
std : : cerr < < " [Debug] TimeBasedDrawnSection, drawOnFront = " < < result . base . drawOnFront < < " , drawOnBack = " < < result . base . drawOnBack < < " , clearBeforeDrawing = " < < result . base . clearBeforeDrawing < < " , element data size = " < < result . base . elementData . size ( ) < < " bytes, timestamp between " < < result . startTimestamp < < " and " < < result . endTimestamp < < std : : endl ;
# endif
return result ;
return result ;
}
}
static std : : expected < std : : span < std : : byte const > , ParseError > parseCustomFontSection ( std : : span < std : : byte const > & data ) {
static std : : expected < std : : span < std : : byte const > , ParseError > parseCustomFontSection ( std : : span < std : : byte const > & data , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
auto type = readU8LE ( data ) ;
auto type = readU8LE ( data ) ;
if ( ! type ) {
if ( ! type ) {
return std : : unexpected ( type . error ( ) ) ;
return std : : unexpected ( type . error ( ) ) ;
@ -135,6 +152,10 @@ static std::expected<std::span<std::byte const>, ParseError> parseCustomFontSect
auto fontData = data . subspan ( 0 , * size - 8 ) ;
auto fontData = data . subspan ( 0 , * size - 8 ) ;
data = data . subspan ( * size - 8 ) ;
data = data . subspan ( * size - 8 ) ;
# if defined(DEBUG)
std : : cerr < < " [Debug] CustomFontSection, font data size = " < < * actualSize < < " bytes " < < std : : endl ;
# endif
return readBuffer ( fontData , * actualSize ) ;
return readBuffer ( fontData , * actualSize ) ;
}
}
@ -182,7 +203,7 @@ std::expected<void, ParseError> parseAndApply(std::span<std::byte const> data, O
}
}
if ( static_cast < SectionType > ( * sectionType ) = = SectionType : : CustomFont ) {
if ( static_cast < SectionType > ( * sectionType ) = = SectionType : : CustomFont ) {
auto fontData = parseCustomFontSection ( * rawSectionData ) ;
auto fontData = parseCustomFontSection ( * rawSectionData , * version ) ;
if ( ! fontData ) {
if ( ! fontData ) {
return std : : unexpected ( fontData . error ( ) ) ;
return std : : unexpected ( fontData . error ( ) ) ;
}
}
@ -194,13 +215,13 @@ std::expected<void, ParseError> parseAndApply(std::span<std::byte const> data, O
AlwaysDrawnSectionMetaData section ;
AlwaysDrawnSectionMetaData section ;
if ( static_cast < SectionType > ( * sectionType ) = = SectionType : : AlwaysDrawn ) {
if ( static_cast < SectionType > ( * sectionType ) = = SectionType : : AlwaysDrawn ) {
auto metaData = parseAlwaysDrawnSection ( * rawSectionData ) ;
auto metaData = parseAlwaysDrawnSection ( * rawSectionData , * version ) ;
if ( ! metaData ) {
if ( ! metaData ) {
return std : : unexpected ( metaData . error ( ) ) ;
return std : : unexpected ( metaData . error ( ) ) ;
}
}
section = * metaData ;
section = * metaData ;
} else if ( static_cast < SectionType > ( * sectionType ) = = SectionType : : TimeBasedDrawn ) {
} else if ( static_cast < SectionType > ( * sectionType ) = = SectionType : : TimeBasedDrawn ) {
auto metaData = parseTimeBasedDrawnSection ( * rawSectionData ) ;
auto metaData = parseTimeBasedDrawnSection ( * rawSectionData , * version ) ;
if ( ! metaData ) {
if ( ! metaData ) {
return std : : unexpected ( metaData . error ( ) ) ;
return std : : unexpected ( metaData . error ( ) ) ;
}
}
@ -234,14 +255,14 @@ std::expected<void, ParseError> parseAndApply(std::span<std::byte const> data, O
auto eType = static_cast < ElementType > ( * type ) ;
auto eType = static_cast < ElementType > ( * type ) ;
std : : expected < void , ParseError > parseResult ;
std : : expected < void , ParseError > parseResult ;
switch ( eType ) {
switch ( eType ) {
case ElementType : : Image : parseResult = handleImage ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : Image : parseResult = handleImage ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : Animation : parseResult = handleAnimation ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : Animation : parseResult = handleAnimation ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : HScrollImage : parseResult = handleHScrollImage ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : HScrollImage : parseResult = handleHScrollImage ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : VScrollImage : parseResult = handleVScrollImage ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : VScrollImage : parseResult = handleVScrollImage ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : Line : parseResult = handleLine ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : Line : parseResult = handleLine ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : ClippedText : parseResult = handleClippedText ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : ClippedText : parseResult = handleClippedText ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : HScrollText : parseResult = handleHScrollText ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : HScrollText : parseResult = handleHScrollText ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
case ElementType : : CurrentTime : parseResult = handleCurrentTime ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) ) ; break ;
case ElementType : : CurrentTime : parseResult = handleCurrentTime ( section . elementData , screen , animationTick , currentTimestamp , std : : span { customFonts } . subspan ( 0 , customFontIndex ) , * version ) ; break ;
default : parseResult = std : : unexpected ( ParseError : : InvalidValue ) ;
default : parseResult = std : : unexpected ( ParseError : : InvalidValue ) ;
}
}
@ -254,7 +275,9 @@ std::expected<void, ParseError> parseAndApply(std::span<std::byte const> data, O
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
auto type = readU16LE ( buffer ) ;
auto type = readU16LE ( buffer ) ;
if ( ! type ) {
if ( ! type ) {
return std : : unexpected ( type . error ( ) ) ;
return std : : unexpected ( type . error ( ) ) ;
@ -292,6 +315,10 @@ std::expected<void, ParseError> handleImage(std::span<std::byte const>& buffer,
buffer = buffer . subspan ( rounded - imageSize ) ;
buffer = buffer . subspan ( rounded - imageSize ) ;
}
}
# if defined(DEBUG)
std : : cerr < < " [Debug] - Image, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height ) < < std : : endl ;
# endif
std : : ignore = animationTick ;
std : : ignore = animationTick ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
std : : ignore = customFonts ;
std : : ignore = customFonts ;
@ -305,7 +332,8 @@ std::expected<void, ParseError> handleImage(std::span<std::byte const>& buffer,
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleAnimation ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleAnimation ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
std : : ignore = customFonts ;
std : : ignore = customFonts ;
@ -345,15 +373,22 @@ std::expected<void, ParseError> handleAnimation(std::span<std::byte const>& buff
return std : : unexpected ( reserved_ . error ( ) ) ;
return std : : unexpected ( reserved_ . error ( ) ) ;
}
}
std : : size_t imageSize = ( ( * width ) * ( * height ) + 8 - 1 ) / 8 ;
std : : size_t imageSize = ( ( * width ) * ( * height ) + 8 - 1 ) / 8 ;
auto imageData = readBuffer ( buffer , imageSize ) ;
auto imageData = readBuffer ( buffer , imageSize * ( * numberOfFrames ) ) ;
if ( ! imageData ) {
if ( ! imageData ) {
return std : : unexpected ( reserved_ . error ( ) ) ;
return std : : unexpected ( reserved_ . error ( ) ) ;
}
}
std : : size_t rounded = ( imageSize + 4 - 1 ) / 4 * 4 ;
std : : size_t rounded = ( imageSize * ( * numberOfFrames ) + 4 - 1 ) / 4 * 4 ;
if ( imageSize < rounded ) {
if ( imageSize * ( * numberOfFrames ) < rounded ) {
buffer = buffer . subspan ( rounded - imageSize ) ;
buffer = buffer . subspan ( rounded - imageSize * ( * numberOfFrames ) ) ;
}
}
# if defined(DEBUG)
std : : cerr < < " [Debug] - Animation, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height )
< < " , numberOfFrames = " < < ( * numberOfFrames )
< < " , updateInterval = " < < ( * updateInterval )
< < std : : endl ;
# endif
if ( * numberOfFrames = = 0 ) {
if ( * numberOfFrames = = 0 ) {
return { } ;
return { } ;
}
}
@ -370,7 +405,8 @@ std::expected<void, ParseError> handleAnimation(std::span<std::byte const>& buff
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleHScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleHScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
std : : ignore = customFonts ;
std : : ignore = customFonts ;
@ -426,14 +462,24 @@ std::expected<void, ParseError> handleHScrollImage(std::span<std::byte const>& b
auto ownImage = ConstMemoryOneBitBuffer { * imageData , * contentWidth , * height } ;
auto ownImage = ConstMemoryOneBitBuffer { * imageData , * contentWidth , * height } ;
ClippedImage target { screen , * x , * y , * width , * height } ;
ClippedImage target { screen , * x , * y , * width , * height } ;
# if defined(DEBUG)
std : : cerr < < " [Debug] - HScrollImage, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height )
< < " , contentWidth = " < < ( * contentWidth )
< < " , scrollSpeed = " < < int ( * scrollSpeed )
< < " , flags = " < < int ( * flags )
< < std : : endl ;
# endif
if ( * contentWidth = = 0 ) {
if ( * contentWidth = = 0 ) {
return { } ;
return { } ;
}
}
bool restarting = ( ( * flags ) & 0x01 ) = = 0x00 ;
ScrollFlags scrollFlags { * flags } ;
bool invert = ( ( * flags ) & 0x02 ) = = 0x02 ;
bool padBefore = ( ( * flags ) & 0x04 ) = = 0x04 ;
bool restarting = ! scrollFlags . endless ;
bool padAfter = ( ( * flags ) & 0x08 ) = = 0x08 ;
bool invert = scrollFlags . invertDirection ;
bool padBefore = scrollFlags . padBefore ;
bool padAfter = scrollFlags . padAfter ;
if ( ! padBefore & & ! padAfter & & * contentWidth < * width ) {
if ( ! padBefore & & ! padAfter & & * contentWidth < * width ) {
std : : int16_t offset = invert ? ( * width - * contentWidth ) : 0 ;
std : : int16_t offset = invert ? ( * width - * contentWidth ) : 0 ;
@ -525,7 +571,8 @@ std::expected<void, ParseError> handleHScrollImage(std::span<std::byte const>& b
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleVScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleVScrollImage ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
std : : ignore = customFonts ;
std : : ignore = customFonts ;
@ -581,14 +628,24 @@ std::expected<void, ParseError> handleVScrollImage(std::span<std::byte const>& b
auto ownImage = ConstMemoryOneBitBuffer { * imageData , * width , * contentHeight } ;
auto ownImage = ConstMemoryOneBitBuffer { * imageData , * width , * contentHeight } ;
ClippedImage target { screen , * x , * y , * width , * height } ;
ClippedImage target { screen , * x , * y , * width , * height } ;
# if defined(DEBUG)
std : : cerr < < " [Debug] - VScrollImage, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height )
< < " , contentHeight = " < < ( * contentHeight )
< < " , scrollSpeed = " < < int ( * scrollSpeed )
< < " , flags = " < < int ( * flags )
< < std : : endl ;
# endif
if ( * contentHeight = = 0 ) {
if ( * contentHeight = = 0 ) {
return { } ;
return { } ;
}
}
bool restarting = ( ( * flags ) & 0x01 ) = = 0x00 ;
ScrollFlags scrollFlags { * flags } ;
bool invert = ( ( * flags ) & 0x02 ) = = 0x02 ;
bool padBefore = ( ( * flags ) & 0x04 ) = = 0x04 ;
bool restarting = ! scrollFlags . endless ;
bool padAfter = ( ( * flags ) & 0x08 ) = = 0x08 ;
bool invert = scrollFlags . invertDirection ;
bool padBefore = scrollFlags . padBefore ;
bool padAfter = scrollFlags . padAfter ;
if ( ! padBefore & & ! padAfter & & * contentHeight < * height ) {
if ( ! padBefore & & ! padAfter & & * contentHeight < * height ) {
std : : int16_t offset = invert ? ( * height - * contentHeight ) : 0 ;
std : : int16_t offset = invert ? ( * height - * contentHeight ) : 0 ;
@ -680,7 +737,8 @@ std::expected<void, ParseError> handleVScrollImage(std::span<std::byte const>& b
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleLine ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleLine ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = animationTick ;
std : : ignore = animationTick ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
std : : ignore = customFonts ;
std : : ignore = customFonts ;
@ -720,6 +778,15 @@ std::expected<void, ParseError> handleLine(std::span<std::byte const>& buffer, O
return std : : unexpected ( flags . error ( ) ) ;
return std : : unexpected ( flags . error ( ) ) ;
}
}
# if defined(DEBUG)
std : : cerr < < " [Debug] - Line, originX = " < < ( * originX ) < < " , originY = " < < ( * originY ) < < " , targetX = " < < ( * targetX ) < < " , targetY = " < < ( * targetY )
< < " , lineStyle = " < < int ( * lineStyle )
< < std : : endl ;
# endif
LineFlags lineFlags { * flags } ;
std : : ignore = lineFlags ;
std : : int32_t dx = static_cast < std : : int32_t > ( * targetX ) - static_cast < std : : int32_t > ( * originX ) ;
std : : int32_t dx = static_cast < std : : int32_t > ( * targetX ) - static_cast < std : : int32_t > ( * originX ) ;
std : : int32_t dy = static_cast < std : : int32_t > ( * targetY ) - static_cast < std : : int32_t > ( * originY ) ;
std : : int32_t dy = static_cast < std : : int32_t > ( * targetY ) - static_cast < std : : int32_t > ( * originY ) ;
bool value = true ;
bool value = true ;
@ -743,7 +810,8 @@ std::expected<void, ParseError> handleLine(std::span<std::byte const>& buffer, O
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleClippedText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleClippedText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = animationTick ;
std : : ignore = animationTick ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
@ -785,9 +853,16 @@ std::expected<void, ParseError> handleClippedText(std::span<std::byte const>& bu
}
}
std : : string_view text { reinterpret_cast < char const * > ( textData - > data ( ) ) , * textLength } ;
std : : string_view text { reinterpret_cast < char const * > ( textData - > data ( ) ) , * textLength } ;
# if defined(DEBUG)
std : : cerr < < " [Debug] - ClippedText, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height )
< < " , fontIndex = " < < int ( * fontIndex )
< < " , text = \" " < < text < < " \" "
< < std : : endl ;
# endif
std : : span < std : : byte const > fontData ;
std : : span < std : : byte const > fontData ;
if ( ( * fontIndex ) & 0x8000u ) {
if ( isBitSet ( * fontIndex , 15 ) ) {
fontIndex = ( * fontIndex ) & ~ 0x8000u ;
unsetBit ( * fontIndex , 15 ) ;
if ( * fontIndex > = customFonts . size ( ) ) {
if ( * fontIndex > = customFonts . size ( ) ) {
return { } ;
return { } ;
}
}
@ -805,7 +880,8 @@ std::expected<void, ParseError> handleClippedText(std::span<std::byte const>& bu
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleHScrollText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleHScrollText ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = currentTimestamp ;
std : : ignore = currentTimestamp ;
auto type = readU16LE ( buffer ) ;
auto type = readU16LE ( buffer ) ;
@ -854,9 +930,18 @@ std::expected<void, ParseError> handleHScrollText(std::span<std::byte const>& bu
}
}
std : : string_view text { reinterpret_cast < char const * > ( textData - > data ( ) ) , * textLength } ;
std : : string_view text { reinterpret_cast < char const * > ( textData - > data ( ) ) , * textLength } ;
# if defined(DEBUG)
std : : cerr < < " [Debug] - HScrollText, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height )
< < " , scrollSpeed = " < < int ( * scrollSpeed )
< < " , flags = " < < int ( * flags )
< < " , fontIndex = " < < int ( * fontIndex )
< < " , text = \" " < < text < < " \" "
< < std : : endl ;
# endif
std : : span < std : : byte const > fontData ;
std : : span < std : : byte const > fontData ;
if ( ( * fontIndex ) & 0x8000u ) {
if ( isBitSet ( * fontIndex , 15 ) ) {
fontIndex = ( * fontIndex ) & ~ 0x8000u ;
unsetBit ( * fontIndex , 15 ) ;
if ( * fontIndex > = customFonts . size ( ) ) {
if ( * fontIndex > = customFonts . size ( ) ) {
return { } ;
return { } ;
}
}
@ -880,10 +965,12 @@ std::expected<void, ParseError> handleHScrollText(std::span<std::byte const>& bu
return { } ;
return { } ;
}
}
bool restarting = ( ( * flags ) & 0x01 ) = = 0x00 ;
ScrollFlags scrollFlags { * flags } ;
bool invert = ( ( * flags ) & 0x02 ) = = 0x02 ;
bool padBefore = ( ( * flags ) & 0x04 ) = = 0x04 ;
bool restarting = ! scrollFlags . endless ;
bool padAfter = ( ( * flags ) & 0x08 ) = = 0x08 ;
bool invert = scrollFlags . invertDirection ;
bool padBefore = scrollFlags . padBefore ;
bool padAfter = scrollFlags . padAfter ;
if ( ! padBefore & & ! padAfter & & contentWidth < * width ) {
if ( ! padBefore & & ! padAfter & & contentWidth < * width ) {
std : : uint16_t offset = invert ? ( * width - contentWidth ) : 0 ;
std : : uint16_t offset = invert ? ( * width - contentWidth ) : 0 ;
@ -955,7 +1042,8 @@ std::expected<void, ParseError> handleHScrollText(std::span<std::byte const>& bu
return { } ;
return { } ;
}
}
std : : expected < void , ParseError > handleCurrentTime ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts ) {
std : : expected < void , ParseError > handleCurrentTime ( std : : span < std : : byte const > & buffer , OneBitBufferInterface * screen , std : : size_t animationTick , std : : int64_t currentTimestamp , std : : span < std : : span < std : : byte const > > customFonts , std : : uint32_t formatVersion ) {
std : : ignore = formatVersion ;
std : : ignore = animationTick ;
std : : ignore = animationTick ;
auto type = readU16LE ( buffer ) ;
auto type = readU16LE ( buffer ) ;
@ -994,9 +1082,17 @@ std::expected<void, ParseError> handleCurrentTime(std::span<std::byte const>& bu
return std : : unexpected ( flags . error ( ) ) ;
return std : : unexpected ( flags . error ( ) ) ;
}
}
# if defined(DEBUG)
std : : cerr < < " [Debug] - CurrentTime, x = " < < ( * x ) < < " , y = " < < ( * y ) < < " , width = " < < ( * width ) < < " , height = " < < ( * height )
< < " , fontIndex = " < < int ( * fontIndex )
< < " , utcOffset = " < < int ( * utcOffset )
< < " , flags = " < < int ( * flags )
< < std : : endl ;
# endif
std : : span < std : : byte const > fontData ;
std : : span < std : : byte const > fontData ;
if ( ( * fontIndex ) & 0x8000u ) {
if ( isBitSet ( * fontIndex , 15 ) ) {
fontIndex = ( * fontIndex ) & ~ 0x8000u ;
unsetBit ( * fontIndex , 15 ) ;
if ( * fontIndex > = customFonts . size ( ) ) {
if ( * fontIndex > = customFonts . size ( ) ) {
return { } ;
return { } ;
}
}
@ -1009,10 +1105,12 @@ std::expected<void, ParseError> handleCurrentTime(std::span<std::byte const>& bu
}
}
ClippedImage target { screen , * x , * y , * width , * height } ;
ClippedImage target { screen , * x , * y , * width , * height } ;
bool use12h = ( ( * flags ) & 0x01u ) = = 0x01u ;
TimeDisplayFlags timeDisplayFlags { * flags } ;
bool showHours = ( ( * flags ) & 0x02u ) = = 0x02u ;
bool showMinutes = ( ( * flags ) & 0x04u ) = = 0x04u ;
bool use12h = timeDisplayFlags . use12h ;
bool showSeconds = ( ( * flags ) & 0x08u ) = = 0x08u ;
bool showHours = timeDisplayFlags . showHours ;
bool showMinutes = timeDisplayFlags . showMinutes ;
bool showSeconds = timeDisplayFlags . showSeconds ;
if ( showHours & & showSeconds ) {
if ( showHours & & showSeconds ) {
showMinutes = true ;
showMinutes = true ;
}
}