diff options
Diffstat (limited to 'mail/xpbiff/files/LocPixmap.c')
| -rw-r--r-- | mail/xpbiff/files/LocPixmap.c | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/mail/xpbiff/files/LocPixmap.c b/mail/xpbiff/files/LocPixmap.c new file mode 100644 index 000000000000..7c89f3b5d32f --- /dev/null +++ b/mail/xpbiff/files/LocPixmap.c @@ -0,0 +1,242 @@ +/* Change for xpbiff by Yoshikazu Yamamoto(y-yamamt@ics.es.osaka-u.ac.jp) at Oct 19, 1993 */ + +/* * Last edited: Sep 17 14:39 1991 (mallet) */ +/* + * $FreeBSD$ + * + * Copyright 1991 Lionel Mallet + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Lionel MALLET not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. Lionel MALLET makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * Lionel MALLET DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL Lionel MALLET BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Lionel Mallet - SIMULOG + */ + +#include <X11/Xlib.h> +#include <X11/Xresource.h> +#include <X11/Xutil.h> +#include <X11/StringDefs.h> +#include <sys/param.h> /* get MAXPATHLEN if possible */ +#ifndef MAXPATHLEN +#define MAXPATHLEN 256 +#endif + +#include <X11/Xmu/CvtCache.h> +#include <X11/xpm.h> +#include <X11/Xmu/Drawing.h> + + +/* + * LocatePixmapFile - read a pixmap file using the normal defaults + */ + +static char **split_path_string(); + +Pixmap LocatePixmapFile (screen, name, srcname, srcnamelen, + widthp, heightp, mask) + Screen *screen; + char *name; + char *srcname; /* RETURN */ + int srcnamelen; + int *widthp, *heightp; /* RETURN */ + Pixmap *mask; /* RETURN */ +{ + Display *dpy = DisplayOfScreen (screen); + Window root = RootWindowOfScreen (screen); + Bool try_plain_name = True; + XmuCvtCache *cache = _XmuCCLookupDisplay (dpy); + char **file_paths; + char filename[MAXPATHLEN]; + unsigned int width, height; + int xhot, yhot; + int i; + + + /* + * look in cache for pixmap path + */ + if (cache) { + if (!cache->string_to_bitmap.bitmapFilePath) { + XrmName xrm_name[2]; + XrmClass xrm_class[2]; + XrmRepresentation rep_type; + XrmValue value; + + xrm_name[0] = XrmStringToName ("bitmapFilePath"); + xrm_name[1] = NULL; + xrm_class[0] = XrmStringToClass ("BitmapFilePath"); + xrm_class[1] = NULL; + /* + * XXX - warning, derefing Display * until XDisplayDatabase + */ + if (!XrmGetDatabase(dpy)) { + /* what a hack; need to initialize dpy->db */ + (void) XGetDefault (dpy, "", ""); + } + if (XrmQGetResource (XrmGetDatabase(dpy), xrm_name, xrm_class, + &rep_type, &value) && + rep_type == XrmStringToQuark(XtRString)) { + cache->string_to_bitmap.bitmapFilePath = + split_path_string (value.addr); + } + } + file_paths = cache->string_to_bitmap.bitmapFilePath; + } + + + /* + * Search order: + * 1. name if it begins with / or ./ + * 2. "each prefix in file_paths"/name + * 3. BITMAPDIR/name + * 4. name if didn't begin with / or . + */ + +#ifndef BITMAPDIR +#define BITMAPDIR "/usr/include/X11/bitmaps" +#endif + + for (i = 1; i <= 4; i++) { + char *fn = filename; + Pixmap pixmap; + XpmAttributes attributes; + unsigned char *data; + + switch (i) { + case 1: + if (!(name[0] == '/' || (name[0] == '.') && name[1] == '/')) + continue; + fn = name; + try_plain_name = False; + break; + case 2: + if (file_paths && *file_paths) { + sprintf (filename, "%s/%s", *file_paths, name); + file_paths++; + i--; + break; + } + continue; + case 3: + sprintf (filename, "%s/%s", BITMAPDIR, name); + break; + case 4: + if (!try_plain_name) continue; + fn = name; + break; + } + + data = NULL; + pixmap = None; + if (XmuReadBitmapDataFromFile (fn, &width, &height, &data, + &xhot, &yhot) == BitmapSuccess) { + pixmap = XCreatePixmapFromBitmapData (dpy, root, (char *) data, + width, height, + (unsigned long) 1, + (unsigned long) 0, + (unsigned int) 1); + XFree ((char *)data); + if (pixmap != None) { + if (widthp) *widthp = (int)width; + if (heightp) *heightp = (int)height; + if (srcname && srcnamelen > 0) { + strncpy (srcname, fn, srcnamelen - 1); + srcname[srcnamelen - 1] = '\0'; + } + *mask = None; + return pixmap; + } + } + attributes.visual = DefaultVisualOfScreen (screen); + attributes.colormap = DefaultColormapOfScreen (screen); + attributes.depth = DefaultDepthOfScreen (screen); + attributes.colorsymbols = (ColorSymbol *)NULL; + attributes.numsymbols = 0; + attributes.valuemask = XpmVisual | XpmColormap | XpmDepth; + if (pixmap == None && + XpmReadPixmapFile (dpy, root, fn, &pixmap, mask, + &attributes) == XpmPixmapSuccess) { + if (widthp) *widthp = (int)attributes.width; + if (heightp) *heightp = (int)attributes.height; + if (srcname && srcnamelen > 0) { + strncpy (srcname, fn, srcnamelen - 1); + srcname[srcnamelen - 1] = '\0'; + } + XpmFreeAttributes(&attributes); + return pixmap; + } + } + *mask = None; + return None; +} + + +/* + * split_path_string - split a colon-separated list into its constituent + * parts; to release, free list[0] and list. + */ +static char **split_path_string (src) + register char *src; +{ + int nelems = 1; + register char *dst; + char **elemlist, **elem; + + /* count the number of elements */ + for (dst = src; *dst; dst++) if (*dst == ':') nelems++; + + /* get memory for everything */ + dst = (char *) malloc (dst - src + 1); + if (!dst) return NULL; + elemlist = (char **) calloc ((nelems + 1), sizeof (char *)); + if (!elemlist) { + free (dst); + return NULL; + } + + /* copy to new list and walk up nulling colons and setting list pointers */ + strcpy (dst, src); + for (elem = elemlist, src = dst; *src; src++) { + if (*src == ':') { + *elem++ = dst; + *src = '\0'; + dst = src + 1; + } + } + *elem = dst; + + return elemlist; +} + +/* +void _XmuStringToBitmapInitCache (c) + register XmuCvtCache *c; +{ + c->string_to_bitmap.bitmapFilePath = NULL; +} + +void _XmuStringToBitmapFreeCache (c) + register XmuCvtCache *c; +{ + if (c->string_to_bitmap.bitmapFilePath) { + if (c->string_to_bitmap.bitmapFilePath[0]) + free (c->string_to_bitmap.bitmapFilePath[0]); + free ((char *) (c->string_to_bitmap.bitmapFilePath)); + } +} +*/ |
