void tex::make_accent () { fnt f; qcell i; ptr p, q, r; scal a, h, w, x; float s, t; scal delta; scan_char_num(); f = cur_font; p = new_character(f, cur_val); if (p != null) { x = x_height(f); s = (float) slant(f) / 65536.0; a = char_width(f, char_info(f, character(p))); do_assignments(); q = null; f = cur_font; if (cur_cmd == LETTER || cur_cmd == OTHER_CHAR || cur_cmd == CHAR_GIVEN) { q = new_character(f, cur_chr); } else if (cur_cmd == CHAR_NUM) { scan_char_num(); q = new_character(f, cur_val); } else { back_input(); } if (q != null) { t = (float) slant(f) / 65536.0; i = char_info(f, character(q)); w = char_width(f, i); h = char_height(f, height_depth(i)); if (h != x) { p = hpack(p, 0, ADDITIONAL); shift_amount(p) = x - h; } delta = round((float) (w - a) / 2.0 + h * t - x * s); r = new_kern(delta); subtype(r) = ACC_KERN; link(tail) = r; link(r) = p; tail = new_kern(-a - delta); subtype(tail) = ACC_KERN; link(p) = tail; p = q; } tail_append(p); space_factor = 1000; } }
static void setlinestyle (wmfAPI* API,wmfDC* dc) { wmf_x_t* ddata = WMF_X_GetData (API); wmfPen* pen = 0; unsigned long color; char* dashes = 0; int dash_len; XGCValues values; pen = WMF_DC_PEN (dc); color = get_color (API,WMF_PEN_COLOR (pen)); switch (WMF_DC_ROP (dc)) { case R2_BLACK: values.foreground = ddata->black; values.function = GXcopy; break; case R2_WHITE: values.foreground = ddata->white; values.function = GXcopy; break; case R2_XORPEN: values.foreground = color; /* It is very unlikely someone wants to XOR with 0 */ /* This fixes the rubber-drawings in paintbrush */ if (values.foreground == 0) { values.foreground = ((ddata->white) ? ddata->white : ddata->black); } values.function = GXxor; break; default: values.foreground = color; values.function = Our_XROPfunction[WMF_DC_ROP (dc) - 1]; break; } switch (WMF_PEN_STYLE (pen)) { case PS_DASH: dashes = (char*) PEN_dash; dash_len = 2; values.line_style = ((WMF_DC_OPAQUE (dc)) ? LineDoubleDash : LineOnOffDash); break; case PS_DOT: dashes = (char*) PEN_dot; dash_len = 2; values.line_style = ((WMF_DC_OPAQUE (dc)) ? LineDoubleDash : LineOnOffDash); break; case PS_DASHDOT: dashes = (char*) PEN_dashdot; dash_len = 4; values.line_style = ((WMF_DC_OPAQUE (dc)) ? LineDoubleDash : LineOnOffDash); break; case PS_DASHDOTDOT: dashes = (char*) PEN_dashdotdot; dash_len = 6; values.line_style = ((WMF_DC_OPAQUE (dc)) ? LineDoubleDash : LineOnOffDash); break; case PS_ALTERNATE: /* FIXME: should be alternating _pixels_ that are set */ dashes = (char*) PEN_alternate; dash_len = 2; values.line_style = ((WMF_DC_OPAQUE (dc)) ? LineDoubleDash : LineOnOffDash); break; case PS_USERSTYLE: /* FIXME */ default: dashes = 0; dash_len = 2; values.line_style = LineSolid; break; } values.fill_style = FillSolid; values.line_width = (int) ceil ( (double) x_width (API,WMF_PEN_WIDTH (pen)) + (double) x_height (API,WMF_PEN_HEIGHT (pen)) ); if (values.line_width < 1) values.line_width = 1; switch (WMF_PEN_ENDCAP (pen)) { case PS_ENDCAP_SQUARE: values.cap_style = CapProjecting; break; case PS_ENDCAP_FLAT: values.cap_style = CapButt; break; case PS_ENDCAP_ROUND: default: values.cap_style = CapRound; break; } switch (WMF_PEN_JOIN (pen)) { case PS_JOIN_BEVEL: values.join_style = JoinBevel; break; case PS_JOIN_MITER: values.join_style = JoinMiter; break; case PS_JOIN_ROUND: default: values.join_style = JoinRound; break; } if (dashes) XSetDashes (ddata->display,ddata->gc,0,dashes,dash_len); values.background = get_color (API,WMF_DC_BACKGROUND (dc)); XChangeGC (ddata->display,ddata->gc, GCFunction | GCForeground | GCLineStyle | GCLineWidth | GCCapStyle | GCBackground | GCJoinStyle | GCFillStyle, &values); }