import options import css/stylednode import css/values import io/window import types/color type #LayoutUnit* = distinct int32 LayoutUnit* = int Offset* = object x*: LayoutUnit y*: LayoutUnit Size* = object width*: LayoutUnit height*: LayoutUnit Strut* = object pos*: int neg*: int Viewport* = ref object window*: WindowAttributes root*: seq[BlockBox] absolutes*: seq[BlockBox] BoxBuilder* = ref object of RootObj children*: seq[BoxBuilder] inlinelayout*: bool computed*: CSSComputedValues node*: StyledNode InlineBoxBuilder* = ref object of BoxBuilder text*: seq[string] newline*: bool BlockBoxBuilder* = ref object of BoxBuilder MarkerBoxBuilder* = ref object of InlineBoxBuilder ListItemBoxBuilder* = ref object of BoxBuilder marker*: MarkerBoxBuilder content*: BlockBoxBuilder TableRowGroupBoxBuilder* = ref object of BlockBoxBuilder TableRowBoxBuilder* = ref object of BlockBoxBuilder TableCellBoxBuilder* = ref object of BlockBoxBuilder TableBoxBuilder* = ref object of BlockBoxBuilder rowgroups*: seq[TableRowGroupBoxBuilder] TableCaptionBoxBuilder* = ref object of BlockBoxBuilder InlineAtom* = ref object of RootObj offset*: Offset width*: int height*: int vertalign*: CSSVerticalAlign baseline*: int top*: int bottom*: int ComputedFormat* = ref object fontstyle*: CSSFontStyle fontweight*: int textdecoration*: set[CSSTextDecoration] color*: RGBAColor node*: StyledNode InlineSpacing* = ref object of InlineAtom format*: ComputedFormat InlineWord* = ref object of InlineAtom str*: string format*: ComputedFormat LineBox* = ref object atoms*: seq[InlineAtom] offset*: Offset width*: int height*: int baseline*: int lineheight*: int #line-height property InlineContext* = ref object offset*: Offset height*: int lines*: seq[LineBox] currentLine*: LineBox width*: int contentWidth*: int contentHeight*: Option[int] maxContentWidth*: int charwidth*: int whitespacenum*: int # this is actually xminwidth. minwidth*: int viewport*: Viewport shrink*: bool format*: ComputedFormat BlockBox* = ref object of RootObj inline*: InlineContext node*: StyledNode nested*: seq[BlockBox] computed*: CSSComputedValues viewport*: Viewport offset*: Offset # This is the padding width/height. width*: int height*: int margin_top*: int margin_bottom*: int margin_left*: int margin_right*: int padding_top*: int padding_bottom*: int padding_left*: int padding_right*: int # This is the (specified) content width/height. Actual dimensions may # differ (i.e. overflow) contentWidth*: int contentHeight*: Option[int] shrink*: bool # The sole purpose of maxContentWidth is to stretch children of table # cells to infinity in its maximum width calculation pass. # For blocks with a specified width, maxContentWidth does nothing. # This should never be used for anything other than setting width to # min(maxContentWidth, width)! Failure to do so will almost certainly # result in overflow errors (because maxContentWidth may be set to # high(int).) maxContentWidth*: int # very bad name. basically the minimum content width after the contents # have been positioned (usually the width of the shortest word.) used # in table cells. xminwidth*: int ListItemBox* = ref object of BlockBox marker*: InlineContext CellWrapper* = ref object builder*: TableCellBoxBuilder box*: BlockBox rowi*: int coli*: int colspan*: int rowspan*: int reflow*: bool grown*: int # number of remaining rows RowContext* = object cells*: seq[CellWrapper] reflow*: seq[bool] width*: int builder*: TableRowBoxBuilder ncols*: int ColumnContext* = object minwidth*: int maxwidth*: int width*: int wspecified*: bool weight*: float64 TableContext* = object caption*: TableCaptionBoxBuilder rows*: seq[RowContext] cols*: seq[ColumnContext] growing*: seq[CellWrapper] maxwidth*: int blockspacing*: int inlinespacing*: int collapse*: bool InlineBlockBox* = ref object of InlineAtom innerbox*: BlockBox margin_top*: int margin_bottom*: int proc append*(a: var Strut, b: int) = if b < 0: a.neg = min(b, a.neg) else: a.pos = max(b, a.pos) func sum*(a: Strut): int = return a.pos + a.neg #proc `div`(a, b: LayoutUnit): LayoutUnit {.borrow.} # #func `+`*(a, b: LayoutUnit): LayoutUnit {.borrow.} #func `-`*(a, b: LayoutUnit): LayoutUnit {.borrow.} #func `*`*(a, b: LayoutUnit): LayoutUnit {.borrow.} #func `/`*(a, b: LayoutUnit): LayoutUnit = a div b # #proc `+=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.} #proc `-=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.} #proc `*=`*(a: var LayoutUnit, b: LayoutUnit) {.borrow.} #proc `/=`*(a: var LayoutUnit, b: LayoutUnit) = a = a div b