This is xanim_dl.c in view mode; [Download] [Up]
/*
* xanim_dl.c
*
* Copyright (C) 1990,1991,1992,1993,1994 by Mark Podlipec.
* All rights reserved.
*
* This software may be freely copied, modified and redistributed without
* fee for non-commerical purposes provided that this copyright notice is
* preserved intact on all copies and modified copies.
*
* There is no warranty or other guarantee of fitness of this software.
* It is provided solely "as is". The author(s) disclaim(s) all
* responsibility and liability with respect to this software's usage
* or its effect upon hardware or computer systems.
*
*/
#include "xanim_dl.h"
XA_CHDR *ACT_Get_CMAP();
XA_ACTION *ACT_Get_Action();
void ACT_Setup_Mapped();
void ACT_Add_CHDR_To_Action();
void ACT_Setup_Loop();
LONG UTIL_Get_LSB_Short();
ULONG UTIL_Get_LSB_Long();
void UTIL_Sub_Image();
ULONG DL_Read_File();
static ULONG dl_version;
static ULONG dl_format;
static ULONG dl_time;
static UBYTE dl_title[21];
static UBYTE dl_author[21];
static ULONG dl_num_of_screens;
static ULONG dl_num_of_images;
static ULONG dl_ims_per_screen;
static ULONG dl_num_of_frames;
static ULONG dl_frame_cnt;
static ULONG dl_loop_frame;
static XA_ACTION **dl_frame_lst;
static ULONG dl_imagex,dl_imagey,dl_imagec;
static ColorReg dl_cmap[DL_MAX_COLORS];
static XA_ACTION **dl_acts;
static XA_CHDR *dl_chdr;
static ULONG dl_image_cnt;
/*
*
*/
LONG Is_DL_File(filename)
char *filename;
{
FILE *fin;
ULONG data0,data1;
if ( (fin=fopen(filename,XA_OPEN_MODE)) == 0) return(XA_NOFILE);
data0 = fgetc(fin);
data1 = fgetc(fin);
fclose(fin);
if (data0 == 0x01) return(TRUE);
if (data0 == 0x02)
{
if ( (data1 >= 0x00) && (data1 <= 0x02) ) return(TRUE);
}
return(FALSE);
}
/*
*
*/
ULONG DL_Read_File(fname,anim_hdr)
XA_ANIM_HDR *anim_hdr;
char *fname;
{
FILE *fin;
LONG i,j,ret,tmp;
XA_ACTION *act;
UBYTE *pic;
ULONG pic_size;
XA_ACTION *prev_end_act;
dl_chdr = 0;
dl_acts = 0;
dl_ims_per_screen = 1;
if ( (fin = fopen(fname,XA_OPEN_MODE)) == 0)
{
fprintf(stderr,"DL_Read_File: Can't open %s for reading.\n",fname);
return(FALSE);
}
dl_version = fgetc(fin); /* either 1 or 2 */
switch(dl_version)
{
case DL_VERSION_1:
dl_format = DL_FORM_MEDIUM;
break;
case DL_VERSION_2:
dl_format = fgetc(fin);
break;
default:
break;
}
switch(dl_format)
{
case DL_FORM_LARGE:
dl_imagex = DL_LARGE_XSIZE;
dl_imagey = DL_LARGE_YSIZE;
dl_ims_per_screen = 1;
break;
case DL_FORM_MEDIUM:
dl_imagex = DL_MEDIUM_XSIZE;
dl_imagey = DL_MEDIUM_YSIZE;
dl_ims_per_screen = 4;
break;
case DL_FORM_SMALL:
dl_imagex = DL_SMALL_XSIZE;
dl_imagey = DL_SMALL_YSIZE;
dl_ims_per_screen = 16;
break;
default:
fprintf(stderr,"DL_Read_File: unknown format %lx\n",dl_format);
return(FALSE);
break;
}
dl_title[20] = 0;
for(i=0; i<20; i++)
{
tmp = fgetc(fin);
dl_title[i] = (tmp)?(tmp ^ 0xff):tmp;
}
dl_author[0] = dl_author[20] = 0;
if (dl_version == DL_VERSION_2)
{
for(i=0; i<20; i++)
{
tmp = fgetc(fin);
dl_author[i] = (tmp)?(tmp ^ 0xff):tmp;
}
}
dl_num_of_screens = fgetc(fin);
/*
dl_num_of_images = dl_num_of_screens * (dl_format * 3 + 1);
*/
dl_num_of_images = dl_num_of_screens * dl_ims_per_screen;
if (dl_version == DL_VERSION_1)
dl_num_of_frames = UTIL_Get_LSB_Short(fin);
else
dl_num_of_frames = UTIL_Get_LSB_Long(fin);
if (xa_verbose == TRUE)
{
fprintf(stderr," Version %ld Format %ld",dl_version,dl_format);
fprintf(stderr," Images %ld Frames %ld\n",
dl_num_of_images, dl_num_of_frames );
fprintf(stderr," Title = %s Author = %s\n",dl_title,dl_author);
}
dl_imagec = DL_MAX_COLORS;
for(i=0; i < DL_MAX_COLORS; i++)
{
dl_cmap[i].red = fgetc(fin) & 0x3f;
dl_cmap[i].green = fgetc(fin) & 0x3f;
dl_cmap[i].blue = fgetc(fin) & 0x3f;
}
dl_chdr = ACT_Get_CMAP(dl_cmap,DL_MAX_COLORS,0,DL_MAX_COLORS,0,6,6,6);
pic_size = dl_imagex * dl_imagey;
dl_time = XA_GET_TIME(100);
dl_acts = (XA_ACTION **)malloc(dl_num_of_images * sizeof(XA_ACTION *));
dl_image_cnt = 0;
for(j = 0; j < dl_num_of_screens; j++)
{
switch(dl_format)
{
case DL_FORM_LARGE: /* large */
pic = (UBYTE *) malloc( XA_PIC_SIZE(pic_size) );
if (pic == 0) TheEnd1("DL: malloc failed.\n");
ret = fread(pic, pic_size, 1, fin);
if (ret != 1) TheEnd1("DL: read of image failed format 0");
DEBUG_LEVEL2 fprintf(stderr,"Read large format image\n");
act = ACT_Get_Action(anim_hdr);
dl_acts[dl_image_cnt] = act; dl_image_cnt++;
ACT_Setup_Mapped(act,pic,dl_chdr,0,0,dl_imagex,dl_imagey,
dl_imagex,dl_imagey,FALSE,0,TRUE,TRUE,FALSE);
ACT_Add_CHDR_To_Action(act,dl_chdr);
break;
case DL_FORM_MEDIUM: /* medium */
case DL_FORM_SMALL: /* medium */
{
ULONG x,y;
UBYTE *t_pic;
tmp = DL_LARGE_XSIZE * DL_LARGE_YSIZE;
pic = (UBYTE *) malloc( tmp );
if (pic == 0) TheEnd1("DL: malloc failed.\n");
ret = fread(pic, tmp , 1, fin);
if (ret != 1) TheEnd1("DL: read of image failed format 1");
DEBUG_LEVEL2 fprintf(stderr,"Read small/medium image\n");
for(y = 0; y < DL_LARGE_YSIZE; y += dl_imagey)
for(x = 0; x < DL_LARGE_XSIZE; x += dl_imagex)
{
t_pic = (UBYTE *) malloc( XA_PIC_SIZE(pic_size) );
if (t_pic == 0) TheEnd1("DL: malloc failed.\n");
UTIL_Sub_Image(t_pic,pic,dl_imagex,dl_imagey, x, y,(DL_LARGE_XSIZE),1);
act = ACT_Get_Action(anim_hdr);
dl_acts[dl_image_cnt] = act; dl_image_cnt++;
ACT_Setup_Mapped(act,t_pic,dl_chdr, 0,0,dl_imagex,dl_imagey,
dl_imagex,dl_imagey,FALSE,0,TRUE,TRUE,FALSE);
ACT_Add_CHDR_To_Action(act,dl_chdr);
}
}
break;
}
}
dl_frame_lst = (XA_ACTION **)malloc( dl_num_of_frames * sizeof(XA_ACTION *) );
if (dl_frame_lst == 0) TheEnd1("DL_Read_File: malloc failed");
prev_end_act = 0;
dl_loop_frame = 0;
switch(dl_version)
{
case DL_VERSION_1:
dl_frame_cnt = 0;
for(i=0; i < dl_num_of_frames; i++)
{
register ULONG tmp;
tmp = fgetc(fin);
tmp = (tmp % 10) - 1 + ((tmp / 10) - 1) * 4;
dl_frame_lst[dl_frame_cnt] = dl_acts[tmp];
dl_frame_cnt++;
}
break;
case DL_VERSION_2:
{
DEBUG_LEVEL2 fprintf(stderr," DL reading frame lst: ");
dl_frame_cnt = 0;
i = 0;
while(i < dl_num_of_frames)
{
register ULONG tmp;
tmp = fgetc(fin); tmp |= ( fgetc(fin) << 8); i++;
DEBUG_LEVEL2 fprintf(stderr,"\t<%ld %lx>",i,tmp);
if (tmp & 0x8000)
{
switch(tmp)
{
case 0xffff:
{
ULONG cnt;
XA_ACTION *begin_act,*end_act;
ACT_END_LP_HDR *end_lp;
cnt = fgetc(fin); cnt |= ( fgetc(fin) << 8); i++;
DEBUG_LEVEL2 fprintf(stderr,"begin loop %ld",cnt);
begin_act = ACT_Get_Action(anim_hdr,0);
end_act = ACT_Get_Action(anim_hdr,0);
dl_frame_lst[dl_frame_cnt] = begin_act;
dl_frame_cnt++;
ACT_Setup_Loop(begin_act,end_act,cnt,dl_frame_cnt,
0);
end_lp = (ACT_END_LP_HDR *)end_act->data;
end_lp->prev_end_act = prev_end_act;
prev_end_act = end_act; /* nest loops */
}
break;
case 0xfffe:
{
ACT_END_LP_HDR *end_lp;
end_lp = (ACT_END_LP_HDR *)prev_end_act->data;
if (dl_frame_cnt > 0)
*end_lp->end_frame = dl_frame_cnt - 1;
else *end_lp->end_frame = 0;
dl_frame_lst[dl_frame_cnt] = prev_end_act;
dl_frame_cnt++;
/* unnest loops */
prev_end_act = end_lp->prev_end_act;
DEBUG_LEVEL2 fprintf(stderr,"end loop ");
}
break;
case 0xfffd:
tmp = fgetc(fin); tmp |= ( fgetc(fin) << 8); i++;
DEBUG_LEVEL2 fprintf(stderr,"key press %lx\n",tmp);
break;
default:
fprintf(stderr,"unknown code %lx\n",tmp);
break;
}
}
else
{
if (tmp < dl_image_cnt)
{
dl_frame_lst[dl_frame_cnt] = dl_acts[tmp];
dl_frame_cnt++;
}
else
{
fprintf(stderr," unknown code - ignored. %lx\n",tmp);
}
}
}
DEBUG_LEVEL2 fprintf(stderr,"\n");
if (dl_loop_frame >= dl_frame_cnt) dl_loop_frame = 0;
}
break;
}
anim_hdr->frame_lst =
(XA_FRAME *)malloc(sizeof(XA_FRAME) * (dl_frame_cnt + 1) );
if (anim_hdr->frame_lst == NULL)
TheEnd1("DL_ANIM: couldn't malloc for frame_lst\0");
for(i=0; i < dl_frame_cnt; i++)
{
anim_hdr->frame_lst[i].act = dl_frame_lst[i];
if ( (dl_frame_lst[i]->type == ACT_BEG_LP)
|| (dl_frame_lst[i]->type == ACT_END_LP) )
anim_hdr->frame_lst[i].time = 0;
else anim_hdr->frame_lst[i].time = dl_time;
}
anim_hdr->frame_lst[dl_frame_cnt].time = 0;
anim_hdr->frame_lst[dl_frame_cnt].act = 0;
anim_hdr->loop_frame = dl_loop_frame;
anim_hdr->last_frame = dl_frame_cnt-1;
anim_hdr->imagex = dl_imagex;
anim_hdr->imagey = dl_imagey;
anim_hdr->imagec = dl_imagec;
anim_hdr->imaged = 8; /* nop */
FREE(dl_frame_lst,0x5000); dl_frame_lst=0;
FREE(dl_acts,0x5001); dl_acts=0;
return(TRUE);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.