⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 headers.c

📁 一个简单而且快速的无损压缩算法。包含源代码实现
💻 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<<fgetc(f);	/* ! */

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

⌨️ 快捷键说明

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