diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:58 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:58 +0000 |
commit | ab2be8865ceaa237d2478d291a90419b573cfb65 (patch) | |
tree | 6aa850beba8f04fdd463834d8e79d01c67d474a7 |
Initial revisionXORG-RELEASE-1-BASEXEVIE-MERGEXEVIE-BASEXORG-STABLE
-rw-r--r-- | showfont.c | 471 | ||||
-rw-r--r-- | showfont.man | 83 |
2 files changed, 554 insertions, 0 deletions
diff --git a/showfont.c b/showfont.c new file mode 100644 index 0000000..0331f9e --- /dev/null +++ b/showfont.c @@ -0,0 +1,471 @@ +/* $XConsortium: showfont.c,v 1.13 94/04/17 20:44:07 gildea Exp $ */ +/* + * Copyright 1990 Network Computing Devices; + * Portions Copyright 1987 by Digital Equipment Corporation and the + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, 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 names of Network Computing Devices or Digital + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * + * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETWORK COMPUTING DEVICES + * OR DIGITAL 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. + */ +/* + +Copyright (c) 1987 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ +/* $XFree86: xc/programs/showfont/showfont.c,v 1.4 2001/08/27 17:41:01 dawes Exp $ */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <X11/fonts/FSlib.h> + +/* + * the equivalent of showsnf + */ + +#define GLWIDTHBYTESPADDED(bits,nbytes) \ + ((nbytes) == 1 ? (((bits)+7)>>3) /* pad to 1 byte */ \ + :(nbytes) == 2 ? ((((bits)+15)>>3)&~1) /* pad to 2 bytes */ \ + :(nbytes) == 4 ? ((((bits)+31)>>3)&~3) /* pad to 4 bytes */ \ + :(nbytes) == 8 ? ((((bits)+63)>>3)&~7) /* pad to 8 bytes */ \ + : 0) + +int byteorder = MSBFirst; /* -LSB or -MSB */ +int bitorder = MSBFirst; /* -lsb or -msb */ +int bitmap_pad = 0; /* -bitmap_pad: ImageRect bitmap format */ +int scan_pad = 8; /* -pad: ScanlinePad */ +int scan_unit = 8; /* -unit: ScanlineUnit */ +int first_ch = 0; /* -start: first character*/ +int end_ch = ~0; /* -end: end character */ +const char *ProgramName; +Bool no_props = False; /* -noprops: don't show font properties */ +Bool extents_only = False; /* -extents_only */ + +FSServer *svr; + +/* set from bitmap_pad to ImageRectMin, ImageMaxWidth, or ImageMax */ +int bitmap_format; + +static FSBitmapFormat +make_format(void) +{ + FSBitmapFormat format; + + format = 0; + /* set up format */ + switch (scan_pad) { + case 8: + format |= BitmapFormatScanlinePad8; + break; + case 16: + format |= BitmapFormatScanlinePad16; + break; + case 32: + format |= BitmapFormatScanlinePad32; + break; + case 64: + format |= BitmapFormatScanlinePad64; + break; + default: + fprintf(stderr, "bogus scanline pad value: %d\n", scan_pad); + break; + } + switch (scan_unit) { + case 8: + format |= BitmapFormatScanlineUnit8; + break; + case 16: + format |= BitmapFormatScanlineUnit16; + break; + case 32: + format |= BitmapFormatScanlineUnit32; + break; + case 64: + format |= BitmapFormatScanlineUnit64; + break; + default: + fprintf(stderr, "bogus scanline unit value: %d\n", scan_unit); + break; + } + switch (bitmap_pad) { + case 0: + bitmap_format = BitmapFormatImageRectMin; + break; + case 1: + bitmap_format = BitmapFormatImageRectMaxWidth; + break; + case 2: + bitmap_format = BitmapFormatImageRectMax; + break; + default: + fprintf(stderr, "bogus bitmap pad value: %d\n", bitmap_pad); + break; + } + format |= bitmap_format; + + format |= (bitorder == MSBFirst) ? BitmapFormatBitOrderMSB : + BitmapFormatBitOrderLSB; + format |= (byteorder == MSBFirst) ? BitmapFormatByteOrderMSB : + BitmapFormatByteOrderLSB; + + return format; +} + +static void +show_char_info(FSXCharInfo *ci) +{ + printf("Left: %-3d Right: %-3d Ascent: %-3d Descent: %-3d Width: %d\n", + ci->left, ci->right, ci->ascent, ci->descent, ci->width); +} + +static void +show_glyphs( + Font fid, + FSXFontInfoHeader *hdr, + Bool show_all, + FSChar2b first, + FSChar2b last) +{ + FSXCharInfo *extents; + int err, + ch, + start, + end; + int offset = 0; + unsigned char *glyphs; + FSOffset *offsets; + int scanpad; + int r, + b; + FSBitmapFormat format; + FSChar2b chars[2]; + int num_chars; + + if (show_all) { + num_chars = 0; + } else { + chars[0] = first; + chars[1] = last; + num_chars = 2; + } + FSQueryXExtents16(svr, fid, True, chars, num_chars, &extents); + + if (!extents_only) { + format = make_format(); + err = FSQueryXBitmaps16(svr, fid, format, True, chars, num_chars, + &offsets, &glyphs); + + if (err != FSSuccess) { + fprintf(stderr, "QueryGlyphs failed\n"); + exit(1); + } + } + start = first.low + (first.high << 8); + end = last.low + (last.high << 8); + + scanpad = scan_pad >> 3; + + for (ch = 0; ch <= (end - start); ch++) { + int bottom, + bpr, + charwidth; + + printf("char #%d", ch + start); + if ((ch + start >= 0) && (ch + start <= 127) && isprint(ch + start)) + printf(" '%c'\n", (char) (ch + start)); + else + printf(" 0x%04x\n", ch + start); + show_char_info(&extents[ch]); + if (extents_only) + continue; + if (offset != offsets[ch].position) + fprintf(stderr, "offset mismatch: expected %d, got %d\n", + offset, offsets[ch].position); + switch (bitmap_format) { + case BitmapFormatImageRectMin: + bottom = extents[ch].descent + extents[ch].ascent; + charwidth = extents[ch].right - extents[ch].left; + break; + case BitmapFormatImageRectMaxWidth: + bottom = extents[ch].descent + extents[ch].ascent; + charwidth = hdr->max_bounds.right - hdr->min_bounds.left; + break; + case BitmapFormatImageRectMax: + bottom = hdr->max_bounds.ascent + + hdr->max_bounds.descent; + charwidth = hdr->max_bounds.right - hdr->min_bounds.left; + break; + default: + bottom = 0; + charwidth = 0; + } + + if (extents[ch].left == 0 && + extents[ch].right == 0 && + extents[ch].width == 0 && + extents[ch].ascent == 0 && + extents[ch].descent == 0) + { + printf ("Nonexistent character\n"); + continue; + } + bpr = GLWIDTHBYTESPADDED(charwidth, scanpad); + if (offsets[ch].length != bottom * bpr) { + fprintf (stderr, "length mismatch: expected %d (%dx%d), got %d\n", + bottom * bpr, bpr, bottom, offsets[ch].length); + } + offset = offsets[ch].position; + for (r = 0; r < bottom; r++) { + unsigned char *row = glyphs + offset; + + for (b = 0; b < charwidth; b++) { + putchar((row[b >> 3] & + (1 << (7 - (b & 7)))) ? '#' : '-'); + } + putchar('\n'); + offset += bpr; + } + } + FSFree((char *) extents); + if (!extents_only) { + FSFree((char *) offsets); + FSFree((char *) glyphs); + } +} + +static void +show_props( + FSPropInfo *pi, + FSPropOffset *po, + unsigned char *pd) +{ + int i; + char buf[512]; + int num_props; + + num_props = pi->num_offsets; + for (i = 0; i < num_props; i++, po++) { + strncpy(buf, (char *) (pd + po->name.position), po->name.length); + buf[po->name.length] = '\0'; + printf("%s\t", buf); + switch (po->type) { + case PropTypeString: + strncpy(buf, (char *)(pd + po->value.position), po->value.length); + buf[po->value.length] = '\0'; + printf("%s\n", buf); + break; + case PropTypeUnsigned: + printf("%lu\n", (unsigned long) po->value.position); + break; + case PropTypeSigned: + printf("%ld\n", (long) po->value.position); + break; + default: + fprintf(stderr, "bogus property\n"); + break; + } + } +} + +static void +show_info( + Font fid, + FSXFontInfoHeader *hdr, + FSChar2b *first, + FSChar2b *last) +{ + FSPropInfo pi; + FSPropOffset *po; + unsigned char *pd; + + FSQueryXInfo(svr, fid, hdr, &pi, &po, &pd); + printf("Direction: %s\n", (hdr->draw_direction == LeftToRightDrawDirection) + ? "Left to Right" : "Right to Left"); + *first = hdr->char_range.min_char; + *last = hdr->char_range.max_char; + printf("Range: %d to %d\n", + first->low + (first->high << 8), + last->low + (last->high << 8)); + if (hdr->flags & FontInfoAllCharsExist) + printf("All chars exist\n"); + printf("Default char: %d\n", + hdr->default_char.low + (hdr->default_char.high << 8)); + printf("Min bounds: \n"); + show_char_info(&hdr->min_bounds); + printf("Max bounds: \n"); + show_char_info(&hdr->max_bounds); + printf("Font Ascent: %d Font Descent: %d\n", + hdr->font_ascent, hdr->font_descent); + + if (!no_props) + show_props(&pi, po, pd); + FSFree((char *) po); + FSFree((char *) pd); +} + +static void +usage(void) +{ + printf("%s: [-server servername] [-extents_only] [-noprops] [-lsb] [-msb] [-LSB] [-MSB] [-unit #] [-pad #] [-bitmap_pad value] [-start first_char] [-end last_char] -fn fontname\n", ProgramName); + exit(0); +} + +int +main(int argc, char **argv) +{ + char *servername = "localhost:7100"; /* -server: font server name */ + char *fontname = NULL; /* -fn: font name */ + int i; + Font fid, + dummy; + FSBitmapFormat format; + FSBitmapFormatMask fmask; + FSChar2b first, + last; + FSXFontInfoHeader hdr; + Bool show_all = True; + + ProgramName = argv[0]; + + for (i = 1; i < argc; i++) { + if (!strncmp(argv[i], "-se", 3)) { + if (++i < argc) + servername = argv[i]; + else + usage(); + } else if (!strncmp(argv[i], "-ext", 4)) { + extents_only = True; + } else if (!strncmp(argv[i], "-noprops", 7)) { + no_props = True; + } else if (!strncmp(argv[i], "-lsb", 4)) { + bitorder = LSBFirst; + } else if (!strncmp(argv[i], "-msb", 4)) { + bitorder = MSBFirst; + } else if (!strncmp(argv[i], "-LSB", 4)) { + byteorder = LSBFirst; + } else if (!strncmp(argv[i], "-MSB", 4)) { + byteorder = MSBFirst; + } else if (!strncmp(argv[i], "-p", 2)) { + if (++i < argc) + scan_pad = atoi(argv[i]); + else + usage(); + } else if (!strncmp(argv[i], "-u", 2)) { + if (++i < argc) + scan_unit = atoi(argv[i]); + else + usage(); + } else if (!strncmp(argv[i], "-b", 2)) { + if (++i < argc) + bitmap_pad = atoi(argv[i]); + else + usage(); + } else if (!strncmp(argv[i], "-st", 3)) { + if (++i < argc) + first_ch = atoi(argv[i]); + else + usage(); + } else if (!strncmp(argv[i], "-e", 2)) { + if (++i < argc) + end_ch = atoi(argv[i]); + else + usage(); + } else if (!strncmp(argv[i], "-f", 2)) { + if (++i < argc) + fontname = argv[i]; + else + usage(); + } else + usage(); + } + if (fontname == NULL) + usage(); + + if (first_ch != 0 && end_ch != ~0 && end_ch < first_ch) { + fprintf(stderr, + "bad character range -- end (%d) is less than start (%d)\n", + end_ch, first_ch); + exit(1); + } + if ((svr = FSOpenServer(servername)) == NULL) { + if(FSServerName(servername) != NULL) + fprintf(stderr, "can't open server \"%s\"\n", FSServerName(servername)); + else + fprintf(stderr, "can't open server \"\"\n"); + exit(1); + } + format = make_format(); + fmask = (BitmapFormatMaskByte | BitmapFormatMaskBit | + BitmapFormatMaskImageRectangle | BitmapFormatMaskScanLinePad | + BitmapFormatMaskScanLineUnit); + fid = FSOpenBitmapFont(svr, format, fmask, fontname, &dummy); + if (fid) { + printf("opened font %s\n", fontname); + show_info(fid, &hdr, &first, &last); + if (first_ch != 0 && + ((unsigned)first_ch >= (first.low + (first.high << 8)))) { + first.low = first_ch & 0xff; + first.high = first_ch >> 8; + show_all = False; + } + if (end_ch != ~0 && + ((unsigned)end_ch <= (last.low + (last.high << 8)))) { + last.low = end_ch & 0xff; + last.high = end_ch >> 8; + show_all = False; + } + /* make sure the range is legal */ + if ((first.high > last.high) || (first.high == last.high && + first.low > last.low)) { + last = first; + fprintf(stderr, + "adjusting range -- specifed first char is after end\n"); + } + show_glyphs(fid, &hdr, show_all, first, last); + FSCloseFont(svr, fid); + } else { + fprintf(stderr, "couldn't get font %s\n", fontname); + FSCloseServer(svr); + exit(1); + } + FSCloseServer(svr); + exit(0); +} diff --git a/showfont.man b/showfont.man new file mode 100644 index 0000000..43b52a8 --- /dev/null +++ b/showfont.man @@ -0,0 +1,83 @@ +.\" $XConsortium: showfont.man,v 1.3 94/04/11 14:29:57 gildea Exp $ +.\" $XFree86: xc/programs/showfont/showfont.man,v 1.4 2001/01/27 18:21:06 dawes Exp $ +.TH SHOWFONT 1 __xorgversion__ +.SH NAME +showfont \- font dumper for X font server +.SH SYNOPSIS +.B showfont +[ +.I \-options +\&.\|.\|. ] +.B \-fn +.I pattern +.SH DESCRIPTION +.I Showfont +displays data about a font that matches the given \fIpattern\fP. +The information shown includes font information, font properties, +character metrics, and character bitmaps. +.PP +The wildcard character "*" can be used to match any sequence of +characters (including none) in the font name, +and "?" can be used to match any single character. +The "*" and "?" characters must be quoted to prevent them from +being expanded by the shell. +If no pattern is given, "*" is assumed. +.SH "OPTIONS" +.TP 8 +.B \-server \fIhost\fP:\fIport\fP +The X font server to contact. +.TP 8 +.BI \-fn " name" +The font to display. +.TP 8 +.B \-lsb +The bit order of the font should be requested as LSBFirst +(least significant bit first). +.TP 8 +.B \-msb +The bit order of the font should be requested as MSBFirst +(most significant bit first). +.TP 8 +.B \-LSB +The byte order of the font should be requested as LSBFirst +(least significant byte first). +.TP 8 +.B \-MSB +The byte order of the font should be requested as MSBFirst +(most significant byte first). +.TP 8 +.B \-ext\fR[\fPents_only\fR]\fP +Only the character extents should be displayed, but not the bitmaps. +.TP 8 +.BI \-start " char" +The start of the range of the characters to display +(\fIchar\fP is a number). +.TP 8 +.BI \-end " char" +The end of the range of the characters to display +(\fIchar\fP is a number). +.TP 8 +.BI \-unit " n" +The scanline unit of the font (8, 16, 32, or 64). +.TP 8 +.BI \-pad " n" +The scanpad unit of the font (8, 16, 32, or 64). +.TP 8 +.BI \-b\fR[\fPitmap_pad\fR]\fP " n" +The bitmap padding unit of the font (0, 1, or 2, +where 0 is ImageRectMin, 1 is ImageRectMaxWidth and 2 is ImageRectMax). +.TP 8 +.B \-noprops +Do not show the font properties. +.SH "SEE ALSO" +xfs(1), fslsfonts(1), xlsfonts(1) +.SH ENVIRONMENT +.TP 8 +.B FONTSERVER +the default X font server to contact. +.SH COPYRIGHT +Copyright 1991, Network Computing Devices, Inc. +.br +See \fIX\fP(1) for a full statement of rights and permissions. +.SH AUTHOR +Dave Lemke, Network Computing Devices, Inc. |