diff options
-rw-r--r-- | dw/fltkviewbase.cc | 40 | ||||
-rw-r--r-- | dw/style.cc | 3 | ||||
-rw-r--r-- | dw/style.hh | 6 | ||||
-rw-r--r-- | src/cssparser.cc | 7 | ||||
-rw-r--r-- | src/styleengine.cc | 6 |
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; } |