don't separately malloc each child, since the list of children never grows #2
38
src/Layout.c
38
src/Layout.c
@@ -70,14 +70,12 @@ typedef struct {
|
|||||||
typedef struct css_node {
|
typedef struct css_node {
|
||||||
css_style_t style;
|
css_style_t style;
|
||||||
css_layout_t layout;
|
css_layout_t layout;
|
||||||
struct css_node **children;
|
struct css_node *children;
|
||||||
int children_count;
|
int children_count;
|
||||||
} css_node_t;
|
} css_node_t;
|
||||||
|
|
||||||
css_node_t *new_css_node() {
|
void init_css_node(css_node_t *node) {
|
||||||
css_node_t *node = malloc(sizeof(css_node_t));
|
memset(node, 0, sizeof(*node));
|
||||||
memset(node, 0, sizeof(css_node_t));
|
|
||||||
|
|
||||||
node->style.align_items = CSS_ALIGN_FLEX_START;
|
node->style.align_items = CSS_ALIGN_FLEX_START;
|
||||||
|
|
||||||
// Some of the fields default to undefined and not 0
|
// Some of the fields default to undefined and not 0
|
||||||
@@ -91,23 +89,31 @@ css_node_t *new_css_node() {
|
|||||||
|
|
||||||
node->layout.dimensions[CSS_WIDTH] = CSS_UNDEFINED;
|
node->layout.dimensions[CSS_WIDTH] = CSS_UNDEFINED;
|
||||||
node->layout.dimensions[CSS_HEIGHT] = CSS_UNDEFINED;
|
node->layout.dimensions[CSS_HEIGHT] = CSS_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
css_node_t *new_css_node() {
|
||||||
|
css_node_t *node = malloc(sizeof(*node));
|
||||||
|
init_css_node(node);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_css_node_children(css_node_t *node, int children_count) {
|
void new_css_node_children(css_node_t *node, int children_count) {
|
||||||
node->children = malloc(children_count * sizeof(css_node_t *));
|
node->children = malloc(children_count * sizeof(css_node_t));
|
||||||
for (int i = 0; i < children_count; ++i) {
|
for (int i = 0; i < children_count; ++i) {
|
||||||
node->children[i] = new_css_node();
|
init_css_node(&node->children[i]);
|
||||||
}
|
}
|
||||||
node->children_count = children_count;
|
node->children_count = children_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_css_node(css_node_t *node) {
|
void cleanup_css_node(css_node_t *node) {
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
free_css_node(node->children[i]);
|
cleanup_css_node(&node->children[i]);
|
||||||
}
|
}
|
||||||
free(node->children);
|
free(node->children);
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_css_node(css_node_t *node) {
|
||||||
|
cleanup_css_node(node);
|
||||||
free(node);
|
free(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +196,7 @@ void print_style(css_node_t *node, int level) {
|
|||||||
if (node->children_count > 0) {
|
if (node->children_count > 0) {
|
||||||
printf("children: [\n");
|
printf("children: [\n");
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
print_style(node->children[i], level + 1);
|
print_style(&node->children[i], level + 1);
|
||||||
}
|
}
|
||||||
indent(level);
|
indent(level);
|
||||||
printf("]},\n");
|
printf("]},\n");
|
||||||
@@ -210,7 +216,7 @@ void print_layout(css_node_t *node, int level) {
|
|||||||
if (node->children_count > 0) {
|
if (node->children_count > 0) {
|
||||||
printf("children: [\n");
|
printf("children: [\n");
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
print_layout(node->children[i], level + 1);
|
print_layout(&node->children[i], level + 1);
|
||||||
}
|
}
|
||||||
indent(level);
|
indent(level);
|
||||||
printf("]},\n");
|
printf("]},\n");
|
||||||
@@ -318,7 +324,7 @@ void layoutNode(css_node_t *node) {
|
|||||||
float mainContentDim = 0;
|
float mainContentDim = 0;
|
||||||
int flexibleChildrenCount = 0;
|
int flexibleChildrenCount = 0;
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
css_node_t* child = node->children[i];
|
css_node_t* child = &node->children[i];
|
||||||
if (isUndefined(node->layout.dimensions[dim[mainAxis]]) || !getFlex(child)) {
|
if (isUndefined(node->layout.dimensions[dim[mainAxis]]) || !getFlex(child)) {
|
||||||
layoutNode(child);
|
layoutNode(child);
|
||||||
mainContentDim += getDimWithMargin(child, mainAxis);
|
mainContentDim += getDimWithMargin(child, mainAxis);
|
||||||
@@ -338,7 +344,7 @@ void layoutNode(css_node_t *node) {
|
|||||||
if (flexibleChildrenCount) {
|
if (flexibleChildrenCount) {
|
||||||
float flexibleMainDim = remainingMainDim / flexibleChildrenCount;
|
float flexibleMainDim = remainingMainDim / flexibleChildrenCount;
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
css_node_t* child = node->children[i];
|
css_node_t* child = &node->children[i];
|
||||||
if (getFlex(child)) {
|
if (getFlex(child)) {
|
||||||
child->layout.dimensions[dim[mainAxis]] = flexibleMainDim;
|
child->layout.dimensions[dim[mainAxis]] = flexibleMainDim;
|
||||||
layoutNode(child);
|
layoutNode(child);
|
||||||
@@ -364,7 +370,7 @@ void layoutNode(css_node_t *node) {
|
|||||||
float crossDim = 0;
|
float crossDim = 0;
|
||||||
float mainPos = getPadding(node, leading[mainAxis]) + leadingMainDim;
|
float mainPos = getPadding(node, leading[mainAxis]) + leadingMainDim;
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
css_node_t* child = node->children[i];
|
css_node_t* child = &node->children[i];
|
||||||
child->layout.position[pos[mainAxis]] += mainPos;
|
child->layout.position[pos[mainAxis]] += mainPos;
|
||||||
mainPos += getDimWithMargin(child, mainAxis) + betweenMainDim;
|
mainPos += getDimWithMargin(child, mainAxis) + betweenMainDim;
|
||||||
|
|
||||||
@@ -387,7 +393,7 @@ void layoutNode(css_node_t *node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < node->children_count; ++i) {
|
for (int i = 0; i < node->children_count; ++i) {
|
||||||
css_node_t* child = node->children[i];
|
css_node_t* child = &node->children[i];
|
||||||
css_align_t alignItem = getAlignItem(node, child);
|
css_align_t alignItem = getAlignItem(node, child);
|
||||||
float remainingCrossDim = node->layout.dimensions[dim[crossAxis]] -
|
float remainingCrossDim = node->layout.dimensions[dim[crossAxis]] -
|
||||||
getDimWithMargin(child, crossAxis) -
|
getDimWithMargin(child, crossAxis) -
|
||||||
@@ -426,7 +432,7 @@ int main()
|
|||||||
node->style.align_items = CSS_ALIGN_STRETCH;
|
node->style.align_items = CSS_ALIGN_STRETCH;
|
||||||
|
|
||||||
new_css_node_children(node, 3);
|
new_css_node_children(node, 3);
|
||||||
node->children[0]->style.dimensions[CSS_HEIGHT] = 50;
|
node->children[0].style.dimensions[CSS_HEIGHT] = 50;
|
||||||
layoutNode(node);
|
layoutNode(node);
|
||||||
|
|
||||||
print_style(node, 0);
|
print_style(node, 0);
|
||||||
|
Reference in New Issue
Block a user