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
|