aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/font/Speedo/sptobdf.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/font/Speedo/sptobdf.c')
-rw-r--r--nx-X11/lib/font/Speedo/sptobdf.c678
1 files changed, 678 insertions, 0 deletions
diff --git a/nx-X11/lib/font/Speedo/sptobdf.c b/nx-X11/lib/font/Speedo/sptobdf.c
new file mode 100644
index 000000000..ca3caa515
--- /dev/null
+++ b/nx-X11/lib/font/Speedo/sptobdf.c
@@ -0,0 +1,678 @@
+/* $Xorg: sptobdf.c,v 1.4 2001/02/09 02:04:00 xorgcvs Exp $ */
+/*
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation
+ *
+ * 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 and
+ * Digital not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * Network Computing Devices and Digital make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * 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.
+ *
+ * Dave Lemke
+ */
+
+/*
+
+Copyright 1987, 1994, 1998 The Open Group
+
+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.
+
+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 OPEN GROUP 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 Open Group 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 Open Group.
+
+*/
+
+/*
+ * Speedo outline to BFD format converter
+ */
+
+#include <stdio.h>
+#include "speedo.h"
+
+#ifdef EXTRAFONTS
+#include "ncdkeys.h"
+#else
+#include "keys.h"
+#endif
+
+#include "iso8859.h"
+
+#define MAX_BITS 1024
+
+#define BBOX_CLIP
+
+static char line_of_bits[MAX_BITS + 1];
+
+static FILE *fp;
+static ufix16 char_index,
+ char_id;
+static buff_t font;
+static buff_t char_data;
+static ufix8 *f_buffer,
+ *c_buffer;
+static ufix16 mincharsize;
+static fix15 cur_y;
+static fix15 bit_width,
+ bit_height;
+
+static ufix8 key[] =
+{
+ KEY0,
+ KEY1,
+ KEY2,
+ KEY3,
+ KEY4,
+ KEY5,
+ KEY6,
+ KEY7,
+ KEY8
+}; /* Font decryption key */
+
+
+static char *progname;
+static char *fontname = NULL;
+static char *fontfile = NULL;
+
+static int point_size = 120;
+static int x_res = 72;
+static int y_res = 72;
+static int quality = 0;
+static int iso_encoding = 1;
+
+static int num_props = 7;
+static int stretch = 120;
+
+static specs_t specs;
+
+static void dump_header();
+
+static void
+usage()
+{
+ fprintf(stderr, "Usage: %s [-xres x resolution] [-yres y resolution]\n\t[-ptsize pointsize] [-fn fontname] [-q quality (0-1)] fontfile\n", progname);
+ fprintf(stderr, "Where:\n");
+ fprintf(stderr, "-xres specifies the X resolution (72)\n");
+ fprintf(stderr, "-yres specifies the Y resolution (72)\n");
+ fprintf(stderr, "-pts specifies the pointsize in decipoints (120)\n");
+ fprintf(stderr, "-fn specifies the font name (full Bitstream name)\n");
+ fprintf(stderr, "-q specifies the font quality [0-1] (0)\n");
+ fprintf(stderr, "\n");
+ exit(0);
+}
+
+static fix15
+read_2b(ptr)
+ ufix8 *ptr;
+{
+ fix15 tmp;
+
+ tmp = *ptr++;
+ tmp = (tmp << 8) + *ptr;
+ return tmp;
+}
+
+static fix31
+read_4b(ptr)
+ ufix8 *ptr;
+{
+ fix31 tmp;
+
+ tmp = *ptr++;
+ tmp = (tmp << 8) + *ptr++;
+ tmp = (tmp << 8) + *ptr++;
+ tmp = (tmp << 8) + *ptr;
+ return tmp;
+}
+
+static void
+process_args(ac, av)
+ int ac;
+ char **av;
+{
+ int i;
+
+ for (i = 1; i < ac; i++) {
+ if (!strncmp(av[i], "-xr", 3)) {
+ if (av[i + 1]) {
+ x_res = atoi(av[++i]);
+ } else
+ usage();
+ } else if (!strncmp(av[i], "-yr", 3)) {
+ if (av[i + 1]) {
+ y_res = atoi(av[++i]);
+ } else
+ usage();
+ } else if (!strncmp(av[i], "-pt", 3)) {
+ if (av[i + 1]) {
+ point_size = atoi(av[++i]);
+ } else
+ usage();
+ } else if (!strncmp(av[i], "-fn", 3)) {
+ if (av[i + 1]) {
+ fontname = av[++i];
+ } else
+ usage();
+ } else if (!strncmp(av[i], "-q", 2)) {
+ if (av[i + 1]) {
+ quality = atoi(av[++i]);
+ } else
+ usage();
+ } else if (!strncmp(av[i], "-st", 3)) {
+ if (av[i + 1]) {
+ stretch = atoi(av[++i]);
+ } else
+ usage();
+ } else if (!strncmp(av[i], "-noni", 5)) {
+ iso_encoding = 0;
+ } else if (*av[i] == '-') {
+ usage();
+ } else
+ fontfile = av[i];
+ }
+ if (!fontfile)
+ usage();
+}
+
+void
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ ufix32 i;
+ ufix8 tmp[16];
+ ufix32 minbufsize;
+ ufix16 cust_no;
+ int first_char_index,
+ num_chars;
+
+ progname = argv[0];
+ process_args(argc, argv);
+ fp = fopen(fontfile, "r");
+ if (!fp) {
+ fprintf(stderr, "No such font file, \"%s\"\n", fontfile);
+ exit(-1);
+ }
+ if (fread(tmp, sizeof(ufix8), 16, fp) != 16) {
+ fprintf(stderr, "error reading \"%s\"\n", fontfile);
+ exit(-1);
+ }
+ minbufsize = (ufix32) read_4b(tmp + FH_FBFSZ);
+ f_buffer = (ufix8 *) malloc(minbufsize);
+ if (!f_buffer) {
+ fprintf(stderr, "can't get %x bytes of memory\n", minbufsize);
+ exit(-1);
+ }
+ fseek(fp, (ufix32) 0, 0);
+
+ if (fread(f_buffer, sizeof(ufix8), (ufix16) minbufsize, fp) != minbufsize) {
+ fprintf(stderr, "error reading file \"%s\"\n", fontfile);
+ exit(-1);
+ }
+ mincharsize = read_2b(f_buffer + FH_CBFSZ);
+
+ c_buffer = (ufix8 *) malloc(mincharsize);
+ if (!c_buffer) {
+ fprintf(stderr, "can't get %x bytes for char buffer\n", mincharsize);
+ exit(-1);
+ }
+ /* init */
+ sp_reset();
+
+ font.org = f_buffer;
+ font.no_bytes = minbufsize;
+
+ if ((cust_no = sp_get_cust_no(font)) != CUS0) {
+ fprintf(stderr, "Non-standard encryption for \"%s\"\n", fontfile);
+ exit(-1);
+ }
+ sp_set_key(key);
+
+ first_char_index = read_2b(f_buffer + FH_FCHRF);
+ num_chars = read_2b(f_buffer + FH_NCHRL);
+
+ /* set up specs */
+ /* Note that point size is in decipoints */
+ specs.pfont = &font;
+ /* XXX beware of overflow */
+ specs.xxmult = point_size * x_res / 720 * (1 << 16);
+ specs.xymult = 0L << 16;
+ specs.xoffset = 0L << 16;
+ specs.yxmult = 0L << 16;
+ specs.yymult = point_size * y_res / 720 * (1 << 16);
+ specs.yoffset = 0L << 16;
+ switch (quality) {
+ case 0:
+ specs.flags = 0;
+ break;
+ case 1:
+ specs.flags = MODE_SCREEN;
+ break;
+ case 2:
+ specs.flags = MODE_2D;
+ break;
+ default:
+ fprintf(stderr, "bogus quality value %d\n", quality);
+ break;
+ }
+ specs.out_info = NULL;
+
+ if (!fontname) {
+ fontname = (char *) (f_buffer + FH_FNTNM);
+ }
+ if (iso_encoding)
+ num_chars = num_iso_chars;
+ dump_header(num_chars);
+
+ if (!sp_set_specs(&specs)) {
+ fprintf(stderr, "can't set specs\n");
+ } else {
+ if (iso_encoding) {
+ for (i = 0; i < num_iso_chars * 2; i += 2) {
+ char_index = iso_map[i + 1];
+ char_id = iso_map[i];
+ if (!sp_make_char(char_index)) {
+ fprintf(stderr, "can't make char %x\n", char_index);
+ }
+ }
+ } else {
+ for (i = 0; i < num_chars; i++) {
+ char_index = i + first_char_index;
+ char_id = sp_get_char_id(char_index);
+ if (char_id) {
+ if (!sp_make_char(char_index)) {
+ fprintf(stderr, "can't make char %x\n", char_index);
+ }
+ }
+ }
+ }
+ }
+
+ (void) fclose(fp);
+
+ printf("ENDFONT\n");
+ exit(0);
+}
+
+static void
+dump_header(num_chars)
+ ufix32 num_chars;
+{
+ fix15 xmin,
+ ymin,
+ xmax,
+ ymax;
+ fix15 ascent,
+ descent;
+ fix15 pixel_size;
+
+ xmin = read_2b(f_buffer + FH_FXMIN);
+ ymin = read_2b(f_buffer + FH_FYMIN);
+ xmax = read_2b(f_buffer + FH_FXMAX);
+ ymax = read_2b(f_buffer + FH_FYMAX);
+ pixel_size = point_size * x_res / 720;
+
+ printf("STARTFONT 2.1\n");
+ printf("COMMENT\n");
+ printf("COMMENT Generated from Bitstream Speedo outlines via sptobdf\n");
+ printf("COMMENT\n");
+ printf("FONT %s\n", fontname);
+ printf("SIZE %d %d %d\n", pixel_size, x_res, y_res);
+ printf("FONTBOUNDINGBOX %d %d %d %d\n", xmin, ymin, xmax, ymax);
+ printf("STARTPROPERTIES %d\n", num_props);
+
+ printf("RESOLUTION_X %d\n", x_res);
+ printf("RESOLUTION_Y %d\n", y_res);
+ printf("POINT_SIZE %d\n", point_size);
+ printf("PIXEL_SIZE %d\n", pixel_size);
+ printf("COPYRIGHT \"%s\"\n", f_buffer + FH_CPYRT);
+
+ /* do some stretching here so that its isn't too tight */
+ pixel_size = pixel_size * stretch / 100;
+ ascent = pixel_size * 764 / 1000; /* 764 == EM_TOP */
+ descent = pixel_size - ascent;
+ printf("FONT_ASCENT %d\n", ascent);
+ printf("FONT_DESCENT %d\n", descent);
+
+ printf("ENDPROPERTIES\n");
+ printf("CHARS %d\n", num_chars);
+}
+
+buff_t *
+sp_load_char_data(file_offset, num, cb_offset)
+ fix31 file_offset;
+ fix15 num;
+ fix15 cb_offset;
+{
+ if (fseek(fp, (long) file_offset, (int) 0)) {
+ fprintf(stderr, "can't seek to char\n");
+ (void) fclose(fp);
+ exit(-1);
+ }
+ if ((num + cb_offset) > mincharsize) {
+ fprintf(stderr, "char buf overflow\n");
+ (void) fclose(fp);
+ exit(-2);
+ }
+ if (fread((c_buffer + cb_offset), sizeof(ufix8), num, fp) != num) {
+ fprintf(stderr, "can't get char data\n");
+ exit(-1);
+ }
+ char_data.org = (ufix8 *) c_buffer + cb_offset;
+ char_data.no_bytes = num;
+
+ return &char_data;
+}
+
+/*
+ * Called by Speedo character generator to report an error.
+ *
+ * Since character data not available is one of those errors
+ * that happens many times, don't report it to user
+ */
+void
+sp_report_error(n)
+ fix15 n;
+{
+ switch (n) {
+ case 1:
+ fprintf(stderr, "Insufficient font data loaded\n");
+ break;
+ case 3:
+ fprintf(stderr, "Transformation matrix out of range\n");
+ break;
+ case 4:
+ fprintf(stderr, "Font format error\n");
+ break;
+ case 5:
+ fprintf(stderr, "Requested specs not compatible with output module\n");
+ break;
+ case 7:
+ fprintf(stderr, "Intelligent transformation requested but not supported\n");
+ break;
+ case 8:
+ fprintf(stderr, "Unsupported output mode requested\n");
+ break;
+ case 9:
+ fprintf(stderr, "Extended font loaded but only compact fonts supported\n");
+ break;
+ case 10:
+ fprintf(stderr, "Font specs not set prior to use of font\n");
+ break;
+ case 12:
+ break;
+ case 13:
+ fprintf(stderr, "Track kerning data not available()\n");
+ break;
+ case 14:
+ fprintf(stderr, "Pair kerning data not available()\n");
+ break;
+ default:
+ fprintf(stderr, "report_error(%d)\n", n);
+ break;
+ }
+}
+
+void
+sp_open_bitmap(x_set_width, y_set_width, xorg, yorg, xsize, ysize)
+ fix31 x_set_width;
+ fix31 y_set_width;
+ fix31 xorg;
+ fix31 yorg;
+ fix15 xsize;
+ fix15 ysize;
+{
+ fix15 i;
+ fix15 off_horz;
+ fix15 off_vert;
+ fix31 width,
+ pix_width;
+ bbox_t bb;
+
+ bit_width = xsize;
+
+ bit_height = ysize;
+ off_horz = (fix15) ((xorg + 32768L) >> 16);
+ off_vert = (fix15) ((yorg + 32768L) >> 16);
+
+ if (bit_width > MAX_BITS) {
+
+#ifdef DEBUG
+ fprintf(stderr, "char wider than max bits -- truncated\n");
+#endif
+
+ bit_width = MAX_BITS;
+ }
+ width = sp_get_char_width(char_index);
+ pix_width = width * (specs.xxmult / 65536L) +
+ ((ufix32) width * ((ufix32) specs.xxmult & 0xffff)) / 65536L;
+ pix_width /= 65536L;
+
+ width = (pix_width * 7200L) / (point_size * y_res);
+
+ (void) sp_get_char_bbox(char_index, &bb);
+ bb.xmin >>= 16;
+ bb.ymin >>= 16;
+ bb.xmax >>= 16;
+ bb.ymax >>= 16;
+
+#ifdef DEBUG
+ if ((bb.xmax - bb.xmin) != bit_width)
+ fprintf(stderr, "bbox & width mismatch 0x%x (%d) (%d vs %d)\n",
+ char_index, char_id, (bb.xmax - bb.xmin), bit_width);
+ if ((bb.ymax - bb.ymin) != bit_height)
+ fprintf(stderr, "bbox & height mismatch 0x%x (%d) (%d vs %d)\n",
+ char_index, char_id, (bb.ymax - bb.ymin), bit_height);
+ if (bb.xmin != off_horz)
+ fprintf(stderr, "x min mismatch 0x%x (%d) (%d vs %d)\n",
+ char_index, char_id, bb.xmin, off_horz);
+ if (bb.ymin != off_vert)
+ fprintf(stderr, "y min mismatch 0x%x (%d) (%d vs %d)\n",
+ char_index, char_id, bb.ymin, off_vert);
+#endif
+
+#ifdef BBOX_CLIP
+ bit_width = bb.xmax - bb.xmin;
+ bit_height = bb.ymax - bb.ymin;
+ off_horz = bb.xmin;
+ off_vert = bb.ymin;
+#endif
+
+ /* XXX kludge to handle space */
+ if (bb.xmin == 0 && bb.ymin == 0 && bb.xmax == 0 && bb.ymax == 0 &&
+ width) {
+ bit_width = 1;
+ bit_height = 1;
+ }
+ printf("STARTCHAR %d\n", char_id);
+ printf("ENCODING %d\n", char_id);
+ printf("SWIDTH %d 0\n", width);
+ printf("DWIDTH %d 0\n", pix_width);
+ printf("BBX %d %d %d %d\n", bit_width, bit_height, off_horz, off_vert);
+ printf("BITMAP\n");
+
+ for (i = 0; i < bit_width; i++) {
+ line_of_bits[i] = '.';
+ }
+ line_of_bits[bit_width] = '\0';
+ cur_y = 0;
+}
+
+static void
+dump_line(line)
+ ufix8 *line;
+{
+ int bit;
+ unsigned byte;
+
+ byte = 0;
+ for (bit = 0; bit < bit_width; bit++) {
+ if (line[bit] == 'X')
+ byte |= (1 << (7 - (bit & 7)));
+ if ((bit & 7) == 7) {
+ printf("%02X", byte);
+ byte = 0;
+ }
+ }
+ if ((bit & 7) != 0)
+ printf("%02X", byte);
+ printf("\n");
+}
+
+#ifdef BBOX_CLIP
+static fix15 last_y;
+static int trunc = 0;
+
+#endif
+
+void
+sp_set_bitmap_bits(y, xbit1, xbit2)
+ fix15 y;
+ fix15 xbit1;
+ fix15 xbit2;
+{
+ fix15 i;
+
+ if (xbit1 > MAX_BITS) {
+
+#ifdef DEBUG
+ fprintf(stderr, "run wider than max bits -- truncated\n");
+#endif
+
+ xbit1 = MAX_BITS;
+ }
+ if (xbit2 > MAX_BITS) {
+
+#ifdef DEBUG
+ fprintf(stderr, "run wider than max bits -- truncated\n");
+#endif
+
+ xbit2 = MAX_BITS;
+ }
+ while (cur_y != y) {
+ dump_line(line_of_bits);
+ for (i = 0; i < bit_width; i++) {
+ line_of_bits[i] = '.';
+ }
+ cur_y++;
+ }
+
+#ifdef BBOX_CLIP
+ last_y = y;
+ if (y >= bit_height) {
+
+#ifdef DEBUG
+ fprintf(stderr,
+ "y value is larger than height 0x%x (%d) -- truncated\n",
+ char_index, char_id);
+#endif
+
+ trunc = 1;
+ return;
+ }
+#endif /* BBOX_CLIP */
+
+ for (i = xbit1; i < xbit2; i++) {
+ line_of_bits[i] = 'X';
+ }
+}
+
+void
+sp_close_bitmap()
+{
+
+#ifdef BBOX_CLIP
+ int i;
+
+ if (!trunc)
+ dump_line(line_of_bits);
+ trunc = 0;
+
+
+ last_y++;
+ while (last_y < bit_height) {
+
+#ifdef DEBUG
+ fprintf(stderr, "padding out height for 0x%x (%d)\n",
+ char_index, char_id);
+#endif
+
+ for (i = 0; i < bit_width; i++) {
+ line_of_bits[i] = '.';
+ }
+ dump_line(line_of_bits);
+ last_y++;
+ }
+
+#else
+ dump_line(line_of_bits);
+#endif
+
+ printf("ENDCHAR\n");
+}
+
+/* outline stubs */
+void
+sp_open_outline()
+{
+}
+
+void
+sp_start_new_char()
+{
+}
+
+void
+sp_start_contour()
+{
+}
+
+void
+sp_curve_to()
+{
+}
+
+void
+sp_line_to()
+{
+}
+
+void
+sp_close_contour()
+{
+}
+
+void
+sp_close_outline()
+{
+}