|
|
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 v
Length: 8712 (0x2208)
Types: TextFile
Names: »vertorst.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦c319c2751⟧ »unix3.0/TeX3.0.tar.Z«
└─⟦036c765ac⟧
└─⟦this⟧ »TeX3.0/TeXcontrib/salkind/src/vertorst.c«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
└─⟦this⟧ »./tex82/TeXcontrib/salkind/src/vertorst.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦63303ae94⟧ »unix3.14/TeX3.14.tar.Z«
└─⟦c58930e5c⟧
└─⟦this⟧ »TeX3.14/TeXcontrib/salkind/src/vertorst.c«
/*
* Convert Versatec or ditroff rasters to RST format
* The default output resolution is 240 dots per inch.
*
* The Versatec format is documented in vfont(5).
*
* by not copying glyphs into memory, we have a hope
* of making this program work on a 16 bit machine
*/
#include <stdio.h>
#include <sys/types.h>
#include <vfont.h>
#include "rst.h"
struct rst_glyph_entry gd[128];
struct rst_preamble rpre;
long ver_offset[128]; /* Seek locations of each pxl glyph */
int dflag;
int spos;
FILE *verfp, *rstfp;
int ver_resolution, ver_pointsize;
#define RST_DEVICE "Imprint-10"
#define RST_RESOLUTION 240
main(argc, argv)
char **argv;
{
int slen, i;
char *verfile, *rstfile;
char *p, *getlogin(), *rindex();
int target_resolution;
char *target_device;
ver_resolution = 200;
ver_pointsize = 0;
target_resolution = RST_RESOLUTION;
target_device = RST_DEVICE;
for (i = 1; i < argc && argv[i][0] == '-'; i++) {
switch (argv[i][1]) {
case 'r':
i++;
ver_resolution = atoi(argv[i]);
break;
case 'p':
i++;
ver_pointsize = atoi(argv[i]);
break;
case 'd':
dflag++;
ver_resolution = 240;
break;
case 's':
i++;
spos = atoi(argv[i]);
break;
case 't':
i++;
target_resolution = atoi(argv[i]);
break;
case 'o':
i++;
target_device = argv[i];
break;
default:
usage:
fprintf(stderr,
"Usage: %s [-p size] [-r res] [-t res] [-o dev] [-d] ver-font rst-font\n", argv[0]);
exit(1);
}
}
if (argc-2 != i)
goto usage;
verfile = argv[i++];
rstfile = argv[i];
if ((verfp = fopen(verfile, "r")) == NULL) {
perror(verfile);
exit(1);
}
if ((rstfp = fopen(rstfile, "w")) == NULL) {
perror(rstfile);
exit(1);
}
if (ver_pointsize == 0) {
/* guess point size by using raster name extension */
p = rindex(verfile, '.');
if (p == NULL || (ver_pointsize = atoi(p+1)) < 0) {
fprintf(stderr, "Assuming 10 point\n");
ver_pointsize = 10;
}
}
/* initialize RST preamble variables which are not found in VER file */
rpre.rp_version = 0;
rpre.rp_interline = 0;
rpre.rp_interword = 0;
rpre.rp_rotation = 0;
rpre.rp_charadvance = 0;
rpre.rp_lineadvance = 1;
rpre.rp_checksum = 0;
rpre.rp_fontres = target_resolution;
/* initialize rp_fontident, rp_fonttype */
strcpy(rpre.rp_outdevice.s_p, target_device);
rpre.rp_outdevice.s_l = strlen(rpre.rp_outdevice.s_p);
if (p = getlogin()) {
strcpy(rpre.rp_creator.s_p, p);
rpre.rp_creator.s_l = strlen(rpre.rp_creator.s_p);
}
slen = rpre.rp_fontident.s_l + rpre.rp_facetype.s_l +
rpre.rp_outdevice.s_l + rpre.rp_creator.s_l + 4;
rpre.rp_bytes = PREAMBLE_FIXED_PART + slen - 2;
rpre.rp_glyphptr = PREAMBLE_FIXED_PART + slen + FILEMARK_SIZE;
/*
* troff raster files really don't have the
* concept of design size. Especially since troff
* determines character widths by scaling up or down
* from a well known reference size.
*
* Therefore, we arbitrarily set the design
* size to 10 point. This will simplify things later on.
* The magnification depends on the original raster resolution
* and pointsize, as well as the target resolution.
*/
rpre.rp_fontmag = (1000*ver_resolution*ver_pointsize) /
(10*target_resolution);
rpre.rp_designsize = 10 * (1L << 20);
read_ver_header();
write_rst_header();
write_gd();
copy_rasters();
#ifdef DEBUG
freopen(argv[2], "r", rstfp);
dump_font();
#endif
exit(0);
}
read_ver_header()
{
int i;
int rowbytes;
struct header h;
struct dispatch d;
long rst_offset, ver_base;
rheader(verfp, &h);
if (h.magic != 0436) {
fprintf(stderr, "Bad magic number in versatec font\n");
exit(1);
}
rpre.rp_firstglyph = 0;
rpre.rp_lastglyph = 127;
rst_offset = rpre.rp_glyphptr +
(rpre.rp_lastglyph-rpre.rp_firstglyph+1) * GLYPH_ENTRY_SIZE;
/*
* the following is really (on a pdp11 or vax):
*
* ver_base = 256 * sizeof (struct dispatch) + sizeof (struct header);
*
* HOWEVER, WE MUST HARDWIRE THESE NUMBERS,
* SINCE STRUCTURES ARE NOT PORTABLE!!!
*/
ver_base = 256 * 10 + 10;
if (spos > 0)
fseek(verfp, (long)(spos * 10 + 10), 0);
for (i = 0; i < 128; i++) {
rdispatch(verfp, &d);
if (d.nbytes == 0) {
gd[i].rg_w = gd[i].rg_h = gd[i].rg_x = gd[i].rg_y = 0;
gd[i].rg_offset = gd[i].rg_width = 0;
continue;
}
/*
* Compensate for a rounding bug in the ditroff font format
*/
if (dflag) {
gd[i].rg_w = d.right + d.left + 1;
rowbytes = (gd[i].rg_w + 7) / 8;
gd[i].rg_h = d.nbytes / rowbytes;
gd[i].rg_x = d.left;
gd[i].rg_y = gd[i].rg_h - d.down;
} else {
gd[i].rg_w = d.right + d.left;
gd[i].rg_h = d.up + d.down;
gd[i].rg_x = d.left;
gd[i].rg_y = d.up;
}
ver_offset[i] = d.addr + ver_base;
gd[i].rg_offset = rst_offset;
/*
* fixes/inch = (fixes/point) * (points/inch)
* = 2**20 * 72.27;
*
* gd[i].rg_width
* = pixel_width * (inch/design_pixels) * (fixes/inch)
* = d.width * 1. / (target_resolution * magnification) *
* (2**20 * 72.27)
*
* where
* magnification = (ver_pointsize / 10) *
* (ver_resolution / target_resolution)
*/
gd[i].rg_width =
d.width * (1L << 20) * 72.27 * 10 /
(ver_resolution * ver_pointsize);
rst_offset += d.nbytes;
}
}
write_rst_header()
{
/* this is the filemark */
outstr("Rast", rstfp);
out4byt(0, rstfp); /* rest of name is nulls */
/* now the preamble */
out2byt(rpre.rp_bytes, rstfp);
out1byt(rpre.rp_version, rstfp);
out3byt(rpre.rp_glyphptr, rstfp);
out2byt(rpre.rp_firstglyph, rstfp);
out2byt(rpre.rp_lastglyph, rstfp);
out4byt(rpre.rp_fontmag, rstfp);
out4byt(rpre.rp_designsize, rstfp);
out4byt(rpre.rp_interline, rstfp);
out4byt(rpre.rp_interword, rstfp);
out2byt(rpre.rp_rotation, rstfp);
out1byt(rpre.rp_charadvance, rstfp);
out1byt(rpre.rp_lineadvance, rstfp);
out4byt(rpre.rp_checksum, rstfp);
out2byt(rpre.rp_fontres, rstfp);
out1byt(rpre.rp_fontident.s_l, rstfp);
outstr(rpre.rp_fontident.s_p, rstfp);
out1byt(rpre.rp_facetype.s_l, rstfp);
outstr(rpre.rp_facetype.s_p, rstfp);
out1byt(rpre.rp_outdevice.s_l, rstfp);
outstr(rpre.rp_outdevice.s_p, rstfp);
out1byt(rpre.rp_creator.s_l, rstfp);
outstr(rpre.rp_creator.s_p, rstfp);
}
write_gd()
{
register int i;
/*
fseek(rstfp, (long)rpre.rp_glyphptr, 0);
*/
for (i = rpre.rp_firstglyph; i <= rpre.rp_lastglyph; i++) {
out2byt(gd[i].rg_h, rstfp);
out2byt(gd[i].rg_w, rstfp);
out2byt(gd[i].rg_y, rstfp);
out2byt(gd[i].rg_x, rstfp);
out4byt(gd[i].rg_width, rstfp);
out3byt(gd[i].rg_offset, rstfp);
}
}
copy_rasters()
{
register int i, j, k;
int nbytes;
for (i = rpre.rp_firstglyph; i <= rpre.rp_lastglyph; i++) {
nbytes = (gd[i].rg_w + 7) / 8;
fseek(verfp, ver_offset[i], 0);
/*
fseek(rstfp, (long)gd[i].rg_offset, 0);
*/
for (j = 0; j < gd[i].rg_h; j++) {
for (k = 0; k < nbytes; k++)
putc(getc(verfp), rstfp);
}
}
}
/*
* read a versatec header
* some munging around since structures are not portable
*/
rheader(fp, hp)
FILE *fp;
struct header *hp;
{
#if !(defined(vax) || defined(pdp11))
char buf[10];
fread(buf, sizeof buf, 1, fp);
hp->magic = makeshort(buf[1], buf[0]);
hp->size = makeshort(buf[3], buf[2]);
hp->maxx = makeshort(buf[5], buf[4]);
hp->maxy = makeshort(buf[7], buf[6]);
hp->xtend = makeshort(buf[9], buf[8]);
#else
fread((char *)hp, sizeof (struct header), 1, fp);
#endif
}
/*
* read a versatec dispatch entry
* some munging around since structures are not portable
*/
rdispatch(fp, dp)
FILE *fp;
struct dispatch *dp;
{
#if !(defined(vax) || defined(pdp11))
char buf[10];
fread(buf, sizeof buf, 1, fp);
dp->addr = makeshort(buf[1], buf[0]);
dp->nbytes = makeshort(buf[3], buf[2]);
dp->up = buf[4];
dp->down = buf[5];
dp->left = buf[6];
dp->right = buf[7];
dp->width = makeshort(buf[9], buf[8]);
#else
fread((char *)dp, sizeof (struct dispatch), 1, fp);
#endif
}
makeshort(high, low)
{
return(((high & 0377) << 8) + (low & 0377));
}
#ifdef DEBUG
dump_font()
{
int i, j, k, l, c;
printf("Dump of font:\n");
for (i = 0; i < 128; i++) {
printf("\nCharacter %d ", i);
if (i < 040)
printf("(^%c)", i + 0100);
else if (i != 0177)
printf("(%c)", i);
else
printf("(^?)");
printf(": ");
printf("H, W, X, Y = %d, %d, %d, %d\n",
gd[i].rg_h, gd[i].rg_w, gd[i].rg_x, gd[i].rg_y);
printf("offset = %ld, voffset = %ld, width = %ld\n",
gd[i].rg_offset, ver_offset[i], gd[i].rg_width);
printf("===RST===\n");
fseek(rstfp, (long)gd[i].rg_offset, 0);
for (j = 0; j < gd[i].rg_h; j++) {
for (k = 0; k < (gd[i].rg_w + 7) / 8; k++) {
c = getc(rstfp);
for (l = 7; l >= 0; l--) {
if (c & (1 << l))
putchar('@');
else
putchar(' ');
}
}
putchar('\n');
}
}
}
#endif