This is the mail archive of the
cygwin-xfree@cygwin.com
mailing list for the Cygwin XFree86 project.
Missing characters from a Type1 font
- From: Arthur Norman <acn1 at cam dot ac dot uk>
- To: cygwin-xfree at cygwin dot com
- Date: Fri, 24 Sep 2004 23:27:52 +0100 (GMT Daylight Time)
- Subject: Missing characters from a Type1 font
- Reply-to: cygwin-xfree at cygwin dot com
I install the AMS "computer modern" type1 fonts (as fetched form any big
TeX archive) and then try to use them. I appear to find that using cygwin
and its X server that the character with code 0xa1 is not displayed when
XDrawString is used. The code is a second-mapping of what would otherwise
be code 0x00, a capital Gamma.
Running exactly the same code on several 32-bit Linux systems causes the
character to be visible (specifically SuSE 9.0 + current updates and
RedHat 6.1). The new fonts were added using "xset fp+" and Delta, Theta
appear ok from 0xa2, 0xa3, so the font can really be accessed. I have some
belief that things fail on SuSE 9.x x86_64 too but can not readily check
that again just now. As short a demo program I have got is a hack of a
Hello World program found on the Web. It should display
X Gamma Y Delta | Theta Lambda Hello, World
but as I say on cygwin the Gamma is just missed out. Have I missed some
fine print in a manual please anybody?
unpack cmps-unix.tar.gz to somwhere
pushd <dir with cm fonts .pfb file>
type1inst
xset fp+ `pwd`
xset fp rehash
popd
gcc hello.c -L/usr/X11R6/lib -lX11 -o hello
./hello
============
/*
* This is basically an X "Hello World" program found in a collection
* of Hello Worlds on the web. I have stripped some comments to reduce
* bulk
*/
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#define STRING "X\x00Y\x01Z\x02\x03Hello, world"
#define STRING "X\xa1Y\xa2Z\xa3\xa4Hello,\xa0world"
#define STRINGlength 19
#define BORDER 1
#define FONT "-unknown-cmr17-medium-r-normal--40-0-0-0-p-0-adobe-fontspecific"
XWMHints xwmh = {
(InputHint|StateHint), /* flags */
False, /* input */
NormalState, /* initial_state */
0, /* icon pixmap */
0, /* icon window */
0, 0, /* icon location */
0, /* icon mask */
0, /* Window group */
};
main(argc,argv)
int argc;
char **argv;
{
Display *dpy; /* X server connection */
Window win; /* Window ID */
GC gc; /* GC to draw with */
XFontStruct *fontstruct; /* Font descriptor */
unsigned long fth, pad; /* Font size parameters */
unsigned long fg, bg, bd; /* Pixel values */
unsigned long bw; /* Border width */
XGCValues gcv; /* Struct for creating GC */
XEvent event; /* Event received */
XSizeHints xsh; /* Size hints for window manager */
char *geomSpec; /* Window geometry string */
XSetWindowAttributes xswa; /* Temporary Set Window Attribute struct */
if ((dpy = XOpenDisplay(NULL)) == NULL) {
fprintf(stderr, "%s: can't open %s\en", argv[0], XDisplayName(NULL));
exit(1);
}
if ((fontstruct = XLoadQueryFont(dpy, FONT)) == NULL) {
fprintf(stderr, "%s: display %s doesn't know font %s\en",
argv[0], DisplayString(dpy), FONT);
exit(1);
}
fth = fontstruct->max_bounds.ascent + fontstruct->max_bounds.descent;
bd = BlackPixel(dpy, DefaultScreen(dpy));
bg = WhitePixel(dpy, DefaultScreen(dpy));
fg = BlackPixel(dpy, DefaultScreen(dpy));
pad = BORDER;
bw = 8;
xsh.flags = (PPosition | PSize);
xsh.height = fth + pad * 2;
xsh.width = XTextWidth(fontstruct, STRING, STRINGlength) + pad * 2;
xsh.x = (DisplayWidth(dpy, DefaultScreen(dpy)) - xsh.width) / 2;
xsh.y = (DisplayHeight(dpy, DefaultScreen(dpy)) - xsh.height) / 2;
win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
xsh.x, xsh.y, xsh.width, xsh.height,
bw, bd, bg);
XSetStandardProperties(dpy, win, STRING, STRING, None, argv, argc, &xsh);
XSetWMHints(dpy, win, &xwmh);
xswa.colormap = DefaultColormap(dpy, DefaultScreen(dpy));
xswa.bit_gravity = CenterGravity;
XChangeWindowAttributes(dpy, win, (CWColormap | CWBitGravity), &xswa);
gcv.font = fontstruct->fid;
gcv.foreground = fg;
gcv.background = bg;
gc = XCreateGC(dpy, win, (GCFont | GCForeground | GCBackground), &gcv);
XSelectInput(dpy, win, ExposureMask);
XMapWindow(dpy, win);
while (1) {
XNextEvent(dpy, &event);
if (event.type == Expose && event.xexpose.count == 0) {
XWindowAttributes xwa; /* Temp Get Window Attribute struct */
int x, y;
while (XCheckTypedEvent(dpy, Expose, &event));
if (XGetWindowAttributes(dpy, win, &xwa) == 0)
break;
x = (xwa.width - XTextWidth(fontstruct, STRING, STRINGlength)) / 2;
y = (xwa.height + fontstruct->max_bounds.ascent
- fontstruct->max_bounds.descent) / 2;
XClearWindow(dpy, win);
/* The next line appears to me to behave oddly */
XDrawString(dpy, win, gc, x, y, STRING, STRINGlength);
}
}
exit(1);
}
============