forked from KolibriOS/kolibrios
2703 lines
64 KiB
C
2703 lines
64 KiB
C
|
#ifndef test_dump_h_
|
||
|
#define test_dump_h_
|
||
|
|
||
|
#include <string.h>
|
||
|
|
||
|
#include <libcss/types.h>
|
||
|
|
||
|
#include "stylesheet.h"
|
||
|
#include "bytecode/bytecode.h"
|
||
|
#include "bytecode/opcodes.h"
|
||
|
#include "select/font_face.h"
|
||
|
|
||
|
#include "testutils.h"
|
||
|
|
||
|
static void dump_sheet(css_stylesheet *sheet, char *buf, size_t *len);
|
||
|
static void dump_rule_selector(css_rule_selector *s, char **buf,
|
||
|
size_t *buflen, uint32_t depth);
|
||
|
static void dump_rule_charset(css_rule_charset *s, char **buf, size_t *buflen);
|
||
|
static void dump_rule_import(css_rule_import *s, char **buf, size_t *buflen);
|
||
|
static void dump_rule_media(css_rule_media *s, char **buf, size_t *buflen);
|
||
|
static void dump_rule_page(css_rule_page *s, char **buf, size_t *buflen);
|
||
|
static void dump_rule_font_face(css_rule_font_face *s,
|
||
|
char **buf, size_t *buflen);
|
||
|
static void dump_selector_list(css_selector *list, char **ptr);
|
||
|
static void dump_selector(css_selector *selector, char **ptr);
|
||
|
static void dump_selector_detail(css_selector_detail *detail, char **ptr);
|
||
|
static void dump_bytecode(css_style *style, char **ptr, uint32_t depth);
|
||
|
static void dump_string(lwc_string *string, char **ptr);
|
||
|
static void dump_font_face(css_font_face *font_face, char**ptr);
|
||
|
|
||
|
void dump_sheet(css_stylesheet *sheet, char *buf, size_t *buflen)
|
||
|
{
|
||
|
css_rule *rule;
|
||
|
|
||
|
for (rule = sheet->rule_list; rule != NULL; rule = rule->next) {
|
||
|
switch (rule->type) {
|
||
|
case CSS_RULE_SELECTOR:
|
||
|
dump_rule_selector((css_rule_selector *) rule,
|
||
|
&buf, buflen, 1);
|
||
|
break;
|
||
|
case CSS_RULE_CHARSET:
|
||
|
dump_rule_charset((css_rule_charset *) rule,
|
||
|
&buf, buflen);
|
||
|
break;
|
||
|
case CSS_RULE_IMPORT:
|
||
|
dump_rule_import((css_rule_import *) rule,
|
||
|
&buf, buflen);
|
||
|
break;
|
||
|
case CSS_RULE_MEDIA:
|
||
|
dump_rule_media((css_rule_media *) rule,
|
||
|
&buf, buflen);
|
||
|
break;
|
||
|
case CSS_RULE_PAGE:
|
||
|
dump_rule_page((css_rule_page *) rule,
|
||
|
&buf, buflen);
|
||
|
break;
|
||
|
case CSS_RULE_FONT_FACE:
|
||
|
dump_rule_font_face((css_rule_font_face *) rule,
|
||
|
&buf, buflen);
|
||
|
break;
|
||
|
default:
|
||
|
{
|
||
|
int written = sprintf(buf, "Unhandled rule type %d\n",
|
||
|
rule->type);
|
||
|
|
||
|
*buflen -= written;
|
||
|
buf += written;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void dump_rule_selector(css_rule_selector *s, char **buf, size_t *buflen,
|
||
|
uint32_t depth)
|
||
|
{
|
||
|
uint32_t i;
|
||
|
char *ptr = *buf;
|
||
|
|
||
|
*ptr++ = '|';
|
||
|
for (i = 0; i < depth; i++)
|
||
|
*ptr++ = ' ';
|
||
|
|
||
|
/* Build selector string */
|
||
|
for (i = 0; i < s->base.items; i++) {
|
||
|
dump_selector_list(s->selectors[i], &ptr);
|
||
|
if (i != (uint32_t) (s->base.items - 1)) {
|
||
|
memcpy(ptr, ", ", 2);
|
||
|
ptr += 2;
|
||
|
}
|
||
|
}
|
||
|
*ptr++ = '\n';
|
||
|
|
||
|
if (s->style != NULL)
|
||
|
dump_bytecode(s->style, &ptr, depth + 1);
|
||
|
|
||
|
*buflen -= ptr - *buf;
|
||
|
*buf = ptr;
|
||
|
}
|
||
|
|
||
|
void dump_rule_charset(css_rule_charset *s, char **buf, size_t *buflen)
|
||
|
{
|
||
|
char *ptr = *buf;
|
||
|
|
||
|
ptr += sprintf(ptr, "| @charset(");
|
||
|
dump_string(s->encoding, &ptr);
|
||
|
*ptr++ = ')';
|
||
|
*ptr++ = '\n';
|
||
|
|
||
|
*buflen -= ptr - *buf;
|
||
|
*buf = ptr;
|
||
|
}
|
||
|
|
||
|
void dump_rule_import(css_rule_import *s, char **buf, size_t *buflen)
|
||
|
{
|
||
|
char *ptr = *buf;
|
||
|
|
||
|
ptr += sprintf(ptr, "| @import url(\"%.*s\")",
|
||
|
(int) lwc_string_length(s->url), lwc_string_data(s->url));
|
||
|
|
||
|
/** \todo media list */
|
||
|
|
||
|
*ptr++ = '\n';
|
||
|
|
||
|
*buflen -= ptr - *buf;
|
||
|
*buf = ptr;
|
||
|
}
|
||
|
|
||
|
void dump_rule_media(css_rule_media *s, char **buf, size_t *buflen)
|
||
|
{
|
||
|
char *ptr = *buf;
|
||
|
css_rule *rule;
|
||
|
|
||
|
ptr += sprintf(ptr, "| @media ");
|
||
|
|
||
|
/* \todo media list */
|
||
|
|
||
|
*ptr++ = '\n';
|
||
|
|
||
|
for (rule = s->first_child; rule != NULL; rule = rule->next) {
|
||
|
size_t len = *buflen - (ptr - *buf);
|
||
|
|
||
|
dump_rule_selector((css_rule_selector *) rule, &ptr, &len, 2);
|
||
|
}
|
||
|
|
||
|
*buflen -= ptr - *buf;
|
||
|
*buf = ptr;
|
||
|
}
|
||
|
|
||
|
void dump_rule_page(css_rule_page *s, char **buf, size_t *buflen)
|
||
|
{
|
||
|
char *ptr = *buf;
|
||
|
|
||
|
ptr += sprintf(ptr, "| @page ");
|
||
|
|
||
|
if (s->selector != NULL)
|
||
|
dump_selector_list(s->selector, &ptr);
|
||
|
|
||
|
*ptr++ = '\n';
|
||
|
|
||
|
if (s->style != NULL)
|
||
|
dump_bytecode(s->style, &ptr, 2);
|
||
|
|
||
|
*buflen -= ptr - *buf;
|
||
|
*buf = ptr;
|
||
|
}
|
||
|
|
||
|
void dump_rule_font_face(css_rule_font_face *s, char **buf, size_t *buflen)
|
||
|
{
|
||
|
char *ptr = *buf;
|
||
|
|
||
|
ptr += sprintf(ptr, "| @font-face ");
|
||
|
|
||
|
if (s->font_face != NULL) {
|
||
|
dump_font_face(s->font_face, &ptr);
|
||
|
}
|
||
|
|
||
|
*ptr++ = '\n';
|
||
|
|
||
|
*buflen -= ptr - *buf;
|
||
|
*buf = ptr;
|
||
|
}
|
||
|
|
||
|
void dump_selector_list(css_selector *list, char **ptr)
|
||
|
{
|
||
|
if (list->combinator != NULL) {
|
||
|
dump_selector_list(list->combinator, ptr);
|
||
|
}
|
||
|
|
||
|
switch (list->data.comb) {
|
||
|
case CSS_COMBINATOR_NONE:
|
||
|
break;
|
||
|
case CSS_COMBINATOR_ANCESTOR:
|
||
|
(*ptr)[0] = ' ';
|
||
|
*ptr += 1;
|
||
|
break;
|
||
|
case CSS_COMBINATOR_PARENT:
|
||
|
memcpy(*ptr, " > ", 3);
|
||
|
*ptr += 3;
|
||
|
break;
|
||
|
case CSS_COMBINATOR_SIBLING:
|
||
|
memcpy(*ptr, " + ", 3);
|
||
|
*ptr += 3;
|
||
|
break;
|
||
|
case CSS_COMBINATOR_GENERIC_SIBLING:
|
||
|
memcpy(*ptr, " + ", 3);
|
||
|
*ptr += 3;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
dump_selector(list, ptr);
|
||
|
}
|
||
|
|
||
|
|
||
|
void dump_selector(css_selector *selector, char **ptr)
|
||
|
{
|
||
|
css_selector_detail *d = &selector->data;
|
||
|
|
||
|
while (true) {
|
||
|
dump_selector_detail(d, ptr);
|
||
|
|
||
|
if (d->next == 0)
|
||
|
break;
|
||
|
|
||
|
d++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void dump_selector_detail(css_selector_detail *detail, char **ptr)
|
||
|
{
|
||
|
if (detail->negate)
|
||
|
*ptr += sprintf(*ptr, ":not(");
|
||
|
|
||
|
switch (detail->type) {
|
||
|
case CSS_SELECTOR_ELEMENT:
|
||
|
if (lwc_string_length(detail->qname.name) == 1 &&
|
||
|
lwc_string_data(detail->qname.name)[0] == '*' &&
|
||
|
detail->next == 0) {
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
} else if (lwc_string_length(detail->qname.name) != 1 ||
|
||
|
lwc_string_data(detail->qname.name)[0] != '*') {
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case CSS_SELECTOR_CLASS:
|
||
|
**ptr = '.';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
break;
|
||
|
case CSS_SELECTOR_ID:
|
||
|
**ptr = '#';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
break;
|
||
|
case CSS_SELECTOR_PSEUDO_CLASS:
|
||
|
case CSS_SELECTOR_PSEUDO_ELEMENT:
|
||
|
**ptr = ':';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
if (detail->value_type == CSS_SELECTOR_DETAIL_VALUE_STRING) {
|
||
|
if (detail->value.string != NULL) {
|
||
|
**ptr = '(';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
**ptr = ')';
|
||
|
*ptr += 1;
|
||
|
}
|
||
|
} else {
|
||
|
*ptr += sprintf(*ptr, "(%dn+%d)",
|
||
|
detail->value.nth.a,
|
||
|
detail->value.nth.b);
|
||
|
}
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
**ptr = ']';
|
||
|
*ptr += 1;
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE_EQUAL:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
(*ptr)[0] = '=';
|
||
|
(*ptr)[1] = '"';
|
||
|
*ptr += 2;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
(*ptr)[0] = '"';
|
||
|
(*ptr)[1] = ']';
|
||
|
*ptr += 2;
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE_DASHMATCH:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
(*ptr)[0] = '|';
|
||
|
(*ptr)[1] = '=';
|
||
|
(*ptr)[2] = '"';
|
||
|
*ptr += 3;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
(*ptr)[0] = '"';
|
||
|
(*ptr)[1] = ']';
|
||
|
*ptr += 2;
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE_INCLUDES:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
(*ptr)[0] = '~';
|
||
|
(*ptr)[1] = '=';
|
||
|
(*ptr)[2] = '"';
|
||
|
*ptr += 3;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
(*ptr)[0] = '"';
|
||
|
(*ptr)[1] = ']';
|
||
|
*ptr += 2;
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE_PREFIX:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
(*ptr)[0] = '^';
|
||
|
(*ptr)[1] = '=';
|
||
|
(*ptr)[2] = '"';
|
||
|
*ptr += 3;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
(*ptr)[0] = '"';
|
||
|
(*ptr)[1] = ']';
|
||
|
*ptr += 2;
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE_SUFFIX:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
(*ptr)[0] = '$';
|
||
|
(*ptr)[1] = '=';
|
||
|
(*ptr)[2] = '"';
|
||
|
*ptr += 3;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
(*ptr)[0] = '"';
|
||
|
(*ptr)[1] = ']';
|
||
|
*ptr += 2;
|
||
|
break;
|
||
|
case CSS_SELECTOR_ATTRIBUTE_SUBSTRING:
|
||
|
**ptr = '[';
|
||
|
*ptr += 1;
|
||
|
dump_string(detail->qname.name, ptr);
|
||
|
(*ptr)[0] = '*';
|
||
|
(*ptr)[1] = '=';
|
||
|
(*ptr)[2] = '"';
|
||
|
*ptr += 3;
|
||
|
dump_string(detail->value.string, ptr);
|
||
|
(*ptr)[0] = '"';
|
||
|
(*ptr)[1] = ']';
|
||
|
*ptr += 2;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (detail->negate)
|
||
|
*ptr += sprintf(*ptr, ")");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Opcode names, indexed by opcode
|
||
|
*/
|
||
|
static const char *opcode_names[] = {
|
||
|
"azimuth",
|
||
|
"background-attachment",
|
||
|
"background-color",
|
||
|
"background-image",
|
||
|
"background-position",
|
||
|
"background-repeat",
|
||
|
"border-collapse",
|
||
|
"border-spacing",
|
||
|
"border-top-color",
|
||
|
"border-right-color",
|
||
|
"border-bottom-color",
|
||
|
"border-left-color",
|
||
|
"border-top-style",
|
||
|
"border-right-style",
|
||
|
"border-bottom-style",
|
||
|
"border-left-style",
|
||
|
"border-top-width",
|
||
|
"border-right-width",
|
||
|
"border-bottom-width",
|
||
|
"border-left-width",
|
||
|
"bottom",
|
||
|
"caption-side",
|
||
|
"clear",
|
||
|
"clip",
|
||
|
"color",
|
||
|
"content",
|
||
|
"counter-increment",
|
||
|
"counter-reset",
|
||
|
"cue-after",
|
||
|
"cue-before",
|
||
|
"cursor",
|
||
|
"direction",
|
||
|
"display",
|
||
|
"elevation",
|
||
|
"empty-cells",
|
||
|
"float",
|
||
|
"font-family",
|
||
|
"font-size",
|
||
|
"font-style",
|
||
|
"font-variant",
|
||
|
"font-weight",
|
||
|
"height",
|
||
|
"left",
|
||
|
"letter-spacing",
|
||
|
"line-height",
|
||
|
"list-style-image",
|
||
|
"list-style-position",
|
||
|
"list-style-type",
|
||
|
"margin-top",
|
||
|
"margin-right",
|
||
|
"margin-bottom",
|
||
|
"margin-left",
|
||
|
"max-height",
|
||
|
"max-width",
|
||
|
"min-height",
|
||
|
"min-width",
|
||
|
"orphans",
|
||
|
"outline-color",
|
||
|
"outline-style",
|
||
|
"outline-width",
|
||
|
"overflow",
|
||
|
"padding-top",
|
||
|
"padding-right",
|
||
|
"padding-bottom",
|
||
|
"padding-left",
|
||
|
"page-break-after",
|
||
|
"page-break-before",
|
||
|
"page-break-inside",
|
||
|
"pause-after",
|
||
|
"pause-before",
|
||
|
"pitch-range",
|
||
|
"pitch",
|
||
|
"play-during",
|
||
|
"position",
|
||
|
"quotes",
|
||
|
"richness",
|
||
|
"right",
|
||
|
"speak-header",
|
||
|
"speak-numeral",
|
||
|
"speak-punctuation",
|
||
|
"speak",
|
||
|
"speech-rate",
|
||
|
"stress",
|
||
|
"table-layout",
|
||
|
"text-align",
|
||
|
"text-decoration",
|
||
|
"text-indent",
|
||
|
"text-transform",
|
||
|
"top",
|
||
|
"unicode-bidi",
|
||
|
"vertical-align",
|
||
|
"visibility",
|
||
|
"voice-family",
|
||
|
"volume",
|
||
|
"white-space",
|
||
|
"widows",
|
||
|
"width",
|
||
|
"word-spacing",
|
||
|
"z-index",
|
||
|
"opacity",
|
||
|
"break-after",
|
||
|
"break-before",
|
||
|
"break-inside",
|
||
|
"column-count",
|
||
|
"column-fill",
|
||
|
"column-gap",
|
||
|
"column-rule-color",
|
||
|
"column-rule-style",
|
||
|
"column-rule-width",
|
||
|
"column-span",
|
||
|
"column-width",
|
||
|
};
|
||
|
|
||
|
static void dump_css_fixed(css_fixed f, char **ptr)
|
||
|
{
|
||
|
#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 (f < 0) {
|
||
|
buf[0] = '-';
|
||
|
buf++;
|
||
|
}
|
||
|
|
||
|
do {
|
||
|
tmp[tlen] = "0123456789"[uintpart % 10];
|
||
|
tlen++;
|
||
|
|
||
|
uintpart /= 10;
|
||
|
} while (tlen < 20 && uintpart != 0);
|
||
|
|
||
|
while (tlen > 0) {
|
||
|
buf[0] = tmp[--tlen];
|
||
|
buf++;
|
||
|
}
|
||
|
|
||
|
buf[0] = '.';
|
||
|
buf++;
|
||
|
|
||
|
do {
|
||
|
tmp[tlen] = "0123456789"[fracpart % 10];
|
||
|
tlen++;
|
||
|
|
||
|
fracpart /= 10;
|
||
|
} while (tlen < 20 && fracpart != 0);
|
||
|
|
||
|
while (tlen > 0) {
|
||
|
buf[0] = tmp[--tlen];
|
||
|
buf++;
|
||
|
flen++;
|
||
|
}
|
||
|
|
||
|
while (flen < 3) {
|
||
|
buf[0] = '0';
|
||
|
buf++;
|
||
|
flen++;
|
||
|
}
|
||
|
|
||
|
buf[0] = '\0';
|
||
|
|
||
|
*ptr = buf;
|
||
|
}
|
||
|
|
||
|
static void dump_number(css_fixed val, char **ptr)
|
||
|
{
|
||
|
if (INTTOFIX(FIXTOINT(val)) == val)
|
||
|
*ptr += sprintf(*ptr, "%d", FIXTOINT(val));
|
||
|
else
|
||
|
dump_css_fixed(val, ptr);
|
||
|
}
|
||
|
|
||
|
static void dump_unit(css_fixed val, uint32_t unit, char **ptr)
|
||
|
{
|
||
|
dump_number(val, ptr);
|
||
|
|
||
|
switch (unit) {
|
||
|
case UNIT_PX:
|
||
|
*ptr += sprintf(*ptr, "px");
|
||
|
break;
|
||
|
case UNIT_EX:
|
||
|
*ptr += sprintf(*ptr, "ex");
|
||
|
break;
|
||
|
case UNIT_EM:
|
||
|
*ptr += sprintf(*ptr, "em");
|
||
|
break;
|
||
|
case UNIT_IN:
|
||
|
*ptr += sprintf(*ptr, "in");
|
||
|
break;
|
||
|
case UNIT_CM:
|
||
|
*ptr += sprintf(*ptr, "cm");
|
||
|
break;
|
||
|
case UNIT_MM:
|
||
|
*ptr += sprintf(*ptr, "mm");
|
||
|
break;
|
||
|
case UNIT_PT:
|
||
|
*ptr += sprintf(*ptr, "pt");
|
||
|
break;
|
||
|
case UNIT_PC:
|
||
|
*ptr += sprintf(*ptr, "pc");
|
||
|
break;
|
||
|
case UNIT_PCT:
|
||
|
*ptr += sprintf(*ptr, "%%");
|
||
|
break;
|
||
|
case UNIT_DEG:
|
||
|
*ptr += sprintf(*ptr, "deg");
|
||
|
break;
|
||
|
case UNIT_GRAD:
|
||
|
*ptr += sprintf(*ptr, "grad");
|
||
|
break;
|
||
|
case UNIT_RAD:
|
||
|
*ptr += sprintf(*ptr, "rad");
|
||
|
break;
|
||
|
case UNIT_MS:
|
||
|
*ptr += sprintf(*ptr, "ms");
|
||
|
break;
|
||
|
case UNIT_S:
|
||
|
*ptr += sprintf(*ptr, "s");
|
||
|
break;
|
||
|
case UNIT_HZ:
|
||
|
*ptr += sprintf(*ptr, "Hz");
|
||
|
break;
|
||
|
case UNIT_KHZ:
|
||
|
*ptr += sprintf(*ptr, "kHz");
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void dump_counter(lwc_string *name, uint32_t value,
|
||
|
char **ptr)
|
||
|
{
|
||
|
*ptr += sprintf(*ptr, "counter(%.*s",
|
||
|
(int) lwc_string_length(name), lwc_string_data(name));
|
||
|
|
||
|
value >>= CONTENT_COUNTER_STYLE_SHIFT;
|
||
|
|
||
|
switch (value) {
|
||
|
case LIST_STYLE_TYPE_DISC:
|
||
|
*ptr += sprintf(*ptr, ", disc");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_CIRCLE:
|
||
|
*ptr += sprintf(*ptr, ", circle");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_SQUARE:
|
||
|
*ptr += sprintf(*ptr, ", square");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_DECIMAL:
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO:
|
||
|
*ptr += sprintf(*ptr, ", decimal-leading-zero");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_ROMAN:
|
||
|
*ptr += sprintf(*ptr, ", lower-roman");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_ROMAN:
|
||
|
*ptr += sprintf(*ptr, ", upper-roman");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_GREEK:
|
||
|
*ptr += sprintf(*ptr, ", lower-greek");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_LATIN:
|
||
|
*ptr += sprintf(*ptr, ", lower-latin");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_LATIN:
|
||
|
*ptr += sprintf(*ptr, ", upper-latin");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_ARMENIAN:
|
||
|
*ptr += sprintf(*ptr, ", armenian");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_GEORGIAN:
|
||
|
*ptr += sprintf(*ptr, ", georgian");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_ALPHA:
|
||
|
*ptr += sprintf(*ptr, ", lower-alpha");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_ALPHA:
|
||
|
*ptr += sprintf(*ptr, ", upper-alpha");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_NONE:
|
||
|
*ptr += sprintf(*ptr, ", none");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*ptr += sprintf(*ptr, ")");
|
||
|
}
|
||
|
|
||
|
static void dump_counters(lwc_string *name, lwc_string *separator,
|
||
|
uint32_t value, char **ptr)
|
||
|
{
|
||
|
*ptr += sprintf(*ptr, "counter(%.*s, %.*s",
|
||
|
(int) lwc_string_length(name),
|
||
|
lwc_string_data(name),
|
||
|
(int) lwc_string_length(separator),
|
||
|
lwc_string_data(separator));
|
||
|
|
||
|
value >>= CONTENT_COUNTER_STYLE_SHIFT;
|
||
|
|
||
|
switch (value) {
|
||
|
case LIST_STYLE_TYPE_DISC:
|
||
|
*ptr += sprintf(*ptr, ", disc");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_CIRCLE:
|
||
|
*ptr += sprintf(*ptr, ", circle");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_SQUARE:
|
||
|
*ptr += sprintf(*ptr, ", square");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_DECIMAL:
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO:
|
||
|
*ptr += sprintf(*ptr, ", decimal-leading-zero");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_ROMAN:
|
||
|
*ptr += sprintf(*ptr, ", lower-roman");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_ROMAN:
|
||
|
*ptr += sprintf(*ptr, ", upper-roman");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_GREEK:
|
||
|
*ptr += sprintf(*ptr, ", lower-greek");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_LATIN:
|
||
|
*ptr += sprintf(*ptr, ", lower-latin");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_LATIN:
|
||
|
*ptr += sprintf(*ptr, ", upper-latin");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_ARMENIAN:
|
||
|
*ptr += sprintf(*ptr, ", armenian");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_GEORGIAN:
|
||
|
*ptr += sprintf(*ptr, ", georgian");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_ALPHA:
|
||
|
*ptr += sprintf(*ptr, ", lower-alpha");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_ALPHA:
|
||
|
*ptr += sprintf(*ptr, ", upper-alpha");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_NONE:
|
||
|
*ptr += sprintf(*ptr, ", none");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*ptr += sprintf(*ptr, ")");
|
||
|
}
|
||
|
|
||
|
void dump_bytecode(css_style *style, char **ptr, uint32_t depth)
|
||
|
{
|
||
|
void *bytecode = style->bytecode;
|
||
|
size_t length = (style->used * sizeof(css_code_t));
|
||
|
uint32_t offset = 0;
|
||
|
|
||
|
#define ADVANCE(n) do { \
|
||
|
offset += (n); \
|
||
|
bytecode = ((uint8_t *) bytecode) + (n); \
|
||
|
} while(0)
|
||
|
|
||
|
while (offset < length) {
|
||
|
opcode_t op;
|
||
|
uint32_t value;
|
||
|
uint32_t opv = *((uint32_t *) bytecode);
|
||
|
|
||
|
ADVANCE(sizeof(opv));
|
||
|
|
||
|
op = getOpcode(opv);
|
||
|
|
||
|
*((*ptr)++) = '|';
|
||
|
for (uint32_t i = 0; i < depth; i++)
|
||
|
*((*ptr)++) = ' ';
|
||
|
*ptr += sprintf(*ptr, "%s: ", opcode_names[op]);
|
||
|
|
||
|
if (isInherit(opv)) {
|
||
|
*ptr += sprintf(*ptr, "inherit");
|
||
|
} else {
|
||
|
value = getValue(opv);
|
||
|
|
||
|
switch (op) {
|
||
|
case CSS_PROP_AZIMUTH:
|
||
|
switch (value & ~AZIMUTH_BEHIND) {
|
||
|
case AZIMUTH_ANGLE:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case AZIMUTH_LEFTWARDS:
|
||
|
*ptr += sprintf(*ptr, "leftwards");
|
||
|
break;
|
||
|
case AZIMUTH_RIGHTWARDS:
|
||
|
*ptr += sprintf(*ptr, "rightwards");
|
||
|
break;
|
||
|
case AZIMUTH_LEFT_SIDE:
|
||
|
*ptr += sprintf(*ptr, "left-side");
|
||
|
break;
|
||
|
case AZIMUTH_FAR_LEFT:
|
||
|
*ptr += sprintf(*ptr, "far-left");
|
||
|
break;
|
||
|
case AZIMUTH_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
case AZIMUTH_CENTER_LEFT:
|
||
|
*ptr += sprintf(*ptr, "center-left");
|
||
|
break;
|
||
|
case AZIMUTH_CENTER:
|
||
|
*ptr += sprintf(*ptr, "center");
|
||
|
break;
|
||
|
case AZIMUTH_CENTER_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "center-right");
|
||
|
break;
|
||
|
case AZIMUTH_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
case AZIMUTH_FAR_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "far-right");
|
||
|
break;
|
||
|
case AZIMUTH_RIGHT_SIDE:
|
||
|
*ptr += sprintf(*ptr, "right-side");
|
||
|
break;
|
||
|
}
|
||
|
if (value & AZIMUTH_BEHIND)
|
||
|
*ptr += sprintf(*ptr, " behind");
|
||
|
break;
|
||
|
case CSS_PROP_BACKGROUND_ATTACHMENT:
|
||
|
switch (value) {
|
||
|
case BACKGROUND_ATTACHMENT_FIXED:
|
||
|
*ptr += sprintf(*ptr, "fixed");
|
||
|
break;
|
||
|
case BACKGROUND_ATTACHMENT_SCROLL:
|
||
|
*ptr += sprintf(*ptr, "scroll");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BORDER_TOP_COLOR:
|
||
|
case CSS_PROP_BORDER_RIGHT_COLOR:
|
||
|
case CSS_PROP_BORDER_BOTTOM_COLOR:
|
||
|
case CSS_PROP_BORDER_LEFT_COLOR:
|
||
|
case CSS_PROP_BACKGROUND_COLOR:
|
||
|
case CSS_PROP_COLUMN_RULE_COLOR:
|
||
|
assert(BACKGROUND_COLOR_TRANSPARENT ==
|
||
|
(enum op_background_color)
|
||
|
BORDER_COLOR_TRANSPARENT);
|
||
|
assert(BACKGROUND_COLOR_CURRENT_COLOR ==
|
||
|
(enum op_background_color)
|
||
|
BORDER_COLOR_CURRENT_COLOR);
|
||
|
assert(BACKGROUND_COLOR_SET ==
|
||
|
(enum op_background_color)
|
||
|
BORDER_COLOR_SET);
|
||
|
|
||
|
switch (value) {
|
||
|
case BACKGROUND_COLOR_TRANSPARENT:
|
||
|
*ptr += sprintf(*ptr, "transparent");
|
||
|
break;
|
||
|
case BACKGROUND_COLOR_CURRENT_COLOR:
|
||
|
*ptr += sprintf(*ptr, "currentColor");
|
||
|
break;
|
||
|
case BACKGROUND_COLOR_SET:
|
||
|
{
|
||
|
uint32_t colour =
|
||
|
*((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(colour));
|
||
|
*ptr += sprintf(*ptr, "#%08x", colour);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BACKGROUND_IMAGE:
|
||
|
case CSS_PROP_CUE_AFTER:
|
||
|
case CSS_PROP_CUE_BEFORE:
|
||
|
case CSS_PROP_LIST_STYLE_IMAGE:
|
||
|
assert(BACKGROUND_IMAGE_NONE ==
|
||
|
(enum op_background_image)
|
||
|
CUE_AFTER_NONE);
|
||
|
assert(BACKGROUND_IMAGE_URI ==
|
||
|
(enum op_background_image)
|
||
|
CUE_AFTER_URI);
|
||
|
assert(BACKGROUND_IMAGE_NONE ==
|
||
|
(enum op_background_image)
|
||
|
CUE_BEFORE_NONE);
|
||
|
assert(BACKGROUND_IMAGE_URI ==
|
||
|
(enum op_background_image)
|
||
|
CUE_BEFORE_URI);
|
||
|
assert(BACKGROUND_IMAGE_NONE ==
|
||
|
(enum op_background_image)
|
||
|
LIST_STYLE_IMAGE_NONE);
|
||
|
assert(BACKGROUND_IMAGE_URI ==
|
||
|
(enum op_background_image)
|
||
|
LIST_STYLE_IMAGE_URI);
|
||
|
|
||
|
switch (value) {
|
||
|
case BACKGROUND_IMAGE_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
case BACKGROUND_IMAGE_URI:
|
||
|
{
|
||
|
uint32_t snum = *((uint32_t *) bytecode);
|
||
|
lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet,
|
||
|
snum,
|
||
|
&he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, "url('%.*s')",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BACKGROUND_POSITION:
|
||
|
switch (value & 0xf0) {
|
||
|
case BACKGROUND_POSITION_HORZ_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case BACKGROUND_POSITION_HORZ_CENTER:
|
||
|
*ptr += sprintf(*ptr, "center");
|
||
|
break;
|
||
|
case BACKGROUND_POSITION_HORZ_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
case BACKGROUND_POSITION_HORZ_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
}
|
||
|
*ptr += sprintf(*ptr, " ");
|
||
|
switch (value & 0x0f) {
|
||
|
case BACKGROUND_POSITION_VERT_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case BACKGROUND_POSITION_VERT_CENTER:
|
||
|
*ptr += sprintf(*ptr, "center");
|
||
|
break;
|
||
|
case BACKGROUND_POSITION_VERT_BOTTOM:
|
||
|
*ptr += sprintf(*ptr, "bottom");
|
||
|
break;
|
||
|
case BACKGROUND_POSITION_VERT_TOP:
|
||
|
*ptr += sprintf(*ptr, "top");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BACKGROUND_REPEAT:
|
||
|
switch (value) {
|
||
|
case BACKGROUND_REPEAT_NO_REPEAT:
|
||
|
*ptr += sprintf(*ptr, "no-repeat");
|
||
|
break;
|
||
|
case BACKGROUND_REPEAT_REPEAT_X:
|
||
|
*ptr += sprintf(*ptr, "repeat-x");
|
||
|
break;
|
||
|
case BACKGROUND_REPEAT_REPEAT_Y:
|
||
|
*ptr += sprintf(*ptr, "repeat-y");
|
||
|
break;
|
||
|
case BACKGROUND_REPEAT_REPEAT:
|
||
|
*ptr += sprintf(*ptr, "repeat");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BORDER_COLLAPSE:
|
||
|
switch (value) {
|
||
|
case BORDER_COLLAPSE_SEPARATE:
|
||
|
*ptr += sprintf(*ptr, "separate");
|
||
|
break;
|
||
|
case BORDER_COLLAPSE_COLLAPSE:
|
||
|
*ptr += sprintf(*ptr, "collapse");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BORDER_SPACING:
|
||
|
switch (value) {
|
||
|
case BORDER_SPACING_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
|
||
|
val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BORDER_TOP_STYLE:
|
||
|
case CSS_PROP_BORDER_RIGHT_STYLE:
|
||
|
case CSS_PROP_BORDER_BOTTOM_STYLE:
|
||
|
case CSS_PROP_BORDER_LEFT_STYLE:
|
||
|
case CSS_PROP_COLUMN_RULE_STYLE:
|
||
|
case CSS_PROP_OUTLINE_STYLE:
|
||
|
assert(BORDER_STYLE_NONE ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_NONE);
|
||
|
assert(BORDER_STYLE_NONE ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_NONE);
|
||
|
assert(BORDER_STYLE_HIDDEN ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_HIDDEN);
|
||
|
assert(BORDER_STYLE_HIDDEN ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_HIDDEN);
|
||
|
assert(BORDER_STYLE_DOTTED ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_DOTTED);
|
||
|
assert(BORDER_STYLE_DOTTED ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_DOTTED);
|
||
|
assert(BORDER_STYLE_DASHED ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_DASHED);
|
||
|
assert(BORDER_STYLE_DASHED ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_DASHED);
|
||
|
assert(BORDER_STYLE_SOLID ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_SOLID);
|
||
|
assert(BORDER_STYLE_SOLID ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_SOLID);
|
||
|
assert(BORDER_STYLE_DOUBLE ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_DOUBLE);
|
||
|
assert(BORDER_STYLE_DOUBLE ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_DOUBLE);
|
||
|
assert(BORDER_STYLE_GROOVE ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_GROOVE);
|
||
|
assert(BORDER_STYLE_GROOVE ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_GROOVE);
|
||
|
assert(BORDER_STYLE_RIDGE ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_RIDGE);
|
||
|
assert(BORDER_STYLE_RIDGE ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_RIDGE);
|
||
|
assert(BORDER_STYLE_INSET ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_INSET);
|
||
|
assert(BORDER_STYLE_INSET ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_INSET);
|
||
|
assert(BORDER_STYLE_OUTSET ==
|
||
|
(enum op_border_style)
|
||
|
OUTLINE_STYLE_OUTSET);
|
||
|
assert(BORDER_STYLE_OUTSET ==
|
||
|
(enum op_border_style)
|
||
|
COLUMN_RULE_STYLE_OUTSET);
|
||
|
|
||
|
switch (value) {
|
||
|
case BORDER_STYLE_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
case BORDER_STYLE_HIDDEN:
|
||
|
*ptr += sprintf(*ptr, "hidden");
|
||
|
break;
|
||
|
case BORDER_STYLE_DOTTED:
|
||
|
*ptr += sprintf(*ptr, "dotted");
|
||
|
break;
|
||
|
case BORDER_STYLE_DASHED:
|
||
|
*ptr += sprintf(*ptr, "dashed");
|
||
|
break;
|
||
|
case BORDER_STYLE_SOLID:
|
||
|
*ptr += sprintf(*ptr, "solid");
|
||
|
break;
|
||
|
case BORDER_STYLE_DOUBLE:
|
||
|
*ptr += sprintf(*ptr, "double");
|
||
|
break;
|
||
|
case BORDER_STYLE_GROOVE:
|
||
|
*ptr += sprintf(*ptr, "groove");
|
||
|
break;
|
||
|
case BORDER_STYLE_RIDGE:
|
||
|
*ptr += sprintf(*ptr, "ridge");
|
||
|
break;
|
||
|
case BORDER_STYLE_INSET:
|
||
|
*ptr += sprintf(*ptr, "inset");
|
||
|
break;
|
||
|
case BORDER_STYLE_OUTSET:
|
||
|
*ptr += sprintf(*ptr, "outset");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BORDER_TOP_WIDTH:
|
||
|
case CSS_PROP_BORDER_RIGHT_WIDTH:
|
||
|
case CSS_PROP_BORDER_BOTTOM_WIDTH:
|
||
|
case CSS_PROP_BORDER_LEFT_WIDTH:
|
||
|
case CSS_PROP_COLUMN_RULE_WIDTH:
|
||
|
case CSS_PROP_OUTLINE_WIDTH:
|
||
|
assert(BORDER_WIDTH_SET ==
|
||
|
(enum op_border_width)
|
||
|
OUTLINE_WIDTH_SET);
|
||
|
assert(BORDER_WIDTH_THIN ==
|
||
|
(enum op_border_width)
|
||
|
OUTLINE_WIDTH_THIN);
|
||
|
assert(BORDER_WIDTH_MEDIUM ==
|
||
|
(enum op_border_width)
|
||
|
OUTLINE_WIDTH_MEDIUM);
|
||
|
assert(BORDER_WIDTH_THICK ==
|
||
|
(enum op_border_width)
|
||
|
OUTLINE_WIDTH_THICK);
|
||
|
|
||
|
switch (value) {
|
||
|
case BORDER_WIDTH_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case BORDER_WIDTH_THIN:
|
||
|
*ptr += sprintf(*ptr, "thin");
|
||
|
break;
|
||
|
case BORDER_WIDTH_MEDIUM:
|
||
|
*ptr += sprintf(*ptr, "medium");
|
||
|
break;
|
||
|
case BORDER_WIDTH_THICK:
|
||
|
*ptr += sprintf(*ptr, "thick");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_MARGIN_TOP:
|
||
|
case CSS_PROP_MARGIN_RIGHT:
|
||
|
case CSS_PROP_MARGIN_BOTTOM:
|
||
|
case CSS_PROP_MARGIN_LEFT:
|
||
|
case CSS_PROP_BOTTOM:
|
||
|
case CSS_PROP_LEFT:
|
||
|
case CSS_PROP_RIGHT:
|
||
|
case CSS_PROP_TOP:
|
||
|
case CSS_PROP_HEIGHT:
|
||
|
case CSS_PROP_WIDTH:
|
||
|
case CSS_PROP_COLUMN_WIDTH:
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom) LEFT_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom) LEFT_AUTO);
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom) RIGHT_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom) RIGHT_AUTO);
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom) TOP_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom) TOP_AUTO);
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom) HEIGHT_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom) HEIGHT_AUTO);
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom) MARGIN_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom) MARGIN_AUTO);
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom) WIDTH_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom) WIDTH_AUTO);
|
||
|
assert(BOTTOM_SET ==
|
||
|
(enum op_bottom)
|
||
|
COLUMN_WIDTH_SET);
|
||
|
assert(BOTTOM_AUTO ==
|
||
|
(enum op_bottom)
|
||
|
COLUMN_WIDTH_AUTO);
|
||
|
|
||
|
switch (value) {
|
||
|
case BOTTOM_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case BOTTOM_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BREAK_AFTER:
|
||
|
case CSS_PROP_BREAK_BEFORE:
|
||
|
assert(BREAK_AFTER_AUTO ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_AUTO);
|
||
|
assert(BREAK_AFTER_ALWAYS ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_ALWAYS);
|
||
|
assert(BREAK_AFTER_AVOID ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_AVOID);
|
||
|
assert(BREAK_AFTER_LEFT ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_LEFT);
|
||
|
assert(BREAK_AFTER_RIGHT ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_RIGHT);
|
||
|
assert(BREAK_AFTER_PAGE ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_PAGE);
|
||
|
assert(BREAK_AFTER_COLUMN ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_COLUMN);
|
||
|
assert(BREAK_AFTER_AVOID_PAGE ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_AVOID_PAGE);
|
||
|
assert(BREAK_AFTER_AVOID_COLUMN ==
|
||
|
(enum op_break_after)
|
||
|
BREAK_BEFORE_AVOID_COLUMN);
|
||
|
|
||
|
switch (value) {
|
||
|
case BREAK_AFTER_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case BREAK_AFTER_ALWAYS:
|
||
|
*ptr += sprintf(*ptr, "always");
|
||
|
break;
|
||
|
case BREAK_AFTER_AVOID:
|
||
|
*ptr += sprintf(*ptr, "avoid");
|
||
|
break;
|
||
|
case BREAK_AFTER_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
case BREAK_AFTER_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
case BREAK_AFTER_PAGE:
|
||
|
*ptr += sprintf(*ptr, "page");
|
||
|
break;
|
||
|
case BREAK_AFTER_COLUMN:
|
||
|
*ptr += sprintf(*ptr, "column");
|
||
|
break;
|
||
|
case BREAK_AFTER_AVOID_PAGE:
|
||
|
*ptr += sprintf(*ptr, "avoid-page");
|
||
|
break;
|
||
|
case BREAK_AFTER_AVOID_COLUMN:
|
||
|
*ptr += sprintf(*ptr, "avoid-column");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_BREAK_INSIDE:
|
||
|
switch (value) {
|
||
|
case BREAK_INSIDE_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case BREAK_INSIDE_AVOID:
|
||
|
*ptr += sprintf(*ptr, "avoid");
|
||
|
break;
|
||
|
case BREAK_INSIDE_AVOID_PAGE:
|
||
|
*ptr += sprintf(*ptr, "avoid-page");
|
||
|
break;
|
||
|
case BREAK_INSIDE_AVOID_COLUMN:
|
||
|
*ptr += sprintf(*ptr, "avoid-column");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_CAPTION_SIDE:
|
||
|
switch (value) {
|
||
|
case CAPTION_SIDE_TOP:
|
||
|
*ptr += sprintf(*ptr, "top");
|
||
|
break;
|
||
|
case CAPTION_SIDE_BOTTOM:
|
||
|
*ptr += sprintf(*ptr, "bottom");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_CLEAR:
|
||
|
switch (value) {
|
||
|
case CLEAR_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
case CLEAR_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
case CLEAR_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
case CLEAR_BOTH:
|
||
|
*ptr += sprintf(*ptr, "both");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_CLIP:
|
||
|
if ((value & CLIP_SHAPE_MASK) ==
|
||
|
CLIP_SHAPE_RECT) {
|
||
|
*ptr += sprintf(*ptr, "rect(");
|
||
|
if (value & CLIP_RECT_TOP_AUTO) {
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
} else {
|
||
|
uint32_t unit;
|
||
|
css_fixed val =
|
||
|
*((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
*ptr += sprintf(*ptr, ", ");
|
||
|
if (value & CLIP_RECT_RIGHT_AUTO) {
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
} else {
|
||
|
uint32_t unit;
|
||
|
css_fixed val =
|
||
|
*((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
*ptr += sprintf(*ptr, ", ");
|
||
|
if (value & CLIP_RECT_BOTTOM_AUTO) {
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
} else {
|
||
|
uint32_t unit;
|
||
|
css_fixed val =
|
||
|
*((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
*ptr += sprintf(*ptr, ", ");
|
||
|
if (value & CLIP_RECT_LEFT_AUTO) {
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
} else {
|
||
|
uint32_t unit;
|
||
|
css_fixed val =
|
||
|
*((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
*ptr += sprintf(*ptr, ")");
|
||
|
} else
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case CSS_PROP_COLOR:
|
||
|
switch (value) {
|
||
|
case COLOR_TRANSPARENT:
|
||
|
*ptr += sprintf(*ptr, "transparent");
|
||
|
break;
|
||
|
case COLOR_CURRENT_COLOR:
|
||
|
*ptr += sprintf(*ptr, "currentColor");
|
||
|
break;
|
||
|
case COLOR_SET:
|
||
|
{
|
||
|
uint32_t colour =
|
||
|
*((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(colour));
|
||
|
*ptr += sprintf(*ptr, "#%08x", colour);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_COLUMN_COUNT:
|
||
|
switch (value) {
|
||
|
case COLUMN_COUNT_SET:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case COLUMN_COUNT_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_COLUMN_FILL:
|
||
|
switch (value) {
|
||
|
case COLUMN_FILL_BALANCE:
|
||
|
*ptr += sprintf(*ptr, "balance");
|
||
|
break;
|
||
|
case COLUMN_FILL_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_COLUMN_GAP:
|
||
|
switch (value) {
|
||
|
case COLUMN_GAP_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case COLUMN_GAP_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_COLUMN_SPAN:
|
||
|
switch (value) {
|
||
|
case COLUMN_SPAN_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
case COLUMN_SPAN_ALL:
|
||
|
*ptr += sprintf(*ptr, "all");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_CONTENT:
|
||
|
if (value == CONTENT_NORMAL) {
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
} else if (value == CONTENT_NONE) {
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
while (value != CONTENT_NORMAL) {
|
||
|
uint32_t snum = *((uint32_t *) bytecode);
|
||
|
lwc_string *he;
|
||
|
const char *end = "";
|
||
|
|
||
|
switch (value & 0xff) {
|
||
|
case CONTENT_COUNTER:
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
dump_counter(he, value, ptr);
|
||
|
break;
|
||
|
|
||
|
case CONTENT_COUNTERS:
|
||
|
{
|
||
|
lwc_string *sep;
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
|
||
|
sep = *((lwc_string **) bytecode);
|
||
|
ADVANCE(sizeof(sep));
|
||
|
|
||
|
dump_counters(he, sep, value,
|
||
|
ptr);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CONTENT_URI:
|
||
|
case CONTENT_ATTR:
|
||
|
case CONTENT_STRING:
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
if (value == CONTENT_URI)
|
||
|
*ptr += sprintf(*ptr, "url(");
|
||
|
if (value == CONTENT_ATTR)
|
||
|
*ptr += sprintf(*ptr, "attr(");
|
||
|
if (value != CONTENT_STRING)
|
||
|
end = ")";
|
||
|
|
||
|
ADVANCE(sizeof(snum));
|
||
|
|
||
|
*ptr += sprintf(*ptr, "'%.*s'%s",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he),
|
||
|
end);
|
||
|
break;
|
||
|
|
||
|
case CONTENT_OPEN_QUOTE:
|
||
|
*ptr += sprintf(*ptr, "open-quote");
|
||
|
break;
|
||
|
|
||
|
case CONTENT_CLOSE_QUOTE:
|
||
|
*ptr += sprintf(*ptr, "close-quote");
|
||
|
break;
|
||
|
|
||
|
case CONTENT_NO_OPEN_QUOTE:
|
||
|
*ptr += sprintf(*ptr, "no-open-quote");
|
||
|
break;
|
||
|
|
||
|
case CONTENT_NO_CLOSE_QUOTE:
|
||
|
*ptr += sprintf(*ptr, "no-close-quote");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
value = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(value));
|
||
|
|
||
|
if (value != CONTENT_NORMAL)
|
||
|
*ptr += sprintf(*ptr, " ");
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_COUNTER_INCREMENT:
|
||
|
case CSS_PROP_COUNTER_RESET:
|
||
|
assert(COUNTER_INCREMENT_NONE ==
|
||
|
(enum op_counter_increment)
|
||
|
COUNTER_RESET_NONE);
|
||
|
assert(COUNTER_INCREMENT_NAMED ==
|
||
|
(enum op_counter_increment)
|
||
|
COUNTER_RESET_NAMED);
|
||
|
|
||
|
switch (value) {
|
||
|
case COUNTER_INCREMENT_NAMED:
|
||
|
while (value != COUNTER_INCREMENT_NONE) {
|
||
|
css_fixed val;
|
||
|
uint32_t snum = *((uint32_t *) bytecode); lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet,
|
||
|
snum,
|
||
|
&he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, "%.*s ",
|
||
|
(int)lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
|
||
|
value = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(value));
|
||
|
|
||
|
if (value !=
|
||
|
COUNTER_INCREMENT_NONE)
|
||
|
*ptr += sprintf(*ptr,
|
||
|
" ");
|
||
|
}
|
||
|
break;
|
||
|
case COUNTER_INCREMENT_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_CURSOR:
|
||
|
while (value == CURSOR_URI) {
|
||
|
uint32_t snum = *((uint32_t *) bytecode); lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet,
|
||
|
snum,
|
||
|
&he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, "url('%.*s'), ",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
|
||
|
value = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(value));
|
||
|
}
|
||
|
|
||
|
switch (value) {
|
||
|
case CURSOR_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case CURSOR_CROSSHAIR:
|
||
|
*ptr += sprintf(*ptr, "crosshair");
|
||
|
break;
|
||
|
case CURSOR_DEFAULT:
|
||
|
*ptr += sprintf(*ptr, "default");
|
||
|
break;
|
||
|
case CURSOR_POINTER:
|
||
|
*ptr += sprintf(*ptr, "pointer");
|
||
|
break;
|
||
|
case CURSOR_MOVE:
|
||
|
*ptr += sprintf(*ptr, "move");
|
||
|
break;
|
||
|
case CURSOR_E_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "e-resize");
|
||
|
break;
|
||
|
case CURSOR_NE_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "ne-resize");
|
||
|
break;
|
||
|
case CURSOR_NW_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "nw-resize");
|
||
|
break;
|
||
|
case CURSOR_N_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "n-resize");
|
||
|
break;
|
||
|
case CURSOR_SE_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "se-resize");
|
||
|
break;
|
||
|
case CURSOR_SW_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "sw-resize");
|
||
|
break;
|
||
|
case CURSOR_S_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "s-resize");
|
||
|
break;
|
||
|
case CURSOR_W_RESIZE:
|
||
|
*ptr += sprintf(*ptr, "w-resize");
|
||
|
break;
|
||
|
case CURSOR_TEXT:
|
||
|
*ptr += sprintf(*ptr, "text");
|
||
|
break;
|
||
|
case CURSOR_WAIT:
|
||
|
*ptr += sprintf(*ptr, "wait");
|
||
|
break;
|
||
|
case CURSOR_HELP:
|
||
|
*ptr += sprintf(*ptr, "help");
|
||
|
break;
|
||
|
case CURSOR_PROGRESS:
|
||
|
*ptr += sprintf(*ptr, "progress");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_DIRECTION:
|
||
|
switch (value) {
|
||
|
case DIRECTION_LTR:
|
||
|
*ptr += sprintf(*ptr, "ltr");
|
||
|
break;
|
||
|
case DIRECTION_RTL:
|
||
|
*ptr += sprintf(*ptr, "rtl");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_DISPLAY:
|
||
|
switch (value) {
|
||
|
case DISPLAY_INLINE:
|
||
|
*ptr += sprintf(*ptr, "inline");
|
||
|
break;
|
||
|
case DISPLAY_BLOCK:
|
||
|
*ptr += sprintf(*ptr, "block");
|
||
|
break;
|
||
|
case DISPLAY_LIST_ITEM:
|
||
|
*ptr += sprintf(*ptr, "list-item");
|
||
|
break;
|
||
|
case DISPLAY_RUN_IN:
|
||
|
*ptr += sprintf(*ptr, "run-in");
|
||
|
break;
|
||
|
case DISPLAY_INLINE_BLOCK:
|
||
|
*ptr += sprintf(*ptr, "inline-block");
|
||
|
break;
|
||
|
case DISPLAY_TABLE:
|
||
|
*ptr += sprintf(*ptr, "table");
|
||
|
break;
|
||
|
case DISPLAY_INLINE_TABLE:
|
||
|
*ptr += sprintf(*ptr, "inline-table");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_ROW_GROUP:
|
||
|
*ptr += sprintf(*ptr, "table-row-group");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_HEADER_GROUP:
|
||
|
*ptr += sprintf(*ptr, "table-header-group");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_FOOTER_GROUP:
|
||
|
*ptr += sprintf(*ptr, "table-footer-group");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_ROW:
|
||
|
*ptr += sprintf(*ptr, "table-row");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_COLUMN_GROUP:
|
||
|
*ptr += sprintf(*ptr, "table-column-group");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_COLUMN:
|
||
|
*ptr += sprintf(*ptr, "table-column");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_CELL:
|
||
|
*ptr += sprintf(*ptr, "table-cell");
|
||
|
break;
|
||
|
case DISPLAY_TABLE_CAPTION:
|
||
|
*ptr += sprintf(*ptr, "table-caption");
|
||
|
break;
|
||
|
case DISPLAY_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_ELEVATION:
|
||
|
switch (value) {
|
||
|
case ELEVATION_ANGLE:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case ELEVATION_BELOW:
|
||
|
*ptr += sprintf(*ptr, "below");
|
||
|
break;
|
||
|
case ELEVATION_LEVEL:
|
||
|
*ptr += sprintf(*ptr, "level");
|
||
|
break;
|
||
|
case ELEVATION_ABOVE:
|
||
|
*ptr += sprintf(*ptr, "above");
|
||
|
break;
|
||
|
case ELEVATION_HIGHER:
|
||
|
*ptr += sprintf(*ptr, "higher");
|
||
|
break;
|
||
|
case ELEVATION_LOWER:
|
||
|
*ptr += sprintf(*ptr, "lower");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_EMPTY_CELLS:
|
||
|
switch (value) {
|
||
|
case EMPTY_CELLS_SHOW:
|
||
|
*ptr += sprintf(*ptr, "show");
|
||
|
break;
|
||
|
case EMPTY_CELLS_HIDE:
|
||
|
*ptr += sprintf(*ptr, "hide");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_FLOAT:
|
||
|
switch (value) {
|
||
|
case FLOAT_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
case FLOAT_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
case FLOAT_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_FONT_FAMILY:
|
||
|
while (value != FONT_FAMILY_END) {
|
||
|
switch (value) {
|
||
|
case FONT_FAMILY_STRING:
|
||
|
case FONT_FAMILY_IDENT_LIST:
|
||
|
{
|
||
|
uint32_t snum = *((uint32_t *) bytecode);
|
||
|
lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, "'%.*s'",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
}
|
||
|
break;
|
||
|
case FONT_FAMILY_SERIF:
|
||
|
*ptr += sprintf(*ptr, "serif");
|
||
|
break;
|
||
|
case FONT_FAMILY_SANS_SERIF:
|
||
|
*ptr += sprintf(*ptr, "sans-serif");
|
||
|
break;
|
||
|
case FONT_FAMILY_CURSIVE:
|
||
|
*ptr += sprintf(*ptr, "cursive");
|
||
|
break;
|
||
|
case FONT_FAMILY_FANTASY:
|
||
|
*ptr += sprintf(*ptr, "fantasy");
|
||
|
break;
|
||
|
case FONT_FAMILY_MONOSPACE:
|
||
|
*ptr += sprintf(*ptr, "monospace");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
value = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(value));
|
||
|
|
||
|
if (value != FONT_FAMILY_END)
|
||
|
*ptr += sprintf(*ptr, ", ");
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_FONT_SIZE:
|
||
|
switch (value) {
|
||
|
case FONT_SIZE_DIMENSION:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case FONT_SIZE_XX_SMALL:
|
||
|
*ptr += sprintf(*ptr, "xx-small");
|
||
|
break;
|
||
|
case FONT_SIZE_X_SMALL:
|
||
|
*ptr += sprintf(*ptr, "x-small");
|
||
|
break;
|
||
|
case FONT_SIZE_SMALL:
|
||
|
*ptr += sprintf(*ptr, "small");
|
||
|
break;
|
||
|
case FONT_SIZE_MEDIUM:
|
||
|
*ptr += sprintf(*ptr, "medium");
|
||
|
break;
|
||
|
case FONT_SIZE_LARGE:
|
||
|
*ptr += sprintf(*ptr, "large");
|
||
|
break;
|
||
|
case FONT_SIZE_X_LARGE:
|
||
|
*ptr += sprintf(*ptr, "x-large");
|
||
|
break;
|
||
|
case FONT_SIZE_XX_LARGE:
|
||
|
*ptr += sprintf(*ptr, "xx-large");
|
||
|
break;
|
||
|
case FONT_SIZE_LARGER:
|
||
|
*ptr += sprintf(*ptr, "larger");
|
||
|
break;
|
||
|
case FONT_SIZE_SMALLER:
|
||
|
*ptr += sprintf(*ptr, "smaller");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_FONT_STYLE:
|
||
|
switch (value) {
|
||
|
case FONT_STYLE_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case FONT_STYLE_ITALIC:
|
||
|
*ptr += sprintf(*ptr, "italic");
|
||
|
break;
|
||
|
case FONT_STYLE_OBLIQUE:
|
||
|
*ptr += sprintf(*ptr, "oblique");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_FONT_VARIANT:
|
||
|
switch (value) {
|
||
|
case FONT_VARIANT_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case FONT_VARIANT_SMALL_CAPS:
|
||
|
*ptr += sprintf(*ptr, "small-caps");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_FONT_WEIGHT:
|
||
|
switch (value) {
|
||
|
case FONT_WEIGHT_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case FONT_WEIGHT_BOLD:
|
||
|
*ptr += sprintf(*ptr, "bold");
|
||
|
break;
|
||
|
case FONT_WEIGHT_BOLDER:
|
||
|
*ptr += sprintf(*ptr, "bolder");
|
||
|
break;
|
||
|
case FONT_WEIGHT_LIGHTER:
|
||
|
*ptr += sprintf(*ptr, "lighter");
|
||
|
break;
|
||
|
case FONT_WEIGHT_100:
|
||
|
*ptr += sprintf(*ptr, "100");
|
||
|
break;
|
||
|
case FONT_WEIGHT_200:
|
||
|
*ptr += sprintf(*ptr, "200");
|
||
|
break;
|
||
|
case FONT_WEIGHT_300:
|
||
|
*ptr += sprintf(*ptr, "300");
|
||
|
break;
|
||
|
case FONT_WEIGHT_400:
|
||
|
*ptr += sprintf(*ptr, "400");
|
||
|
break;
|
||
|
case FONT_WEIGHT_500:
|
||
|
*ptr += sprintf(*ptr, "500");
|
||
|
break;
|
||
|
case FONT_WEIGHT_600:
|
||
|
*ptr += sprintf(*ptr, "600");
|
||
|
break;
|
||
|
case FONT_WEIGHT_700:
|
||
|
*ptr += sprintf(*ptr, "700");
|
||
|
break;
|
||
|
case FONT_WEIGHT_800:
|
||
|
*ptr += sprintf(*ptr, "800");
|
||
|
break;
|
||
|
case FONT_WEIGHT_900:
|
||
|
*ptr += sprintf(*ptr, "900");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_LETTER_SPACING:
|
||
|
case CSS_PROP_WORD_SPACING:
|
||
|
assert(LETTER_SPACING_SET ==
|
||
|
(enum op_letter_spacing)
|
||
|
WORD_SPACING_SET);
|
||
|
assert(LETTER_SPACING_NORMAL ==
|
||
|
(enum op_letter_spacing)
|
||
|
WORD_SPACING_NORMAL);
|
||
|
|
||
|
switch (value) {
|
||
|
case LETTER_SPACING_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case LETTER_SPACING_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_LINE_HEIGHT:
|
||
|
switch (value) {
|
||
|
case LINE_HEIGHT_NUMBER:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case LINE_HEIGHT_DIMENSION:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case LINE_HEIGHT_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_LIST_STYLE_POSITION:
|
||
|
switch (value) {
|
||
|
case LIST_STYLE_POSITION_INSIDE:
|
||
|
*ptr += sprintf(*ptr, "inside");
|
||
|
break;
|
||
|
case LIST_STYLE_POSITION_OUTSIDE:
|
||
|
*ptr += sprintf(*ptr, "outside");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_LIST_STYLE_TYPE:
|
||
|
switch (value) {
|
||
|
case LIST_STYLE_TYPE_DISC:
|
||
|
*ptr += sprintf(*ptr, "disc");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_CIRCLE:
|
||
|
*ptr += sprintf(*ptr, "circle");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_SQUARE:
|
||
|
*ptr += sprintf(*ptr, "square");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_DECIMAL:
|
||
|
*ptr += sprintf(*ptr, "decimal");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO:
|
||
|
*ptr += sprintf(*ptr, "decimal-leading-zero");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_ROMAN:
|
||
|
*ptr += sprintf(*ptr, "lower-roman");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_ROMAN:
|
||
|
*ptr += sprintf(*ptr, "upper-roman");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_GREEK:
|
||
|
*ptr += sprintf(*ptr, "lower-greek");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_LATIN:
|
||
|
*ptr += sprintf(*ptr, "lower-latin");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_LATIN:
|
||
|
*ptr += sprintf(*ptr, "upper-latin");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_ARMENIAN:
|
||
|
*ptr += sprintf(*ptr, "armenian");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_GEORGIAN:
|
||
|
*ptr += sprintf(*ptr, "georgian");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_LOWER_ALPHA:
|
||
|
*ptr += sprintf(*ptr, "lower-alpha");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_UPPER_ALPHA:
|
||
|
*ptr += sprintf(*ptr, "upper-alpha");
|
||
|
break;
|
||
|
case LIST_STYLE_TYPE_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_MAX_HEIGHT:
|
||
|
case CSS_PROP_MAX_WIDTH:
|
||
|
assert(MAX_HEIGHT_SET ==
|
||
|
(enum op_max_height)
|
||
|
MAX_WIDTH_SET);
|
||
|
assert(MAX_HEIGHT_NONE ==
|
||
|
(enum op_max_height)
|
||
|
MAX_WIDTH_NONE);
|
||
|
|
||
|
switch (value) {
|
||
|
case MAX_HEIGHT_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case MAX_HEIGHT_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_OPACITY:
|
||
|
switch (value) {
|
||
|
case OPACITY_SET:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_PADDING_TOP:
|
||
|
case CSS_PROP_PADDING_RIGHT:
|
||
|
case CSS_PROP_PADDING_BOTTOM:
|
||
|
case CSS_PROP_PADDING_LEFT:
|
||
|
case CSS_PROP_MIN_HEIGHT:
|
||
|
case CSS_PROP_MIN_WIDTH:
|
||
|
case CSS_PROP_PAUSE_AFTER:
|
||
|
case CSS_PROP_PAUSE_BEFORE:
|
||
|
case CSS_PROP_TEXT_INDENT:
|
||
|
assert(MIN_HEIGHT_SET ==
|
||
|
(enum op_min_height)
|
||
|
MIN_WIDTH_SET);
|
||
|
assert(MIN_HEIGHT_SET ==
|
||
|
(enum op_min_height)
|
||
|
PADDING_SET);
|
||
|
assert(MIN_HEIGHT_SET ==
|
||
|
(enum op_min_height)
|
||
|
PAUSE_AFTER_SET);
|
||
|
assert(MIN_HEIGHT_SET ==
|
||
|
(enum op_min_height)
|
||
|
PAUSE_BEFORE_SET);
|
||
|
assert(MIN_HEIGHT_SET ==
|
||
|
(enum op_min_height)
|
||
|
TEXT_INDENT_SET);
|
||
|
|
||
|
switch (value) {
|
||
|
case MIN_HEIGHT_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_ORPHANS:
|
||
|
case CSS_PROP_PITCH_RANGE:
|
||
|
case CSS_PROP_RICHNESS:
|
||
|
case CSS_PROP_STRESS:
|
||
|
case CSS_PROP_WIDOWS:
|
||
|
assert(ORPHANS_SET ==
|
||
|
(enum op_orphans)
|
||
|
PITCH_RANGE_SET);
|
||
|
assert(ORPHANS_SET ==
|
||
|
(enum op_orphans)
|
||
|
RICHNESS_SET);
|
||
|
assert(ORPHANS_SET ==
|
||
|
(enum op_orphans)
|
||
|
STRESS_SET);
|
||
|
assert(ORPHANS_SET ==
|
||
|
(enum op_orphans)
|
||
|
WIDOWS_SET);
|
||
|
|
||
|
switch (value) {
|
||
|
case ORPHANS_SET:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_OUTLINE_COLOR:
|
||
|
switch (value) {
|
||
|
case OUTLINE_COLOR_TRANSPARENT:
|
||
|
*ptr += sprintf(*ptr, "transparent");
|
||
|
break;
|
||
|
case OUTLINE_COLOR_CURRENT_COLOR:
|
||
|
*ptr += sprintf(*ptr, "currentColor");
|
||
|
break;
|
||
|
case OUTLINE_COLOR_SET:
|
||
|
{
|
||
|
uint32_t colour =
|
||
|
*((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(colour));
|
||
|
*ptr += sprintf(*ptr, "#%08x", colour);
|
||
|
}
|
||
|
break;
|
||
|
case OUTLINE_COLOR_INVERT:
|
||
|
*ptr += sprintf(*ptr, "invert");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_OVERFLOW:
|
||
|
switch (value) {
|
||
|
case OVERFLOW_VISIBLE:
|
||
|
*ptr += sprintf(*ptr, "visible");
|
||
|
break;
|
||
|
case OVERFLOW_HIDDEN:
|
||
|
*ptr += sprintf(*ptr, "hidden");
|
||
|
break;
|
||
|
case OVERFLOW_SCROLL:
|
||
|
*ptr += sprintf(*ptr, "scroll");
|
||
|
break;
|
||
|
case OVERFLOW_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_PAGE_BREAK_AFTER:
|
||
|
case CSS_PROP_PAGE_BREAK_BEFORE:
|
||
|
assert(PAGE_BREAK_AFTER_AUTO ==
|
||
|
(enum op_page_break_after)
|
||
|
PAGE_BREAK_BEFORE_AUTO);
|
||
|
assert(PAGE_BREAK_AFTER_ALWAYS ==
|
||
|
(enum op_page_break_after)
|
||
|
PAGE_BREAK_BEFORE_ALWAYS);
|
||
|
assert(PAGE_BREAK_AFTER_AVOID ==
|
||
|
(enum op_page_break_after)
|
||
|
PAGE_BREAK_BEFORE_AVOID);
|
||
|
assert(PAGE_BREAK_AFTER_LEFT ==
|
||
|
(enum op_page_break_after)
|
||
|
PAGE_BREAK_BEFORE_LEFT);
|
||
|
assert(PAGE_BREAK_AFTER_RIGHT ==
|
||
|
(enum op_page_break_after)
|
||
|
PAGE_BREAK_BEFORE_RIGHT);
|
||
|
|
||
|
switch (value) {
|
||
|
case PAGE_BREAK_AFTER_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case PAGE_BREAK_AFTER_ALWAYS:
|
||
|
*ptr += sprintf(*ptr, "always");
|
||
|
break;
|
||
|
case PAGE_BREAK_AFTER_AVOID:
|
||
|
*ptr += sprintf(*ptr, "avoid");
|
||
|
break;
|
||
|
case PAGE_BREAK_AFTER_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
case PAGE_BREAK_AFTER_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_PAGE_BREAK_INSIDE:
|
||
|
switch (value) {
|
||
|
case PAGE_BREAK_INSIDE_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case PAGE_BREAK_INSIDE_AVOID:
|
||
|
*ptr += sprintf(*ptr, "avoid");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_PITCH:
|
||
|
switch (value) {
|
||
|
case PITCH_FREQUENCY:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case PITCH_X_LOW:
|
||
|
*ptr += sprintf(*ptr, "x-low");
|
||
|
break;
|
||
|
case PITCH_LOW:
|
||
|
*ptr += sprintf(*ptr, "low");
|
||
|
break;
|
||
|
case PITCH_MEDIUM:
|
||
|
*ptr += sprintf(*ptr, "medium");
|
||
|
break;
|
||
|
case PITCH_HIGH:
|
||
|
*ptr += sprintf(*ptr, "high");
|
||
|
break;
|
||
|
case PITCH_X_HIGH:
|
||
|
*ptr += sprintf(*ptr, "x-high");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_PLAY_DURING:
|
||
|
switch (value) {
|
||
|
case PLAY_DURING_URI:
|
||
|
{
|
||
|
uint32_t snum = *((uint32_t *) bytecode);
|
||
|
lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, "'%.*s'",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
}
|
||
|
break;
|
||
|
case PLAY_DURING_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case PLAY_DURING_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (value & PLAY_DURING_MIX)
|
||
|
*ptr += sprintf(*ptr, " mix");
|
||
|
if (value & PLAY_DURING_REPEAT)
|
||
|
*ptr += sprintf(*ptr, " repeat");
|
||
|
break;
|
||
|
case CSS_PROP_POSITION:
|
||
|
switch (value) {
|
||
|
case POSITION_STATIC:
|
||
|
*ptr += sprintf(*ptr, "static");
|
||
|
break;
|
||
|
case POSITION_RELATIVE:
|
||
|
*ptr += sprintf(*ptr, "relative");
|
||
|
break;
|
||
|
case POSITION_ABSOLUTE:
|
||
|
*ptr += sprintf(*ptr, "absolute");
|
||
|
break;
|
||
|
case POSITION_FIXED:
|
||
|
*ptr += sprintf(*ptr, "fixed");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_QUOTES:
|
||
|
switch (value) {
|
||
|
case QUOTES_STRING:
|
||
|
while (value != QUOTES_NONE) {
|
||
|
uint32_t snum = *((uint32_t *) bytecode);
|
||
|
lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, " '%.*s' ",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(he));
|
||
|
*ptr += sprintf(*ptr, " '%.*s' ",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
|
||
|
value = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(value));
|
||
|
}
|
||
|
break;
|
||
|
case QUOTES_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_SPEAK_HEADER:
|
||
|
switch (value) {
|
||
|
case SPEAK_HEADER_ONCE:
|
||
|
*ptr += sprintf(*ptr, "once");
|
||
|
break;
|
||
|
case SPEAK_HEADER_ALWAYS:
|
||
|
*ptr += sprintf(*ptr, "always");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_SPEAK_NUMERAL:
|
||
|
switch (value) {
|
||
|
case SPEAK_NUMERAL_DIGITS:
|
||
|
*ptr += sprintf(*ptr, "digits");
|
||
|
break;
|
||
|
case SPEAK_NUMERAL_CONTINUOUS:
|
||
|
*ptr += sprintf(*ptr, "continuous");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_SPEAK_PUNCTUATION:
|
||
|
switch (value) {
|
||
|
case SPEAK_PUNCTUATION_CODE:
|
||
|
*ptr += sprintf(*ptr, "code");
|
||
|
break;
|
||
|
case SPEAK_PUNCTUATION_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_SPEAK:
|
||
|
switch (value) {
|
||
|
case SPEAK_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case SPEAK_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
case SPEAK_SPELL_OUT:
|
||
|
*ptr += sprintf(*ptr, "spell-out");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_SPEECH_RATE:
|
||
|
switch (value) {
|
||
|
case SPEECH_RATE_SET:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case SPEECH_RATE_X_SLOW:
|
||
|
*ptr += sprintf(*ptr, "x-slow");
|
||
|
break;
|
||
|
case SPEECH_RATE_SLOW:
|
||
|
*ptr += sprintf(*ptr, "slow");
|
||
|
break;
|
||
|
case SPEECH_RATE_MEDIUM:
|
||
|
*ptr += sprintf(*ptr, "medium");
|
||
|
break;
|
||
|
case SPEECH_RATE_FAST:
|
||
|
*ptr += sprintf(*ptr, "fast");
|
||
|
break;
|
||
|
case SPEECH_RATE_X_FAST:
|
||
|
*ptr += sprintf(*ptr, "x-fast");
|
||
|
break;
|
||
|
case SPEECH_RATE_FASTER:
|
||
|
*ptr += sprintf(*ptr, "faster");
|
||
|
break;
|
||
|
case SPEECH_RATE_SLOWER:
|
||
|
*ptr += sprintf(*ptr, "slower");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_TABLE_LAYOUT:
|
||
|
switch (value) {
|
||
|
case TABLE_LAYOUT_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
case TABLE_LAYOUT_FIXED:
|
||
|
*ptr += sprintf(*ptr, "fixed");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_TEXT_ALIGN:
|
||
|
switch (value) {
|
||
|
case TEXT_ALIGN_LEFT:
|
||
|
*ptr += sprintf(*ptr, "left");
|
||
|
break;
|
||
|
case TEXT_ALIGN_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "right");
|
||
|
break;
|
||
|
case TEXT_ALIGN_CENTER:
|
||
|
*ptr += sprintf(*ptr, "center");
|
||
|
break;
|
||
|
case TEXT_ALIGN_JUSTIFY:
|
||
|
*ptr += sprintf(*ptr, "justify");
|
||
|
break;
|
||
|
case TEXT_ALIGN_LIBCSS_LEFT:
|
||
|
*ptr += sprintf(*ptr, "-libcss-left");
|
||
|
break;
|
||
|
case TEXT_ALIGN_LIBCSS_CENTER:
|
||
|
*ptr += sprintf(*ptr, "-libcss-center");
|
||
|
break;
|
||
|
case TEXT_ALIGN_LIBCSS_RIGHT:
|
||
|
*ptr += sprintf(*ptr, "-libcss-right");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_TEXT_DECORATION:
|
||
|
if (value == TEXT_DECORATION_NONE)
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
|
||
|
if (value & TEXT_DECORATION_UNDERLINE)
|
||
|
*ptr += sprintf(*ptr, " underline");
|
||
|
if (value & TEXT_DECORATION_OVERLINE)
|
||
|
*ptr += sprintf(*ptr, " overline");
|
||
|
if (value & TEXT_DECORATION_LINE_THROUGH)
|
||
|
*ptr += sprintf(*ptr, " line-through");
|
||
|
if (value & TEXT_DECORATION_BLINK)
|
||
|
*ptr += sprintf(*ptr, " blink");
|
||
|
break;
|
||
|
case CSS_PROP_TEXT_TRANSFORM:
|
||
|
switch (value) {
|
||
|
case TEXT_TRANSFORM_CAPITALIZE:
|
||
|
*ptr += sprintf(*ptr, "capitalize");
|
||
|
break;
|
||
|
case TEXT_TRANSFORM_UPPERCASE:
|
||
|
*ptr += sprintf(*ptr, "uppercase");
|
||
|
break;
|
||
|
case TEXT_TRANSFORM_LOWERCASE:
|
||
|
*ptr += sprintf(*ptr, "lowercase");
|
||
|
break;
|
||
|
case TEXT_TRANSFORM_NONE:
|
||
|
*ptr += sprintf(*ptr, "none");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_UNICODE_BIDI:
|
||
|
switch (value) {
|
||
|
case UNICODE_BIDI_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case UNICODE_BIDI_EMBED:
|
||
|
*ptr += sprintf(*ptr, "embed");
|
||
|
break;
|
||
|
case UNICODE_BIDI_BIDI_OVERRIDE:
|
||
|
*ptr += sprintf(*ptr, "bidi-override");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_VERTICAL_ALIGN:
|
||
|
switch (value) {
|
||
|
case VERTICAL_ALIGN_SET:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_BASELINE:
|
||
|
*ptr += sprintf(*ptr, "baseline");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_SUB:
|
||
|
*ptr += sprintf(*ptr, "sub");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_SUPER:
|
||
|
*ptr += sprintf(*ptr, "super");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_TOP:
|
||
|
*ptr += sprintf(*ptr, "top");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_TEXT_TOP:
|
||
|
*ptr += sprintf(*ptr, "text-top");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_MIDDLE:
|
||
|
*ptr += sprintf(*ptr, "middle");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_BOTTOM:
|
||
|
*ptr += sprintf(*ptr, "bottom");
|
||
|
break;
|
||
|
case VERTICAL_ALIGN_TEXT_BOTTOM:
|
||
|
*ptr += sprintf(*ptr, "text-bottom");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_VISIBILITY:
|
||
|
switch (value) {
|
||
|
case VISIBILITY_VISIBLE:
|
||
|
*ptr += sprintf(*ptr, "visible");
|
||
|
break;
|
||
|
case VISIBILITY_HIDDEN:
|
||
|
*ptr += sprintf(*ptr, "hidden");
|
||
|
break;
|
||
|
case VISIBILITY_COLLAPSE:
|
||
|
*ptr += sprintf(*ptr, "collapse");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_VOICE_FAMILY:
|
||
|
while (value != VOICE_FAMILY_END) {
|
||
|
switch (value) {
|
||
|
case VOICE_FAMILY_STRING:
|
||
|
case VOICE_FAMILY_IDENT_LIST:
|
||
|
{
|
||
|
uint32_t snum = *((uint32_t *) bytecode);
|
||
|
lwc_string *he;
|
||
|
css__stylesheet_string_get(style->sheet, snum, &he);
|
||
|
ADVANCE(sizeof(snum));
|
||
|
*ptr += sprintf(*ptr, "'%.*s'",
|
||
|
(int) lwc_string_length(he),
|
||
|
lwc_string_data(he));
|
||
|
}
|
||
|
break;
|
||
|
case VOICE_FAMILY_MALE:
|
||
|
*ptr += sprintf(*ptr, "male");
|
||
|
break;
|
||
|
case VOICE_FAMILY_FEMALE:
|
||
|
*ptr += sprintf(*ptr, "female");
|
||
|
break;
|
||
|
case VOICE_FAMILY_CHILD:
|
||
|
*ptr += sprintf(*ptr, "child");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
value = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(value));
|
||
|
|
||
|
if (value != VOICE_FAMILY_END)
|
||
|
*ptr += sprintf(*ptr, ", ");
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_VOLUME:
|
||
|
switch (value) {
|
||
|
case VOLUME_NUMBER:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case VOLUME_DIMENSION:
|
||
|
{
|
||
|
uint32_t unit;
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
unit = *((uint32_t *) bytecode);
|
||
|
ADVANCE(sizeof(unit));
|
||
|
dump_unit(val, unit, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case VOLUME_SILENT:
|
||
|
*ptr += sprintf(*ptr, "silent");
|
||
|
break;
|
||
|
case VOLUME_X_SOFT:
|
||
|
*ptr += sprintf(*ptr, "x-soft");
|
||
|
break;
|
||
|
case VOLUME_SOFT:
|
||
|
*ptr += sprintf(*ptr, "soft");
|
||
|
break;
|
||
|
case VOLUME_MEDIUM:
|
||
|
*ptr += sprintf(*ptr, "medium");
|
||
|
break;
|
||
|
case VOLUME_LOUD:
|
||
|
*ptr += sprintf(*ptr, "loud");
|
||
|
break;
|
||
|
case VOLUME_X_LOUD:
|
||
|
*ptr += sprintf(*ptr, "x-loud");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_WHITE_SPACE:
|
||
|
switch (value) {
|
||
|
case WHITE_SPACE_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case WHITE_SPACE_PRE:
|
||
|
*ptr += sprintf(*ptr, "pre");
|
||
|
break;
|
||
|
case WHITE_SPACE_NOWRAP:
|
||
|
*ptr += sprintf(*ptr, "nowrap");
|
||
|
break;
|
||
|
case WHITE_SPACE_PRE_WRAP:
|
||
|
*ptr += sprintf(*ptr, "pre-wrap");
|
||
|
break;
|
||
|
case WHITE_SPACE_PRE_LINE:
|
||
|
*ptr += sprintf(*ptr, "pre-line");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case CSS_PROP_Z_INDEX:
|
||
|
switch (value) {
|
||
|
case Z_INDEX_SET:
|
||
|
{
|
||
|
css_fixed val = *((css_fixed *) bytecode);
|
||
|
ADVANCE(sizeof(val));
|
||
|
dump_number(val, ptr);
|
||
|
}
|
||
|
break;
|
||
|
case Z_INDEX_AUTO:
|
||
|
*ptr += sprintf(*ptr, "auto");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
*ptr += sprintf(*ptr, "Unknown opcode %x", op);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (isImportant(opv))
|
||
|
*ptr += sprintf(*ptr, " !important");
|
||
|
|
||
|
*ptr += sprintf(*ptr, "\n");
|
||
|
}
|
||
|
|
||
|
#undef ADVANCE
|
||
|
|
||
|
}
|
||
|
|
||
|
void dump_string(lwc_string *string, char **ptr)
|
||
|
{
|
||
|
*ptr += sprintf(*ptr, "%.*s",
|
||
|
(int) lwc_string_length(string),
|
||
|
lwc_string_data(string));
|
||
|
}
|
||
|
|
||
|
void dump_font_face(css_font_face *font_face, char **ptr)
|
||
|
{
|
||
|
uint8_t style, weight;
|
||
|
|
||
|
if (font_face->font_family != NULL) {
|
||
|
*(*ptr)++ = '\n';
|
||
|
*ptr += sprintf(*ptr, "| font-family: %.*s",
|
||
|
(int) lwc_string_length(font_face->font_family),
|
||
|
lwc_string_data(font_face->font_family));
|
||
|
}
|
||
|
|
||
|
*ptr += sprintf(*ptr, "\n| font-style: ");
|
||
|
style = css_font_face_font_style(font_face);
|
||
|
switch (style) {
|
||
|
case CSS_FONT_STYLE_INHERIT:
|
||
|
*ptr += sprintf(*ptr, "unspecified");
|
||
|
break;
|
||
|
case CSS_FONT_STYLE_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case CSS_FONT_STYLE_ITALIC:
|
||
|
*ptr += sprintf(*ptr, "italic");
|
||
|
break;
|
||
|
case CSS_FONT_STYLE_OBLIQUE:
|
||
|
*ptr += sprintf(*ptr, "oblique");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*ptr += sprintf(*ptr, "\n| font-weight: ");
|
||
|
weight = css_font_face_font_weight(font_face);
|
||
|
switch (weight) {
|
||
|
case CSS_FONT_WEIGHT_INHERIT:
|
||
|
*ptr += sprintf(*ptr, "unspecified");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_NORMAL:
|
||
|
*ptr += sprintf(*ptr, "normal");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_BOLD:
|
||
|
*ptr += sprintf(*ptr, "bold");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_100:
|
||
|
*ptr += sprintf(*ptr, "100");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_200:
|
||
|
*ptr += sprintf(*ptr, "200");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_300:
|
||
|
*ptr += sprintf(*ptr, "300");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_400:
|
||
|
*ptr += sprintf(*ptr, "400");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_500:
|
||
|
*ptr += sprintf(*ptr, "500");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_600:
|
||
|
*ptr += sprintf(*ptr, "600");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_700:
|
||
|
*ptr += sprintf(*ptr, "700");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_800:
|
||
|
*ptr += sprintf(*ptr, "800");
|
||
|
break;
|
||
|
case CSS_FONT_WEIGHT_900:
|
||
|
*ptr += sprintf(*ptr, "900");
|
||
|
break;
|
||
|
default:
|
||
|
*ptr += sprintf(*ptr, "Unhandled weight %d\n", (int)weight);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (font_face->srcs != NULL) {
|
||
|
uint32_t i;
|
||
|
css_font_face_src *srcs = font_face->srcs;
|
||
|
for (i = 0; i < font_face->n_srcs; ++i) {
|
||
|
*ptr += sprintf(*ptr, "\n| src: ");
|
||
|
|
||
|
css_font_face_format format =
|
||
|
css_font_face_src_format(&srcs[i]);
|
||
|
|
||
|
*ptr += sprintf(*ptr, "\n| format: ");
|
||
|
|
||
|
switch (format) {
|
||
|
case CSS_FONT_FACE_FORMAT_UNSPECIFIED:
|
||
|
*ptr += sprintf(*ptr, "unspecified");
|
||
|
break;
|
||
|
case CSS_FONT_FACE_FORMAT_WOFF:
|
||
|
*ptr += sprintf(*ptr, "WOFF");
|
||
|
break;
|
||
|
case CSS_FONT_FACE_FORMAT_OPENTYPE:
|
||
|
*ptr += sprintf(*ptr, "OTF");
|
||
|
break;
|
||
|
case CSS_FONT_FACE_FORMAT_EMBEDDED_OPENTYPE:
|
||
|
*ptr += sprintf(*ptr, "EOTF");
|
||
|
break;
|
||
|
case CSS_FONT_FACE_FORMAT_SVG:
|
||
|
*ptr += sprintf(*ptr, "SVG");
|
||
|
break;
|
||
|
case CSS_FONT_FACE_FORMAT_UNKNOWN:
|
||
|
*ptr += sprintf(*ptr, "unknown");
|
||
|
break;
|
||
|
default:
|
||
|
*ptr += sprintf(*ptr, "UNEXPECTED");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (srcs[i].location != NULL) {
|
||
|
*ptr += sprintf(*ptr, "\n| location: ");
|
||
|
|
||
|
switch (css_font_face_src_location_type(
|
||
|
&srcs[i])) {
|
||
|
case CSS_FONT_FACE_LOCATION_TYPE_LOCAL:
|
||
|
*ptr += sprintf(*ptr, "local");
|
||
|
break;
|
||
|
case CSS_FONT_FACE_LOCATION_TYPE_URI:
|
||
|
*ptr += sprintf(*ptr, "url");
|
||
|
break;
|
||
|
default:
|
||
|
*ptr += sprintf(*ptr, "UNKNOWN");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*ptr += sprintf(*ptr, "(%.*s)",
|
||
|
(int) lwc_string_length(
|
||
|
srcs[i].location),
|
||
|
lwc_string_data(srcs[i].location));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|