home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
REND.LZH
/
PIC1600
/
F_25_7.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-27
|
7KB
|
218 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "piclib.h"
#ifndef SEEK_SET
#define SEEK_SET 0
#endif
typedef struct {
FILE *fp;
unsigned long buffer[BUFFERSIZE];
unsigned long seek;
unsigned long totallength;
unsigned int nowpoint;
unsigned long nowcolor;
unsigned short nowlength;
} PicWork;
#ifdef LittleEndian
#define r_short(p) (((unsigned long)(((unsigned char*)(p))[0])) * 256L + ((unsigned char*)(p))[1])
#define w_short(p,n) ((((unsigned char*)(p))[0] = (unsigned char)(n/256)),\
(((unsigned char*)(p))[1] = (unsigned char)(n%256)))
#define r_long(p) ((((unsigned long)(((unsigned char*)(p))[0])) << 24L) |\
(((unsigned long)(((unsigned char*)(p))[1])) << 16L) |\
(((unsigned long)(((unsigned char*)(p))[2])) << 8L) |\
(((unsigned long)(((unsigned char*)(p))[3])) ))
#define w_long(p,n) ((((unsigned char*)(p))[0] = (unsigned char)((n) >> 24)),\
(((unsigned char*)(p))[1] = (unsigned char)((n) >> 16)),\
(((unsigned char*)(p))[2] = (unsigned char)((n) >> 8)),\
(((unsigned char*)(p))[3] = (unsigned char) (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
int PicReadHeader_25_7(PicData *pd, FILE *fp, unsigned char *magic)
{
extern PicFunction PicFunction_16_16;
return PicFunction_16_16.PicReadHeader(pd, fp, magic);
}
static inline Pixel Convert_25_32(unsigned long color)
{
return (color & 0xffffff00UL) | ((color & 0x80) ? 0xff : 0);
}
static inline unsigned long Convert_32_25(Pixel p)
{
return p & 0xffffff80UL;
}
extern int WritePicHeader_DPIC(PicHeader *ph, FILE *fp);
int PicOpen_25_7(PicData *pd, FILE *fp, int flag)
{
unsigned long c;
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);
if (ferror(work->fp)) return FALSE;
work->nowpoint = 0;
c = r_long(work->buffer + work->nowpoint); work->nowpoint++;
work->nowcolor = Convert_25_32(c);
work->nowlength = c & 0x7f;
} else {
PicHeader ph;
ph.pixelX = pd->pixelX;
ph.pixelY = pd->pixelY;
ph.screenX = 4;
ph.screenY = 3;
ph.positionX = 0;
ph.positionY = 0;
ph.frame = 1;
ph.storecolor[0] = GRN; ph.storecolorbit[0] = 8;
ph.storecolor[1] = RED; ph.storecolorbit[1] = 8;
ph.storecolor[2] = BLU; ph.storecolorbit[2] = 8;
ph.storecolor[3] = TRP; ph.storecolorbit[3] = 1;
ph.storecolor[4] = 0; ph.storecolorbit[4] = 0;
ph.mode = RLN;
ph.storedata[0] = COL; ph.storedatabit[0] = 25;
ph.storedata[1] = LEN; ph.storedatabit[1] = 7;
ph.storedata[2] = 0; ph.storedatabit[2] = 0;
if (WritePicHeader_DPIC(&ph, fp) == FALSE) return FALSE;
work->seek = ftell(work->fp);
if (ferror(work->fp)) return FALSE;
work->nowpoint = 0;
w_long(work->buffer+work->nowpoint,0);work->nowpoint++;
work->nowcolor = 0;
work->nowlength = 0;
work->totallength = 0;
}
return TRUE;
}
int PicOutput_25_7(PicData *pd, Pixel *pixel)
{
int pixels = pd->pixelX;
PicWork *work = pd->work;
unsigned short nowlength = work->nowlength;
unsigned long nowcolor = work->nowcolor;
unsigned long color;
for (; pixels > 0; --pixels) {
color = Convert_32_25(*pixel++);
if (color == nowcolor) {
if (nowlength == 127) {
w_long(work->buffer+work->nowpoint, nowcolor | 127L);work->nowpoint++;
if (work->nowpoint == BUFFERSIZE) {
fwrite(work->buffer, 1, BUFFERSIZE * sizeof(long), work->fp);
if (ferror(work->fp)) return FALSE;
work->totallength += BUFFERSIZE * sizeof(long);
work->nowpoint = 0;
}
nowlength = 0;
}
nowlength++;
} else {
if (nowlength > 0) {
w_long(work->buffer+work->nowpoint, nowcolor | nowlength);work->nowpoint++;
if (work->nowpoint == BUFFERSIZE) {
fwrite(work->buffer, 1, BUFFERSIZE * sizeof(long), work->fp);
if (ferror(work->fp)) return FALSE;
work->totallength += BUFFERSIZE * sizeof(long);
work->nowpoint = 0;
}
}
nowlength = 1;
nowcolor = color;
}
}
work->nowcolor = nowcolor;
work->nowlength = nowlength;
return TRUE;
}
int PicInput_25_7(PicData *pd, Pixel *pixel)
{
int pixels = pd->pixelX;
PicWork *work = pd->work;
Pixel nowpixel;
unsigned long c;
unsigned short nowlength = work->nowlength;
unsigned long nowcolor = work->nowcolor;
nowpixel = Convert_25_32(nowcolor);
while (nowlength <= pixels) {
pixels -= nowlength;
for (; nowlength > 0; --nowlength) {
*pixel++ = nowpixel;
}
c = r_long(work->buffer + work->nowpoint); work->nowpoint++;
nowcolor = Convert_25_32(c);
nowlength = c & 0x7f;
nowpixel = Convert_25_32(nowcolor);
if (work->nowpoint == BUFFERSIZE) {
fread(work->buffer, 1, BUFFERSIZE*sizeof(unsigned long), work->fp);
if (ferror(work->fp)) return FALSE;
work->nowpoint = 0;
}
}
nowlength -= pixels;
for (;pixels > 0; --pixels) {
*pixel++ = nowpixel;
}
work->nowlength = nowlength;
work->nowcolor = nowcolor;
return TRUE;
}
int PicClose_25_7(PicData *pd)
{
PicWork *work = pd->work;
if (pd->flag == PIC_WRITE) {
if (work->nowlength > 0) {
w_long(work->buffer+work->nowpoint, work->nowcolor | work->nowlength);
work->nowpoint++;
}
if (work->nowpoint > 0) {
fwrite(work->buffer, 1, work->nowpoint * sizeof(unsigned long), work->fp);
if (ferror(work->fp)) return FALSE;
work->totallength += work->nowpoint * sizeof(unsigned long);
}
work->totallength -= 4;
fseek(work->fp, work->seek, SEEK_SET);
if (ferror(work->fp)) return FALSE;
fputc((int)( work->totallength >> 24L ), work->fp);
fputc((int)((work->totallength >> 16L) & 0xffL), work->fp);
fputc((int)((work->totallength >> 8L) & 0xffL), work->fp);
fputc((int)((work->totallength ) & 0xffL), work->fp);
if (ferror(work->fp)) return FALSE;
}
fclose(work->fp);
free(work);
return TRUE;
}
PicFunction PicFunction_25_7 = {
"",
PicReadHeader_25_7,
PicOpen_25_7,
PicOutput_25_7,
PicInput_25_7,
PicClose_25_7
};