#include #include "clay.h" #include "layout.h" static size_t stringify_prop_value(struct clay_prop_val_s val, clay_prop_definition propdef, char *out, size_t max_len); static void stringify_prop_values(clay_prop_vals_const vals, clay_prop_definition propdef, char *out, size_t max_len); #define DEBUG_MAX_PROP_STR_LEN 2047 void clay_print_layout_tree(clay doc) { clay_prop_map props = clay_layout_get_properties(doc); int depth = 0; for (clay cur = doc->parent; cur != NULL; cur = cur->parent, depth++); int indent = depth * 4; printf("%*s<%s>:\n", indent, "", clay_ctx_get_layout_class_name(doc->ctx, doc->class)); char *prop_string = malloc(DEBUG_MAX_PROP_STR_LEN + 1); CLAY_MAP_FOREACH(props, prop_name, prop_val_ptr) { const clay_prop_definition *propdef = clay_ctx_get_property_definition(doc->ctx, doc->class, prop_name); stringify_prop_values(prop_val_ptr->values, *propdef, prop_string, DEBUG_MAX_PROP_STR_LEN); if (prop_val_ptr->inheritance_level == 0) { printf("%*s %s: %s\n", indent, "", prop_name, prop_string); } else { printf("%*s [%s]: %s\n", indent, "", prop_name, prop_string); } } free(prop_string); clay_layout_list_const children = clay_layout_get_children(doc); if (children->length > 0) { printf("%*s children:\n", indent, ""); CLAY_LIST_FOREACH(children, childptr, _) { clay_print_layout_tree(*childptr); } } } static void stringify_prop_values(clay_prop_vals_const vals, clay_prop_definition propdef, char *out, size_t max_len) { size_t pos = 0; CLAY_LIST_FOREACH(vals, valptr, _) { pos += stringify_prop_value(*valptr, propdef, out + pos, max_len - pos); pos += snprintf(out + pos, max_len - pos, " "); } } static size_t stringify_prop_value(struct clay_prop_val_s val, clay_prop_definition propdef, char *out, size_t max_len) { size_t len = 0; switch (val.type) { case CLAY_PROP_TYPE_KEYWORD: { bool found = false; CLAY_MAP_FOREACH(propdef.keywords, keyword_string, numptr) { if (*numptr == val.keyword) { len += snprintf(out, max_len - len, "%s", keyword_string); found = true; break; } } if (!found) { len += snprintf(out, max_len - len, ""); } break; } case CLAY_PROP_TYPE_NUMBER: { if (val.number.type == CLAY_PROP_NUMBER_INT) { len += snprintf(out, max_len - len, "%" PRId64, val.number.value_int); } else { len += snprintf(out, max_len - len, "%f", val.number.value_double); } const char *unit_str; switch (val.number.unit) { case CLAY_PROP_UNIT_PX: unit_str = "px"; break; case CLAY_PROP_UNIT_PT: unit_str = "pt"; break; case CLAY_PROP_UNIT_CM: unit_str = "cm"; break; case CLAY_PROP_UNIT_MM: unit_str = "mm"; break; case CLAY_PROP_UNIT_PERCENT: unit_str = "%"; break; default: unit_str = ""; } len += snprintf(out + len, max_len - len, "%s", unit_str); break; } case CLAY_PROP_TYPE_COLOR: { len += snprintf(out, max_len - len, "rgba(%" PRId8 ", %" PRId8 ", %" PRId8 ", %" PRId8 ")", val.color.red, val.color.green, val.color.blue, val.color.alpha); break; } case CLAY_PROP_TYPE_STRING: { len += snprintf(out, max_len - len, "'%s'", val.string); break; } } return len; }