57void SymmetryXY(
Global& g) {
61 std::swap(b.min_size_x, b.min_size_y);
62 std::swap(b.flex_grow_x, b.flex_grow_y);
63 std::swap(b.flex_shrink_x, b.flex_shrink_y);
65 std::swap(b.dim_x, b.dim_y);
72 b.x = g.
size_x - b.x - b.dim_x;
79 b.y = g.
size_y - b.y - b.dim_y;
84 std::vector<Block*> blocks;
87void SetX(
Global& global, std::vector<Line> lines) {
88 for (
auto& line : lines) {
89 std::vector<box_helper::Element> elements;
90 for (
auto* block : line.blocks) {
92 element.
min_size = block->min_size_x;
99 elements.push_back(element);
107 for (
size_t i = 0; i < line.blocks.size(); ++i) {
108 line.blocks[i]->dim_x = elements[i].size;
109 line.blocks[i]->x = x;
110 x += elements[i].size;
117void SetY(
Global& g, std::vector<Line> lines) {
118 std::vector<box_helper::Element> elements;
119 for (
auto& line : lines) {
121 element.
flex_shrink = line.blocks.front()->flex_shrink_y;
122 element.
flex_grow = line.blocks.front()->flex_grow_y;
123 for (
auto* block : line.blocks) {
128 elements.push_back(element);
135 std::vector<int> ys(elements.size());
137 for (
size_t i = 0; i < elements.size(); ++i) {
139 y += elements[i].size;
142 int remaining_space = std::max(0, g.
size_y - y);
149 for (
size_t i = 0; i < ys.size(); ++i) {
150 ys[i] += remaining_space;
156 for (
size_t i = 0; i < ys.size(); ++i) {
157 ys[i] += remaining_space / 2;
163 for (
int i = ys.size() - 1; i >= 0; --i) {
164 int shifted = remaining_space * (i + 0) / (i + 1);
166 int consumed = remaining_space - shifted;
167 elements[i].size += consumed;
168 remaining_space -= consumed;
174 for (
int i = ys.size() - 1; i >= 1; --i) {
175 ys[i] += remaining_space;
176 remaining_space = remaining_space * (i - 1) / i;
182 for (
int i = ys.size() - 1; i >= 0; --i) {
183 ys[i] += remaining_space * (2 * i + 1) / (2 * i + 2);
184 remaining_space = remaining_space * (2 * i) / (2 * i + 2);
190 for (
int i = ys.size() - 1; i >= 0; --i) {
191 ys[i] += remaining_space * (i + 1) / (i + 2);
192 remaining_space = remaining_space * (i + 1) / (i + 2);
199 for (
size_t i = 0; i < lines.size(); ++i) {
200 auto& element = elements[i];
201 for (
auto* block : lines[i].blocks) {
203 block->flex_grow_y != 0 ||
206 stretch ? element.size : std::min(element.size, block->min_size_y);
215 block->y = ys[i] + (element.size -
size) / 2;
221 block->y = ys[i] + element.size -
size;
228 block->dim_y = element.size;
236void JustifyContent(
Global& g, std::vector<Line> lines) {
237 for (
auto& line : lines) {
238 Block* last = line.blocks.back();
246 for (
auto* block : line.blocks) {
247 block->x += remaining_space;
253 for (
auto* block : line.blocks) {
254 block->x += remaining_space / 2;
260 for (
int i = (
int)line.blocks.size() - 1; i >= 1; --i) {
261 line.blocks[i]->x += remaining_space;
262 remaining_space = remaining_space * (i - 1) / i;
268 for (
int i = (
int)line.blocks.size() - 1; i >= 0; --i) {
269 line.blocks[i]->x += remaining_space * (2 * i + 1) / (2 * i + 2);
270 remaining_space = remaining_space * (2 * i) / (2 * i + 2);
276 for (
int i = (
int)line.blocks.size() - 1; i >= 0; --i) {
277 line.blocks[i]->x += remaining_space * (i + 1) / (i + 2);
278 remaining_space = remaining_space * (i + 1) / (i + 2);
289void Compute1(
Global& global);
290void Compute2(
Global& global);
291void Compute3(
Global& global);
293void Compute1(
Global& global) {
303void Compute2(
Global& global) {
313void Compute3(
Global& global) {
315 std::vector<Line> lines;
319 for (
auto& block : global.
blocks) {
322 if (x + block.min_size_x > global.
size_x) {
324 if (!line.blocks.empty()) {
325 lines.push_back(std::move(line));
330 block.line = (int)lines.size();
331 block.line_position = (int)line.blocks.size();
332 line.blocks.push_back(&block);
335 if (!line.blocks.empty()) {
336 lines.push_back(std::move(line));
342 JustifyContent(global, lines);