about summary refs log tree commit diff stats
path: root/src/layout/box.nim
blob: 930ffa908cbe86a1bd946909e8bcd10b0e96d24f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import css/stylednode
import css/values
import layout/layoutunit

type
  Offset* = object
    x*: LayoutUnit
    y*: LayoutUnit

  Size* = object
    w*: LayoutUnit
    h*: LayoutUnit

  InlineAtomType* = enum
    INLINE_SPACING, INLINE_WORD, INLINE_BLOCK

  InlineAtom* = ref object
    offset*: Offset
    size*: Size
    case t*: InlineAtomType
    of INLINE_SPACING:
      discard
    of INLINE_WORD:
      str*: string
    of INLINE_BLOCK:
      innerbox*: BlockBox

  RootInlineFragment* = ref object
    # offset relative to parent
    offset*: Offset
    # root fragment
    fragment*: InlineFragment
    # baseline of the first line box
    firstBaseline*: LayoutUnit
    # baseline of the last line box
    baseline*: LayoutUnit
    # minimum content width
    xminwidth*: LayoutUnit
    size*: Size

  SplitType* = enum
    stSplitStart, stSplitEnd

  InlineFragment* = ref object
    # Say we have the following inline box:
    #   abcd
    # efghij
    # klm
    # Then startOffset is x: 2ch, y: 1em, endOffset is x: 3ch, y: 2em,
    # and size is w: 6ch, h: 3em.
    # So the algorithm for painting a fragment is:
    # if startOffset.y == endOffset.y:
    #   paint(startOffset, endOffset)
    # else:
    #   paint(startOffset.x, 0, size.w, startOffset.y)
    #   paint(0, startOffset.y, size.w, endOffset.y)
    #   paint(0, endOffset.y, endOffset.x, size.h)
    startOffset*: Offset
    endOffset*: Offset
    size*: Size
    children*: seq[InlineFragment]
    atoms*: seq[InlineAtom]
    computed*: CSSComputedValues
    node*: StyledNode
    splitType*: set[SplitType]

  RelativeRect* = object
    top*: LayoutUnit
    bottom*: LayoutUnit
    left*: LayoutUnit
    right*: LayoutUnit

  BlockBox* = ref object of RootObj
    inline*: RootInlineFragment
    node*: StyledNode
    nested*: seq[BlockBox]
    computed*: CSSComputedValues
    offset*: Offset
    size*: Size # padding size
    margin*: RelativeRect #TODO get rid of this?
    # 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*: LayoutUnit
    # baseline of the first line box of all descendants
    firstBaseline*: LayoutUnit
    # baseline of the last line box of all descendants
    baseline*: LayoutUnit

  ListItemBox* = ref object of BlockBox
    marker*: RootInlineFragment