This is the mail archive of the cygwin-xfree@cygwin.com mailing list for the Cygwin XFree86 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Missing characters from a Type1 font


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]