3235 lines · 76.9 KB · C
RawDownload
#include <libcss/computed.h>#include <libcss/properties.h>#include <libcss/types.h> static size_t dump_css_fixed(css_fixed f, char *ptr, size_t len){#define ABS(x) (uint32_t)((x) < 0 ? -(x) : (x))	uint32_t uintpart = FIXTOINT(ABS(f));	/* + 500 to ensure round to nearest (division will truncate) */	uint32_t fracpart = ((ABS(f) & 0x3ff) * 1000 + 500) / (1 << 10);#undef ABS	size_t flen = 0;	char tmp[20];	size_t tlen = 0;	char *buf = ptr; 	if (len == 0)		return 0; 	if (f < 0) {		buf[0] = '-';		buf++;		len--;	} 	do {		tmp[tlen] = "0123456789"[uintpart % 10];		tlen++; 		uintpart /= 10;	} while (tlen < 20 && uintpart != 0); 	while (tlen > 0 && len > 0) {		buf[0] = tmp[--tlen];		buf++;		len--;	} 	if (len > 0) {		buf[0] = '.';		buf++;		len--;	} 	do {		tmp[tlen] = "0123456789"[fracpart % 10];		tlen++; 		fracpart /= 10;	} while (tlen < 20 && fracpart != 0); 	while (tlen > 0 && len > 0) {		buf[0] = tmp[--tlen];		buf++;		flen++;		len--;	} 	while (flen < 3 && len > 0) {		buf[0] = '0';		buf++;		flen++;		len--;	} 	if (len > 0)		buf[0] = '\0'; 	return buf - ptr;}static size_t dump_css_number(css_fixed val, char *ptr, size_t len){	if (INTTOFIX(FIXTOINT(val)) == val)		return snprintf(ptr, len, "%d", FIXTOINT(val));	else		return dump_css_fixed(val, ptr, len);} static size_t dump_css_unit(css_fixed val, css_unit unit, char *ptr, size_t len){	size_t ret = dump_css_number(val, ptr, len); 	switch (unit) {	case CSS_UNIT_PX:		ret += snprintf(ptr + ret, len - ret, "px");		break;	case CSS_UNIT_EX:		ret += snprintf(ptr + ret, len - ret, "ex");		break;	case CSS_UNIT_EM:		ret += snprintf(ptr + ret, len - ret, "em");		break;	case CSS_UNIT_IN:		ret += snprintf(ptr + ret, len - ret, "in");		break;	case CSS_UNIT_CM:		ret += snprintf(ptr + ret, len - ret, "cm");		break;	case CSS_UNIT_MM:		ret += snprintf(ptr + ret, len - ret, "mm");		break;	case CSS_UNIT_PT:		ret += snprintf(ptr + ret, len - ret, "pt");		break;	case CSS_UNIT_PC:		ret += snprintf(ptr + ret, len - ret, "pc");		break;	case CSS_UNIT_CH:		ret += snprintf(ptr + ret, len - ret, "ch");		break;	case CSS_UNIT_REM:		ret += snprintf(ptr + ret, len - ret, "rem");		break;	case CSS_UNIT_LH:		ret += snprintf(ptr + ret, len - ret, "lh");		break;	case CSS_UNIT_VH:		ret += snprintf(ptr + ret, len - ret, "vh");		break;	case CSS_UNIT_VW:		ret += snprintf(ptr + ret, len - ret, "vw");		break;	case CSS_UNIT_VI:		ret += snprintf(ptr + ret, len - ret, "vi");		break;	case CSS_UNIT_VB:		ret += snprintf(ptr + ret, len - ret, "vb");		break;	case CSS_UNIT_VMIN:		ret += snprintf(ptr + ret, len - ret, "vmin");		break;	case CSS_UNIT_VMAX:		ret += snprintf(ptr + ret, len - ret, "vmax");		break;	case CSS_UNIT_Q:		ret += snprintf(ptr + ret, len - ret, "q");		break;	case CSS_UNIT_PCT:		ret += snprintf(ptr + ret, len - ret, "%%");		break;	case CSS_UNIT_DEG:		ret += snprintf(ptr + ret, len - ret, "deg");		break;	case CSS_UNIT_GRAD:		ret += snprintf(ptr + ret, len - ret, "grad");		break;	case CSS_UNIT_RAD:		ret += snprintf(ptr + ret, len - ret, "rad");		break;	case CSS_UNIT_MS:		ret += snprintf(ptr + ret, len - ret, "ms");		break;	case CSS_UNIT_S:		ret += snprintf(ptr + ret, len - ret, "s");		break;	case CSS_UNIT_HZ:		ret += snprintf(ptr + ret, len - ret, "Hz");		break;	case CSS_UNIT_KHZ:		ret += snprintf(ptr + ret, len - ret, "kHz");		break;	} 	return ret;}  static void dump_computed_style(const css_computed_style *style, char *buf,		size_t *len){	char *ptr = buf;	size_t wrote = 0;	uint8_t val;	css_color color = 0;	lwc_string *url = NULL;	css_fixed len1 = 0, len2 = 0;	css_unit unit1 = CSS_UNIT_PX, unit2 = CSS_UNIT_PX;	css_computed_clip_rect rect = { 0, 0, 0, 0, CSS_UNIT_PX, CSS_UNIT_PX,					CSS_UNIT_PX, CSS_UNIT_PX, true, true,					true, true };	const css_computed_content_item *content = NULL;	const css_computed_counter *counter = NULL;	lwc_string **string_list = NULL;	int32_t integer = 0; 	/* align-content */	val = css_computed_align_content(style);	switch (val) {	case CSS_ALIGN_CONTENT_INHERIT:		wrote = snprintf(ptr, *len, "align-content: inherit\n");		break;	case CSS_ALIGN_CONTENT_STRETCH:		wrote = snprintf(ptr, *len, "align-content: stretch\n");		break;	case CSS_ALIGN_CONTENT_FLEX_START:		wrote = snprintf(ptr, *len, "align-content: flex-start\n");		break;	case CSS_ALIGN_CONTENT_FLEX_END:		wrote = snprintf(ptr, *len, "align-content: flex-end\n");		break;	case CSS_ALIGN_CONTENT_CENTER:		wrote = snprintf(ptr, *len, "align-content: center\n");		break;	case CSS_ALIGN_CONTENT_SPACE_BETWEEN:		wrote = snprintf(ptr, *len, "align-content: space-between\n");		break;	case CSS_ALIGN_CONTENT_SPACE_AROUND:		wrote = snprintf(ptr, *len, "align-content: space-around\n");		break;	case CSS_ALIGN_CONTENT_SPACE_EVENLY:		wrote = snprintf(ptr, *len, "align-content: space-evenly\n");		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* align-items */	val = css_computed_align_items(style);	switch (val) {	case CSS_ALIGN_ITEMS_INHERIT:		wrote = snprintf(ptr, *len, "align-items: inherit\n");		break;	case CSS_ALIGN_ITEMS_STRETCH:		wrote = snprintf(ptr, *len, "align-items: stretch\n");		break;	case CSS_ALIGN_ITEMS_FLEX_START:		wrote = snprintf(ptr, *len, "align-items: flex-start\n");		break;	case CSS_ALIGN_ITEMS_FLEX_END:		wrote = snprintf(ptr, *len, "align-items: flex-end\n");		break;	case CSS_ALIGN_ITEMS_CENTER:		wrote = snprintf(ptr, *len, "align-items: center\n");		break;	case CSS_ALIGN_ITEMS_BASELINE:		wrote = snprintf(ptr, *len, "align-items: baseline\n");		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* align-self */	val = css_computed_align_self(style);	switch (val) {	case CSS_ALIGN_SELF_INHERIT:		wrote = snprintf(ptr, *len, "align-self: inherit\n");		break;	case CSS_ALIGN_SELF_STRETCH:		wrote = snprintf(ptr, *len, "align-self: stretch\n");		break;	case CSS_ALIGN_SELF_FLEX_START:		wrote = snprintf(ptr, *len, "align-self: flex-start\n");		break;	case CSS_ALIGN_SELF_FLEX_END:		wrote = snprintf(ptr, *len, "align-self: flex-end\n");		break;	case CSS_ALIGN_SELF_CENTER:		wrote = snprintf(ptr, *len, "align-self: center\n");		break;	case CSS_ALIGN_SELF_BASELINE:		wrote = snprintf(ptr, *len, "align-self: baseline\n");		break;	case CSS_ALIGN_SELF_AUTO:		wrote = snprintf(ptr, *len, "align-self: auto\n");		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* background-attachment */	val = css_computed_background_attachment(style);	switch (val) {	case CSS_BACKGROUND_ATTACHMENT_INHERIT:		wrote = snprintf(ptr, *len, "background-attachment: inherit\n");		break;	case CSS_BACKGROUND_ATTACHMENT_FIXED:		wrote = snprintf(ptr, *len, "background-attachment: fixed\n");		break;	case CSS_BACKGROUND_ATTACHMENT_SCROLL:		wrote = snprintf(ptr, *len, "background-attachment: scroll\n");		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* background-color */	val = css_computed_background_color(style, &color);	switch (val) {	case CSS_BACKGROUND_COLOR_INHERIT:		wrote = snprintf(ptr, *len, "background-color: inherit\n");		break;	case CSS_BACKGROUND_COLOR_COLOR:		wrote = snprintf(ptr, *len, "background-color: #%08x\n", color);		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* background-image */	val = css_computed_background_image(style, &url);	if (val == CSS_BACKGROUND_IMAGE_INHERIT) {		wrote = snprintf(ptr, *len, "background-image: inherit\n");	} else if (val == CSS_BACKGROUND_IMAGE_IMAGE && url != NULL) {		wrote = snprintf(ptr, *len, "background-image: url('%.*s')\n",				(int) lwc_string_length(url),				lwc_string_data(url));	} else if (val == CSS_BACKGROUND_IMAGE_NONE) {		wrote = snprintf(ptr, *len, "background-image: none\n");	} else {		wrote = 0;	}	ptr += wrote;	*len -= wrote; 	/* background-position */	val = css_computed_background_position(style, &len1, &unit1,			&len2, &unit2);	if (val == CSS_BACKGROUND_POSITION_INHERIT) {		wrote = snprintf(ptr, *len, "background-position: inherit\n");		ptr += wrote;		*len -= wrote;	} else if (val == CSS_BACKGROUND_POSITION_SET) {		wrote = snprintf(ptr, *len, "background-position: ");		ptr += wrote;		*len -= wrote; 		wrote = dump_css_unit(len1, unit1, ptr, *len);		ptr += wrote;		*len -= wrote; 		wrote = snprintf(ptr, *len, " ");		ptr += wrote;		*len -= wrote; 		wrote = dump_css_unit(len2, unit2, ptr, *len);		ptr += wrote;		*len -= wrote; 		wrote = snprintf(ptr, *len, "\n");		ptr += wrote;		*len -= wrote;	} 	/* background-repeat */	val = css_computed_background_repeat(style);	switch (val) {	case CSS_BACKGROUND_REPEAT_INHERIT:		wrote = snprintf(ptr, *len, "background-repeat: inherit\n");		break;	case CSS_BACKGROUND_REPEAT_REPEAT_X:		wrote = snprintf(ptr, *len, "background-repeat: repeat-x\n");		break;	case CSS_BACKGROUND_REPEAT_REPEAT_Y:		wrote = snprintf(ptr, *len, "background-repeat: repeat-y\n");		break;	case CSS_BACKGROUND_REPEAT_REPEAT:		wrote = snprintf(ptr, *len, "background-repeat: repeat\n");		break;	case CSS_BACKGROUND_REPEAT_NO_REPEAT:		wrote = snprintf(ptr, *len, "background-repeat: no-repeat\n");		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* border-collapse */	val = css_computed_border_collapse(style);	switch (val) {	case CSS_BORDER_COLLAPSE_INHERIT:		wrote = snprintf(ptr, *len, "border-collapse: inherit\n");		break;	case CSS_BORDER_COLLAPSE_SEPARATE:		wrote = snprintf(ptr, *len, "border-collapse: separate\n");		break;	case CSS_BORDER_COLLAPSE_COLLAPSE:		wrote = snprintf(ptr, *len, "border-collapse: collapse\n");		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* border-spacing */	val = css_computed_border_spacing(style, &len1, &unit1, &len2, &unit2);	if (val == CSS_BORDER_SPACING_INHERIT) {		wrote = snprintf(ptr, *len, "border-spacing: inherit\n");		ptr += wrote;		*len -= wrote;	} else if (val == CSS_BORDER_SPACING_SET) {		wrote = snprintf(ptr, *len, "border-spacing: ");		ptr += wrote;		*len -= wrote; 		wrote = dump_css_unit(len1, unit1, ptr, *len);		ptr += wrote;		*len -= wrote; 		wrote = snprintf(ptr, *len, " ");		ptr += wrote;		*len -= wrote; 		wrote = dump_css_unit(len2, unit2, ptr, *len);		ptr += wrote;		*len -= wrote; 		wrote = snprintf(ptr, *len, "\n");		ptr += wrote;		*len -= wrote;	} 	/* border-top-color */	val = css_computed_border_top_color(style, &color);	switch (val) {	case CSS_BORDER_COLOR_INHERIT:		wrote = snprintf(ptr, *len, "border-top-color: inherit\n");		break;	case CSS_BORDER_COLOR_CURRENT_COLOR:		wrote = snprintf(ptr, *len, "border-top-color: currentColor\n");		break;	case CSS_BORDER_COLOR_COLOR:		wrote = snprintf(ptr, *len, "border-top-color: #%08x\n", color);		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* border-right-color */	val = css_computed_border_right_color(style, &color);	switch (val) {	case CSS_BORDER_COLOR_INHERIT:		wrote = snprintf(ptr, *len, "border-right-color: inherit\n");		break;	case CSS_BORDER_COLOR_CURRENT_COLOR:		wrote = snprintf(ptr, *len, "border-right-color: currentColor\n");		break;	case CSS_BORDER_COLOR_COLOR:		wrote = snprintf(ptr, *len,				"border-right-color: #%08x\n", color);		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* border-bottom-color */	val = css_computed_border_bottom_color(style, &color);	switch (val) {	case CSS_BORDER_COLOR_INHERIT:		wrote = snprintf(ptr, *len, "border-bottom-color: inherit\n");		break;	case CSS_BORDER_COLOR_CURRENT_COLOR:		wrote = snprintf(ptr, *len, "border-bottom-color: currentColor\n");		break;	case CSS_BORDER_COLOR_COLOR:		wrote = snprintf(ptr, *len,				"border-bottom-color: #%08x\n", color);		break;	default:		wrote = 0;		break;	}	ptr += wrote;	*len -= wrote; 	/* border-left-color */	val = css_computed_border_left_color(style, &color);	switch (val) {	case CSS_BORDER_COLOR_INHERIT:		wrote = snprintf(ptr, *len, "border-left-color: inherit\n");		break;	case CSS_BORDER_COLOR_CURRENT_COLOR:		wrote = snprintf(ptr, *len, "border-left-color: currentColor\n");		break;	case CSS_BORDER_COLOR_COLOR:		wrote = snprintf(ptr, *len,

Lines 1–500 of 3235.