Example #1
0
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;
		}
	}
Example #2
0
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);
}