11namespace flexbox_helper {
58void SymmetryXY(
Global& g) {
62 std::swap(b.min_size_x, b.min_size_y);
63 std::swap(b.flex_grow_x, b.flex_grow_y);
64 std::swap(b.flex_shrink_x, b.flex_shrink_y);
66 std::swap(b.dim_x, b.dim_y);
73 b.x = g.
size_x - b.x - b.dim_x;
80 b.y = g.
size_y - b.y - b.dim_y;
85 std::vector<Block*> blocks;
88void SetX(
Global& global, std::vector<Line> lines) {
89 for (
auto& line : lines) {
90 std::vector<box_helper::Element> elements;
91 for (
auto* block : line.blocks) {
93 element.
min_size = block->min_size_x;
98 elements.push_back(element);
106 for (
size_t i = 0; i < line.blocks.size(); ++i) {
107 line.blocks[i]->dim_x = elements[i].size;
108 line.blocks[i]->x = x;
109 x += elements[i].size;
115void SetY(
Global& g, std::vector<Line> lines) {
116 std::vector<box_helper::Element> elements;
117 for (
auto& line : lines) {
119 element.
flex_shrink = line.blocks.front()->flex_shrink_y;
120 element.
flex_grow = line.blocks.front()->flex_grow_y;
121 for (
auto* block : line.blocks) {
126 elements.push_back(element);
133 std::vector<int> ys(elements.size());
135 for (
size_t i = 0; i < elements.size(); ++i) {
137 y += elements[i].size;
140 int remaining_space = std::max(0, g.
size_y - y);
146 for (
size_t i = 0; i < ys.size(); ++i)
147 ys[i] += remaining_space;
151 for (
size_t i = 0; i < ys.size(); ++i)
152 ys[i] += remaining_space / 2;
156 for (
int i = ys.size() - 1; i >= 0; --i) {
157 int shifted = remaining_space * (i + 0) / (i + 1);
159 int consumed = remaining_space - shifted;
160 elements[i].size += consumed;
161 remaining_space -= consumed;
166 for (
int i = ys.size() - 1; i >= 1; --i) {
167 ys[i] += remaining_space;
168 remaining_space = remaining_space * (i - 1) / i;
173 for (
int i = ys.size() - 1; i >= 0; --i) {
174 ys[i] += remaining_space * (2 * i + 1) / (2 * i + 2);
175 remaining_space = remaining_space * (2 * i) / (2 * i + 2);
180 for (
int i = ys.size() - 1; i >= 0; --i) {
181 ys[i] += remaining_space * (i + 1) / (i + 2);
182 remaining_space = remaining_space * (i + 1) / (i + 2);
188 for (
size_t i = 0; i < lines.size(); ++i) {
189 auto& element = elements[i];
190 for (
auto* block : lines[i].blocks) {
192 block->flex_grow_y ||
195 stretch ? element.size : std::min(element.size, block->min_size_y);
203 block->y = ys[i] + (element.size -
size) / 2;
208 block->y = ys[i] + element.size -
size;
214 block->dim_y = element.size;
221void JustifyContent(
Global& g, std::vector<Line> lines) {
222 for (
auto& line : lines) {
223 Block* last = line.blocks.back();
231 for (
auto* block : line.blocks)
232 block->x += remaining_space;
236 for (
auto* block : line.blocks)
237 block->x += remaining_space / 2;
241 for (
int i = line.blocks.size() - 1; i >= 1; --i) {
242 line.blocks[i]->x += remaining_space;
243 remaining_space = remaining_space * (i - 1) / i;
248 for (
int i = line.blocks.size() - 1; i >= 0; --i) {
249 line.blocks[i]->x += remaining_space * (2 * i + 1) / (2 * i + 2);
250 remaining_space = remaining_space * (2 * i) / (2 * i + 2);
255 for (
int i = line.blocks.size() - 1; i >= 0; --i) {
256 line.blocks[i]->x += remaining_space * (i + 1) / (i + 2);
257 remaining_space = remaining_space * (i + 1) / (i + 2);
289 std::vector<Line> lines;
293 for (
auto& block : global.
blocks) {
296 if (x + block.min_size_x > global.
size_x) {
298 if (!line.blocks.empty())
299 lines.push_back(std::move(line));
303 block.line = lines.size();
304 block.line_position = line.blocks.size();
305 line.blocks.push_back(&block);
308 if (!line.blocks.empty())
309 lines.push_back(std::move(line));
314 JustifyContent(global, lines);