summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/TODO-CSS8
-rw-r--r--css/css.c8
-rw-r--r--css/css.h1
-rw-r--r--css/css_enums2
-rw-r--r--css/ruleset.c20
-rw-r--r--riscos/font.c87
6 files changed, 93 insertions, 33 deletions
diff --git a/Docs/TODO-CSS b/Docs/TODO-CSS
index 285764c1d..5b90cdda8 100644
--- a/Docs/TODO-CSS
+++ b/Docs/TODO-CSS
@@ -1,4 +1,4 @@
-$Id: TODO-CSS,v 1.5 2004/01/28 21:48:10 jmb Exp $
+$Id: TODO-CSS,v 1.6 2004/01/30 22:28:32 jmb Exp $
TODO-CSS file for NetSurf.
@@ -37,13 +37,13 @@ See TODO-HTML for HTML related TODOs.
+ display
- empty-cells
+ float
-= font (style, weight, size, line-spacing)
-= font-family
+= font (style, weight, size, line-spacing, family, variant)
++ font-family
+ font-size
- font-size-adjust
- font-stretch
+ font-style
-- font-variant
++ font-variant
+ font-weight
+ height
- left
diff --git a/css/css.c b/css/css.c
index fe124d612..4d37ddece 100644
--- a/css/css.c
+++ b/css/css.c
@@ -46,6 +46,7 @@ const struct css_style css_base_style = {
CSS_FONT_FAMILY_SANS_SERIF,
CSS_FONT_WEIGHT_NORMAL,
CSS_FONT_STYLE_NORMAL,
+ CSS_FONT_VARIANT_NORMAL,
{ CSS_HEIGHT_AUTO, { 1, CSS_UNIT_EM } },
{ CSS_LINE_HEIGHT_ABSOLUTE, { 1.3 } },
CSS_TEXT_ALIGN_LEFT,
@@ -65,6 +66,7 @@ const struct css_style css_empty_style = {
CSS_FONT_FAMILY_INHERIT,
CSS_FONT_WEIGHT_INHERIT,
CSS_FONT_STYLE_INHERIT,
+ CSS_FONT_VARIANT_INHERIT,
{ CSS_HEIGHT_INHERIT, { 1, CSS_UNIT_EM } },
{ CSS_LINE_HEIGHT_INHERIT, { 1.3 } },
CSS_TEXT_ALIGN_INHERIT,
@@ -84,6 +86,7 @@ const struct css_style css_blank_style = {
CSS_FONT_FAMILY_INHERIT,
CSS_FONT_WEIGHT_INHERIT,
CSS_FONT_STYLE_INHERIT,
+ CSS_FONT_VARIANT_INHERIT,
{ CSS_HEIGHT_AUTO, { 1, CSS_UNIT_EM } },
{ CSS_LINE_HEIGHT_INHERIT, { 1.3 } },
CSS_TEXT_ALIGN_INHERIT,
@@ -658,6 +661,7 @@ void css_dump_style(const struct css_style * const style)
default: fprintf(stderr, "UNKNOWN"); break;
}
fprintf(stderr, " %s", css_font_family_name[style->font_family]);
+ fprintf(stderr, " %s", css_font_variant_name[style->font_variant]);
fprintf(stderr, "; ");
fprintf(stderr, "height: ");
switch (style->height.height) {
@@ -758,6 +762,8 @@ void css_cascade(struct css_style * const style, const struct css_style * const
style->font_style = apply->font_style;
if (apply->font_weight != CSS_FONT_WEIGHT_INHERIT)
style->font_weight = apply->font_weight;
+ if (apply->font_variant != CSS_FONT_VARIANT_INHERIT)
+ style->font_variant = apply->font_variant;
if (apply->height.height != CSS_HEIGHT_INHERIT)
style->height = apply->height;
if (apply->line_height.size != CSS_LINE_HEIGHT_INHERIT)
@@ -831,6 +837,8 @@ void css_merge(struct css_style * const style, const struct css_style * const ap
style->font_style = apply->font_style;
if (apply->font_weight != CSS_FONT_WEIGHT_INHERIT)
style->font_weight = apply->font_weight;
+ if (apply->font_variant != CSS_FONT_VARIANT_INHERIT)
+ style->font_variant = apply->font_variant;
if (apply->height.height != CSS_HEIGHT_INHERIT)
style->height = apply->height;
if (apply->line_height.size != CSS_LINE_HEIGHT_INHERIT)
diff --git a/css/css.h b/css/css.h
index 3c27b0182..545e7e570 100644
--- a/css/css.h
+++ b/css/css.h
@@ -75,6 +75,7 @@ struct css_style {
css_font_family font_family;
css_font_weight font_weight;
css_font_style font_style;
+ css_font_variant font_variant;
struct {
enum { CSS_HEIGHT_INHERIT,
diff --git a/css/css_enums b/css/css_enums
index 9dd77c9c3..c51e8acc7 100644
--- a/css/css_enums
+++ b/css/css_enums
@@ -9,7 +9,7 @@ css_display inherit inline block list-item run-in inline-block table inline-tabl
css_float inherit none left right
css_font_family inherit sans-serif serif monospace cursive fantasy
css_font_style inherit normal italic oblique
-css_font_variant normal smallcaps
+css_font_variant inherit normal small-caps
css_font_weight inherit normal bold bolder lighter 100 200 300 400 500 600 700 800 900
css_letter_spacing normal length
css_list_style_position outside inside
diff --git a/css/ruleset.c b/css/ruleset.c
index 578704af6..6e7de6ba5 100644
--- a/css/ruleset.c
+++ b/css/ruleset.c
@@ -47,6 +47,7 @@ static void parse_font(struct css_style * const s, const struct css_node * v);
static void parse_font_family(struct css_style * const s, const struct css_node * v);
static void parse_font_size(struct css_style * const s, const struct css_node * const v);
static void parse_font_style(struct css_style * const s, const struct css_node * const v);
+static void parse_font_variant(struct css_style * const s, const struct css_node * const v);
static void parse_font_weight(struct css_style * const s, const struct css_node * const v);
static void parse_height(struct css_style * const s, const struct css_node * const v);
static void parse_line_height(struct css_style * const s, const struct css_node * const v);
@@ -70,6 +71,7 @@ static const struct property_entry property_table[] = {
{ "font-family", parse_font_family },
{ "font-size", parse_font_size },
{ "font-style", parse_font_style },
+ { "font-variant", parse_font_variant },
{ "font-weight", parse_font_weight },
{ "height", parse_height },
{ "line-height", parse_line_height },
@@ -399,6 +401,7 @@ void parse_font(struct css_style * const s, const struct css_node * v)
{
css_font_family ff;
css_font_style fs;
+ css_font_variant fv;
css_font_weight fw;
s->font_family = CSS_FONT_FAMILY_SANS_SERIF;
s->font_style = CSS_FONT_STYLE_NORMAL;
@@ -414,13 +417,17 @@ void parse_font(struct css_style * const s, const struct css_node * v)
s->font_family = ff;
break;
}
-
/* font-style, font-variant, or font-weight */
fs = css_font_style_parse(v->data);
if (fs != CSS_FONT_STYLE_UNKNOWN) {
s->font_style = fs;
break;
}
+ fv = css_font_variant_parse(v->data);
+ if (fv != CSS_FONT_VARIANT_UNKNOWN) {
+ s->font_variant = fv;
+ break;
+ }
fw = css_font_weight_parse(v->data);
if (fw != CSS_FONT_WEIGHT_UNKNOWN) {
s->font_weight = fw;
@@ -507,6 +514,16 @@ void parse_font_style(struct css_style * const s, const struct css_node * const
s->font_style = z;
}
+void parse_font_variant(struct css_style * const s, const struct css_node * const v)
+{
+ css_font_variant z;
+ if (v->type != CSS_NODE_IDENT || v->next != 0)
+ return;
+ z = css_font_variant_parse(v->data);
+ if (z != CSS_FONT_VARIANT_UNKNOWN)
+ s->font_variant = z;
+}
+
void parse_font_weight(struct css_style * const s, const struct css_node * const v)
{
css_font_weight z;
@@ -516,6 +533,7 @@ void parse_font_weight(struct css_style * const s, const struct css_node * const
if (z != CSS_FONT_WEIGHT_UNKNOWN)
s->font_weight = z;
}
+
void parse_height(struct css_style * const s, const struct css_node * const v)
{
if (v->type == CSS_NODE_IDENT && strcasecmp(v->data, "auto") == 0)
diff --git a/riscos/font.c b/riscos/font.c
index 9833871c3..70dbea29f 100644
--- a/riscos/font.c
+++ b/riscos/font.c
@@ -23,57 +23,81 @@
#include "netsurf/utils/utils.h"
#define FONT_FAMILIES 5 /* Number of families */
+#define FONT_FACES 8 /* Number of faces */
+
+/* Font Variants */
+#define FONT_SMALLCAPS 4
/* Font Styles */
#define FONT_BOLD 2
#define FONT_SLANTED 1
/* Font families */
-#define FONT_SANS_SERIF 0
-#define FONT_SERIF 4
-#define FONT_MONOSPACE 8
-#define FONT_CURSIVE 12
-#define FONT_FANTASY 16
+#define FONT_SANS_SERIF (0 * FONT_FACES)
+#define FONT_SERIF (1 * FONT_FACES)
+#define FONT_MONOSPACE (2 * FONT_FACES)
+#define FONT_CURSIVE (3 * FONT_FACES)
+#define FONT_FANTASY (4 * FONT_FACES)
/* a font_set is just a linked list of font_data for each face for now */
struct font_set {
- struct font_data *font[FONT_FAMILIES * 4];
+ struct font_data *font[FONT_FAMILIES * FONT_FACES];
};
/** Table of font names.
*
- * font id = font family * 4 + bold * 2 + slanted
+ * font id = font family * 8 + smallcaps * 4 + bold * 2 + slanted
*
* font family: 0 = sans-serif, 1 = serif, 2 = monospace, 3 = cursive
* 4 = fantasy
*/
-const char * const font_table[FONT_FAMILIES * 4] = {
+const char * const font_table[FONT_FAMILIES * FONT_FACES] = {
/* sans-serif */
/*0*/ "Homerton.Medium\\ELatin1",
/*1*/ "Homerton.Medium.Oblique\\ELatin1",
/*2*/ "Homerton.Bold\\ELatin1",
/*3*/ "Homerton.Bold.Oblique\\ELatin1",
+ "Homerton.Medium.SmallCaps\\ELatin1",
+ "Homerton.Medium.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
+ "Homerton.Bold.SmallCaps\\ELatin1",
+ "Homerton.Bold.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
/* serif */
-/*4*/ "Trinity.Medium\\ELatin1",
-/*5*/ "Trinity.Medium.Italic\\ELatin1",
-/*6*/ "Trinity.Bold\\ELatin1",
-/*7*/ "Trinity.Bold.Italic\\ELatin1",
+/*8*/ "Trinity.Medium\\ELatin1",
+/*9*/ "Trinity.Medium.Italic\\ELatin1",
+/*10*/ "Trinity.Bold\\ELatin1",
+/*11*/ "Trinity.Bold.Italic\\ELatin1",
+ "Trinity.Medium.SmallCaps\\ELatin1",
+ "Trinity.Medium.Italic.SmallCaps\\ELatin1",
+ "Trinity.Bold.SmallCaps\\ELatin1",
+ "Trinity.Bold.Italic.SmallCaps\\ELatin1",
/* monospace */
-/*8*/ "Corpus.Medium\\ELatin1",
-/*9*/ "Corpus.Medium.Oblique\\ELatin1",
-/*10*/ "Corpus.Bold\\ELatin1",
-/*11*/ "Corpus.Bold.Oblique\\ELatin1",
+/*16*/ "Corpus.Medium\\ELatin1",
+/*17*/ "Corpus.Medium.Oblique\\ELatin1",
+/*18*/ "Corpus.Bold\\ELatin1",
+/*19*/ "Corpus.Bold.Oblique\\ELatin1",
+ "Corpus.Medium.SmallCaps\\ELatin1",
+ "Corpus.Medium.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
+ "Corpus.Bold.SmallCaps\\ELatin1",
+ "Corpus.Bold.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
/* cursive */
-/*12*/ "Churchill.Medium\\ELatin1",
-/*13*/ "Churchill.Medium\\ELatin1\\M65536 0 13930 65536 0 0",
-/*14*/ "Churchill.Bold\\ELatin1",
-/*15*/ "Churchill.Bold\\ELatin1\\M65536 0 13930 65536 0 0",
+/*24*/ "Churchill.Medium\\ELatin1",
+/*25*/ "Churchill.Medium\\ELatin1\\M65536 0 13930 65536 0 0",
+/*26*/ "Churchill.Bold\\ELatin1",
+/*27*/ "Churchill.Bold\\ELatin1\\M65536 0 13930 65536 0 0",
+ "Churchill.Medium.SmallCaps\\ELatin1",
+ "Churchill.Medium.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
+ "Churchill.Bold.SmallCaps\\ELatin1",
+ "Churchill.Bold.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
/* fantasy */
-/*16*/ "Sassoon.Primary\\ELatin1",
-/*17*/ "Sassoon.Primary\\ELatin1\\M65536 0 13930 65536 0 0",
-/*18*/ "Sassoon.Primary.Bold\\ELatin1",
-/*19*/ "Sassoon.Primary.Bold\\ELatin1\\M65536 0 13930 65536 0 0",
+/*32*/ "Sassoon.Primary\\ELatin1",
+/*33*/ "Sassoon.Primary\\ELatin1\\M65536 0 13930 65536 0 0",
+/*34*/ "Sassoon.Primary.Bold\\ELatin1",
+/*35*/ "Sassoon.Primary.Bold\\ELatin1\\M65536 0 13930 65536 0 0",
+ "Sassoon.Primary.SmallCaps\\ELatin1",
+ "Sassoon.Primary.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
+ "Sassoon.Primary.Bold.SmallCaps\\ELatin1",
+ "Sassoon.Primary.Bold.SmallCaps\\ELatin1\\M65536 0 13930 65536 0 0",
};
@@ -88,7 +112,7 @@ struct font_set *font_new_set()
struct font_set *set = xcalloc(1, sizeof(*set));
unsigned int i;
- for (i = 0; i < FONT_FAMILIES * 4; i++)
+ for (i = 0; i < FONT_FAMILIES * FONT_FACES; i++)
set->font[i] = 0;
return set;
@@ -139,6 +163,14 @@ struct font_data *font_open(struct font_set *set, struct css_style *style)
break;
}
+ switch (style->font_variant) {
+ case CSS_FONT_VARIANT_SMALL_CAPS:
+ f += FONT_SMALLCAPS;
+ break;
+ default:
+ break;
+ }
+
switch (style->font_weight) {
case CSS_FONT_WEIGHT_BOLD:
case CSS_FONT_WEIGHT_600:
@@ -171,7 +203,8 @@ struct font_data *font_open(struct font_set *set, struct css_style *style)
if (error) { /* fall back to Homerton */
LOG(("font_find_font failed; falling back to Homerton"));
- error = xfont_find_font(font_table[f % 4], (int)size, (int)size,
+ error = xfont_find_font(font_table[f % 4],
+ (int)size, (int)size,
0, 0, &handle, 0, 0);
if (error) {
LOG(("%i: %s\n", error->errnum, error->errmess));
@@ -203,7 +236,7 @@ void font_free_set(struct font_set *set)
assert(set != 0);
- for (i = 0; i < FONT_FAMILIES * 4; i++) {
+ for (i = 0; i < FONT_FAMILIES * FONT_FACES; i++) {
for (data = set->font[i]; data != 0; data = next) {
next = data->next;
font_lose_font((font_f)(data->handle));