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

📄 pbm.c

📁 speech signal process tools
💻 C
字号:
/* pbm.c: * * portable bit map (pbm) format images * * jim frost 09.27.89 * * patched by W. David Higgins (wdh@mkt.csd.harris.com) to support * raw-format PBM files. */#ifdef SCCS    static char *sccs_id = "@(#)pbm.c	1.1  10/13/90";#endif#include "xloadimage.h"static int          IntTable[256];static unsigned int Initialized= 0;#define NOTINT  -1#define COMMENT -2#define SPACE   -3#define NEWLINE -4#define BADREAD    0 /* read error */#define NOTPBM     1 /* not a pbm file */#define PBMNORMAL  2 /* pbm normal type file */#define PBMCOMPACT 3 /* pbm compacty type file */#define PBMRAWBITS 4 /* pbm raw bits type file */static void initializeTable(){ unsigned int a;  for (a= 0; a < 256; a++)    IntTable[a]= NOTINT;  IntTable['#']= COMMENT;  IntTable['\n']= NEWLINE;  IntTable['\r']= IntTable['\t']= IntTable[' ']= SPACE;  IntTable['0']= 0;  IntTable['1']= 1;  IntTable['2']= 2;  IntTable['3']= 3;  IntTable['4']= 4;  IntTable['5']= 5;  IntTable['6']= 6;  IntTable['7']= 7;  IntTable['8']= 8;  IntTable['9']= 9;  Initialized= 1;}static int pbmReadChar(zf)     ZFILE *zf;{ int c;  if ((c= zgetc(zf)) == EOF) {    zclose(zf);    return(-1);  }  if (IntTable[c] == COMMENT)    do {      if ((c= zgetc(zf)) == EOF)	return(-1);    } while (IntTable[c] != NEWLINE);  return(c);}static int pbmReadInt(zf)     ZFILE *zf;{ int c, value;  for (;;) {    c= pbmReadChar(zf);    if (c < 0)      return(-1);    if (IntTable[c] >= 0)      break;  };  value= IntTable[c];  for (;;) {    c= pbmReadChar(zf);    if (c < 0)      return(-1);    if (IntTable[c] < 0)      return(value);    value= (value * 10) + IntTable[c];  }}static int isPBM(zf, name, width, height, verbose)     ZFILE        *zf;     char         *name;     unsigned int *width, *height;     unsigned int  verbose;{ unsigned char buf[4];  if (! Initialized)    initializeTable();  if (zread(zf, buf, 2) != 2)    return(NOTPBM);  if (memToVal(buf, 2) == memToVal("P1", 2)) {    if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0))      return(NOTPBM);    if (verbose)      printf("%s is a %dx%d PBM image\n", name, *width, *height);    return(PBMNORMAL);  }  if (memToVal(buf, 2) == memToVal("P4", 2)) {    if (((*width= pbmReadInt(zf)) < 0) || ((*height= pbmReadInt(zf)) < 0))      return(NOTPBM);    if (verbose)      printf("%s is a %dx%d RawBits PBM image\n", name, *width, *height);    return(PBMRAWBITS);  }  if (memToVal(buf, 2) == 0x2a17) {    if (zread(zf, buf, 4) != 4)      return(NOTPBM);    *width= memToVal(buf, 2);    *height= memToVal(buf + 2, 2);    if (verbose)      printf("%s is a %dx%d Compact PBM image\n", name, *width, *height);    return(PBMCOMPACT);  }  return(NOTPBM);}int pbmIdent(fullname, name)     char *fullname, *name;{ ZFILE        *zf;  unsigned int  width, height, ret;  if (! (zf= zopen(fullname, name)))    return(0);  ret= isPBM(zf, name, &width, &height, (unsigned int)1);  zclose(zf);  return(ret != NOTPBM);}Image *pbmLoad(fullname, name, verbose)     char         *fullname, *name;     unsigned int  verbose;{ ZFILE        *zf;  Image        *image;  unsigned int  x, y;  unsigned int  width, height;  unsigned int  linelen;  byte          srcmask, destmask;  byte         *destptr, *destline;  int           src;  unsigned int  numbytes, numread;  if (! (zf= zopen(fullname)))    return(NULL);  switch (isPBM(zf, name, &width, &height, verbose)) {  case NOTPBM:    zclose(zf);    return(NULL);      case PBMNORMAL:    image= newBitImage(width, height);    linelen= (width / 8) + (width % 8 ? 1 : 0);    destline= image->data;    for (y= 0; y < height; y++) {      destptr= destline;      destmask= 0x80;      for (x= 0; x < width; x++) {	do {	  if ((src= pbmReadChar(zf)) < 0) {	    printf("%s: Short image\n", fullname);	    zclose(zf);	    exit(1);	  }	  if (IntTable[src] == NOTINT) {	    printf("%s: Bad image data\n", fullname);	    zclose(zf);	    exit(1);	  }	} while (IntTable[src] < 0);		switch (IntTable[src]) {	case 1:	  *destptr |= destmask;	case 0:	  if (! (destmask >>= 1)) {	    destmask= 0x80;	    destptr++;	  }	  break;	default:	  printf("%s: Bad image data\n", fullname);	  zclose(zf);	  exit(1);	}      }      destline += linelen;    }    break;  case PBMRAWBITS:    image= newBitImage(width, height);    destline= image->data;    linelen= (width + 7) / 8;    numbytes= linelen * height;    srcmask= 0;		/* force initial read */    numread= 0;    for (y= 0; y < height; y++) {      destptr= destline;      destmask= 0x80;      if (srcmask != 0x80) {        srcmask= 0x80;	if ((numread < numbytes) && ((src= zgetc(zf)) == EOF)) {	   printf("%s: Short image\n", fullname);	   zclose(zf);	   exit(1);	}	numread++;      }      for (x= 0; x < width; x++) {	if (src & srcmask)	  *destptr |= destmask;	if (! (destmask >>= 1)) {	  destmask= 0x80;	  destptr++;	}	if (! (srcmask >>= 1)) {	  srcmask= 0x80;	  if ((numread < numbytes) && ((src= zgetc(zf)) == EOF)) {	    printf("%s: Short image\n", fullname);	    zclose(zf);	    exit(1);	  }	  numread++;	}      }      destline += linelen;    }    break;   case PBMCOMPACT:    image= newBitImage(width, height);    destline= image->data;    linelen= (width / 8) + (width % 8 ? 1 : 0);    srcmask= 0x80;    destmask= 0x80;    if ((src= zgetc(zf)) == EOF) {      printf("%s: Short image\n", fullname);      zclose(zf);      exit(1);    }    numread= 1;    numbytes= width * height;    numbytes= (numbytes / 8) + (numbytes % 8 ? 1 : 0);    for (y= 0; y < height; y++) {      destptr= destline;      destmask= 0x80;      for (x= 0; x < width; x++) {	if (src & srcmask)	  *destptr |= destmask;	if (! (destmask >>= 1)) {	  destmask= 0x80;	  destptr++;	}	if (! (srcmask >>= 1)) {	  srcmask= 0x80;	  if ((numread < numbytes) && ((src= zgetc(zf)) == EOF)) {	    printf("%s: Short image\n", fullname);	    zclose(zf);	    exit(1);	  }	  numread++;	}      }      destline += linelen;    }    break;  }  image->title= dupString(name);  return(image);}

⌨️ 快捷键说明

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