home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
REND.LZH
/
PIC1600
/
F_RGBT8.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-12
|
3KB
|
139 lines
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "piclib.h"
typedef struct {
FILE *fp;
unsigned long buffer[BUFFERSIZE];
unsigned int nowpoint;
} PicWork;
#ifdef LittleEndian
#define r_short(p) (((unsigned char*)(p))[0] * 256 + ((unsigned char*)(p))[1])
#define w_short(p,n) ((((unsigned char*)(p))[0] = n/256), (((unsigned char*)(p))[1] = n%256))
#define r_long(p) ((((unsigned char*)(p))[0] << 24) |\
(((unsigned char*)(p))[1] << 16) |\
(((unsigned char*)(p))[2] << 8) |\
(((unsigned char*)(p))[3] ))
#define w_long(p,n) ((((unsigned char*)(p))[0] = ((n) >> 24)),\
(((unsigned char*)(p))[1] = ((n) >> 16)),\
(((unsigned char*)(p))[2] = ((n) >> 8)),\
(((unsigned char*)(p))[3] = (n) ))
#if 0
#define r_long(p) (r_short(p) * 65536 + r_short(((unsigned char*)p)+2))
#define w_long(p,n) (w_short(p, n/65536), w_short(((unsigned char*)p)+2, n%65536))
#endif
#else
#define r_short(p) (*((unsigned short *)(p)))
#define w_short(p,n) ((*((unsigned short *)(p))) = (n))
#define r_long(p) (*((unsigned long *)(p)))
#define w_long(p,n) ((*((unsigned long *)(p))) = (n))
#endif
static int Get4Hex(char *p)
{
int i;
int code = 0;;
for (i = 4; i > 0; --i, ++p) {
code *= 16;
if (isdigit(*p)) {
code += *p - '0';
} else if (isalpha(*p)) {
code += tolower(*p) - 'a';
}
}
return code;
}
int PicReadHeader_RGBT8888(PicData *pd, FILE *fp, unsigned char *magic)
{
char header[1024];
extern PicFunction PicFunction_RGBT8888;
if (magic[0] != 0xff || magic[1] != 0xff || magic[2] != 0xff || magic[3] != 0xf0) {
return FALSE;
}
fread(header, 1, 1024, fp);
pd->mode = NON;
pd->pixelX = Get4Hex(header+20); pd->pixelY = Get4Hex(header+24);
pd->func = &PicFunction_RGBT8888;
return TRUE;
}
static inline Pixel Convert_RGBT8888_32(unsigned long color)
{
return ((color & 0xff000000UL) >> 8)
| ((color & 0x00ff0000UL) << 8)
| ((color & 0x0000ffffUL) ) ;
}
int PicOpen_RGBT8888(PicData *pd, FILE *fp, int flag)
{
PicWork *work;
if ((work = malloc(sizeof(PicWork))) == NULL) {
return FALSE;
}
pd->work = work;
work->fp = fp;
if (pd->flag == PIC_READ) {
fread(work->buffer, 1, BUFFERSIZE*sizeof(long), work->fp);
work->nowpoint = 0;
} else {
/* Not Implemented*/
return FALSE;
}
return TRUE;
}
int PicOutput_RGBT8888(PicData *pd, Pixel *pixel)
{
/* Not Implemented*/
return FALSE;
}
int PicInput_RGBT8888(PicData *pd, Pixel *pixel)
{
int pixels = pd->pixelX;
PicWork *work = pd->work;
unsigned long *nowp;
nowp = work->buffer+work->nowpoint;
work->nowpoint += pixels;
for (; pixels > 0; --pixels) {
*pixel++ = Convert_RGBT8888_32(r_long(nowp));
nowp++;
}
if (work->nowpoint > BUFFERSIZE - pd->pixelX) {
int rest = BUFFERSIZE - work->nowpoint;
memcpy(work->buffer, work->buffer+work->nowpoint, rest);
fread(work->buffer+rest, 1, (work->nowpoint)*sizeof(long), work->fp);
work->nowpoint = 0;
}
return TRUE;
}
int PicClose_RGBT8888(PicData *pd)
{
PicWork *work = pd->work;
if (pd->flag == PIC_WRITE) {
/* Not Implemented*/
}
fclose(work->fp);
free(work);
return TRUE;
}
PicFunction PicFunction_RGBT8888 = {
"",
PicReadHeader_RGBT8888,
PicOpen_RGBT8888,
PicOutput_RGBT8888,
PicInput_RGBT8888,
PicClose_RGBT8888
};