📄 faces.c
字号:
/* faces.c: * * faces format image loader * * jim frost 07.06.89 * * Copyright 1989 Jim Frost. See included file "copyright.h" for complete * copyright information. */#ifdef SCCS static char *sccs_id = "@(#)faces.c 1.1 10/13/90";#endif#include "copyright.h"#include "xloadimage.h"static short HexTable[256]; /* conversion value */static unsigned int Initialized= 0; /* easier to fill in at run time */#define HEXIGNORE -1#define HEXBAD -2/* build a hex digit value table with the bits inverted */static void initHexTable(){ int a; for (a= 0; a < 256; a++) HexTable[a]= HEXBAD; HexTable['0']= 0x0; HexTable['1']= 0x1; HexTable['2']= 0x2; HexTable['3']= 0x3; HexTable['4']= 0x4; HexTable['5']= 0x5; HexTable['6']= 0x6; HexTable['7']= 0x7; HexTable['8']= 0x8; HexTable['9']= 0x9; HexTable['A']= 0xa; HexTable['a']= HexTable['A']; HexTable['B']= 0xb; HexTable['b']= HexTable['B']; HexTable['C']= 0xc; HexTable['c']= HexTable['C']; HexTable['D']= 0xd; HexTable['d']= HexTable['D']; HexTable['E']= 0xe; HexTable['e']= HexTable['E']; HexTable['F']= 0xf; HexTable['f']= HexTable['F']; HexTable['\r']= HEXIGNORE; HexTable['\n']= HEXIGNORE; HexTable['\t']= HEXIGNORE; HexTable[' ']= HEXIGNORE; Initialized = 1;}/* read a hex value and return its value */static int nextInt(zf, len) ZFILE *zf; unsigned int len;{ int c; int value= 0; int count; len <<= 1; for (count= 0; count < len;) { c= zgetc(zf); if (c == EOF) return(-1); else { c= HexTable[c & 0xff]; switch(c) { case HEXIGNORE: break; case HEXBAD: return(-1); default: value= (value << 4) + c; count++; } } } return(value);}Image *facesLoad(fullname, name, verbose) char *fullname, *name;{ ZFILE *zf; Image *image; char fname[BUFSIZ]; char lname[BUFSIZ]; char buf[BUFSIZ]; unsigned int w, h, d, iw, ih, id; unsigned int x, y; int value; unsigned int linelen; byte *lineptr, *dataptr; if (!Initialized) initHexTable(); if (! (zf= zopen(fullname))) return(NULL); w= h= d= 0; fname[0]= lname[0]= '\0'; while (zgets(buf, BUFSIZ - 1, zf)) { if (! strcmp(buf, "\n")) break; if (!strncmp(buf, "FirstName:", 10)) strcpy(fname, buf + 11); else if (!strncmp(buf, "LastName:", 9)) strcpy(lname, buf + 10); else if (!strncmp(buf, "Image:", 6)) { if (sscanf(buf + 7, "%d%d%d", &iw, &ih, &id) != 3) { printf("%s: Bad Faces Project image\n", fullname); exit(1); } } else if (!strncmp(buf, "PicData:", 8)) { if (sscanf(buf + 9, "%d%d%d", &w, &h, &d) != 3) { printf("%s: Bad Faces Project image\n", fullname); exit(1); } } } if (!w || !h || !d) { zclose(zf); return(NULL); } if (verbose) printf("%s is a %dx%d %d-bit grayscale Faces Project image\n", name, w, h, d); image= newRGBImage(w, h, d); fname[strlen(fname) - 1]= ' '; strcat(fname, lname); fname[strlen(fname) - 1]= '\0'; image->title= dupString(fname); /* image is greyscale; build RGB map accordingly */ for (x= 0; x < image->rgb.size; x++) *(image->rgb.red + x)= *(image->rgb.green + x)= *(image->rgb.blue + x)= (65536 / image->rgb.size) * x; image->rgb.used= image->rgb.size; /* read in image data */ linelen= w * image->pixlen; lineptr= image->data + (h * linelen); for (y= 0; y < h; y++) { lineptr -= linelen; dataptr= lineptr; for (x= 0; x < w; x++) { if ((value= nextInt(zf, image->pixlen)) < 0) { printf("%s: Bad Faces Project image data\n", fullname); exit(1); } *(dataptr++)= value; } } zclose(zf); return(image);}int facesIdent(fullname, name) char *fullname, *name;{ Image *image; if (image= facesLoad(name, fullname, 1)) { freeImage(image); return(1); } return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -