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

📄 xpixmap.c

📁 speech signal process tools
💻 C
字号:
/* xpixmap.c: * * XPixMap format file read and identify routines.  these can handle any * "format 1" XPixmap file with up to BUFSIZ - 1 chars per pixel.  it's * not nearly as picky as it might be. * * unlike most image loading routines, this is X specific since it * requires X color name parsing.  to handle this we have global X * variables for display and screen.  it's ugly but it keeps the rest * of the image routines clean. * * Copyright 1989 Jim Frost.  See included file "copyright.h" for complete * copyright information. */#ifdef SCCS    static char *sccs_id = "@(#)xpixmap.c	1.1  10/13/90";#endif#include "copyright.h"#include "xloadimage.h"char *rindex();extern Display *Disp; /* X display, null if in "identify" mode */extern int      Scrn; /* X screen number */#define XPM_FORMAT 1static void corrupted(fullname, zf)     char  *fullname;     ZFILE *zf;{  zclose(zf);  printf("%s: X Pixmap file is corrupted\n", fullname);  exit(1);}Image *xpixmapLoad(fullname, name, verbose)     char         *fullname, *name;     unsigned int  verbose;{ ZFILE         *zf;  char           buf[BUFSIZ];  char           what[BUFSIZ];  char          *p;  char          *imagetitle;  unsigned int   value;  unsigned int   format;  /* image format */  unsigned int   w, h;    /* image dimensions */  unsigned int   cpp;     /* chars per pixel */  unsigned int   ncolors; /* number of colors */  unsigned int   depth;   /* depth of image */  char         **ctable;  /* color table */  Image         *image;  XColor         xcolor;  unsigned int   a, b, x, y;  int            c;  byte          *dptr;  if (! (zf= zopen(fullname)))    return(NULL);  /* read #defines until we have all that are necessary or until we   * get an error   */  format= w= h= ncolors= 0;  for (;;) {    if (! zgets(buf, BUFSIZ - 1, zf)) {      zclose(zf);      return(NULL);    }    if (!strncmp(buf, "#define", 7)) {      if (sscanf(buf, "#define %s %d", what, &value) != 2) {	zclose(zf);	return(NULL);      }      if (! (p= rindex(what, '_')))	p= what;      else	p++;      if (!strcmp(p, "format"))	format= value;      else if (!strcmp(p, "width"))	w= value;      else if (!strcmp(p, "height"))	h= value;      else if (!strcmp(p, "ncolors"))	ncolors= value;      /* this one is ugly       */      else if (!strcmp(p, "pixel")) { /* this isn't pretty but it works */	if (p == what)	  continue;	*(--p)= '\0';	if (!(p= rindex(what, '_')) || (p == what) || strcmp(++p, "per"))	  continue;	*(--p)= '\0';	if (!(p= rindex(what, '_')))	  p= what;	if (strcmp(++p, "chars"))	  continue;	cpp= value;      }    }    else if ((sscanf(buf, "static char * %s", what) == 1) &&	     (p= rindex(what, '_')) && !strcmp(++p, "colors[]"))      break;  }  if ((format != XPM_FORMAT) || !w || !h || !ncolors || !cpp) {    zclose(zf);    return(NULL);  }  if (p= rindex(what, '_')) {     /* get the name in the image if there is */    *p= '\0';                     /* one */    imagetitle= dupString(what);  }  else {    p= what;    imagetitle= dupString(name);  }  if (verbose)    printf("%s is a %dx%d X Pixmap image with %d colors titled '%s'\n",	   name, w, h, ncolors, imagetitle);  for (depth= 1, value= 2; value < ncolors; value <<= 1, depth++)    ;  image= newRGBImage(w, h, depth);  image->rgb.used= ncolors;  image->title= dupString(imagetitle);  /* read the colors array and build the image colormap   */  ctable= (char **)lmalloc(sizeof(char *) * ncolors);  xcolor.flags= DoRed | DoGreen | DoBlue;  for (a= 0; a < ncolors; a++) {     /* read pixel value     */    *(ctable + a)= (char *)lmalloc(cpp);    while (((c= zgetc(zf)) != EOF) && (c != '"'))      ;    if (c == EOF)      corrupted(fullname, zf);    for (b= 0; b < cpp; b++) {      if ((c= zgetc(zf)) == '\\')	c= zgetc(zf);     if (c == EOF)	corrupted(fullname, zf);      *(*(ctable + a) + b)= (char)c;    }    if (((c= zgetc(zf)) == EOF) || (c != '"'))      corrupted(fullname, zf);    /* read color definition and parse it     */    while (((c= zgetc(zf)) != EOF) && (c != '"'))      ;    if (c == EOF)      corrupted(fullname, zf);    for (b= 0; ((c= zgetc(zf)) != EOF) && (c != '"'); b++) {      if (c == '\\')	c= zgetc(zf);      if (c == EOF)	corrupted(fullname, zf);      buf[b]= (char)c;    }    buf[b]= '\0';    if (Disp) {      if (! XParseColor(Disp, DefaultColormap(Disp, Scrn), buf, &xcolor)) {	printf("%s: %s: Bad color name\n", fullname, buf);	exit(1);      }      *(image->rgb.red + a)= xcolor.red;      *(image->rgb.green + a)= xcolor.green;      *(image->rgb.blue + a)= xcolor.blue;    }  }  for (;;) {    if (! zgets(buf, BUFSIZ - 1, zf))      corrupted(fullname, zf);    if (sscanf(buf, "static char * %s", what) == 1)      break;  }  if (p= rindex(what, '_'))    p++;  else    p= what;  if (strcmp(p, "pixels[]"))    corrupted(fullname, zf);  /* read in image data   */  dptr= image->data;  for (y= 0; y < h; y++) {    while (((c= zgetc(zf)) != EOF) && (c != '"'))      ;    for (x= 0; x < w; x++) {      for (a= 0; a < cpp; a++) {	if ((c= zgetc(zf)) == '\\')	  c= zgetc(zf);	if (c == EOF)	  corrupted(fullname, zf);	buf[a]= (char)c;      }      for (a= 0; a < ncolors; a++)	if (!strncmp(*(ctable + a), buf, cpp))	  break;      if (a == ncolors) { /* major uncool */	zclose(zf);	printf("%s: Pixel data doesn't match color data\n", fullname);	exit(1);      }      valToMem((unsigned long)a, dptr, image->pixlen);      dptr += image->pixlen;    }    if ((c= zgetc(zf)) != '"')      corrupted(fullname, zf);  }  return(image);}int xpixmapIdent(fullname, name)     char *fullname, *name;{ Image *image;  if (image= xpixmapLoad(fullname, name, (unsigned int)1)) {    freeImage(image);    return(1);  }  return(0);}

⌨️ 快捷键说明

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