summaryrefslogtreecommitdiff
path: root/css
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2005-04-14 19:54:24 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2005-04-14 19:54:24 +0000
commit487cad486dce950f51c60aee81ba792be1ef2f33 (patch)
tree1327ba6ce314fb76e4a224ecc8385b326b39e60d /css
parent92b2d468740c72094ae47ab1f72995ec60d93ae6 (diff)
downloadnetsurf-487cad486dce950f51c60aee81ba792be1ef2f33.tar.gz
netsurf-487cad486dce950f51c60aee81ba792be1ef2f33.tar.bz2
[project @ 2005-04-14 19:54:24 by rjw]
Implement HTML table border setting. Improve support for the collapsing border model. svn path=/import/netsurf/; revision=1632
Diffstat (limited to 'css')
-rw-r--r--css/css.c80
-rw-r--r--css/css.h15
2 files changed, 90 insertions, 5 deletions
diff --git a/css/css.c b/css/css.c
index c188e7c11..b4948adba 100644
--- a/css/css.c
+++ b/css/css.c
@@ -2864,6 +2864,86 @@ float css_len2px(const struct css_length *length,
}
+/**
+ * Return the most 'eyecatching' border.
+ *
+ * \return the most eyecatching border, favoured towards test2
+ */
+
+struct css_border *css_eyecatching_border(struct css_border *test1,
+ struct css_style *style1, struct css_border *test2,
+ struct css_style *style2)
+{
+ float width1, width2;
+ int impact = 0;
+
+ assert(test1);
+ assert(style1);
+ assert(test2);
+ assert(style2);
+
+ /* hidden border styles always win, none always loses */
+ if ((test1->style == CSS_BORDER_STYLE_HIDDEN) ||
+ (test2->style == CSS_BORDER_STYLE_NONE))
+ return test1;
+ if ((test2->style == CSS_BORDER_STYLE_HIDDEN) ||
+ (test1->style == CSS_BORDER_STYLE_NONE))
+ return test2;
+
+ /* the widest border wins */
+ width1 = css_len2px(&test1->width.value, style1);
+ width2 = css_len2px(&test2->width.value, style2);
+ if (width1 > width2)
+ return test1;
+ if (width2 > width1)
+ return test2;
+
+ /* the closest to a solid line wins */
+ switch (test1->style) {
+ case CSS_BORDER_STYLE_DOUBLE:
+ impact++;
+ case CSS_BORDER_STYLE_SOLID:
+ impact++;
+ case CSS_BORDER_STYLE_DASHED:
+ impact++;
+ case CSS_BORDER_STYLE_DOTTED:
+ impact++;
+ case CSS_BORDER_STYLE_RIDGE:
+ impact++;
+ case CSS_BORDER_STYLE_OUTSET:
+ impact++;
+ case CSS_BORDER_STYLE_GROOVE:
+ impact++;
+ case CSS_BORDER_STYLE_INSET:
+ impact++;
+ default:
+ break;
+ }
+ switch (test2->style) {
+ case CSS_BORDER_STYLE_DOUBLE:
+ impact--;
+ case CSS_BORDER_STYLE_SOLID:
+ impact--;
+ case CSS_BORDER_STYLE_DASHED:
+ impact--;
+ case CSS_BORDER_STYLE_DOTTED:
+ impact--;
+ case CSS_BORDER_STYLE_RIDGE:
+ impact--;
+ case CSS_BORDER_STYLE_OUTSET:
+ impact--;
+ case CSS_BORDER_STYLE_GROOVE:
+ impact--;
+ case CSS_BORDER_STYLE_INSET:
+ impact--;
+ default:
+ break;
+ }
+ if (impact > 0)
+ return test1;
+ return test2;
+}
+
#ifdef DEBUG
int main()
diff --git a/css/css.h b/css/css.h
index d9701cbbe..19b8a8c25 100644
--- a/css/css.h
+++ b/css/css.h
@@ -84,6 +84,12 @@ struct css_border_width {
struct css_length value;
};
+struct css_border {
+ colour color;
+ struct css_border_width width;
+ css_border_style style;
+};
+
typedef enum {
CSS_CONTENT_STRING,
CSS_CONTENT_URI,
@@ -163,11 +169,7 @@ struct css_style {
css_background_repeat background_repeat;
/* borders */
- struct {
- colour color;
- struct css_border_width width;
- css_border_style style;
- } border[4]; /**< top, right, bottom, left */
+ struct css_border border[4]; /**< top, right, bottom, left */
css_border_collapse border_collapse;
struct {
enum { CSS_BORDER_SPACING_INHERIT,
@@ -630,5 +632,8 @@ void css_dump_stylesheet(const struct css_stylesheet * stylesheet);
float css_len2px(const struct css_length *length,
const struct css_style *style);
+struct css_border *css_eyecatching_border(struct css_border *test1,
+ struct css_style *style1, struct css_border *test2,
+ struct css_style *style2);
#endif