|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 9802 (0x264a) Types: TextFile Names: »ttextext.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦2ca9b63e1⟧ »./contrib-1/contrib-1.00« └─⟦a8392fb20⟧ └─⟦this⟧ »contrib/examples/text/ttextext/ttextext.c«
/* * $XConsortium: ttextext.c,v 1.3 89/06/08 09:08:56 jim Exp $ * * Copyright 1989 Massachusetts Institute of Technology * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Jim Fulton, MIT X Consortium */ #include <stdio.h> #include <X11/Xos.h> #include <X11/Xlib.h> #include "mapfile.h" char *ProgramName; char *displayname = NULL; char *filename = NULL; Bool using_temp_file = False; Bool twobytechars = False; Display *dpy = NULL; int error_total = 0, font_total = 0, badfont_total = 0; #define V_OFF 0 #define V_PER_FONT 1 #define V_BAD 2 #define V_PER_STRING 3 int verbose = V_PER_FONT; usage () { fprintf (stderr, "usage: %s [-d dpy] [-2] [-v] [-q] [-file filename] [-fn pattern....]\n", ProgramName); exit (1); } Exit (n) int n; { if (dpy) XCloseDisplay (dpy); if (using_temp_file) unlink (filename); exit (n); } main (argc, argv) int argc; char **argv; { int i; char *cp; ProgramName = argv[0]; for (i = 1; i < argc; i++) { char *arg = argv[i]; if (arg[0] == '-') { switch (arg[1]) { case 'd': if (++i >= argc) usage (); if (dpy) usage (); displayname = argv[i]; continue; case 'f': switch (arg[2]) { case 'i': if (++i >= argc) usage (); if (filename) usage (); filename = argv[i]; continue; case 'n': if (++i >= argc) usage (); for (; i < argc; i++) { doit (argv[i]); } goto done; } usage (); case 'v': for (cp = arg+1; *cp; cp++) { if (*cp == 'v') verbose++; } continue; case 'q': verbose = V_OFF; continue; case '2': twobytechars = True; continue; } } usage (); } done: if (dpy) { if (verbose >= V_PER_FONT) putchar ('\n'); printf ("Total: %d errors, %d of %d fonts gave bad extents\n", error_total, badfont_total, font_total); } Exit (0); } doit (pattern) char *pattern; { static char tmpfilename[256]; static struct mapfile *linelist = NULL; static nlines = 0; char **fontnames; int nfonts; static Bool first_time = True; int i; if (!dpy) { dpy = XOpenDisplay (displayname); if (!dpy) { fprintf (stderr, "%s: unable to open display \"%s\"\n", ProgramName, XDisplayName (displayname)); exit (1); } } if (!filename) { strcpy (tmpfilename, "/tmp/ttext.XXXXXX"); (void) mktemp (tmpfilename); copy_to_file (stdin, tmpfilename); filename = tmpfilename; using_temp_file = True; } if (nlines == 0) { nlines = mapfilein (filename, &linelist); if (nlines < 0) { fprintf (stderr, "%s: unable to read in test strings from file \"%s\"\n", ProgramName, filename); Exit (1); } if (nlines == 0) { fprintf (stderr, "%s: no input in file \"%s\"\n", ProgramName, filename); Exit (1); } } fontnames = XListFonts (dpy, pattern, 10000, &nfonts); if (!fontnames) { fprintf (stderr, "%s: no fonts named \"%s\"\n", ProgramName, pattern); return; } if (first_time) { if (verbose >= V_PER_FONT) { printf ("Testing %d lines of input from file %s:\n\n", nlines, filename); } if (verbose >= V_BAD) { printf ("\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "dir", "asc", "desc", "Owidth", "Oleft", "Oright", "Oasc", "Odesc"); printf ("\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "---", "---", "----", "------", "-----", "------", "----", "-----"); } else if (verbose == V_PER_FONT) { printf ("\t%s\t%s\n", "Bad", "Font name"); printf ("\t%s\t%s\n", "---", "---------"); printf ("\n"); } first_time = False; } for (i = 0; i < nfonts; i++) { int n = test_font (dpy, linelist, nlines, fontnames[i]); if (n) badfont_total++; error_total += n; font_total++; } XFreeFontNames (fontnames); return; } copy_to_file (infp, filename) FILE *infp; char *filename; { FILE *outfp; char buf[BUFSIZ*8]; int n; outfp = fopen (filename, "w"); if (!outfp) { fprintf (stderr, "%s: unable to open output file \"%s\"\n", ProgramName, filename); Exit (1); } while ((n = read (fileno(infp), buf, sizeof buf)) > 0) { int nn = write (fileno(outfp), buf, n); if (nn != n) { fprintf (stderr, "%s: only wrote %d/%d bytes to file \"%s\"\n", ProgramName, n, nn, filename); Exit (1); } } fclose (outfp); return; } struct _finfo { int dir, ascent, descent; XCharStruct overall; }; int test_font (dpy, linelist, nlines, fontname) Display *dpy; struct mapfile *linelist; int nlines; char *fontname; { int i, j; struct _finfo load, query, load16, query16; XFontStruct *fs; Font fid; int bad; static XChar2b *twobs = NULL; static nbs = 0; fs = XLoadQueryFont (dpy, fontname); if (!fs) { fprintf (stderr, "%s: unable to load and query font \"%s\"\n", ProgramName, fontname); return 1; } if (verbose >= V_BAD) { printf ("font %s\n", fontname); } for (i = 0, bad = 0; i < nlines; i++, linelist++) { int error = 0; char *s = linelist->line; int len = linelist->len - 1; int width, width16; if (len < 1) continue; width = XTextWidth (fs, s, len); XTextExtents (fs, s, len, &load.dir, &load.ascent, &load.descent, &load.overall); XQueryTextExtents (dpy, fs->fid, s, len, &query.dir, &query.ascent, &query.descent, &query.overall); if ((load.dir != query.dir) || (load.ascent != query.ascent) || (load.descent != query.descent) || (load.overall.lbearing != query.overall.lbearing) || (load.overall.rbearing != query.overall.rbearing) || (load.overall.width != query.overall.width) || (load.overall.ascent != query.overall.ascent) || (load.overall.descent != query.overall.descent) || (width != load.overall.width)) { error++; bad++; } if (twobytechars) { if (len > nbs) { if (twobs) free ((char *) twobs); nbs = len * 2; twobs = (XChar2b *) calloc (nbs, sizeof(XChar2b)); if (!twobs) { fprintf (stderr, "%s: unable to calloc %d XChar2b structs\n", ProgramName, nbs); nbs = 0; } } for (j = 0; j < len; j++) twobs[j].byte2 = (unsigned char) s[j]; width16 = XTextWidth16 (fs, twobs, len); XTextExtents16 (fs, twobs, len, &load16.dir, &load16.ascent, &load16.descent, &load16.overall); XQueryTextExtents16 (dpy, fs->fid, twobs, len, &query16.dir, &query16.ascent, &query16.descent, &query16.overall); if ((load16.dir != query16.dir) || (load16.ascent != query16.ascent) || (load16.descent != query16.descent) || (load16.overall.lbearing != query16.overall.lbearing) || (load16.overall.rbearing != query16.overall.rbearing) || (load16.overall.width != query16.overall.width) || (load16.overall.ascent != query16.overall.ascent) || (load16.overall.descent != query16.overall.descent) || (width16 != load16.overall.width)) { error++; bad++; } if ((load.dir != load16.dir) || (load.ascent != load16.ascent) || (load.descent != load16.descent) || (load.overall.lbearing != load16.overall.lbearing) || (load.overall.rbearing != load16.overall.rbearing) || (load.overall.width != load16.overall.width) || (load.overall.ascent != load16.overall.ascent) || (load.overall.descent != load16.overall.descent) || (width != width16)) { error++; bad++; } } if (verbose >= V_PER_STRING || ((verbose == V_BAD) && error)) { printf (" (%s) \"", error ? "bad" : "good"); fwrite (s, sizeof (char), len, stdout); printf ("\"\n"); printf ("\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t(%d)\n", load.dir, load.ascent, load.descent, load.overall.width, load.overall.lbearing, load.overall.rbearing, load.overall.ascent, load.overall.descent, width); printf ("\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", query.dir, query.ascent, query.descent, query.overall.width, query.overall.lbearing, query.overall.rbearing, query.overall.ascent, query.overall.descent); if (twobytechars) { printf ("\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t(%d)\n", load16.dir, load16.ascent, load16.descent, load16.overall.width, load16.overall.lbearing, load16.overall.rbearing, load16.overall.ascent, load16.overall.descent, width16); printf ("\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", query16.dir, query16.ascent, query16.descent, query16.overall.width, query16.overall.lbearing, query16.overall.rbearing, query16.overall.ascent, query16.overall.descent); } } } if (verbose == V_PER_FONT) { printf ("\t%d\t%s\n", bad, fontname); } XFreeFont (dpy, fs); return bad; }