/***************************************
 * animation.vc                        *
 * author: vecna                       *
 * a quick utility library to simplify *
 * using an 'animation-strip' style    *
 * image in animations.                *
 ***************************************/

/**************************** data ****************************/

#define MAX_ANIMATIONS 	16	// Tweak this to your liking!
#define NO_INDEX	65535	// This is just a sentinel.


struct anim_t
{
	int sizex, sizey;	// the width andh height of a single frame of this animation.
	int numframes;		// the total framecount of this animation
	int active;		// the status of this animation (0 means the slot is free for plundering!)
	int image;		// the reference to the base image data.

	int bufimage;		// a new image one frame in size that is a copy of the current frame.
	int bufferedframe;	//.the index of the presently buffered frame.  65535 is a sentinel.
};



// Loads an animation from a 'filmstrip'-style file.
// it auto-calculates how many frames there are based on the overall image size
// and the specific frame size you specify.  This does not allow for whitespace
// in the base image.
//
// returns an anims[] index to be used in other functions in this library.
int LoadAnimation(string filename, int sizex, int sizey)



// Takes an anims[] index.
//
// frees that slot of the anims[] array, releasing it's data back into the
// wild.
void FreeAnimation(int index)



// Blits the specified frame of the specified animation to (x,y) of Dest.
//
// This function buffers the frame the first time it blits a new frame for an
// image, and continues to blit that buffered image as long as the frame
// doesn't change.
//
// Fatally errors if you attempt to render from an inactive animation.
// quietly does nothing if the frame index was invalid for this animation
void BlitFrame(int x, int y, int anim, int frame, int dest)



// TBlits the specified frame of the specified animation to (x,y) of Dest.
//
// This function buffers the frame the first time it blits a new frame for an
// image, and continues to blit that buffered image as long as the frame
// doesn't change.
//
// Fatally errors if you attempt to render from an inactive animation.
// quietly does nothing if the frame index was invalid for this animation
void TBlitFrame(int x, int y, int anim, int frame, int dest)



// Transparently draws frame #'frame of animation 'anim' onto 'dest' with the frame centered on (x,y)
// 'dest' must be a valid v3 image reference.
// 'anim' must be a valid animation index, does nothing if invalid.
//
// Fatally errors if you attempt to render from an inactive animation.
// quietly does nothing if the frame index was invalid for this animation
void BlitFrameAt(int x, int y, int anim, int frame, int dest)



// Transparently draws 'img' onto 'dest' with 'img' centered on (x,y)
// 'img' and 'dest' must be valid v3 image references.
void BlitAt(int x, int y, int img, int dest)