#ifndef lint static char sccsid[] = "@(#)writevfont.c 9.2 88/01/19 Copyright 1984 Sun Micro"; #endif /* * Copyright (c) 1984 by Sun Microsystems, Inc. */ /*- Write a vfont file writevfont.c, Mon Jun 10 15:12:46 1985 James Gosling, Sun Microsystems */ #include #include "fract.h" #include "font.h" #include "vfont.h" #define bmsize(g) (((((g)->size.x)+7)>>3)*(g)->size.y) writevfont(f, name) struct font *f; char *name; { register FILE *out = fopen(name, "w"); int nglyphs = NUM_DISPATCH < f->nglyphs ? NUM_DISPATCH : f->nglyphs; if (out == 0) return -1; { register i; struct header h; h.size = 0; for (i = nglyphs; i-- != 0;) if (f->glyphs[i].glyph) h.size += bmsize(f->glyphs[i].glyph); h.magic = VFONT_MAGIC; h.maxx = f->size.x; h.maxy = f->size.y; h.xtend = 0; fwrite(&h, sizeof h, 1, out); } { register offset = 0; register i; for (i = 0; i < NUM_DISPATCH; i++) { struct dispatch d; register struct glyph *g; if (i < f->nglyphs && (g = f->glyphs[i].glyph) != 0) { d.addr = offset; d.nbytes = bmsize(g); offset += d.nbytes; d.up = g->origin.y; d.left = g->origin.x; d.right = g->size.x - d.left; d.down = g->size.y - d.up; d.width = cfloorfr(f->glyphs[i].width.x); } else { d.addr = 0; d.nbytes = 0; d.up = 0; d.left = 0; d.right = 0; d.down = 0; d.width = 0; } fwrite(&d, sizeof d, 1, out); } for (i = 0; i < NUM_DISPATCH; i++) { register struct glyph *g; if (i < f->nglyphs && (g = f->glyphs[i].glyph) != 0) { register j; register size = ((g->size.x+7)>>3); register wsize = ((g->size.x+15)>>4); for (j = 0; jsize.y; j++) fwrite(((struct generic_glyph *) g)->bits+j*wsize, size, 1, out); } } } fclose(out); return 0; }