/* * FIG : Facility for Interactive Generation of figures * Copyright (c) 1989-2007 by Brian V. Smith * * Any party obtaining a copy of these files is granted, free of charge, a * full and unrestricted irrevocable, world-wide, paid up, royalty-free, * nonexclusive right and license to deal in this software and documentation * files (the "Software"), including without limitation the rights to use, * copy, modify, merge, publish distribute, sublicense and/or sell copies of * the Software, and to permit persons who receive copies from any such * party to do so, with the only requirement being that the above copyright * and this permission notice remain intact. * */ #include "fig.h" #include "resources.h" #include "object.h" #include "w_indpanel.h" #include "w_color.h" #include "w_msgpanel.h" #include "w_setup.h" #include "f_util.h" /* attempt to read a XPM (color pixmap) file */ /* the filename is passed since XpmReadFileToXpmImage needs a name instead of a FILE pointer. This is fine because it handles compressed files */ /* return codes: PicSuccess (1) : success FileInvalid (-2) : invalid file */ int read_xpm(char *file, int filetype, F_pic *pic) { int status; XpmImage image; int i; char *c; XColor exact_def; /* make scale factor smaller for metric */ float scale = (appres.INCHES ? (float)PIX_PER_INCH : 2.54*PIX_PER_CM)/(float)DISPLAY_PIX_PER_INCH; status = XpmReadFileToXpmImage(file, &image, NULL); /* if out of colors, try switching colormaps and reading again */ if (status == XpmColorFailed) { if (!switch_colormap()) return PicSuccess; status = XpmReadFileToXpmImage(file, &image, NULL); } if (status == XpmSuccess) { /* now look up the colors in the image and put them in the pic colormap */ for (i=0; ic_color; if (c == NULL || *c == '\0') { /* use white for null color */ c = "white"; file_msg("white used for *NULL color"); } if (XParseColor(tool_d, tool_cm, c, &exact_def) == 0) { file_msg("Error parsing color %s",c); exact_def.red = exact_def.green = exact_def.blue = 65535; } pic->pic_cache->cmap[i].red = exact_def.red >> 8; pic->pic_cache->cmap[i].green = exact_def.green >> 8; pic->pic_cache->cmap[i].blue = exact_def.blue >> 8; } pic->pic_cache->subtype = T_PIC_XPM; pic->pic_cache->numcols = image.ncolors; pic->pixmap = None; pic->pic_cache->bitmap = (unsigned char *) malloc(image.width*image.height*sizeof(unsigned char)); if (pic->pic_cache->bitmap == NULL) { file_msg("cannot allocate space for XPM image"); return PicSuccess; } for (i=0; ipic_cache->bitmap[i] = (unsigned char) image.data[i]; /* int to unsigned char */ pic->hw_ratio = (float) image.height / image.width; pic->pic_cache->bit_size.x = image.width; pic->pic_cache->bit_size.y = image.height; pic->pic_cache->size_x = image.width * scale; pic->pic_cache->size_y = image.height * scale; XpmFreeXpmImage(&image); /* get rid of the image */ /* if monochrome display map bitmap */ if (tool_cells <= 2 || appres.monochrome) map_to_mono(pic); return PicSuccess; } return FileInvalid; }