summaryrefslogtreecommitdiff
path: root/src/cairo-font-face-twin.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2008-12-24 03:47:21 -0500
committerBehdad Esfahbod <behdad@behdad.org>2008-12-24 03:48:00 -0500
commit6c1d21bf8947f5b11702626ddfd9bac18073188d (patch)
tree7ade92a40c8f52c353819d1b5c4e0c255c823c76 /src/cairo-font-face-twin.c
parent5def8c587b2b897bfebc6d77a6a3e13355cae2f2 (diff)
downloadcairo-6c1d21bf8947f5b11702626ddfd9bac18073188d.tar.gz
[twin] Implement monospace
Diffstat (limited to 'src/cairo-font-face-twin.c')
-rw-r--r--src/cairo-font-face-twin.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/cairo-font-face-twin.c b/src/cairo-font-face-twin.c
index ade41e6ac..e06bf26b9 100644
--- a/src/cairo-font-face-twin.c
+++ b/src/cairo-font-face-twin.c
@@ -285,6 +285,8 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font,
twin_face_properties_t *props;
const int8_t *b;
const int8_t *g;
+ int8_t w;
+ double lw;
struct {
cairo_bool_t snap;
@@ -297,12 +299,14 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font,
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);
props = cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
&twin_face_properties_key);
cairo_set_tolerance (cr, 0.01);
/* The weight is tuned to match DejaVu Sans' */
- cairo_set_line_width (cr, props->weight * (5.5 / 64 / TWIN_WEIGHT_NORMAL));
+ lw = props->weight * (5.5 / 64 / TWIN_WEIGHT_NORMAL);
+ cairo_set_line_width (cr, lw);
cairo_set_miter_limit (cr, M_SQRT2);
cairo_set_line_join (cr, props->serif ?
@@ -312,6 +316,23 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font,
CAIRO_LINE_CAP_SQUARE :
CAIRO_LINE_CAP_ROUND);
+
+ cairo_translate (cr, lw, 0); /* for margin */
+
+ cairo_save (cr);
+ if (props->monospace) {
+ int8_t monow = 24;
+ cairo_scale (cr, (FX(monow)+lw) / (FX(w)+lw), 1.);
+ w = monow;
+ }
+
+ cairo_translate (cr, lw * .5, 0); /* for pen width */
+
+ metrics->x_advance = FX(w) + lw;
+ metrics->x_advance += 2 * lw /* XXX 2*x.margin */;
+ if (info.snap)
+ metrics->x_advance = SNAPI (SNAPX (metrics->x_advance));
+
for (;;) {
switch (*g++) {
case 'M':
@@ -365,6 +386,7 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font,
cairo_close_path (cr);
/* fall through */
case 'e':
+ cairo_restore (cr);
cairo_stroke (cr);
break;
case 'X':
@@ -374,12 +396,6 @@ twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font,
break;
}
- metrics->x_advance = FX(twin_glyph_right(b)) + cairo_get_line_width (cr);
- metrics->x_advance += 2*cairo_get_line_width (cr)/* XXX 2*x.margin */;
- if (info.snap)
- metrics->x_advance = SNAPI (SNAPX (metrics->x_advance));
-
-
return CAIRO_STATUS_SUCCESS;
}