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

📄 readmrf.c

📁 zgv-5.6,一个Linux系统下的图片浏览器(VGA/SVGA)
💻 C
字号:
/* Zgv v3.0 - GIF, JPEG and PBM/PGM/PPM viewer, for VGA PCs running Linux. * Copyright (C) 1993-1998 Russell Marks. See README for license details. * * readmrf.c - read the 1-bit mono `mrf' format. based on my `mrftopbm'. */#include <stdio.h>#include <string.h>#include <stdlib.h>#include "zgv.h"#include "readmrf.h"/* for aborted_file_mrf_cleanup() */static unsigned char *work_bmap,*work_pal;static FILE *work_in;static int bitbox,bitsleft;void bit_init(){bitbox=0; bitsleft=0;}int bit_input(FILE *in){if(bitsleft==0)  {  bitbox=fgetc(in);  bitsleft=8;  }bitsleft--;return((bitbox&(1<<bitsleft))?1:0);}void do_square(FILE *in,unsigned char *image,int ox,int oy,int w,int size){int x,y,c;/* is it all black or white? */if(size==1 || bit_input(in))  {  /* yes, next bit says which. */  c=bit_input(in);  for(y=0;y<size;y++)    for(x=0;x<size;x++)      image[(oy+y)*w+ox+x]=c;  }else  {  /* not all one colour, so recurse. */  size>>=1;  do_square(in,image,ox,oy,w,size);  do_square(in,image,ox+size,oy,w,size);  do_square(in,image,ox,oy+size,w,size);  do_square(in,image,ox+size,oy+size,w,size);  }}int read_mrf_file(char *filename,hffunc howfarfunc,unsigned char **bmap,                  unsigned char **pal,int *output_type,PICINFO *pp){FILE *in;int w,h,w64,h64,x,y;unsigned char buf[13],*image;int totalsq;*bmap=NULL;*pal=NULL;if((in=fopen(filename,"rb"))==NULL)  return(_PICERR_NOFILE);fread(buf,1,13,in);if(strncmp(buf,"MRF1",4)!=0)  CLOSE_AND_RET(_PICERR_CORRUPT);if(buf[12]!=0)  CLOSE_AND_RET(_PICERR_UNSUPPORTED);w=((buf[4]<<24)|(buf[5]<<16)|(buf[6]<<8)|buf[7]);h=((buf[8]<<24)|(buf[9]<<16)|(buf[10]<<8)|buf[11]);if(w==0 || h==0)  CLOSE_AND_RET(_PICERR_CORRUPT);if((*pal=calloc(768,1))==NULL)  CLOSE_AND_RET(_PICERR_NOMEM);(*pal)[0]=(*pal)[256]=(*pal)[512]=0;(*pal)[1]=(*pal)[257]=(*pal)[513]=255;/* w64 is units-of-64-bits width, h64 same for height */w64=(w+63)/64;h64=(h+63)/64;if((*bmap=malloc(w*h))==NULL ||   (image=calloc(w64*h64*64*64,1))==NULL)  CLOSE_AND_RET(_PICERR_NOMEM);/* save stuff in case of abort */work_in=in; work_bmap=(*bmap); work_pal=*pal;/* now recursively input squares. *//* init bit input */bit_init();totalsq=w64*h64;for(y=0;y<h64;y++)  for(x=0;x<w64;x++)    {    /* difficult to do meaningful howfar for this, but we give it a go... */    /* the icky *10 stuff is to defeat %10 in zgv.c's showhowfar */    if(howfarfunc!=NULL) howfarfunc((y*w64+x)*10,totalsq*10);    do_square(in,image,x*64,y*64,w64*64,64);    }fclose(in);/* write real image */for(y=0;y<h;y++)  memcpy(*bmap+y*w,image+y*w64*64,w);free(image);pp->width=w;pp->height=h;pp->numcols=2;*output_type=1;return(_PIC_OK);  }void aborted_file_mrf_cleanup(){free(work_bmap);free(work_pal);fclose(work_in);}

⌨️ 快捷键说明

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