Missing characters from a Type1 font

Arthur Norman acn1@cam.ac.uk
Fri Sep 24 22:27:00 GMT 2004


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);
}
============



More information about the Cygwin-xfree mailing list