aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-07 20:47:42 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-07 20:47:42 +0100
commit8ab7dd2af3b0230112fbdd552f9461dda6371cea (patch)
tree961d4410226e4fe4c48d71abc85d5a7b4863b5ef
parent7cd57f638232a8a066d257de0e032ae9682cbd62 (diff)
make CssProperty::Value a union of int and char*
-rw-r--r--src/css.cc46
-rw-r--r--src/css.hh28
-rw-r--r--src/html.cc30
-rw-r--r--src/styleengine.cc28
-rw-r--r--src/table.cc9
5 files changed, 59 insertions, 82 deletions
diff --git a/src/css.cc b/src/css.cc
index d40a281e..3f036f5e 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -14,6 +14,8 @@
#include "html_common.hh"
#include "css.hh"
+using namespace dw::core::style;
+
/** \todo dummy only */
CssPropertyList *CssPropertyList::parse (const char *buf) {
return NULL;
@@ -102,58 +104,47 @@ void CssContext::apply (CssPropertyList *props, Doctree *docTree,
CssStyleSheet * CssContext::buildUserAgentStyle () {
CssStyleSheet *s = new CssStyleSheet ();
CssPropertyList *props;
- CssProperty::Value v;
// <a>
props = new CssPropertyList ();
- v.color = 0x0000ff;
- props->set (CssProperty::CSS_PROPERTY_COLOR, v);
- v.textDecoration = dw::core::style::TEXT_DECORATION_UNDERLINE;
- props->set (CssProperty::CSS_PROPERTY_TEXT_DECORATION, v);
- v.cursor = dw::core::style::CURSOR_POINTER;
- props->set (CssProperty::CSS_PROPERTY_CURSOR, v);
+ props->set (CssProperty::CSS_PROPERTY_COLOR, 0x0000ff);
+ props->set (CssProperty::CSS_PROPERTY_TEXT_DECORATION, TEXT_DECORATION_UNDERLINE);
+ props->set (CssProperty::CSS_PROPERTY_CURSOR, CURSOR_POINTER);
s->addRule (new CssSelector(a_Html_tag_index("a"), NULL, NULL), props);
// <b>
props = new CssPropertyList ();
- v.weight = 700;
- props->set (CssProperty::CSS_PROPERTY_FONT_WEIGHT, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_WEIGHT, 700);
s->addRule (new CssSelector(a_Html_tag_index("b"), NULL, NULL), props);
// <i>
props = new CssPropertyList ();
- v.fontStyle = dw::core::style::FONT_STYLE_ITALIC;
- props->set (CssProperty::CSS_PROPERTY_FONT_STYLE, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_STYLE, FONT_STYLE_ITALIC);
s->addRule (new CssSelector(a_Html_tag_index("i"), NULL, NULL), props);
// <h1>
props = new CssPropertyList ();
- v.size = 40;
- props->set (CssProperty::CSS_PROPERTY_FONT_SIZE, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_SIZE, 40);
s->addRule (new CssSelector(a_Html_tag_index("h1"), NULL, NULL), props);
// <h2>
props = new CssPropertyList ();
- v.size = 30;
- props->set (CssProperty::CSS_PROPERTY_FONT_SIZE, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_SIZE, 30);
s->addRule (new CssSelector(a_Html_tag_index("h2"), NULL, NULL), props);
// <h3>
props = new CssPropertyList ();
- v.size = 20;
- props->set (CssProperty::CSS_PROPERTY_FONT_SIZE, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_SIZE, 20);
s->addRule (new CssSelector(a_Html_tag_index("h3"), NULL, NULL), props);
// <ol>
props = new CssPropertyList ();
- v.listStyleType = dw::core::style::LIST_STYLE_TYPE_DECIMAL;
- props->set (CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE, v);
+ props->set (CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE, LIST_STYLE_TYPE_DECIMAL);
s->addRule (new CssSelector(a_Html_tag_index("ol"), NULL, NULL), props);
// <pre>
props = new CssPropertyList ();
- v.name = "DejaVu Sans Mono";
- props->set (CssProperty::CSS_PROPERTY_FONT_FAMILY, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_FAMILY, "DejaVu Sans Mono");
s->addRule (new CssSelector(a_Html_tag_index("pre"), NULL, NULL), props);
return s;
@@ -162,27 +153,22 @@ CssStyleSheet * CssContext::buildUserAgentStyle () {
CssStyleSheet * CssContext::buildUserStyle (bool important) {
CssStyleSheet *s = new CssStyleSheet ();
CssPropertyList *props;
- CssProperty::Value v;
if (! important) {
// <a>
props = new CssPropertyList ();
- v.color = prefs.link_color;
- props->set (CssProperty::CSS_PROPERTY_COLOR, v);
+ props->set (CssProperty::CSS_PROPERTY_COLOR, prefs.link_color);
s->addRule (new CssSelector(a_Html_tag_index("a"), NULL, NULL), props);
// <body>
props = new CssPropertyList ();
- v.name = prefs.vw_fontname;
- props->set (CssProperty::CSS_PROPERTY_FONT_FAMILY, v);
- v.color = prefs.text_color;
- props->set (CssProperty::CSS_PROPERTY_COLOR, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_FAMILY, prefs.vw_fontname);
+ props->set (CssProperty::CSS_PROPERTY_COLOR, prefs.text_color);
s->addRule (new CssSelector(a_Html_tag_index("body"), NULL, NULL), props);
// <pre>
props = new CssPropertyList ();
- v.name = prefs.fw_fontname;
- props->set (CssProperty::CSS_PROPERTY_FONT_FAMILY, v);
+ props->set (CssProperty::CSS_PROPERTY_FONT_FAMILY, prefs.fw_fontname);
s->addRule (new CssSelector(a_Html_tag_index("pre"), NULL, NULL), props);
}
diff --git a/src/css.hh b/src/css.hh
index 9070b646..84eba13a 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -7,22 +7,8 @@
class CssProperty {
public:
typedef union {
- int color;
- dw::core::style::Length length;
- dw::core::style::Cursor cursor;
- dw::core::style::BorderStyle borderStyle;
- dw::core::style::TextAlignType textAlignType;
- dw::core::style::VAlignType valignType;
- dw::core::style::DisplayType displayType;
- dw::core::style::ListStyleType listStyleType;
- dw::core::style::FontStyle fontStyle;
- dw::core::style::TextDecoration textDecoration;
- dw::core::style::WhiteSpace whiteSpace;
- const char *name; /* used for font family */
- int size;
- int weight;
- int x_link;
- int x_img;
+ int intVal;
+ char *strVal;
} Value;
typedef enum {
@@ -125,6 +111,16 @@ class CssPropertyList : public lout::misc::SimpleVector <CssProperty> {
static CssPropertyList *parse (const char *buf);
void set (CssProperty::Name name, CssProperty::Value value);
+ void set (CssProperty::Name name, char *value) {
+ CssProperty::Value v;
+ v.strVal = value;
+ set (name, v);
+ };
+ void set (CssProperty::Name name, int value) {
+ CssProperty::Value v;
+ v.intVal = value;
+ set (name, v);
+ };
void apply (CssPropertyList *props);
};
diff --git a/src/html.cc b/src/html.cc
index f7934365..e840b46c 100644
--- a/src/html.cc
+++ b/src/html.cc
@@ -294,16 +294,16 @@ void a_Html_tag_set_align_attr(DilloHtml *html,
const char *align;
if ((align = a_Html_get_attr(html, tag, tagsize, "align"))) {
- CssProperty::Value v;
+ TextAlignType textAlignType = TEXT_ALIGN_LEFT;
if (dStrcasecmp (align, "left") == 0)
- v.textAlignType = TEXT_ALIGN_LEFT;
+ textAlignType = TEXT_ALIGN_LEFT;
else if (dStrcasecmp (align, "right") == 0)
- v.textAlignType = TEXT_ALIGN_RIGHT;
+ textAlignType = TEXT_ALIGN_RIGHT;
else if (dStrcasecmp (align, "center") == 0)
- v.textAlignType = TEXT_ALIGN_CENTER;
+ textAlignType = TEXT_ALIGN_CENTER;
else if (dStrcasecmp (align, "justify") == 0)
- v.textAlignType = TEXT_ALIGN_JUSTIFY;
+ textAlignType = TEXT_ALIGN_JUSTIFY;
#if 0
else if (dStrcasecmp (align, "char") == 0) {
/* TODO: Actually not supported for <p> etc. */
@@ -322,7 +322,7 @@ void a_Html_tag_set_align_attr(DilloHtml *html,
style_attrs.textAlignChar = '.';
}
#endif
- props->set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, v);
+ props->set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, textAlignType);
}
}
@@ -2456,7 +2456,6 @@ static void Html_tag_open_a(DilloHtml *html, const char *tag, int tagsize)
{
DilloUrl *url;
CssPropertyList props;
- CssProperty::Value propValue;
const char *attrbuf;
/* TODO: add support for MAP with A HREF */
@@ -2471,8 +2470,7 @@ static void Html_tag_open_a(DilloHtml *html, const char *tag, int tagsize)
url = a_Html_url_new(html, attrbuf, NULL, 0);
dReturn_if_fail ( url != NULL );
- propValue.x_link = Html_set_new_link(html, &url);
- props.set (CssProperty::PROPERTY_X_LINK, propValue);
+ props.set (CssProperty::PROPERTY_X_LINK, Html_set_new_link(html, &url));
html->styleEngine->setNonCssProperties (&props);
}
@@ -2623,20 +2621,20 @@ static void Html_tag_open_ol(DilloHtml *html, const char *tag, int tagsize)
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "type"))) {
CssPropertyList props;
- CssProperty::Value v;
+ ListStyleType listStyleType = LIST_STYLE_TYPE_DECIMAL;
if (*attrbuf == '1')
- v.listStyleType = LIST_STYLE_TYPE_DECIMAL;
+ listStyleType = LIST_STYLE_TYPE_DECIMAL;
else if (*attrbuf == 'a')
- v.listStyleType = LIST_STYLE_TYPE_LOWER_ALPHA;
+ listStyleType = LIST_STYLE_TYPE_LOWER_ALPHA;
else if (*attrbuf == 'A')
- v.listStyleType = LIST_STYLE_TYPE_UPPER_ALPHA;
+ listStyleType = LIST_STYLE_TYPE_UPPER_ALPHA;
else if (*attrbuf == 'i')
- v.listStyleType = LIST_STYLE_TYPE_LOWER_ROMAN;
+ listStyleType = LIST_STYLE_TYPE_LOWER_ROMAN;
else if (*attrbuf == 'I')
- v.listStyleType = LIST_STYLE_TYPE_UPPER_ROMAN;
+ listStyleType = LIST_STYLE_TYPE_UPPER_ROMAN;
- props.set (CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE, v);
+ props.set (CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE, listStyleType);
html->styleEngine->setNonCssProperties (&props);
}
diff --git a/src/styleengine.cc b/src/styleengine.cc
index d6b639e7..9123007e 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -95,47 +95,47 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
/* \todo missing cases */
case CssProperty::CSS_PROPERTY_BACKGROUND_COLOR:
attrs->backgroundColor =
- Color::createSimple (layout, p->value.color);
+ Color::createSimple (layout, p->value.intVal);
break;
case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_COLOR:
attrs->borderColor.bottom =
- Color::createSimple (layout, p->value.color);
+ Color::createSimple (layout, p->value.intVal);
break;
case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE:
- attrs->borderStyle.bottom = p->value.borderStyle;
+ attrs->borderStyle.bottom = (BorderStyle) p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_COLOR:
- attrs->color = Color::createSimple (layout, p->value.color);
+ attrs->color = Color::createSimple (layout, p->value.intVal);
break;
case CssProperty::CSS_PROPERTY_CURSOR:
- attrs->cursor = p->value.cursor;
+ attrs->cursor = (Cursor) p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_FONT_FAMILY:
- fontAttrs.name = p->value.name;
+ fontAttrs.name = p->value.strVal;
break;
case CssProperty::CSS_PROPERTY_FONT_SIZE:
- fontAttrs.size = p->value.size;
+ fontAttrs.size = p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_FONT_STYLE:
- fontAttrs.style = p->value.fontStyle;
+ fontAttrs.style = (FontStyle) p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_FONT_WEIGHT:
- fontAttrs.weight = p->value.weight;
+ fontAttrs.weight = p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE:
- attrs->listStyleType = p->value.listStyleType;
+ attrs->listStyleType = (ListStyleType) p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_TEXT_ALIGN:
- attrs->textAlign = p->value.textAlignType;
+ attrs->textAlign = (TextAlignType) p->value.intVal;
break;
case CssProperty::CSS_PROPERTY_TEXT_DECORATION:
- attrs->textDecoration |= p->value.textDecoration;
+ attrs->textDecoration |= p->value.intVal;
break;
case CssProperty::PROPERTY_X_LINK:
- attrs->x_link = p->value.x_link;
+ attrs->x_link = p->value.intVal;
break;
case CssProperty::PROPERTY_X_IMG:
- attrs->x_img = p->value.x_img;
+ attrs->x_img = p->value.intVal;
break;
default:
diff --git a/src/table.cc b/src/table.cc
index 04c98f5f..97f53064 100644
--- a/src/table.cc
+++ b/src/table.cc
@@ -239,7 +239,6 @@ static void Html_tag_open_table_cell(DilloHtml *html,
Style *style;
bool_t new_style;
CssPropertyList props;
- CssProperty::Value v;
switch (S_TOP(html)->table_mode) {
case DILLO_HTML_TABLE_MODE_NONE:
@@ -264,14 +263,12 @@ static void Html_tag_open_table_cell(DilloHtml *html,
/* text style */
if (!S_TOP(html)->cell_text_align_set) {
- v.textAlignType = text_align;
- props.set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, v);
+ props.set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, text_align);
}
if (a_Html_get_attr(html, tag, tagsize, "nowrap"))
- v.whiteSpace = WHITE_SPACE_NOWRAP;
+ props.set (CssProperty::CSS_PROPERTY_WHITE_SPACE, WHITE_SPACE_NOWRAP);
else
- v.whiteSpace = WHITE_SPACE_NORMAL;
- props.set (CssProperty::CSS_PROPERTY_WHITE_SPACE, v);
+ props.set (CssProperty::CSS_PROPERTY_WHITE_SPACE, WHITE_SPACE_NORMAL);
// html->styleEngine->style () =
// Style::create (HT2LT(html), &style_attrs);