Skip to content

Commit ce7d5a1

Browse files
committed
flex: added support for align-content property
1 parent bf94093 commit ce7d5a1

File tree

3 files changed

+141
-22
lines changed

3 files changed

+141
-22
lines changed

include/litehtml/types.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,12 +874,14 @@ namespace litehtml
874874
flex_align_items_auto // used for align-self property only
875875
};
876876

877-
#define flex_align_content_strings "flex-start;flex-end;center;space-between;space-around;stretch"
877+
#define flex_align_content_strings "flex-start;start;flex-end;end;center;space-between;space-around;stretch"
878878

879879
enum flex_align_content
880880
{
881881
flex_align_content_flex_start,
882+
flex_align_content_start,
882883
flex_align_content_flex_end,
884+
flex_align_content_end,
883885
flex_align_content_center,
884886
flex_align_content_space_between,
885887
flex_align_content_space_around,

src/render_flex.cpp

Lines changed: 136 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,107 @@ namespace litehtml
7979
}
8080
}
8181
};
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+
};
82183
}
83184

84185
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,
177278
}
178279

179280
int free_cross_size = 0;
180-
int add_cross_size = 0;
181281
if(sum_cross_size)
182282
{
183283
if (is_row_direction)
184284
{
185285
if (self_size.height.type != containing_block_context::cbc_value_type_auto)
186286
{
187-
free_cross_size = self_size.height;
287+
int height = self_size.height;
188288
if (src_el()->css().get_box_sizing() == box_sizing_border_box)
189289
{
190-
free_cross_size -= box_sizing_height();
290+
height -= box_sizing_height();
191291
}
292+
free_cross_size = height - sum_cross_size;
192293
}
193294
} else
194295
{
195-
free_cross_size = self_size.render_width;
296+
free_cross_size = self_size.render_width - sum_cross_size;
196297
ret_width = sum_cross_size;
197298
}
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());
201299
}
202300

203301
// Find line cross size and align items
204302
el_x = el_y = 0;
205303
bool is_wrap_reverse = css().get_flex_wrap() == flex_wrap_wrap_reverse;
206304

305+
flex_align_content_spread lines_spread(css().get_flex_align_content(), css().get_flex_wrap(), (int) lines.size(), free_cross_size);
306+
207307
if(is_wrap_reverse)
208308
{
209309
if(is_row_direction)
210310
{
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();
212321
} else
213322
{
214-
el_x = sum_cross_size;
323+
el_x = lines_spread.start();
215324
}
216325
}
217326

218327
for(auto& ln : lines)
219328
{
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+
225331
flex_justify_content_spread content_spread(css().get_flex_justify_content(),
226332
(int) ln.items.size(),
227333
container_main_size - ln.main_size);
228334
if(is_row_direction)
229335
{
230336
if(is_wrap_reverse)
231337
{
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();
233342
}
234343
if(reverse)
235344
{
@@ -284,7 +393,10 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
284393
}
285394
if(!is_wrap_reverse)
286395
{
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();
288400
}
289401
} else
290402
{
@@ -306,7 +418,10 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
306418
}
307419
if(is_wrap_reverse)
308420
{
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();
310425
}
311426
for (auto &item: ln.items)
312427
{
@@ -359,7 +474,10 @@ int litehtml::render_item_flex::_render_content(int x, int y, bool second_pass,
359474
}
360475
if(!is_wrap_reverse)
361476
{
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();
363481
}
364482
}
365483
}

test/render_test.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ void read_dir(const string& subdir, vector<string>& files)
3838
string name = ent->d_name;
3939
if (ent->d_type == DT_DIR)
4040
{
41-
if(name != "." && name != "..")
41+
if(name != "." && name != ".." && name[0] != '-')
4242
{
4343
read_dir(subdir + "/" + name, files);
4444
}
45-
} else
45+
} else if (ent->d_type == DT_REG)
4646
{
47-
if (ent->d_type != DT_REG) continue; // if not regular file
4847
if (name[0] != '-' && name.size() > 4 &&
4948
(name.substr(name.size() - 4) == ".htm" || name.substr(name.size() - 5) == ".html"))
5049
files.push_back(subdir + "/" + name);

0 commit comments

Comments
 (0)