summaryrefslogtreecommitdiff
path: root/src/select/properties.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-02-11 17:16:43 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-02-11 17:16:43 +0000
commit95106ec57637a13990f644f2a0c574164ac9a20a (patch)
tree81f7d50267dca40c871b7956eecb60f96e44a5e0 /src/select/properties.c
parent16666e0d1a9e5f444848f86fef8fc545f0298670 (diff)
downloadlibcss-95106ec57637a13990f644f2a0c574164ac9a20a.tar.gz
libcss-95106ec57637a13990f644f2a0c574164ac9a20a.tar.bz2
Something approximating font-family. This is hideous.
svn path=/trunk/libcss/; revision=6439
Diffstat (limited to 'src/select/properties.c')
-rw-r--r--src/select/properties.c162
1 files changed, 155 insertions, 7 deletions
diff --git a/src/select/properties.c b/src/select/properties.c
index 06f5d18..0999a33 100644
--- a/src/select/properties.c
+++ b/src/select/properties.c
@@ -855,7 +855,8 @@ static css_error cascade_cursor(uint32_t opv, css_style *style,
if (outranks_existing(getOpcode(opv), isImportant(opv), state)) {
return set_cursor(state->result, value, uris);
} else {
- state->result->alloc(uris, 0, state->result->pw);
+ if (n_uris > 0)
+ state->result->alloc(uris, 0, state->result->pw);
}
return CSS_OK;
@@ -1076,20 +1077,167 @@ static css_error initial_float(css_computed_style *style)
static css_error cascade_font_family(uint32_t opv, css_style *style,
css_select_state *state)
{
- UNUSED(opv);
- UNUSED(style);
- UNUSED(state);
+ 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;
+ css_string *temp;
+
+ switch (v) {
+ case FONT_FAMILY_STRING:
+ case FONT_FAMILY_IDENT_LIST:
+ font = *((parserutils_hash_entry **)
+ 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);
+ }
+ 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);
+ }
+ 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);
+ }
+ 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);
+ }
+ 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);
+ }
+ break;
+ }
- /** \todo font-family */
+ 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,
+ state->result->pw);
+ }
+ return CSS_NOMEM;
+ }
+
+ fonts = temp;
+
+ fonts[n_fonts].data = (uint8_t *) font->data;
+ fonts[n_fonts].len = font->len;
+
+ n_fonts++;
+
+ v = *((uint32_t *) style->bytecode);
+ advance_bytecode(style, sizeof(v));
+ }
+ }
+
+ /* Terminate array with blank entry, if needed */
+ if (n_fonts > 0) {
+ css_string *temp;
+
+ temp = state->result->alloc(fonts,
+ (n_fonts + 1) * sizeof(css_string),
+ state->result->pw);
+ if (temp == NULL) {
+ state->result->alloc(fonts, 0, state->result->pw);
+ return CSS_NOMEM;
+ }
+
+ fonts = temp;
+
+ fonts[n_fonts].data = NULL;
+ fonts[n_fonts].len = 0;
+ }
+
+ if (outranks_existing(getOpcode(opv), isImportant(opv), state)) {
+ return set_font_family(state->result, value, fonts);
+ } else {
+ if (n_fonts > 0)
+ state->result->alloc(fonts, 0, state->result->pw);
+ }
return CSS_OK;
}
static css_error initial_font_family(css_computed_style *style)
{
- UNUSED(style);
+ css_string *fonts;
- return CSS_OK;
+ /** \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);
}
static css_error cascade_font_size(uint32_t opv, css_style *style,