basti@orthogo.UUCP (Sebastian Wangnick) (12/12/90)
/* This piece of code embeds xloadimage 2.0 functionality into a Xt converter
* so that you can load image files of different formats into any pixmap
* resource straight from your resource database file. This means that you
* can set the background pixmap of any widget to an image stored in a file
* in FBM image, Sun rasterfile, CMU WM raster, PBM, Faces, GIF, Utah RLE,
* X window dump, MacPaint, X pixmap, X bitmap or G3 fax image formats
* (that's the current list of xloadimage 2.0 readable formats). xloadimage
* is written by Jim Frost (jimf@saber.com) and is publicly available via
* anonymous ftp as expo.lcs.mit.edu:contrib/xloadimage.2.02.tar.Z.
*
* No warranties, of course.
*
* basti@orthogo.uucp
*/
/* #define MOTIF */
#ifdef MOTIF
#include <Xm/XmP.h>
#else
#include <X11/IntrinsicP.h>
#endif
#include <X11/StringDefs.h>
#include <X11/Xresource.h>
static Arg args[3];
static int num;
#ifdef MOTIF
static void TryMotif (Widget widget, char* name, XrmValuePtr to)
{Pixel foreground = BlackPixelOfScreen(XtScreen(widget));
Pixel background = WhitePixelOfScreen(XtScreen(widget));
static Pixmap pixmap;
XtSetArg(args[num=0],XtNforeground,&foreground); num++;
XtSetArg(args[num],XtNbackground,&background); num++;
XtGetValues(widget,args,num);
pixmap = XmGetPixmap(XtScreen(widget),name,foreground,background);
if (pixmap==XmUNSPECIFIED_PIXMAP)
XtStringConversionWarning(name,XtRPixmap);
else
{to->addr = (caddr_t) &pixmap;
to->size = sizeof(Pixmap);
}
}
#else
#define TryMotif(widget,name,to)
#endif
#define Pixel ImagePixel
#include <image.h>
#undef Pixel
#include <imagetypes.h>
int findImage (char* name, char* fullname);
unsigned int sendImageToX(Display* disp, int scrn, Visual* visual,
Image* image, Pixmap* pixmap, Colormap* cmap, unsigned int verbose);
void goodImage(Image* image, char* func) {}
extern int errno;
extern char* sys_errlist[];
Display* Disp;
int Scrn;
static void CvtStringToPixmap (XrmValuePtr closure, Cardinal *num_closure,
XrmValuePtr from, XrmValuePtr to)
{static char* fname = "CvtStringToPixmap";
static XtResource resource =
{"createTraceback","CreateTraceback",XtRBool,sizeof(Bool),0,
XtRImmediate, (caddr_t) FALSE};
Bool traceback;
char fullname[BUFSIZ];
Widget widget;
Visual* visual;
Colormap cmap;
static Pixmap pixmap;
Image* image = NULL;
int itype;
to->addr = NULL;
to->size = 0;
if (*num_closure != 1)
{fprintf(stderr,"%s: Wrong number of arguments\n",fname);
XtStringConversionWarning(from->addr,XtRPixmap);
return;
}
widget = (Widget) closure->addr;
if (widget->core.self != widget)
{fprintf(stderr,"%s: Funny widget\n",fname);
XtStringConversionWarning(from->addr,XtRPixmap);
return;
}
Disp = XtDisplay(widget);
Scrn = DefaultScreen(Disp);
visual = DefaultVisual(Disp,Scrn);
cmap = widget->core.colormap;
XtGetApplicationResources(widget,&traceback,&resource,1,NULL,0);
if (findImage(from->addr,fullname)<0)
{if (traceback)
printf("%s: Can't find imagefile %s (%s)\n",
fname,from->addr,sys_errlist[errno]);
TryMotif(widget,from->addr,to);
return;
}
for (itype=0; ImageTypes[itype].loader; itype++)
if (image=ImageTypes[itype].loader(from->addr,from->addr,0))
break;
if (!image)
{if (traceback)
printf("%s: Can't load imagefile %s\n",fname,from->addr);
TryMotif(widget,from->addr,to);
return;
}
if (!BITMAPP(image) && !RGBP(image))
{if (traceback)
printf("%s: Strange image type %d in image %s\n",
fname,image->type,image->title);
TryMotif(widget,from->addr,to);
return;
}
if (!sendImageToX(Disp,Scrn,visual,image,&pixmap,&cmap,0))
{if (traceback)
printf("%s: Can't send image %s to X\n",fname,image->title);
TryMotif(widget,from->addr,to);
return;
}
if (traceback)
printf("%s: %s is a %dx%d %s\n",fname,image->title,
image->width,image->height,ImageTypes[itype].name);
XtSetArg(args[num=0],XtNcolormap,cmap); num++;
XtSetArg(args[num],XtNwidth,image->width); num++;
XtSetArg(args[num],XtNheight,image->height); num++;
XtSetValues(widget,args,num);
to->addr = (caddr_t) &pixmap;
to->size = sizeof(Pixmap);
}
void Register
#ifdef MOTIF
(Widget toplevel)
#else
(void)
#endif
{static XtConvertArgRec widgetConvertArg = {XtBaseOffset,0,sizeof(Widget)};
#ifdef MOTIF
XtDestroyWidget(XtCreateWidget("dummy",xmManagerWidgetClass,toplevel,NULL,0));
XtDestroyWidget(XtCreateWidget("dummy",xmPrimitiveWidgetClass,toplevel,NULL,0));
#endif
XtAddConverter(XtRString,XtRPixmap,CvtStringToPixmap,&widgetConvertArg,1);
}
Have a nice day,
Sebastian Wangnick (basti@orthogo.uucp)