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

This is xanim.h in view mode; [Download] [Up]

/*
 * xanim.h
 *
 * 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.
 *
 */
 
#define XWIN 0
#define MAIN 0
#define SETFILE 0

#if XWIN
#include <Xos.h>
#endif
#include <sys/types.h>
#ifndef VMS
#include <sys/param.h>
#include <memory.h>
#include <unistd.h>
#else
#include <unixio.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#if XWIN
#include <Xlib.h>
#endif
#include "xanim_config.h"

#ifdef XA_XTPOINTER
typedef void* XtPointer
#endif

/*
 * MSDOS needs to be specifically told to open file for binary reading.
 * For VMS systems, specify "Stream_LF" mode for VAX C.
 */
#ifdef MSDOS
#define XA_OPEN_MODE "rb"
#else
#ifdef VMS
#define XA_OPEN_MODE "r","ctx=stm"
#else
#define XA_OPEN_MODE "r"
#endif
#endif

#define LONG int
#define ULONG unsigned int
#define BYTE char
#define UBYTE unsigned char
#define SHORT short
#define USHORT unsigned short
#define WORD short int
#define UWORD unsigned short int

#undef TRUE
#undef FALSE
#define TRUE 1
#define FALSE 0
#define XA_NOFILE 2


#define XA_MIN(x,y)   ( ((x)>(y))?(y):(x) )
#define XA_MAX(x,y)   ( ((x)>(y))?(x):(y) )

/* Read xanim.readme at the end for more info on this line
*/
#ifndef HZ
#define HZ 60
#endif

#define MS_PER_60HZ 17

#if !XWIN
#include "xsim.h"
#endif

/* X11 variables */

#define XA_GRAYSCALE	0x06
#define XA_STATICGRAY	0x03
#define XA_PSEUDOCOLOR	0x14
#define XA_STATICCOLOR	0x11
#define XA_DIRECTCOLOR	0x18
#define XA_TRUECOLOR	0x19
#define XA_MONOCHROME	0x00

#define XA_X11_STATIC	0x01
#define XA_X11_GRAY	0x02
#define XA_X11_CMAP	0x04
#define XA_X11_TRUE	0x08
#define XA_X11_COLOR	0x10

extern LONG x11_depth;
extern LONG x11_class;
extern LONG x11_bytes_pixel;
extern LONG x11_bits_per_pixel;
extern LONG x11_bitmap_pad;
extern LONG x11_bitmap_unit;
extern LONG x11_bit_order;
extern LONG x11_byte_order;
extern LONG x11_pack_flag;
extern LONG x11_cmap_flag;
extern LONG x11_cmap_size;
extern LONG x11_disp_bits;
extern LONG x11_cmap_type;
extern LONG x11_depth_mask;
extern LONG x11_display_type;
extern LONG x11_red_mask;
extern LONG x11_green_mask;
extern LONG x11_blue_mask;
extern LONG x11_red_shift;
extern LONG x11_green_shift;
extern LONG x11_blue_shift;
extern LONG x11_red_bits;
extern LONG x11_green_bits;
extern LONG x11_blue_bits;
extern LONG x11_black;
extern LONG x11_white;
extern LONG x11_verbose_flag;
extern ULONG x11_kludge_1;

#define X11_MSB  1
#define X11_LSB  0

extern LONG xa_anim_holdoff;
extern LONG xa_anim_status;

/*------*/
#define XA_NEXT_MASK	0x01
#define XA_STOP_MASK	0x02
#define XA_STEP_MASK	0x04
#define XA_RUN_MASK	0x08
#define XA_ISTP_MASK	0x10
#define XA_FILE_MASK	0x20
#define XA_CLEAR_MASK	0x01
#define XA_BEGIN_MASK	0x01
/*------*/
#define XA_UNSTARTED   0x00
#define XA_BEGINNING   0x80
#define XA_STOP_PREV   0x02
#define XA_STOP_NEXT   0x03
#define XA_STEP_PREV   0x04
#define XA_STEP_NEXT   0x05
#define XA_RUN_PREV    0x08
#define XA_RUN_NEXT    0x09
#define XA_ISTP_PREV   0x14
#define XA_ISTP_NEXT   0x15
#define XA_FILE_PREV   0x24
#define XA_FILE_NEXT   0x25

#define XA_SHOW_NORM   0
#define XA_SHOW_SKIP   1

#define NOFILE_ANIM   0xffff
#define UNKNOWN_ANIM  0
#define IFF_ANIM      1
#define FLI_ANIM      2
#define GIF_ANIM      3
#define TXT_ANIM      4
#define FADE_ANIM     5
#define DL_ANIM       6
#define JPG_ANIM      7
#define PFX_ANIM      8
#define SET_ANIM      9
#define RLE_ANIM     10
#define AVI_ANIM     11
#define QT_ANIM      12
#define MPG_ANIM     13

typedef struct
{
  USHORT red,green,blue,gray;
} ColorReg;

typedef struct XA_ACTION_STRUCT
{
 LONG type;		/* type of action */
 LONG cmap_rev;          /* rev of cmap */
 UBYTE *data;		/* data ptr */
 struct XA_ACTION_STRUCT *next;
 struct XA_CHDR_STRUCT *chdr;
 ColorReg *h_cmap;	/* For IFF HAM images */
 ULONG *map;
 struct XA_ACTION_STRUCT *next_same_chdr; /*ptr to next action with same cmap*/
} XA_ACTION;

typedef struct XA_CHDR_STRUCT
{
 LONG rev;
 ColorReg *cmap;
 ULONG csize,coff;
 ULONG *map;
 ULONG msize,moff;
 struct XA_CHDR_STRUCT *next;
 XA_ACTION *acts;
 struct XA_CHDR_STRUCT *new_chdr;
} XA_CHDR;

typedef struct
{
 ULONG csize,coff;
 UBYTE data[4];
} ACT_CMAP_HDR;

typedef struct XA_FRAME_STRUCT
{
  XA_ACTION *act;	/* ptr to relevant Action */
  LONG time;		/* # of milliseconds */
  LONG timelo;		/* higher precision time */
} XA_FRAME;

typedef struct
{
  ULONG count;    /* number of loops */
  LONG cnt_var;   /* var to keep track of loops */
  ULONG end_frame; /* last frame of loop */
} ACT_BEG_LP_HDR;

typedef struct ACT_END_LP_STRUCT
{
  ULONG *count;       /* points back to beg_lp->count */
  LONG *cnt_var;      /* points back to beg_lp->cnt_var */
  ULONG begin_frame;  /* first frame of loop */
  ULONG *end_frame;   /* points back to beg_lp->end_frame */
  XA_ACTION *prev_end_act; /* used to nest loops during creation */
} ACT_END_LP_HDR;

/** AUDIO SECTION ************************/

#ifdef XA_SPARC_AUDIO
#define XA_AUDIO 1
#endif
#ifdef XA_LINUX_AUDIO
#define XA_AUDIO 1
#endif
#ifdef XA_SGI_AUDIO
#define XA_AUDIO 1
#endif


#define XA_AUDIO_STEREO_MSK	0x000001
#define XA_AUDIO_BPS_2_MSK	0x000002
#define XA_AUDIO_BIGEND_MSK	0x000004
#define XA_AUDIO_INVALID	0x000000
#define XA_AUDIO_LINEAR		0x000010
#define XA_AUDIO_SIGNED		0x000020
#define XA_AUDIO_SUN_AU		0x000030
#define XA_AUDIO_ADPCM		0x000040
#define XA_AUDIO_TYPE_MASK  	0xfffff0

/*NOTES: 
 * last ending is [1|2](BPS),[M|S](Mono/Stereo),[B|L](big/little endian)
 */
   /* 8 bit LINUX */
#define XA_AUDIO_LINEAR_1M	0x000010
#define XA_AUDIO_SIGNED_1M	0x000020
#define XA_AUDIO_LINEAR_1S	0x000011
#define XA_AUDIO_SIGNED_1S	0x000021
   /* 16 bit Sparc 10 DBRI, SGI Indigo */
#define XA_AUDIO_SIGNED_2MB	0x000026
   /* 16 bit LINUX */
#define XA_AUDIO_LINEAR_2ML	0x000012

#define XA_AUDIO_SIGNED_2ML	0x000022
#define XA_AUDIO_LINEAR_2MB	0x000016

#define XA_AUDIO_LINEAR_2SB	0x000017
#define XA_AUDIO_LINEAR_2SL	0x000013
#define XA_AUDIO_SIGNED_2SB	0x000027
#define XA_AUDIO_SIGNED_2SL	0x000023
#define XA_AUDIO_ADPCM_M	0x000040

#define XA_AUDIO_FILE_FLAG   0x0001

typedef struct XA_SND_STRUCT
{
  ULONG type;		/* type, chans, bps, */
  ULONG flag;		/* flags */
  ULONG fpos;		/* starting file position */
  ULONG ifreq;		/* input sample freq */
  ULONG hfreq;		/* closest hardware freq */
  ULONG inc;		/* inc for i to h converstion << 24 */
  ULONG ilen;		/* total size in bytes*/
  ULONG inc_cnt;	/* dynamic var for freq conv */
  ULONG bit_cnt;	/* dynamic var for partial bytes */
  ULONG len_cnt;	/* dynamic var for length */
  ULONG (*delta)();	/* conversion routine */
  ULONG ch_time;	/* chunk time */
  ULONG ch_timelo;
  ULONG ch_size;	/* size of chunk */
  ULONG spec;		/* used by decoder */
  UBYTE *snd;		/* sound if present */
  struct XA_SND_STRUCT *next;
} XA_SND;


typedef struct XA_PAUSE_STRUCT
{
  ULONG frame;
  struct XA_PAUSE_STRUCT *next;
} XA_PAUSE;

typedef struct XA_ANIM_HDR_STRUCT
{
  LONG file_num;
  LONG anim_type;	/* animation type */
  LONG imagex;		/* width */
  LONG imagey;		/* height */
  LONG imagec;		/* number of colors */
  LONG imaged;		/* depth in planes */
  LONG dispx;		/* display width */
  LONG dispy;		/* display height */
  LONG buffx;		/* buffered width */
  LONG buffy;		/* buffered height */
  LONG anim_flags;
  LONG loop_num;	/* number of times to loop animation */
  LONG loop_frame;	/* index of loop frame */
  LONG last_frame;	/* index of last frame */
  char *name;		/* name of anim */
  char *fname;		/* name of anim data file */
/* char *fsndname;	eventually have separate sound file name */
  LONG max_fsize;	/* Largest codec size */
  XA_FRAME *frame_lst;	/* array of Frames making up the animation */
  XA_ACTION *acts;	/* actions associated with this animation */
  XA_SND *first_snd;	/* ptr to first sound chunk */
  XA_SND *last_snd;	/* ptr to last sound chunk */
  XA_PAUSE *pause_lst;	/* pause list */
  void (*init_vid)();	/* routine to init video */
  void (*init_aud)();	/* routine to init audio */
  struct XA_ANIM_HDR_STRUCT *next_file;
  struct XA_ANIM_HDR_STRUCT *prev_file;
} XA_ANIM_HDR;

#define ANIM_HAM	0x00000009
#define ANIM_HAM6	0x00000001
#define ANIM_LACE	0x00000002
#define ANIM_CYCLE	0x00000004
#define ANIM_HAM8	0x00000008
#define ANIM_PIXMAP	0x00000100
#define ANIM_PING	0x00010000
#define ANIM_NOLOOP	0x00020000
/* single buffered, x11_bytes_pixel */
#define ANIM_SNG_BUF	0x01000000
/* double buffered, 1 byte per pixel */
#define ANIM_DBL_BUF	0x02000000
#define ANIM_3RD_BUF	0x04000000
/* open anim_hdr->fname when starting anim */
#define ANIM_USE_FILE	0x08000000

typedef struct
{
 LONG imagex;
 LONG imagey;
 LONG xoff;
 LONG yoff;
} SIZE_HDR;

typedef struct
{ 
 LONG xpos;
 LONG ypos;
 LONG xsize;
 LONG ysize;
 XImage *image;
 UBYTE *clip;
} ACT_IMAGE_HDR;

typedef struct
{ 
 LONG xpos;
 LONG ypos;
 LONG xsize;
 LONG ysize;
 Pixmap pixmap;
 Pixmap clip;
} ACT_PIXMAP_HDR;

typedef struct
{ 
  ULONG (*delta)();
  ULONG flags;
  ULONG xpos,ypos;
  ULONG xsize,ysize;
  ULONG special;
  ULONG extra;
  ULONG fpos;
  ULONG fsize;
  UBYTE data[4];
} ACT_DLTA_HDR;

/* ACT_DLTA_HDR Flag Values */
#define ACT_SNGL_BUF    0x0100   /* delta is from sngl buffer anim */
#define ACT_DBL_BUF     0x0200   /* delta is from sngl buffer anim */
#define ACT_3RD_BUF     0x0400   /* needs 3rd buffer for HAM or Dither */
#define DLTA_DATA	0x1000   /* delta data is present */

/* DELTA Return VALUES */
#define ACT_DLTA_NORM   0x00000000   /* nothing special */
#define ACT_DLTA_BODY   0x00000001   /* IFF BODY - used for dbl buffer */
#define ACT_DLTA_XOR    0x00000002   /* delta work in both directions */
#define ACT_DLTA_NOP    0x00000004   /* delta didn't change anything */
#define ACT_DLTA_MAPD   0x00000008   /* delta was able to map image */
#define ACT_DLTA_BAD    0x80000000   /* uninitialize value if needed */


typedef struct STRUCT_ACT_SETTER_HDR
{ 
 XA_ACTION *work;
 LONG xback,yback;
 LONG xpback,ypback; 
 XA_ACTION *back;
 LONG xface,yface;
 LONG xpface,ypface;
 LONG depth;
 XA_ACTION *face;
 struct STRUCT_ACT_SETTER_HDR *next;
} ACT_SETTER_HDR;

typedef struct
{ 
  LONG xpos;
  LONG ypos;
  LONG xsize;
  LONG ysize;
  LONG psize;
  UBYTE *clip;
  UBYTE *data; 
} ACT_MAPPED_HDR;

typedef struct
{ 
  LONG xpos;
  LONG ypos;
  LONG xsize;
  LONG ysize;
  LONG psize;
  LONG rbits;
  LONG gbits;
  LONG bbits;
  UBYTE *clip;
  UBYTE *data; 
} ACT_TRUE_HDR;

typedef struct
{ 
  LONG xpos;
  LONG ypos;
  LONG xsize;
  LONG ysize;
  LONG pk_size;
  UBYTE *clip;
  UBYTE data[4]; 
} ACT_PACKED_HDR;

typedef struct
{ 
 LONG xpos;
 LONG ypos;
 LONG xsize;
 LONG ysize;
 XImage *image;
 UBYTE *clip_ptr;
} ACT_CLIP_HDR;

#define ACT_NOP		0x0000
#define ACT_DELAY	0x0001
#define ACT_IMAGE	0x0002
#define ACT_CMAP	0x0003
#define ACT_SIZE	0x0004
#define ACT_FADE	0x0005
#define ACT_CLIP	0x0006
#define ACT_PIXMAP	0x0007
#define ACT_SETTER	0x0008
#define ACT_RAW		0x0009
#define ACT_PACKED	0x0010
#define ACT_DISP	0x0011
#define ACT_MAPPED	0x0012
#define ACT_TRUE	0x0013
#define ACT_PIXMAPS	0x0014
#define ACT_IMAGES	0x0015
#define ACT_CYCLE	0x0016
#define ACT_DELTA	0x0017
#define ACT_BEG_LP	0x0100
#define ACT_END_LP	0x0101
#define ACT_JMP2END	0x0102

/* flags */
extern LONG xa_verbose;
extern LONG xa_debug;
extern LONG xa_jiffy_flag;
extern LONG xa_buffer_flag;
extern LONG xa_file_flag;
extern LONG xa_optimize_flag;
extern LONG xa_use_depth_flag;

#define DEBUG_LEVEL1   if (xa_debug >= 1) 
#define DEBUG_LEVEL2   if (xa_debug >= 2) 
#define DEBUG_LEVEL3   if (xa_debug >= 3) 
#define DEBUG_LEVEL4   if (xa_debug >= 4) 
#define DEBUG_LEVEL5   if (xa_debug >= 5) 

#define XA_CMAP_SIZE 256
#define XA_HMAP_SIZE  64
#define XA_HMAP6_SIZE 16
#define XA_HMAP8_SIZE 64

/* CMAP function flags for ACT_Setup_CMAP */
#define CMAP_DIRECT		0x000000
#define CMAP_ALLOW_REMAP	0x000001


#define CMAP_SCALE4 4369
#define CMAP_SCALE5 2114
#define CMAP_SCALE6 1040
#define CMAP_SCALE8  257
#define CMAP_SCALE9  128
#define CMAP_SCALE10  64
#define CMAP_SCALE11  32
#define CMAP_SCALE13   8
extern ULONG cmap_scale[17];
extern LONG cmap_true_to_332;
extern LONG cmap_true_to_gray;
extern LONG cmap_true_to_1st;
extern LONG cmap_true_to_all;
extern LONG cmap_true_map_flag;
extern LONG cmap_dither_type;

extern ULONG cmap_sample_cnt;  /* how many times to sample colors for +CF4 */
extern ULONG cmap_color_func;
extern LONG cmap_luma_sort;
extern LONG cmap_map_to_1st_flag;
extern LONG cmap_play_nice;
extern XA_CHDR *xa_chdr_start;
extern XA_CHDR *xa_chdr_cur;
extern XA_CHDR *xa_chdr_now;
extern ColorReg *xa_cmap;
extern ULONG xa_cmap_size;
extern ULONG xa_cmap_off;
extern LONG cmap_median_type;
extern SHORT cmap_floyd_error;
extern LONG cmap_map_to_one_flag;
extern LONG pod_max_colors;
extern LONG cmap_hist_flag;
extern LONG cmap_median_bits;
extern ULONG cmap_cache_size;
extern ULONG cmap_cache_bits;
extern ULONG cmap_cache_rmask;
extern ULONG cmap_cache_gmask;
extern ULONG cmap_cache_bmask;
extern USHORT *cmap_cache;
extern XA_CHDR *cmap_cache_chdr;

extern ULONG xa_gamma_flag;
extern USHORT xa_gamma_adj[];


extern ULONG xa_r_shift,xa_g_shift,xa_b_shift;
extern ULONG xa_r_mask,xa_g_mask,xa_b_mask;
extern ULONG xa_gray_bits,xa_gray_shift;

#define XA_HAM_MAP_INVALID 0xffffffff
#define XA_HAM6_CACHE_SIZE   4096
#define XA_HAM8_CACHE_SIZE 262144

typedef struct
{
 ULONG rate;	/* rate at which to cycle colors in milliseconds */
 ULONG flags;   /* flags */
 ULONG size;    /* size of color array */
 ULONG curpos;  /* curpos in array */
 UBYTE data[4];  /* array of cmap pixel values to cycle */
} ACT_CYCLE_HDR;

/* ACT_CYCLE flags values */
/* NOTE: ACTIVE isn't currently checked. It's assumed to be active or
 *       else it shouldn't have been created by anim reader. */
#define ACT_CYCLE_ACTIVE  0x01
#define ACT_CYCLE_REVERSE 0x02
#define ACT_CYCLE_STARTED 0x80000000

extern void TheEnd();
extern void TheEnd1();
extern void ShowAnimation();
extern void ShowAction();
extern void Cycle_It();
extern ULONG X11_Get_True_Color();
extern ULONG X11_Get_Line_Size();


/* AUDIO STUFF */

#define XA_AUDIO_STOPPED 0
#define XA_AUDIO_STARTED 1

#define XA_AUDIO_OK   0
#define XA_AUDIO_UNK  1
#define XA_AUDIO_NONE 2
#define XA_AUDIO_ERR  3

#define XA_AUDIO_MAXVOL  255

extern ULONG xa_audio_enable;


/* 
 * Useful Macros 
 */

#define CMAP_GET_GRAY(r,g,b,scale) \
( ((scale)*((r)*11+(g)*16+(b)*5) ) >> xa_gray_shift)

#define CMAP_GET_332(r,g,b,scale) ( \
( (((r)*(scale)) & xa_r_mask) >> xa_r_shift) | \
( (((g)*(scale)) & xa_g_mask) >> xa_g_shift) | \
( (((b)*(scale)) & xa_b_mask) >> xa_b_shift) )

#define X11_Get_Bitmap_Width(x) \
  ( ((x + x11_bitmap_unit - 1)/x11_bitmap_unit) * x11_bitmap_unit )

#define X11_Make_Pixel(p)  (x11_cmap_type == 0)?(p): \
		( (((p)<<24)|((p)<<16)|((p)<<8)|(p)) & x11_depth_mask )

#define XA_PIC_SIZE(p) ( (xa_use_depth_flag==TRUE)?((p) * x11_bytes_pixel): \
		(p) )

#define XA_GET_TIME(t) ( (xa_jiffy_flag)?(xa_jiffy_flag):(t) )

#define XA_MEMSET(p,d,size) \
{ if (x11_bytes_pixel==4) { ULONG _sz=(size); \
    ULONG *_lp=(ULONG *)p; while(_sz--) *_lp++ = (ULONG)(d); } \
  else if (x11_bytes_pixel==2) { ULONG _sz=(size); \
    USHORT *_sp=(USHORT *)p; while(_sz--) *_sp++ = (USHORT)(d); } \
  else { memset(p,d,size); } \
}

#define XA_REALLOC(p,cur_size,new_size) { if (new_size > cur_size) \
{ char *_tmp; \
  if (p == 0) _tmp=(char *)malloc(new_size); \
  else _tmp=(char *)realloc(p,new_size); \
  if (_tmp == 0) TheEnd1("XA_Realloc: malloc err"); \
  p = _tmp; cur_size = new_size; } \
} 

#define FREE(_p,_q) free(_p)
/* For Debug
#define FREE(_p,_q) { fprintf(stderr,"FREE %lx %lx\n",_p,_q); free(_p); }
*/

#if !MAIN
extern int xa_init();
#endif
extern XA_ANIM_HDR *Get_Anim_Hdr();
extern XA_ANIM_HDR *Return_Anim_Hdr();
extern LONG Determine_Anim_Type();
extern ULONG IFF_Read_File();
/*
void IFF_Buffer_Action();
void IFF_Init_DLTA_HDR();
void IFF_Update_DLTA_HDR();
void IFF_Buffer_HAM6();
void IFF_Buffer_HAM8();
*/
extern ULONG GIF_Read_Anim();
extern ULONG TXT_Read_File();
extern ULONG Fli_Read_File();
extern ULONG DL_Read_File();
extern ULONG PFX_Read_File();
extern ULONG SET_Read_File();
extern ULONG RLE_Read_File();
extern ULONG AVI_Read_File();
extern ULONG QT_Read_File();
extern void XA_Read_Delta();

extern void Step_File_Next();
extern void Step_File_Prev();
extern void Step_Frame_Next();
extern void Step_Frame_Prev();

/*
 * Global variables to keep track of current width, height, num of colors and
 * number of bit planes respectively. 
 *
 * the max_ variable are used for worst case allocation. Are useful for Anims
 * that have multiple image sizes.
 *
 * image_size and max_image_size are imagex * imagey, etc.
 */
extern ULONG xa_image_size;
extern ULONG xa_max_image_size;
extern ULONG xa_imagex,xa_max_imagex;
extern ULONG xa_imagey,xa_max_imagey;
extern ULONG xa_imaged;

extern XA_ANIM_HDR *cur_file;
extern XA_ANIM_HDR *first_file;
extern LONG cur_floop,cur_frame;
extern LONG xa_anim_flags;

int xa_fd;		/* Used if anim is being read from a file */
char *xa_codec_buf;

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.