diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2009-02-11 17:58:24 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2009-02-11 17:58:24 +0000 |
commit | ceafe236c3365978cd8be8db5f4a266e57135fb7 (patch) | |
tree | 9fec8f52f2553915e37015a9b717e25d6e96a15c /src/select | |
parent | 1617f3813486071779fe3ff6c724dcd6ae3f6223 (diff) | |
download | libcss-ceafe236c3365978cd8be8db5f4a266e57135fb7.tar.gz libcss-ceafe236c3365978cd8be8db5f4a266e57135fb7.tar.bz2 |
Rework font-family handler to a) compile and b) reflect the changes made to the font-family representation.
svn path=/trunk/libcss/; revision=6441
Diffstat (limited to 'src/select')
-rw-r--r-- | src/select/properties.c | 117 |
1 files changed, 28 insertions, 89 deletions
diff --git a/src/select/properties.c b/src/select/properties.c index 0999a33..1cfaedc 100644 --- a/src/select/properties.c +++ b/src/select/properties.c @@ -1080,15 +1080,12 @@ static css_error cascade_font_family(uint32_t opv, css_style *style, uint16_t value = CSS_FONT_FAMILY_INHERIT; css_string *fonts = NULL; uint32_t n_fonts = 0; - parserutils_error perror; if (isInherit(opv) == false) { uint32_t v = getValue(opv); - value = CSS_FONT_FAMILY_SET; - while (v != FONT_FAMILY_END) { - const parserutils_hash_entry *font; + const parserutils_hash_entry *font = NULL; css_string *temp; switch (v) { @@ -1098,96 +1095,51 @@ static css_error cascade_font_family(uint32_t opv, css_style *style, style->bytecode); advance_bytecode(style, sizeof(font)); break; - /** \todo This sucks */ case FONT_FAMILY_SERIF: - perror = parserutils_hash_insert( - state->sheet->dictionary, - (const uint8_t *) "serif", - SLEN("serif"), &font); - if (perror != PARSERUTILS_OK) { - if (fonts != NULL) { - state->result->alloc(fonts, 0, - state->result->pw); - } - return css_error_from_parserutils_error( - perror); - } + if (value == CSS_FONT_FAMILY_INHERIT) + value = CSS_FONT_FAMILY_SERIF; break; case FONT_FAMILY_SANS_SERIF: - perror = parserutils_hash_insert( - state->sheet->dictionary, - (const uint8_t *) "sans-serif", - SLEN("sans-serif"), &font); - if (perror != PARSERUTILS_OK) { - if (fonts != NULL) { - state->result->alloc(fonts, 0, - state->result->pw); - } - return css_error_from_parserutils_error( - perror); - } + if (value == CSS_FONT_FAMILY_INHERIT) + value = CSS_FONT_FAMILY_SANS_SERIF; break; case FONT_FAMILY_CURSIVE: - perror = parserutils_hash_insert( - state->sheet->dictionary, - (const uint8_t *) "cursive", - SLEN("cursive"), &font); - if (perror != PARSERUTILS_OK) { - if (fonts != NULL) { - state->result->alloc(fonts, 0, - state->result->pw); - } - return css_error_from_parserutils_error( - perror); - } + if (value == CSS_FONT_FAMILY_INHERIT) + value = CSS_FONT_FAMILY_CURSIVE; break; case FONT_FAMILY_FANTASY: - perror = parserutils_hash_insert( - state->sheet->dictionary, - (const uint8_t *) "fantasy", - SLEN("fantasy"), &font); - if (perror != PARSERUTILS_OK) { - if (fonts != NULL) { - state->result->alloc(fonts, 0, - state->result->pw); - } - return css_error_from_parserutils_error( - perror); - } + if (value == CSS_FONT_FAMILY_INHERIT) + value = CSS_FONT_FAMILY_FANTASY; break; case FONT_FAMILY_MONOSPACE: - perror = parserutils_hash_insert( - state->sheet->dictionary, - (const uint8_t *) "monospace", - SLEN("monospace"), &font); - if (perror != PARSERUTILS_OK) { - if (fonts != NULL) { - state->result->alloc(fonts, 0, - state->result->pw); - } - return css_error_from_parserutils_error( - perror); - } + if (value == CSS_FONT_FAMILY_INHERIT) + value = CSS_FONT_FAMILY_MONOSPACE; break; } - temp = state->result->alloc(fonts, + /* Only use family-names which occur before the first + * generic-family. Any values which occur after the + * first generic-family are ignored. */ + /** \todo Do this at bytecode generation time? */ + if (value == CSS_FONT_FAMILY_INHERIT && font != NULL) { + temp = state->result->alloc(fonts, (n_fonts + 1) * sizeof(css_string), state->result->pw); - if (temp == NULL) { - if (fonts != NULL) { - state->result->alloc(fonts, 0, + if (temp == NULL) { + if (fonts != NULL) { + state->result->alloc(fonts, 0, state->result->pw); + } + return CSS_NOMEM; } - return CSS_NOMEM; - } - fonts = temp; + fonts = temp; - fonts[n_fonts].data = (uint8_t *) font->data; - fonts[n_fonts].len = font->len; + fonts[n_fonts].data = (uint8_t *) font->data; + fonts[n_fonts].len = font->len; - n_fonts++; + n_fonts++; + } v = *((uint32_t *) style->bytecode); advance_bytecode(style, sizeof(v)); @@ -1224,20 +1176,7 @@ static css_error cascade_font_family(uint32_t opv, css_style *style, static css_error initial_font_family(css_computed_style *style) { - css_string *fonts; - - /** \todo This also sucks */ - - fonts = style->alloc(NULL, 2 * sizeof(css_string), style->pw); - if (fonts == NULL) - return CSS_NOMEM; - - fonts[0].data = (uint8_t *) "sans-serif"; - fonts[0].len = SLEN("sans-serif"); - fonts[1].data = NULL; - fonts[1].len = 0; - - return set_font_family(style, CSS_FONT_FAMILY_SET, fonts); + return set_font_family(style, CSS_FONT_FAMILY_DEFAULT, NULL); } static css_error cascade_font_size(uint32_t opv, css_style *style, |