@@ -79,6 +79,107 @@ namespace litehtml
79
79
}
80
80
}
81
81
};
82
+
83
+ class flex_align_content_spread
84
+ {
85
+ flex_align_content m_type;
86
+ int m_num_lines;
87
+ int m_free_space;
88
+ flex_wrap m_wrap;
89
+ public:
90
+ flex_align_content_spread (flex_align_content type, flex_wrap wrap, int num_lines, int free_space) :
91
+ m_type (type), m_num_lines(num_lines), m_free_space(0 ), m_wrap(wrap)
92
+ {
93
+ if (m_wrap == flex_wrap_nowrap)
94
+ {
95
+ m_type = flex_align_content_stretch;
96
+ }
97
+ set_free_space (free_space);
98
+ }
99
+
100
+ void set_free_space (int free_space)
101
+ {
102
+ m_free_space = free_space;
103
+ switch (m_type)
104
+ {
105
+
106
+ case flex_align_content_space_between:
107
+ // If the leftover free-space is negative or there is only a single flex line in the flex
108
+ // container, this value is identical to flex-start.
109
+ if (m_num_lines == 1 || m_free_space < 0 ) m_type = flex_align_content_flex_start;
110
+ break ;
111
+ case flex_align_content_space_around:
112
+ // If the leftover free-space is negative this value is identical to center.
113
+ if (m_num_lines == 1 || m_free_space < 0 ) m_type = flex_align_content_center;
114
+ break ;
115
+ default :
116
+ break ;
117
+ }
118
+ }
119
+
120
+ int start ()
121
+ {
122
+ switch (m_type)
123
+ {
124
+ case flex_align_content_flex_end:
125
+ case flex_align_content_end:
126
+ return m_free_space;
127
+ case flex_align_content_center:
128
+ return m_free_space / 2 ;
129
+ case flex_align_content_stretch:
130
+ case flex_align_content_space_between:
131
+ case flex_align_content_space_around:
132
+ default :
133
+ // using stretch by default
134
+ return 0 ;
135
+ }
136
+ }
137
+
138
+ int add_line_size ()
139
+ {
140
+ switch (m_type)
141
+ {
142
+
143
+ case flex_align_content_flex_start:
144
+ case flex_align_content_flex_end:
145
+ case flex_align_content_start:
146
+ case flex_align_content_end:
147
+ case flex_align_content_center:
148
+ case flex_align_content_space_between:
149
+ case flex_align_content_space_around:
150
+ return 0 ;
151
+ case flex_align_content_stretch:
152
+ default :
153
+ return m_free_space / m_num_lines;
154
+ }
155
+ }
156
+
157
+ int before_line ()
158
+ {
159
+ switch (m_type)
160
+ {
161
+ case flex_align_content_space_between:
162
+ return 0 ;
163
+ case flex_align_content_space_around:
164
+ return m_free_space / (m_num_lines * 2 );
165
+ default :
166
+ return 0 ;
167
+ }
168
+ }
169
+
170
+ int after_line ()
171
+ {
172
+ switch (m_type)
173
+ {
174
+ case flex_align_content_space_between:
175
+ return m_free_space / (m_num_lines - 1 );
176
+ case flex_align_content_space_around:
177
+ return m_free_space / (m_num_lines * 2 );
178
+ default :
179
+ return 0 ;
180
+ }
181
+ }
182
+ };
82
183
}
83
184
84
185
int litehtml::render_item_flex::_render_content (int x, int y, bool second_pass, const containing_block_context &self_size, formatting_context* fmt_ctx)
@@ -177,59 +278,67 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
177
278
}
178
279
179
280
int free_cross_size = 0 ;
180
- int add_cross_size = 0 ;
181
281
if (sum_cross_size)
182
282
{
183
283
if (is_row_direction)
184
284
{
185
285
if (self_size.height .type != containing_block_context::cbc_value_type_auto)
186
286
{
187
- free_cross_size = self_size.height ;
287
+ int height = self_size.height ;
188
288
if (src_el ()->css ().get_box_sizing () == box_sizing_border_box)
189
289
{
190
- free_cross_size -= box_sizing_height ();
290
+ height -= box_sizing_height ();
191
291
}
292
+ free_cross_size = height - sum_cross_size;
192
293
}
193
294
} else
194
295
{
195
- free_cross_size = self_size.render_width ;
296
+ free_cross_size = self_size.render_width - sum_cross_size ;
196
297
ret_width = sum_cross_size;
197
298
}
198
- free_cross_size -= sum_cross_size;
199
- sum_cross_size += free_cross_size;
200
- add_cross_size = (int ) ((float ) free_cross_size / (float ) lines.size ());
201
299
}
202
300
203
301
// Find line cross size and align items
204
302
el_x = el_y = 0 ;
205
303
bool is_wrap_reverse = css ().get_flex_wrap () == flex_wrap_wrap_reverse;
206
304
305
+ flex_align_content_spread lines_spread (css ().get_flex_align_content (), css ().get_flex_wrap (), (int ) lines.size (), free_cross_size);
306
+
207
307
if (is_wrap_reverse)
208
308
{
209
309
if (is_row_direction)
210
310
{
211
- el_y = sum_cross_size;
311
+ el_y = sum_cross_size - lines_spread.start ();
312
+ } else
313
+ {
314
+ el_x = sum_cross_size - lines_spread.start ();
315
+ }
316
+ } else
317
+ {
318
+ if (is_row_direction)
319
+ {
320
+ el_y = lines_spread.start ();
212
321
} else
213
322
{
214
- el_x = sum_cross_size ;
323
+ el_x = lines_spread. start () ;
215
324
}
216
325
}
217
326
218
327
for (auto & ln : lines)
219
328
{
220
- if (free_cross_size > 0 && add_cross_size > 0 )
221
- {
222
- ln.cross_size += add_cross_size;
223
- free_cross_size -= add_cross_size;
224
- }
329
+ ln.cross_size += lines_spread.add_line_size ();
330
+
225
331
flex_justify_content_spread content_spread (css ().get_flex_justify_content (),
226
332
(int ) ln.items .size (),
227
333
container_main_size - ln.main_size );
228
334
if (is_row_direction)
229
335
{
230
336
if (is_wrap_reverse)
231
337
{
232
- el_y -= ln.cross_size ;
338
+ el_y -= ln.cross_size - lines_spread.before_line ();
339
+ } else
340
+ {
341
+ el_y += lines_spread.before_line ();
233
342
}
234
343
if (reverse)
235
344
{
@@ -284,7 +393,10 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
284
393
}
285
394
if (!is_wrap_reverse)
286
395
{
287
- el_y += ln.cross_size ;
396
+ el_y += ln.cross_size + lines_spread.after_line ();
397
+ } else
398
+ {
399
+ el_y -= lines_spread.after_line ();
288
400
}
289
401
} else
290
402
{
@@ -306,7 +418,10 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
306
418
}
307
419
if (is_wrap_reverse)
308
420
{
309
- el_x -= ln.cross_size ;
421
+ el_x -= ln.cross_size - lines_spread.before_line ();
422
+ } else
423
+ {
424
+ el_x += lines_spread.before_line ();
310
425
}
311
426
for (auto &item: ln.items )
312
427
{
@@ -359,7 +474,10 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
359
474
}
360
475
if (!is_wrap_reverse)
361
476
{
362
- el_x += ln.cross_size ;
477
+ el_x += ln.cross_size + lines_spread.after_line ();
478
+ } else
479
+ {
480
+ el_x -= lines_spread.after_line ();
363
481
}
364
482
}
365
483
}
0 commit comments