Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f195ffb

Browse filesBrowse files
committed
flex: refactoring flexbox redering
1 parent 7f77236 commit f195ffb
Copy full SHA for f195ffb
Expand file treeCollapse file tree

40 files changed

+1323
-864
lines changed

‎CMakeLists.txt

Copy file name to clipboardExpand all lines: CMakeLists.txt
+4-1Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ set(SOURCE_LITEHTML
6969
src/render_flex.cpp
7070
src/render_image.cpp
7171
src/formatting_context.cpp
72-
)
72+
src/flex_item.cpp
73+
src/flex_line.cpp)
7374

7475
set(HEADER_LITEHTML
7576
include/litehtml.h
@@ -132,6 +133,8 @@ set(HEADER_LITEHTML
132133
include/litehtml/master_css.h
133134
include/litehtml/string_id.h
134135
include/litehtml/formatting_context.h
136+
include/litehtml/flex_item.h
137+
include/litehtml/flex_line.h
135138
)
136139

137140
set(TEST_LITEHTML

‎include/litehtml/flex_item.h

Copy file name to clipboard
+137Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
#ifndef LITEHTML_FLEX_ITEM_H
2+
#define LITEHTML_FLEX_ITEM_H
3+
4+
#include <functional>
5+
#include "formatting_context.h"
6+
7+
namespace litehtml
8+
{
9+
class flex_line;
10+
11+
/**
12+
* Base class for flex item
13+
*/
14+
class flex_item
15+
{
16+
public:
17+
std::shared_ptr<render_item> el;
18+
int base_size;
19+
int min_size;
20+
def_value<int> max_size;
21+
int main_size;
22+
int grow;
23+
int shrink;
24+
int scaled_flex_shrink_factor;
25+
bool frozen;
26+
int order;
27+
int src_order;
28+
def_value<int> auto_margin_main_start;
29+
def_value<int> auto_margin_main_end;
30+
bool auto_margin_cross_start;
31+
bool auto_margin_cross_end;
32+
flex_align_items align;
33+
34+
explicit flex_item(std::shared_ptr<render_item> &_el) :
35+
el(_el),
36+
align(flex_align_items_auto),
37+
grow(0),
38+
base_size(0),
39+
shrink(0),
40+
min_size(0),
41+
frozen(false),
42+
main_size(0),
43+
max_size(0),
44+
order(0),
45+
src_order(0),
46+
scaled_flex_shrink_factor(0),
47+
auto_margin_main_start(0),
48+
auto_margin_main_end(0),
49+
auto_margin_cross_start(false),
50+
auto_margin_cross_end(false)
51+
{}
52+
53+
virtual ~flex_item() = default;
54+
55+
bool operator<(const flex_item& b) const
56+
{
57+
if(order < b.order) return true;
58+
if(order == b.order) return src_order < b.src_order;
59+
return false;
60+
}
61+
void init(const litehtml::containing_block_context &self_size,
62+
litehtml::formatting_context *fmt_ctx, flex_align_items align_items);
63+
virtual void apply_main_auto_margins() = 0;
64+
virtual bool apply_cross_auto_margins(int cross_size) = 0;
65+
virtual void set_main_position(int pos) = 0;
66+
virtual void set_cross_position(int pos) = 0;
67+
virtual int get_el_main_size() = 0;
68+
virtual int get_el_cross_size() = 0;
69+
70+
void place(flex_line &ln, int main_pos,
71+
const containing_block_context &self_size,
72+
formatting_context *fmt_ctx);
73+
int get_last_baseline(baseline::_baseline_type type) const;
74+
int get_first_baseline(baseline::_baseline_type type) const;
75+
76+
protected:
77+
virtual void direction_specific_init(const litehtml::containing_block_context &self_size,
78+
litehtml::formatting_context *fmt_ctx) = 0;
79+
virtual void align_stretch(flex_line &ln, const containing_block_context &self_size,
80+
formatting_context *fmt_ctx) = 0;
81+
virtual void align_baseline(flex_line &ln,
82+
const containing_block_context &self_size,
83+
formatting_context *fmt_ctx) = 0;
84+
};
85+
86+
/**
87+
* Flex item with "flex-direction: row" or " flex-direction: row-reverse"
88+
*/
89+
class flex_item_row_direction : public flex_item
90+
{
91+
public:
92+
explicit flex_item_row_direction(std::shared_ptr<render_item> &_el) : flex_item(_el) {}
93+
94+
void apply_main_auto_margins() override;
95+
bool apply_cross_auto_margins(int cross_size) override;
96+
void set_main_position(int pos) override;
97+
void set_cross_position(int pos) override;
98+
int get_el_main_size() override;
99+
int get_el_cross_size() override;
100+
101+
protected:
102+
void direction_specific_init(const litehtml::containing_block_context &self_size,
103+
litehtml::formatting_context *fmt_ctx) override;
104+
void align_stretch(flex_line &ln, const containing_block_context &self_size,
105+
formatting_context *fmt_ctx) override;
106+
void align_baseline(flex_line &ln,
107+
const containing_block_context &self_size,
108+
formatting_context *fmt_ctx) override;
109+
};
110+
111+
/**
112+
* Flex item with "flex-direction: column" or " flex-direction: column-reverse"
113+
*/
114+
class flex_item_column_direction : public flex_item
115+
{
116+
public:
117+
explicit flex_item_column_direction(std::shared_ptr<render_item> &_el) : flex_item(_el) {}
118+
119+
void apply_main_auto_margins() override;
120+
bool apply_cross_auto_margins(int cross_size) override;
121+
void set_main_position(int pos) override;
122+
void set_cross_position(int pos) override;
123+
int get_el_main_size() override;
124+
int get_el_cross_size() override;
125+
126+
protected:
127+
void direction_specific_init(const litehtml::containing_block_context &self_size,
128+
litehtml::formatting_context *fmt_ctx) override;
129+
void align_stretch(flex_line &ln, const containing_block_context &self_size,
130+
formatting_context *fmt_ctx) override;
131+
void align_baseline(flex_line &ln,
132+
const containing_block_context &self_size,
133+
formatting_context *fmt_ctx) override;
134+
};
135+
}
136+
137+
#endif //LITEHTML_FLEX_ITEM_H

‎include/litehtml/flex_line.h

Copy file name to clipboard
+56Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#ifndef LITEHTML_FLEX_LINE_H
2+
#define LITEHTML_FLEX_LINE_H
3+
4+
#include "formatting_context.h"
5+
6+
namespace litehtml
7+
{
8+
class flex_item;
9+
10+
class flex_line
11+
{
12+
public:
13+
std::list<std::shared_ptr<flex_item>> items;
14+
int cross_start; // for row direction: top. for column direction: left
15+
int main_size; // sum of all items main size
16+
int cross_size; // sum of all items cross size
17+
int base_size;
18+
int total_grow;
19+
int total_shrink;
20+
int num_auto_margin_main_start; // number of items with auto margin left/top
21+
int num_auto_margin_main_end; // number of items with auto margin right/bottom
22+
baseline first_baseline;
23+
baseline last_baseline;
24+
bool reverse_main;
25+
bool reverse_cross;
26+
27+
flex_line(bool _reverse_main, bool _reverse_cross) :
28+
cross_size(0),
29+
cross_start(0),
30+
total_grow(0),
31+
base_size(0),
32+
total_shrink(0),
33+
main_size(0),
34+
num_auto_margin_main_start(0),
35+
num_auto_margin_main_end(0),
36+
first_baseline(),
37+
last_baseline(),
38+
reverse_main(_reverse_main),
39+
reverse_cross(_reverse_cross)
40+
{}
41+
42+
void init(int container_main_size, bool fit_container, bool is_row_direction,
43+
const litehtml::containing_block_context &self_size,
44+
litehtml::formatting_context *fmt_ctx);
45+
bool distribute_main_auto_margins(int free_main_size);
46+
int calculate_items_position(int container_main_size,
47+
flex_justify_content justify_content,
48+
bool is_row_direction,
49+
const containing_block_context &self_size,
50+
formatting_context *fmt_ctx);
51+
protected:
52+
void distribute_free_space(int container_main_size);
53+
};
54+
}
55+
56+
#endif //LITEHTML_FLEX_LINE_H

‎include/litehtml/render_flex.h

Copy file name to clipboardExpand all lines: include/litehtml/render_flex.h
+3-84Lines changed: 3 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2,102 +2,21 @@
22
#define LITEHTML_RENDER_FLEX_H
33

44
#include "render_block.h"
5+
#include "flex_item.h"
6+
#include "flex_line.h"
57

68
namespace litehtml
79
{
810
class render_item_flex : public render_item_block
911
{
10-
struct flex_item
11-
{
12-
std::shared_ptr<render_item> el;
13-
int base_size;
14-
int min_size;
15-
def_value<int> max_size;
16-
int main_size;
17-
int grow;
18-
int shrink;
19-
int scaled_flex_shrink_factor;
20-
bool frozen;
21-
int order;
22-
int src_order;
23-
def_value<int> auto_margin_main_start;
24-
def_value<int> auto_margin_main_end;
25-
bool auto_margin_cross_start;
26-
bool auto_margin_cross_end;
27-
flex_align_items align;
28-
29-
explicit flex_item(std::shared_ptr<render_item> &_el) :
30-
el(_el),
31-
align(flex_align_items_auto),
32-
grow(0),
33-
base_size(0),
34-
shrink(0),
35-
min_size(0),
36-
frozen(false),
37-
main_size(0),
38-
max_size(0),
39-
order(0),
40-
src_order(0),
41-
scaled_flex_shrink_factor(0),
42-
auto_margin_main_start(0),
43-
auto_margin_main_end(0),
44-
auto_margin_cross_start(false),
45-
auto_margin_cross_end(false)
46-
{}
47-
48-
bool operator<(const flex_item& b) const
49-
{
50-
if(order < b.order) return true;
51-
if(order == b.order) return src_order < b.src_order;
52-
return false;
53-
}
54-
};
55-
56-
struct flex_line
57-
{
58-
std::list<flex_item> items;
59-
int top;
60-
int main_size; // sum of all items main size
61-
int cross_size; // sum of all items cross size
62-
int base_size;
63-
int total_grow;
64-
int total_shrink;
65-
int num_auto_margin_main_start; // number of items with auto margin left/top
66-
int num_auto_margin_main_end; // number of items with auto margin right/bottom
67-
int num_auto_margin_cross_start; // number of items with auto margin left/top
68-
int num_auto_margin_cross_end; // number of items with auto margin right/bottom
69-
int first_baseline;
70-
int last_baseline;
71-
72-
flex_line() :
73-
cross_size(0),
74-
top(0),
75-
total_grow(0),
76-
base_size(0),
77-
total_shrink(0),
78-
main_size(0),
79-
num_auto_margin_main_start(0),
80-
num_auto_margin_main_end(0),
81-
num_auto_margin_cross_start(0),
82-
num_auto_margin_cross_end(0),
83-
first_baseline(0),
84-
last_baseline(0)
85-
{}
86-
87-
void distribute_free_space(int container_main_size);
88-
};
89-
9012
std::list<flex_line> m_lines;
91-
def_value<int> m_first_baseline;
92-
def_value<int> m_last_baseline;
9313

9414
std::list<flex_line> get_lines(const containing_block_context &self_size, formatting_context *fmt_ctx, bool is_row_direction,
9515
int container_main_size, bool single_line);
9616
int _render_content(int x, int y, bool second_pass, const containing_block_context &self_size, formatting_context* fmt_ctx) override;
9717

9818
public:
99-
explicit render_item_flex(std::shared_ptr<element> src_el) : render_item_block(std::move(src_el)),
100-
m_first_baseline(0), m_last_baseline(0)
19+
explicit render_item_flex(std::shared_ptr<element> src_el) : render_item_block(std::move(src_el))
10120
{}
10221

10322
std::shared_ptr<render_item> clone() override

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.