ftp.nice.ch/pub/next/graphics/movie/Movie.3.0.NIHS.bs.tar.gz#/Movie3.0/Source/xanim/xanim_dl.c

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.