home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
graphics
/
utility
/
mdl10
/
mkdl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-25
|
6KB
|
317 lines
/*
* mkdl -- create a sample dl file
*/
#include <stdio.h>
#include <stdlib.h> /* for malloc */
#include <string.h> /* for bzero */
#include <sys/types.h>
#include <sys/time.h>
typedef struct {
int version;
int format;
int images_per_screen;
char title[21];
char author[21];
int num_screen;
int num_command;
} DL_info;
int __default_mode__ = _IOBIN; /* force stdin binary (gcc) */
char *myname = "mkdl";
void colormap_setup (FILE *, int);
/*------------------------------*/
/* main */
/*------------------------------*/
void main (int argc, char *argv[])
{
DL_info dlinfo; /* dl file info */
char *filename;
FILE *fp;
unsigned char *image_data; /* space for 1 screen from file */
int *cmd; /* space for command list */
int i, j;
/*
* if no files, use stdin. otherwise open file
*/
argv++, argc--;
if (argc < 1)
{
fprintf(stderr, "%s: need file name\n", myname);
exit(1);
}
else if ((fp = fopen (*argv, "wb")) == NULL)
{
fprintf(stderr, "%s: can't open %s\n", myname, argv[1]);
exit(1);
}
filename = *argv;
/*
* set up parameters...
*/
dlinfo.version = 2;
dlinfo.format = 1;
dlinfo.images_per_screen = 4;
dlinfo.num_screen = 1;
dlinfo.num_command = 16;
for (i = 0; i < 20; i++)
{
dlinfo.title[i] = 0;
dlinfo.author[i] = 0;
}
/*
* write the version number...
*/
fputc (dlinfo.version, fp);
/*
* ...and the format.
*/
fputc (dlinfo.format, fp);
/*
* put title and author
*/
for (i = 0; i < 20; i++)
fputc ((int)(dlinfo.title[i] ^ 255), fp);
for (i = 0; i < 20; i++)
fputc ((int)(dlinfo.author[i] ^ 255), fp);
/*
* number of screens and commands.
*/
fputc(dlinfo.num_screen, fp);
fputc(dlinfo.num_command, fp);
/*
* Display what we know so far.
*/
printf("%s is a %s sized version %d .DL file.\n",
filename,
(dlinfo.format == 0 ? "large" : "medium"),
dlinfo.version);
printf("It contains %d images (num_screen=%d * images_per_screen=%d)\n",
dlinfo.num_screen * dlinfo.images_per_screen,
dlinfo.num_screen,
dlinfo.images_per_screen);
printf("in a %d frame (num_command) loop.\n",
dlinfo.num_command);
/*
* do the color map
*/
colormap_setup(fp, dlinfo.version);
/*
* Allocate memory for the commands, the image data, etc
*/
printf ("Allocating memory:\n");
/* command list: */
printf (" command list (%d bytes)\n",
dlinfo.num_command * sizeof(int));
if (!(cmd = (int *)malloc(dlinfo.num_command * sizeof(int))))
{
fprintf(stderr, "%s: out of memory (commands)", myname);
exit(1);
}
/* one screen (file): */
printf (" single screen from file (64000 bytes)\n");
if (NULL == (image_data = (unsigned char *)malloc(320 * 200)))
{
fprintf(stderr, "%s: not enough memory (image data).", myname);
exit(1);
}
/*
* Build the pixmaps for the animation.
*/
printf("Building pixmaps, wait..."); fflush(stdout);
for (j = 0; j < dlinfo.num_screen; j++)
{
/*
* image is stored in 'screens' which can have 1 or 4
* images. with 'medium' format in version 2, layout is:
*
* 0 <-------row------>319
* _____________________ 0
* | | | ^
* | screen 0 | screen 1 | |
* | | | |
* |__________|__________| col
* | | | |
* | screen 2 | screen 3 | |
* | | | v
* |__________|__________| 199
*
* otherwise there is a single image per screen. we try
* and save space for this test.
*
* the image here is just a white vertical bar on a black
* background that moves right in each successive screen.
* the commands will animate it.
*/
unsigned char *dst;
int row;
int col;
dst = (unsigned char *) image_data;
/* set everything black first */
bzero (dst, (size_t)(320*200));
/* image 0 */ for (row = 30; row < 60; row++)
{
for (col = 20; col < 30; col++) dst[row*320 + col] = 255;
}
/* image 1 */ for (row = 30; row < 60; row++)
{
for (col = 185; col < 195; col++) dst[row*320 + col] = 255;
}
/* image 2 */ for (row = 130; row < 160; row++)
{
for (col = 30; col < 40; col++) dst[row*320 + col] = 255;
}
/* image 3 */ for (row = 130; row < 160; row++)
{
for (col = 195; col < 205; col++) dst[row*320 + col] = 255;
}
/*
* one screen of data.
*/
fwrite(image_data, 1, 320 * 200, fp);
}
printf("done\n");
/*
* write the commands.
*/
cmd[0] = 0;
cmd[1] = 1;
cmd[2] = 2;
cmd[3] = 3;
cmd[4] = 2;
cmd[5] = 1;
cmd[6] = 2;
cmd[7] = 3;
cmd[8] = 2;
cmd[9] = 3;
cmd[10] = 2;
cmd[11] = 3;
cmd[12] = 2;
cmd[13] = 1;
cmd[14] = 2;
cmd[15] = 1;
for (i = 0; i < dlinfo.num_command; i++)
{
if (dlinfo.version == 2)
{
fputc(cmd[i], fp);
fputc(0, fp); /* as long as number < 255 */
}
else
{
/*
* unknown??? here is the way it is read:
*
* j = fgetc(fp);
* cmd[i] = (j % 10) - 1 + ((j / 10) - 1) * 4;
*/
fputc(cmd[i], fp);
}
}
fclose (fp);
exit (0);
}
/*------------------------------*/
/* colormap_setup */
/*------------------------------*/
void colormap_setup (FILE *fp, int version)
{
unsigned char pal[768];
int i;
/*
* set up palette (continuous gray)...
*/
for (i = 0; i < 256; i++)
{
pal[3*i ] = i;
pal[3*i + 1] = i;
pal[3*i + 2] = i;
}
/*
* Is this the border colour? mdl ignores this anyway...
*/
if (version == 2)
{
for (i = 0; i < 3; i++)
fputc(0, fp);
}
else
fputc(0, fp);
/*
* write the colormap. 3 bytes per each of 256 colors.
*/
fwrite(pal, 1, 768, fp);
return;
}