diff utils/frmconv/frm.c @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/frmconv/frm.c	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,177 @@
+// test
+#ifdef _WIN32
+#define ssize_t int
+#include <io.h>
+#include <sys/types.h>
+#include <Winsock2.h>
+#else
+#include <netinet/in.h>
+#include <unistd.h>
+#endif
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "frm.h"
+#include "pal.h"
+
+#define ntoh32(BASE, OFF) ntohl( ( ((uint32_t)(BASE[(OFF+3)])) << 24 ) | ( ((uint32_t)(BASE[(OFF) + 2])) << 16 ) | ( ((uint32_t)(BASE[(OFF) + 1])) << 8 ) | ((uint32_t)(BASE[(OFF)])))
+#define ntoh16(BASE, OFF) ntohs( (((uint16_t)(BASE[(OFF)+1])) << 8) | ((uint16_t)(BASE[(OFF)])) )
+
+
+void freefrmanim(frm_anim *anim) {
+	frm_frame *frp, *frp2;
+	
+	if (!anim)
+		return;
+
+	if ( (frp2 = (frp = anim->frames)) ) {
+		do {
+			frp2 = frp->next_frame;
+			free(frp);
+			frp = frp2;
+		} while (frp);
+	}
+	
+	free(anim);
+}
+
+frm_frame *fetchFRMFrame(unsigned char *buf, uint32_t buflen, uint8_t direct) {
+	int i = 0;
+	frm_frame *frame = malloc(sizeof(frm_frame));
+
+	if (!frame || buflen < 8)
+		return NULL;
+
+	frame->orient = direct;
+	frame->width = ntoh16(buf, FRMFRAME_OFFSET_WIDTH);
+	frame->height = ntoh16(buf, FRMFRAME_OFFSET_HEIGHT);
+	frame->framesize = ntoh32(buf, FRMFRAME_OFFSET_SIZE);
+
+	if (frame->framesize != frame->width * frame->height) {
+		printf("ERR: Framesize different: %d %d\n", frame->framesize, frame->width * frame->height);
+		return NULL;
+	}
+	
+	if (buflen < (12 + frame->width * frame->height) ) {
+		return NULL;
+	}
+	
+	frame->rowptr = malloc( sizeof(unsigned char *) * frame->height);
+	if (!frame->rowptr) {
+		printf("ERROR: no memory\n");
+		free(frame);
+		return NULL;
+	}
+	
+	for(i=0; i < frame->height; ++i) {
+		frame->rowptr[i] = malloc(sizeof(unsigned char) * frame->width);
+		if (!frame->rowptr[i]) {
+			printf("ERROR: no memory\n");
+			free(frame);
+			return NULL;
+		}
+		memcpy(frame->rowptr[i], &buf[12]+i*frame->width, frame->width);
+	}
+	
+	frame->next_frame = NULL;
+	return frame;
+}
+
+
+
+/*
+ * frm_anim *loadFRMAnim(FILE *frmfile)
+ * 
+ * Paramter: frmfile is an already opened FILE handle.
+ * Return: a pointer to frm_anim structure for the frm animation; NULL in case of an error
+ * 
+ * Note: 1) loadFRMAnim calls rewind and fseek on frmfile.
+ *       2) loadFRMAnim does not close frmfile
+ * 
+ * Overview:
+ * loadFRMAnim tries to load a frm file from frmfile and creates a frm_anim structure that has
+ * to be freed later with freefrmanim(frmanim *). Please look at the frm_anim for an explanation of
+ * the structure.
+ * 
+ */
+
+frm_anim *loadFRMAnim(FILE *frmfile) {
+	uint32_t frmfilesize, offset=0;
+	uint8_t direct=0;
+	unsigned char *filebuf;
+	frm_anim *frmp;
+	frm_frame *frame;
+
+	// Get the length of the file frmfile:
+	rewind(frmfile);
+	fseek(frmfile, 0l, SEEK_END);
+	frmfilesize = ftell(frmfile);
+	rewind(frmfile);
+	
+	if (frmfilesize < 0x3e) {
+		printf("Error: loadFRMAnim - File length to short. This cannout be a frm file.\n");
+		return NULL;
+	}
+	
+	filebuf = malloc(frmfilesize);
+	if (!filebuf) {
+		printf("Error: loadFRMAnim - Couldn't allocate %d Byte memory for the file.\n", frmfilesize);
+		return NULL;
+	}
+	
+	if (frmfilesize != fread(filebuf, 1, frmfilesize, frmfile)) {
+		printf("Error: loadFRMAnim - Reading the whole file failed.\n");
+		free(filebuf);
+		return NULL;
+	}
+	
+	if (NULL == (frmp = malloc(sizeof(frm_anim)))) {
+		printf("Error: loadFRMAnim - Couldn't allocate %d Byte memory for the frm_anim struct.\n", sizeof(frm_anim));
+		free(filebuf);
+		return NULL;
+	}
+	
+	frmp->nrofframes = 0;
+	frmp->palette = pal;
+	frmp->frames = NULL;
+	frmp->frameperorient = ntoh16(filebuf, FRM_OFFSET_FRAMESPERORIENT);
+	frmp->frameareasize = ntoh32(filebuf, FRM_OFFSET_FRAMEAREASIZE);
+	
+	frame = (frmp->frames = fetchFRMFrame(&filebuf[FRM_OFFSET_FRAMEDATA], frmfilesize-FRM_OFFSET_FRAMEDATA, direct));
+	
+	if (frame) {
+		offset = FRM_OFFSET_FRAMEDATA + FRMFRAME_OFFSET_DATA + frame->framesize;
+		frmp->nrofframes = 1;
+	} else {
+		printf("Warn: loadFRMAnim - Haven't found one frame.\n");
+	}
+		
+	while (frame && (frame->next_frame = fetchFRMFrame(&filebuf[offset], frmfilesize-offset, direct) )) {
+		frame = frame->next_frame;
+		offset += FRMFRAME_OFFSET_DATA + frame->framesize;
+		++frmp->nrofframes;
+		
+		if (offset > filebuf[FRM_OFFSET_FIRSTFRAME_ORIENT5]) {
+			direct=5;
+		} else if (offset > filebuf[FRM_OFFSET_FIRSTFRAME_ORIENT4]) {
+			direct=4;
+		} else if (offset > filebuf[FRM_OFFSET_FIRSTFRAME_ORIENT3]) {
+			direct=3;
+		} else if (offset > filebuf[FRM_OFFSET_FIRSTFRAME_ORIENT2]) {
+			direct=2;
+		} else if (offset > filebuf[FRM_OFFSET_FIRSTFRAME_ORIENT1]) {
+			direct=1;
+		} else if (offset > filebuf[FRM_OFFSET_FIRSTFRAME_ORIENT0]) {
+			direct=0;
+		} else { 
+			printf("Error: loadFRMAnim - wrong offset.\n");
+			freefrmanim(frmp);
+			free(filebuf);
+			return 0;
+		}
+	}
+	free(filebuf);
+	return frmp;
+}