aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/fltkviewbase.cc40
-rw-r--r--dw/style.cc3
-rw-r--r--dw/style.hh6
-rw-r--r--src/cssparser.cc7
-rw-r--r--src/styleengine.cc6
5 files changed, 53 insertions, 9 deletions
diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc
index 7d519f05..e39de0c6 100644
--- a/dw/fltkviewbase.cc
+++ b/dw/fltkviewbase.cc
@@ -483,7 +483,7 @@ void FltkWidgetView::drawText (core::style::Font *font,
setfont(ff->font, ff->size);
setcolor(((FltkColor*)color)->colors[shading]);
- if (!font->letterSpacing) {
+ if (!font->letterSpacing && !font->fontVariant) {
drawtext(text, len,
translateCanvasXToViewX (x), translateCanvasYToViewY (y));
} else {
@@ -491,12 +491,38 @@ void FltkWidgetView::drawText (core::style::Font *font,
int viewX = translateCanvasXToViewX (x),
viewY = translateCanvasYToViewY (y);
int curr = 0, next = 0;
-
- while (next < len) {
- next = theLayout->nextGlyph(text, curr);
- drawtext(text + curr, next - curr, viewX, viewY);
- viewX += font->letterSpacing + (int)getwidth(text + curr,next - curr);
- curr = next;
+ char *text2 = NULL;
+
+ if (font->fontVariant == 1) {
+ int sc_fontsize, sc_letterSpacing;
+ sc_fontsize = lout::misc::roundInt(ff->size * 0.78);
+ sc_letterSpacing = lout::misc::roundInt(font->letterSpacing * 0.78);
+ text2 = strdup(text);
+ while(next < len) {
+ next = theLayout->nextGlyph(text, curr);
+ if (isupper(text[curr])) {
+ setfont(ff->font, ff->size);
+ drawtext(text + curr, next - curr, viewX, viewY);
+ viewX += font->letterSpacing;
+ viewX += (int)getwidth(text + curr, next - curr);
+ } else {
+ text2[curr] = toupper(text2[curr]);
+ setfont(ff->font, sc_fontsize);
+ drawtext(text2 + curr, next - curr, viewX, viewY);
+ viewX += sc_letterSpacing;
+ viewX += (int)getwidth(text2 + curr, next - curr);
+ }
+ curr = next;
+ }
+ free(text2);
+ } else {
+ while (next < len) {
+ next = theLayout->nextGlyph(text, curr);
+ drawtext(text + curr, next - curr, viewX, viewY);
+ viewX += font->letterSpacing +
+ (int)getwidth(text + curr,next - curr);
+ curr = next;
+ }
}
}
}
diff --git a/dw/style.cc b/dw/style.cc
index cc58ce28..30597af2 100644
--- a/dw/style.cc
+++ b/dw/style.cc
@@ -269,6 +269,7 @@ bool FontAttrs::equals(object::Object *other)
weight == otherAttrs->weight &&
style == otherAttrs->style &&
letterSpacing == otherAttrs->letterSpacing &&
+ fontVariant == otherAttrs->fontVariant &&
strcmp (name, otherAttrs->name) == 0);
}
@@ -279,6 +280,7 @@ int FontAttrs::hashValue()
h = (h << 5) - h + weight;
h = (h << 5) - h + style;
h = (h << 5) - h + letterSpacing;
+ h = (h << 5) - h + fontVariant;
return h;
}
@@ -294,6 +296,7 @@ void Font::copyAttrs (FontAttrs *attrs)
weight = attrs->weight;
style = attrs->style;
letterSpacing = attrs->letterSpacing;
+ fontVariant = attrs->fontVariant;
}
Font *Font::create0 (Layout *layout, FontAttrs *attrs,
diff --git a/dw/style.hh b/dw/style.hh
index c32476e3..33d42c29 100644
--- a/dw/style.hh
+++ b/dw/style.hh
@@ -293,6 +293,11 @@ enum FontStyle {
FONT_STYLE_OBLIQUE
};
+enum FontVariant {
+ FONT_VARIANT_NORMAL,
+ FONT_VARIANT_SMALL_CAPS
+};
+
enum TextDecoration {
TEXT_DECORATION_NONE = 0,
TEXT_DECORATION_UNDERLINE = 1 << 0,
@@ -558,6 +563,7 @@ public:
int size;
int weight;
int letterSpacing;
+ FontVariant fontVariant;
FontStyle style;
bool equals(lout::object::Object *other);
diff --git a/src/cssparser.cc b/src/cssparser.cc
index 00ba7428..23085352 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -77,6 +77,10 @@ static const char *const Css_font_style_enum_vals[] = {
"normal", "italic", "oblique", NULL
};
+static const char *const Css_font_variant_enum_vals[] = {
+ "normal", "small-caps", NULL
+};
+
static const char *const Css_font_weight_enum_vals[] = {
"bold", "bolder", "light", "lighter", "normal", NULL
};
@@ -169,7 +173,8 @@ const CssPropertyInfo Css_property_info[CSS_PROPERTY_LAST] = {
{"font-size-adjust", {CSS_TYPE_UNUSED}, NULL},
{"font-stretch", {CSS_TYPE_UNUSED}, NULL},
{"font-style", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_font_style_enum_vals},
- {"font-variant", {CSS_TYPE_UNUSED}, NULL},
+ {"font-variant", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED},
+ Css_font_variant_enum_vals},
{"font-weight", {CSS_TYPE_ENUM, CSS_TYPE_FONT_WEIGHT, CSS_TYPE_UNUSED},
Css_font_weight_enum_vals},
{"height", {CSS_TYPE_LENGTH_PERCENTAGE, CSS_TYPE_UNUSED}, NULL},
diff --git a/src/styleengine.cc b/src/styleengine.cc
index 3233b69c..c7820760 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -41,6 +41,7 @@ StyleEngine::StyleEngine (dw::core::Layout *layout) {
font_attrs.weight = 400;
font_attrs.style = FONT_STYLE_NORMAL;
font_attrs.letterSpacing = 0;
+ font_attrs.fontVariant = FONT_VARIANT_NORMAL;
style_attrs.initValues ();
style_attrs.font = Font::create (layout, &font_attrs);
@@ -227,7 +228,7 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
char *c, *fontName;
int lineHeight;
- /* Determine font first so it can be used to resolve relative lenths. */
+ /* Determine font first so it can be used to resolve relative lengths. */
for (int i = 0; i < props->size (); i++) {
CssProperty *p = props->getRef (i);
@@ -363,6 +364,9 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
else if (fontAttrs.letterSpacing < -1000)
fontAttrs.letterSpacing = -1000;
break;
+ case CSS_PROPERTY_FONT_VARIANT:
+ fontAttrs.fontVariant = (FontVariant) p->value.intVal;
+ break;
default:
break;
}