use binrw::BinRead;
use enum_display::EnumDisplay;
use modular_bitfield::{
Specifier, bitfield,
prelude::{B2, B4, B7, B12},
};
#[derive(Debug, BinRead)]
pub struct Data {
#[br(assert(_len == 20))]
_len: u16,
#[br(assert(ifnt != 4 && ifnt <= 1022))]
pub ifnt: u16, pub ifmt: u16,
pub protection: Protection, pub alignment: Alignment, _independent: Independent, #[br(pad_after = -1)]
pub borders: Borders, #[br(map = |x: u8| x >> 1 & 0x01 == 0x01, restore_position)]
_has_ext: bool, #[br(pad_after = -1)]
pub fill: Fill, #[br(map = |x: u8| x >> 6 & 0x01 == 0x01, restore_position)]
_pivot_button: bool, #[br(map = |x: u8| x >> 7 & 0x01 == 0x01, assert(!_reserved3))]
_reserved3: bool, }
#[bitfield]
#[derive(Debug, BinRead)]
#[br(map = Self::from_bytes,
assert(if self.is_style() { !self.prefix123() && self.parent_ixfe() == 0x0FFF } else { true }))]
pub struct Protection {
#[skip(setters)]
pub locked: bool, #[skip(setters)]
pub hidden: bool, #[skip(setters)]
is_style: bool, #[skip(setters)]
prefix123: bool, #[skip(setters)]
parent_ixfe: B12, }
#[bitfield]
#[derive(Debug, BinRead)]
#[br(map = Self::from_bytes,
assert(if self.just_last() { self.horiz_align() == HorizAlign::Distributed } else { true }),
assert(!self.reserved()))]
pub struct Alignment {
#[skip(setters)]
pub horiz_align: HorizAlign, #[skip(setters)]
pub warp_text: bool, #[skip(setters)]
pub vert_align: VertAlign, #[skip(setters)]
just_last: bool, #[skip(setters)]
pub text_rotation: u8, #[skip]
indent: B4, #[skip]
shrink_fit: bool, #[skip(setters)]
reserved: bool, #[skip]
reading_order: ReadingOrder, }
#[derive(Debug, Specifier, PartialEq)]
#[bits = 3]
pub enum HorizAlign {
General, Left, Center, Right, Fill, Justify, CenterContinuous, Distributed, }
#[derive(Debug, Specifier)]
#[bits = 3]
pub enum VertAlign {
Top, Center, Bottom, Justify, Distributed, }
#[derive(Debug, Specifier)]
#[bits = 2]
pub enum ReadingOrder {
Context, Ltr, Rtl, }
#[bitfield]
#[derive(Debug, BinRead)]
#[br(map = Self::from_bytes,
assert(self.reserved() == 0))]
pub struct Independent {
#[skip(setters)]
reserved: B2, #[skip]
format: bool, #[skip]
font: bool, #[skip]
alignment: bool, #[skip]
border: bool, #[skip]
fill: bool, #[skip]
protection: bool, }
#[bitfield]
#[derive(Debug, BinRead)]
#[br(map = Self::from_bytes)]
pub struct Borders {
#[skip(setters)]
pub left_style: BorderStyle, #[skip(setters)]
pub right_style: BorderStyle, #[skip(setters)]
pub top_style: BorderStyle, #[skip(setters)]
pub bottom_style: BorderStyle, #[skip(setters)]
pub left_icv: B7, #[skip(setters)]
pub right_icv: B7, #[skip(setters)]
pub diagonal_type: B2, #[skip(setters)]
pub top_icv: B7, #[skip(setters)]
pub bottom_icv: B7, #[skip(setters)]
pub diagonal_icv: B7, #[skip(setters)]
pub diagonal_style: BorderStyle, #[skip]
__: B7, }
#[derive(Debug, Specifier, EnumDisplay)]
#[enum_display(case = "Camel")]
#[bits = 4]
pub enum BorderStyle {
None, Thin, Medium, Dashed, Dotted, Thick, Double, Hair, MediumDashed, DashDot, MediumDashDot, DashDotDot, MediumDashDotDot, SlantedDashDotDot, }
#[bitfield]
#[derive(Debug, BinRead)]
#[br(map = Self::from_bytes)]
pub struct Fill {
#[skip]
__: B2, #[skip(setters)]
pub pattern: Pattern, #[skip(setters)]
pub fore_icv: B7, #[skip(setters)]
pub back_icv: B7, #[skip]
__: B2, }
#[derive(Debug, Specifier)]
#[bits = 6]
pub enum Pattern {
None, Solid, MediumGray, DarkGray, LightGray, DarkHorizontal, DarkVertical, DarkDown, DarkUp, DarkGrid, DarkTrellis, LightHorizontal, LightVertical, LightDown, LightUp, LightGrid, LightTrellis, Gray125, Gray0625, }