www.pudn.com > sfalic-03-src.rar.rar > headers.c


#include "headers.h" 
#include "taskparams.h" 
#include "bigendian.h" 
#include "exitit.h" 
#include "ceillog2.h" 
 
 
/* czyta naglowek PGMP5 i wypelna width, height i bpp */ 
/* ustawia sie na pierwszym bajcie pierwszego piksela obrazka */ 
void readPGMP5header(FILE *f) 
{ 
	int levelmax; 
	if (fscanf(f, "P5%d %d %d", &width, &height, &levelmax) != 3) 
		exitit("error reading PGMP5 header", 3); 
 
	if (!(width>0 && height>0 && levelmax>0 && levelmax<=0xFFFF)) 
		exitit("error in PGMP5 header", 3); 
 
	bpp=ceil_log_2(levelmax+1); 
 
	while (fgetc(f)!=0x0a) 
		if (feof(f)) 
			exitit("error reading PGMP5 header", 3); 
} 
 
 
/* zapisz naglowek PGMP5 na podstawie width, height i bpp */ 
/* nie zamykaj pliku */ 
void writePGMP5header(FILE *f) 
{ 
	int levelmax=((int)0xffff >> (16-bpp)); 
 
	if (EOF == fprintf(f, "P5%c%d %d%c%d%c", 0x0A, width, height, 0x0A, levelmax, 0x0A)) 
		exitit("error writting PGMP5 header", 3); 
} 
 
 
/* zapisz naglowek CDF na podstawie parametrow z taskparams */ 
/* nie zamykaj pliku */ 
void writeCDFheader(FILE *f) 
{ 
	int fres; /* wynik operacji plikowej */ 
 
	fputs("CDF", f); 
	fputc(SFALICVERSION, f); 
	BEwrite2Bytes(width, f); 
	BEwrite2Bytes(height, f); 
	fputc(bpp, f); 
	fputc(pred, f); 
 
	fputc(evol, f); 
	fputc(trigger/10, f);	/* ! */ 
	fputc(maxclen, f); 
	fputc(wmistart, f); 
	fputc(wmimax, f); 
 
	fres= fputc(ceil_log_2(wminext), f);	/* ! */ 
 
	if (fres==EOF) 
		exitit("error writting CDF header", 3); 
} 
 
/* czyta naglowek CDF i wypelnia parametry z taskparams */ 
/* ustawia sie na pierwszym bajcie skompresowanego pikseli obrazka */ 
void readCDFheader(FILE *f) 
{ 
	int fres; /* wynik operacji plikowej */ 
 
	if (fgetc(f) != 'C' || fgetc(f) != 'D' || fgetc(f) != 'F') 
		exitit("bad CDF header", 3); 
		 
	if (fgetc(f) != SFALICVERSION) 
		exitit("bad CDF header version", 3); 
 
	width=BEread2Bytes(f); 
	height=BEread2Bytes(f); 
	bpp=fgetc(f); 
 
	pred=fgetc(f); 
	pred=(int)((i8)pred);	/* pred moze byc ujemny ! */ 
 
	evol=fgetc(f); 
 
	trigger=fgetc(f)*10;	/* ! */ 
	maxclen=fgetc(f); 
	wmistart=fgetc(f); 
	wmimax=fgetc(f); 
 
	fres= wminext=1<