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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
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
|