⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp2res.c

📁 早期freebsd实现
💻 C
字号:
/* * Copyright (c) 1984, 1985, 1986 Xerox Corp. * *    This module reads a compressed bitmap file in the MacPaint *    format and outputs an RES file. * *    For a description of RES (Raster Encoding Standard) see *    the booklet entitled "Raster Encoding Standard" XNS Standard 178506 *    (June, 1985) * * HISTORY * 21-Jul-86  Lee Moore (lee) at Xerox Webster Research Center *	Added the ability to generate IP masters, too. * * 07-Jul-86  Lee Moore (lee) at Xerox Webster Research Center *	Converted for use with getopt. * * 03-Jun-86  Lee Moore (lee) at Xerox Webster Research Center *	Created mp2res from readmac.c . * * * K. Knox, 10-Dec-84 18:51:22, Created readmac. */#include <stdio.h>#include "iptokens.h"#include "literal.h"#include "operator.h"#define err0 "usage: readmac filename\n"#define err1 "mp2res: Could not open, %s.\n"#define TRUE	1#define FALSE	0/* External procedures. */extern char *malloc();/* * Main program *	parse command line *	call ProcessData to do the work */main(argc, argv)int argc;char *argv[];{	int c;	int	firstRow = 0,		lastRow = (720 - 1),		firstColumn = 0,		lastColumn = (576 - 1),		outputFileFD,		makeInterpress = FALSE;	extern char *optarg;	extern optind;	FILE *inputFileDesc;	outputFileFD = 1;		/* standard out */	while ((c = getopt(argc, argv, "it:b:l:o:r:")) != EOF)	    switch (c) {		case 'i':		    makeInterpress = TRUE;		    break;		case 't':		/* top */		    firstRow = atoi(optarg);		    break;		case 'b':		/* bottom */		    lastRow = atoi(optarg);		    break;		case 'l':		/* left */		    firstColumn = atoi(optarg);		    break;		case 'o':		/* output file */		    if( (outputFileFD = creat(optarg, 0664)) < 0) {			fprintf(stderr, "mp2res: can't open %s for writing\n", optarg);			perror(optarg);			exit(1);		    }		    break;		case 'r':		/* right */		    lastColumn = atoi(optarg);		    break;	    default:		printf("ipmetrics: option '%c' not allowed\n");	    }	/* do we read from standard input? */	if (argc == optind) {		inputFileDesc = stdin;	} else {		/* open the MacPaint file */		if ((inputFileDesc = fopen(argv[optind], "r")) == NULL)			fprintf(stderr, err1, argv[optind]);	}	if (! makeInterpress )	    MakeRES(inputFileDesc, outputFileFD,		firstRow, lastRow, firstColumn, lastColumn);	else	    MakeIP(inputFileDesc, outputFileFD,		firstRow, lastRow, firstColumn, lastColumn);	exit(0);}/* * Convert a MacPaint document to an RES file *	don't copy the data that the user doesn't want */MakeRES(inputFileDesc, outputFileFD,	firstRow, lastRow, firstColumn, lastColumn)FILE *inputFileDesc;int outputFileFD,	firstRow, lastRow, firstColumn, lastColumn;{	int i,		bufferSize;	int	pixelsPerScanLine,		numberOfScanLines,		bytesPerScanLine;	unsigned char *image, *p;	pixelsPerScanLine = lastColumn - firstColumn + 1;	numberOfScanLines = lastRow - firstRow + 1;	if( pixelsPerScanLine % 32 != 0 )		fprintf(stderr, "internal error: %d is not a multiple of 32\n", pixelsPerScanLine);	bytesPerScanLine = (pixelsPerScanLine + 7)/8;	/* skip over MacPaint header */	for (i=0; i < 512; i++)		getc(inputFileDesc);	bufferSize = bytesPerScanLine * numberOfScanLines;	image = (unsigned char *) malloc((unsigned) bufferSize);	res_select(outputFileFD);	AppendOp(OP_beginBlock);	/* element 1: imageScale */	AppendRational(254L, 72L*100*100);	/* assume 72 spots/inch */	AppendOp(OP_dup);	AppendInteger(2L);	AppendOp(OP_makevec);	/* element 2: xDimension */	AppendInteger((long) pixelsPerScanLine);		/* xPixels */	/* element 3: yDimension */	AppendInteger((long) numberOfScanLines);		/* yPixels */	/* element 4: maskImage */	AppendInteger(0L);				/* maskImage */	/* element 5: colorImage */	AppendInteger((long) numberOfScanLines);		/* yPixels */	AppendInteger((long) pixelsPerScanLine);		/* xPixels */	AppendInteger(1L);		/* sampelsPerPixel */	AppendInteger(1L);		/* maxSampleValue */	AppendInteger(1L);		/* samplesInterleaved */	/* enter transformation to bring it to row major order */	AppendInteger(-90L);	AppendOp(OP_rotate);	AppendInteger(0L);	AppendInteger((long) numberOfScanLines);	AppendOp(OP_translate);	AppendOp(OP_concat);	/* skip over as many rows as needed */	for (i = 0; i < firstRow; i++)		readscan(inputFileDesc, image);	/* read the scan lines in */	for (i = firstRow, p = image; i <= lastRow; i++, p += bytesPerScanLine)		readscan(inputFileDesc, p);	AppendPPVector(bufferSize, 1, pixelsPerScanLine, (unsigned char *) image);	Op(makepixelarray);		/* make the array */	/* element 6: colorOperator */	AppendInteger(0L);	/* element 7: image Properties */	AppendIdentifier("imageDescription");	AppendString("made from a MacPaint file");	Makevec(2);	/* element 8: signature */	AppendInteger(13086L);	AppendOp(OP_endBlock);	ip_flush();	free((char *) image);}MakeIP(inputFileDesc, outputFileFD,	firstRow, lastRow, firstColumn, lastColumn)FILE *inputFileDesc;int outputFileFD,	firstRow, lastRow, firstColumn, lastColumn;{	int i,		bufferSize;	int	pixelsPerScanLine,		numberOfScanLines,		bytesPerScanLine;	unsigned char *image, *p;	pixelsPerScanLine = lastColumn - firstColumn + 1;	numberOfScanLines = lastRow - firstRow + 1;	if( pixelsPerScanLine % 32 != 0 )		fprintf(stderr, "%d is not a multiple of 32\n", pixelsPerScanLine);	bytesPerScanLine = (pixelsPerScanLine + 7)/8;	for (i=0; i < 512; i++)		getc(inputFileDesc);	bufferSize = bytesPerScanLine * numberOfScanLines;	image = (unsigned char *) malloc((unsigned) bufferSize);	ip_select(outputFileFD);	AppendOp(OP_beginBlock);	AppendOp(OP_beginBody);	AppendOp(OP_endBody);	/* end preamble */	AppendOp(OP_beginBody);	/* page 1 (and only) */	AppendRational(254L, 72L*100*100);	/* assume 72 spots/inch */	AppendOp(OP_scale);	Translate(.5*.0254, .25*.0254);	AppendOp(OP_concat);	AppendOp(OP_concatt);	AppendInteger((long) numberOfScanLines);		/* yPixels */	AppendInteger((long) pixelsPerScanLine);		/* xPixels */	AppendInteger(1L);		/* sampelsPerPixel */	AppendInteger(1L);		/* maxSampleValue */	AppendInteger(1L);		/* samplesInterleaved */	/* enter transformation to bring it to row major order */	AppendInteger(-90L);	AppendOp(OP_rotate);	AppendInteger(0L);	AppendInteger((long) numberOfScanLines);	AppendOp(OP_translate);	AppendOp(OP_concat);	/* skip over as many rows as needed */	for (i = 0; i < firstRow; i++)		readscan(inputFileDesc, image);	for (i = firstRow, p = image; i <= lastRow; i++, p += bytesPerScanLine)		readscan(inputFileDesc, p);	/* output the result to the Interpress file */	AppendPPVector(bufferSize, 1, pixelsPerScanLine, (unsigned char *) image);	Op(makepixelarray);		/* make the array */	/* draw a box around the pixel array */	AppendInteger(1L);		/* unit stroke width */	AppendInteger(15L);		/* stroke width imager variable */	AppendOp(OP_iset);	AppendRational(-1L, 2L);	AppendRational(-1L, 2L);	AppendOp(OP_moveto);	AppendInteger((long) (numberOfScanLines + 1));	AppendOp(OP_linetoy);	AppendInteger((long) (pixelsPerScanLine + 1));	AppendOp(OP_linetox);	AppendRational(-1L, 2L);	AppendOp(OP_linetoy);	AppendRational(-1L, 2L);	AppendOp(OP_linetox);	AppendOp(OP_maskstroke);	/* prepare to show pixel array */	AppendInteger(0L);	AppendInteger(0L);	AppendOp(OP_setxy);	Op(maskpixel);			/* show it */	AppendOp(OP_endBody);	AppendOp(OP_endBlock);	ip_flush();	free((char *) image);}/* * Read the next scan line from the MacPaint file */readscan(inputFileDesc, image)FILE *inputFileDesc;unsigned char *image;{	int in_pos, count, data_byte;	in_pos = 0;	while (in_pos < 72)	{		count = getc(inputFileDesc);		if (count > 127)			count -= 256;		if (count >= 0) {			/* run of raw bytes */			count++;                            /* # of bytes to read */			while (count--)				image[in_pos++] = getc(inputFileDesc);		} 		else {			/* run of repeated byte */			count = -count+1;	                 /* repetition factor */			data_byte = getc(inputFileDesc);              /* byte to repeat */			while (count--)				image[in_pos++] = data_byte;		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -