diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2008-12-24 16:32:25 -0500 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2008-12-24 16:32:25 -0500 |
commit | 1116febb40cb5e5f7eafe97999d1143347819b3f (patch) | |
tree | 3486027fc007348a73746e591b809f7762922e7b /src/cairo-font-face-twin.c | |
parent | 6767673961401c7ab7b92eb8dfbb345efb560741 (diff) | |
download | cairo-1116febb40cb5e5f7eafe97999d1143347819b3f.tar.gz |
[twin] Implement small-caps
Diffstat (limited to 'src/cairo-font-face-twin.c')
-rw-r--r-- | src/cairo-font-face-twin.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/cairo-font-face-twin.c b/src/cairo-font-face-twin.c index b4a271785..f911005e1 100644 --- a/src/cairo-font-face-twin.c +++ b/src/cairo-font-face-twin.c @@ -298,11 +298,6 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, int n_snap_y; } info = {FALSE}; - b = _cairo_twin_outlines + - _cairo_twin_charmap[unlikely (glyph >= ARRAY_LENGTH (_cairo_twin_charmap)) ? 0 : glyph]; - g = twin_glyph_draw(b); - w = twin_glyph_right(b); - cairo_set_tolerance (cr, 0.01); /* Prepare face */ @@ -330,8 +325,8 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, /* lock pen matrix */ cairo_save (cr); - /* left margin */ - cairo_translate (cr, lw, 0); + /* left margin + pen width */ + cairo_translate (cr, lw * 1.5, 0); /* slant */ if (props->slant != CAIRO_FONT_SLANT_NORMAL) { @@ -339,22 +334,32 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, cairo_transform (cr, &shear); } + if (props->smallcaps && glyph >= 'a' && glyph <= 'z') { + glyph += 'A' - 'a'; + cairo_scale (cr, 1, 28. / 42); + } + + b = _cairo_twin_outlines + + _cairo_twin_charmap[unlikely (glyph >= ARRAY_LENGTH (_cairo_twin_charmap)) ? 0 : glyph]; + g = twin_glyph_draw(b); + w = twin_glyph_right(b); gw = FX(w); + /* monospace */ if (props->monospace) { double monow = FX(24); cairo_scale (cr, (monow+lw) / (gw+lw), 1); gw = monow; } - cairo_translate (cr, lw * .5, 0); /* for pen width */ - - metrics->x_advance = gw + lw; - metrics->x_advance += 2 * lw /* XXX 2*x.margin */; + /* advance width */ + metrics->x_advance = gw + lw * 3; /* pen width + margin */ metrics->x_advance *= stretch; if (info.snap) metrics->x_advance = SNAPI (SNAPX (metrics->x_advance)); + + /* glyph shape */ for (;;) { switch (*g++) { case 'M': |