headers.c

来自「一个简单而且快速的无损压缩算法。包含源代码实现」· C语言 代码 · 共 95 行

C
95
字号
#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<<fgetc(f);	/* ! */

	if (fres==EOF)
		exitit("error reading CDF header", 3);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?