v13i037: ImageMagick - Graphics display programs, Part21/21
cristy at dupont.com
cristy at dupont.com
Fri May 24 13:23:01 AEST 1991
Submitted-by: cristy at dupont.com
Posting-number: Volume 13, Issue 37
Archive-name: imagemagic/part21
#!/bin/sh
# this is img.21 (part 21 of ImageMagick)
# do not concatenate these parts, unpack them in order with /bin/sh
# file ImageMagick/animate.c continued
#
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck
if test "$Scheck" != 21; then
echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping ImageMagick/animate.c'
else
echo 'x - continuing file ImageMagick/animate.c'
sed 's/^X//' << 'SHAR_EOF' >> 'ImageMagick/animate.c' &&
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Function Delay suspends animation for the number of milliseconds specified.
%
% The format of the Delay routine is:
%
% Delay(milliseconds)
%
% A description of each parameter follows:
%
% o milliseconds: Specifies the number of milliseconds to delay before
% returning.
%
%
*/
void Timer()
{
}
X
void Delay(milliseconds)
unsigned long
X milliseconds;
{
#include <signal.h>
X
#ifndef vms
X struct itimerval
X timer;
X
X if (milliseconds == 0)
X return;
X /*
X Schedule interval timer.
X */
X timer.it_interval.tv_sec=0;
X timer.it_interval.tv_usec=0;
X timer.it_value.tv_sec=milliseconds/1000;
X timer.it_value.tv_usec=(milliseconds % 1000)*1000;
X (void) signal(SIGALRM,Timer);
X (void) setitimer(ITIMER_REAL,&timer,(struct itimerval *) NULL);
X (void) pause();
#endif
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% E r r o r %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Function Error displays an error message and then terminates the program.
%
% The format of the Error routine is:
%
% Error(message,qualifier)
%
% A description of each parameter follows:
%
% o message: Specifies the message to display before terminating the
% program.
%
% o qualifier: Specifies any qualifier to the message.
%
%
*/
void Error(message,qualifier)
char
X *message,
X *qualifier;
{
X (void) fprintf(stderr,"%s: %s",application_name,message);
X if (qualifier != (char *) NULL)
X (void) fprintf(stderr," (%s)",qualifier);
X (void) fprintf(stderr,".\n");
X exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% U s a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Function Usage displays the program command syntax.
%
% The format of the Usage routine is:
%
% Usage(message,terminate)
%
% A description of each parameter follows:
%
% o message: Specifies a specific message to display to the user.
%
% o terminate: The program will exit if the value is not zero.
%
%
*/
static void Usage(message,terminate)
char
X *message;
X
unsigned int
X terminate;
{
X char
X **p;
X
X static char
X *buttons[]=
X {
X "1 press and drag to select a command from a pop-up menu",
X (char *) NULL
X },
X *keys[]=
X {
X "0-9 press to change the level of delay",
X "p press to animate the sequence of images",
X "s press to display the next image in the sequence",
X ". press to continually display the sequence of images",
X "a press to automatically reverse the sequence of images",
X "f press to animate in the forward direction",
X "r press to animate in the reverse direction",
X "i press to display information about the image",
X "q press to discard all images and exit program",
X (char *) NULL
X },
X *options[]=
X {
X "-backdrop display image centered on a backdrop",
X "-clip geometry preferred size and location of the clipped image",
X "-colors value preferred number of colors in the image",
X "-compress type compress image: RunlengthEncoded or QEncoded",
X "-delay milliseconds display the next image after pausing",
X "-display server display image to this X server",
X "-dither apply Floyd/Steinberg error diffusion to image",
X "-gamma value level of gamma correction",
X "-geometry geometry preferred size and location of the image window",
X "-gray transform image to gray scale colors",
X "-map type display image using this Standard Colormap",
X "-monochrome transform image to black and white",
X "-reflect reflect the image scanlines",
X "-rotate degrees apply Paeth rotation to the image",
X "-scale geometry preferred size factors of the image",
X "-treedepth value depth of the color classification tree",
X "-verbose print detailed information about the image",
X "-visual type display image using this visual type",
X (char *) NULL
X };
X if (message != (char *) NULL)
X (void) fprintf(stderr,"Can't continue, %s\n\n",message);
X (void) fprintf(stderr,
X "Usage: %s [-options ...] file [ [-options ...] file ...]\n",
X application_name);
X (void) fprintf(stderr,"\nWhere options include: \n");
X for (p=options; *p != (char *) NULL; p++)
X (void) fprintf(stderr," %s\n",*p);
X (void) fprintf(stderr,
X "\nIn addition to those listed above, you can specify these standard X\n");
X (void) fprintf(stderr,
X "resources as command line options: -background, -bordercolor,\n");
X (void) fprintf(stderr,
X "-borderwidth, -font, -foreground, -iconGeometry, -iconic, -name, or\n");
X (void) fprintf(stderr,"-title.\n");
X (void) fprintf(stderr,
X "\nChange '-' to '+' in any option above to reverse its effect. For\n");
X (void) fprintf(stderr,
X "example, specify +compress to store the image as uncompressed.\n");
X (void) fprintf(stderr,
X "\nSpecify 'file' as '-' for standard input or output.\n");
X (void) fprintf(stderr,"\nButtons: \n");
X for (p=buttons; *p != (char *) NULL; p++)
X (void) fprintf(stderr," %s\n",*p);
X (void) fprintf(stderr,"\nKeys: \n");
X for (p=keys; *p != (char *) NULL; p++)
X (void) fprintf(stderr," %s\n",*p);
X if (terminate)
X exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% U s e r C o m m a n d %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Function UserCommand makes a transform to the image or image window as
% specified by a user menu button or keyboard command.
%
% The format of the UserCommand routine is:
%
% UserCommand(display,info_window,image_window,image,command,state);
%
% A description of each parameter follows:
%
% o display: Specifies a connection to an X server; returned from
% XOpenDisplay.
%
% o info_window: Specifies a pointer to a XWindowInfo structure.
%
% o image_window: Specifies a pointer to a XWindowInfo structure.
%
% o image: Specifies a pointer to a Image structure; UserCommand
% may transform the image and return a new image pointer.
%
% o state: Specifies an unsigned int; UserCommand may return a
% modified state.
%
%
*/
static void UserCommand(display,info_window,image_window,command,image,state)
Display
X *display;
X
XXWindowInfo
X *info_window,
X *image_window;
X
char
X *command;
X
Image
X **image;
X
unsigned int
X *state;
{
X if (*state & InfoMappedState)
X XWithdrawWindow(display,info_window->id,info_window->screen);
X /*
X Process user command.
X */
X switch (*command)
X {
X case 'i':
X {
X char
X text[256];
X
X /*
X Display information about the image in the info window.
X */
X (void) sprintf(text," [%d] %s %dx%d \0",(*image)->scene,
X (*image)->filename,image_window->width,image_window->height);
X if ((*image)->colors > 0)
X (void) sprintf(text,"%s%dc \0",text,(*image)->colors);
X info_window->width=XTextWidth(info_window->font_info,text,strlen(text));
X info_window->height=
X info_window->font_info->ascent+info_window->font_info->descent+4;
X XResizeWindow(display,info_window->id,info_window->width,
X info_window->height);
X XMapWindow(display,info_window->id);
X XClearWindow(display,info_window->id);
X XDrawString(display,info_window->id,info_window->graphic_context,2,
X info_window->font_info->ascent+2,text,(unsigned int) strlen(text));
X break;
X }
X case 'p':
X {
X *state|=PlayAnimationState;
X *state&=(~AutoReverseAnimationState);
X break;
X }
X case 's':
X {
X *state|=StepAnimationState;
X *state&=(~PlayAnimationState);
X break;
X }
X case '.':
X {
X *state|=RepeatAnimationState;
X *state&=(~AutoReverseAnimationState);
X *state|=PlayAnimationState;
X break;
X }
X case 'a':
X {
X *state|=AutoReverseAnimationState;
X *state&=(~RepeatAnimationState);
X *state|=PlayAnimationState;
X break;
X }
X case 'f':
X {
X *state=ForwardAnimationState;
X *state&=(~AutoReverseAnimationState);
X break;
X }
X case 'r':
X {
X *state&=(~ForwardAnimationState);
X *state&=(~AutoReverseAnimationState);
X break;
X }
X case 'q':
X {
X /*
X Exit program
X */
X *state|=ExitState; /* exit program */
X break;
X }
X case ' ':
X case '\0':
X break;
X default:
X {
X XBell(display,0);
X break;
X }
X }
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% X A n i m a t e I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Function XAnimateImage displays an image via X11.
%
% The format of the XAnimateImage routine is:
%
% XAnimateImage(display,resource_info,argv,argc,image,number_scenes)
%
% A description of each parameter follows:
%
% o display: Specifies a connection to an X server; returned from
% XOpenDisplay.
%
% o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
%
% o argv: Specifies the application's argument list.
%
% o argc: Specifies the number of arguments.
%
% o image: Specifies a pointer to a Image structure; returned from
% ReadImage.
%
%
*/
static int LinearCompare(image_1,image_2)
Image
X **image_1,
X **image_2;
{
X return((int) (*image_1)->scene-(int) (*image_2)->scene);
}
X
static void XAnimateImage(display,resource_info,argv,argc,images,number_scenes)
Display
X *display;
X
XXResourceInfo
X *resource_info;
X
char
X **argv;
X
int
X argc;
X
Image
X **images;
X
unsigned int
X number_scenes;
{
X Atom
X delete_property,
X protocols_property;
X
X Colormap
X colormap;
X
X char
X text[256];
X
X Cursor
X arrow_cursor,
X watch_cursor;
X
X GC
X graphic_context;
X
X int
X scene;
X
X unsigned int
X state;
X
X Window
X root_window;
X
X XClassHint
X *class_hint;
X
X XColor
X color;
X
X XEvent
X event;
X
X XFontStruct
X *font_info;
X
X XGCValues
X graphic_context_value;
X
X XPixelInfo
X *pixel_info;
X
X XStandardColormap
X **map_info;
X
X XVisualInfo
X *visual_info;
X
X XWindowInfo
X backdrop_window,
X icon_window,
X image_window,
X info_window,
X menu_window,
X superclass_window;
X
X XWMHints
X *manager_hints;
X
X /*
X Sort images by increasing scene number.
X */
X qsort((char *) images,(int) number_scenes,sizeof(Image *),LinearCompare);
X /*
X Allocate pixel and map info.
X */
X pixel_info=(XPixelInfo *) malloc(number_scenes*sizeof(XPixelInfo));
X map_info=(XStandardColormap **)
X malloc(number_scenes*sizeof(XStandardColormap *));
X if ((pixel_info == (XPixelInfo *) NULL) ||
X (map_info == (XStandardColormap **) NULL))
X Error("unable to animate images","memory allocation failed");
X /*
X Get the best visual this server supports.
X */
X visual_info=XBestVisualInfo(display,resource_info->visual_type,
X resource_info->map_type,&map_info[0]);
X if (visual_info == (XVisualInfo *) NULL)
X Error("unable to get visual",resource_info->visual_type);
X /*
X Initialize colormap.
X */
X pixel_info[0].pixels=(unsigned long *) NULL;
X if (resource_info->map_type == (char *) NULL)
X {
X /*
X Create Standard Colormap.
X */
X map_info[0]=XMakeStandardColormap(display,visual_info,resource_info,
X &pixel_info[0],images[0]);
X colormap=map_info[0]->colormap;
X }
X else
X {
X if (images[0]->class == PseudoClass)
X {
X register int
X i;
X
X /*
X Initialize pixel array for images of type PseudoClass.
X */
X pixel_info[0].pixels=(unsigned long *)
X malloc((unsigned int) images[0]->colors*sizeof(unsigned long));
X if (pixel_info[0].pixels == (unsigned long *) NULL)
X Error("unable to create colormap","memory allocation failed");
X for (i=0; i < images[0]->colors; i++)
X pixel_info[0].pixels[i]=
X XStandardPixel(map_info[0],images[0]->colormap[i],8);
X }
X /*
X Define background/border/foreground pixels.
X */
X colormap=map_info[0]->colormap;
X XParseColor(display,colormap,resource_info->background_color,&color);
X pixel_info[0].background_pixel=XStandardPixel(map_info[0],color,16);
X XParseColor(display,colormap,resource_info->border_color,&color);
X pixel_info[0].border_pixel=XStandardPixel(map_info[0],color,16);
X XParseColor(display,colormap,resource_info->foreground_color,&color);
X pixel_info[0].foreground_pixel=XStandardPixel(map_info[0],color,16);
X }
X /*
X Initialize font info.
X */
X (void) sprintf(text," [%d] %s %dx%d \0",number_scenes,
X images[0]->filename,images[0]->columns,images[0]->rows);
X font_info=XBestFont(display,resource_info,text,images[0]->columns);
X if (font_info == (XFontStruct *) NULL)
X Error("unable to load font",resource_info->font_name);
X /*
X Initialize cursor.
X */
X arrow_cursor=XCreateFontCursor(display,XC_arrow);
X watch_cursor=XCreateFontCursor(display,XC_watch);
X if ((arrow_cursor == (Cursor) NULL) || (watch_cursor == (Cursor) NULL))
X Error("unable to create cursor",(char *) NULL);
X /*
X Initialize atoms.
X */
X protocols_property=XInternAtom(display,"WM_PROTOCOLS",False);
X delete_property=XInternAtom(display,"WM_DELETE_WINDOW",False);
X if ((protocols_property == (Atom) NULL) || (delete_property == (Atom) NULL))
X Error("unable to create property",(char *) NULL);
X /*
X Initialize class and manager hints.
X */
X class_hint=XAllocClassHint();
X manager_hints=XAllocWMHints();
X if ((class_hint == (XClassHint *) NULL) ||
X (manager_hints == (XWMHints *) NULL))
X Error("unable to allocate X hints",(char *) NULL);
X if (resource_info->name == (char *) NULL)
X class_hint->res_name=application_name;
X else
X class_hint->res_name=resource_info->name;
X class_hint->res_class=(char *) "ImageMagick";
X manager_hints->flags=InputHint | StateHint;
X manager_hints->input=False;
X manager_hints->initial_state=NormalState;
X /*
X Window superclass.
X */
X superclass_window.screen=visual_info->screen;
X superclass_window.depth=visual_info->depth;
X superclass_window.visual_info=visual_info;
X superclass_window.map_info=map_info[0];
X superclass_window.pixel_info=(&pixel_info[0]);
X superclass_window.font_info=font_info;
X superclass_window.cursor=arrow_cursor;
X superclass_window.busy_cursor=watch_cursor;
X superclass_window.name="ImageMagick SuperClass";
X superclass_window.geometry=(char *) NULL;
X superclass_window.icon_geometry=resource_info->icon_geometry;
X superclass_window.clip_geometry=(char *) NULL;
X superclass_window.flags=PSize;
X superclass_window.x=0;
X superclass_window.y=0;
X superclass_window.width=1;
X superclass_window.height=1;
X superclass_window.min_width=0;
X superclass_window.min_height=0;
X superclass_window.width_inc=1;
X superclass_window.height_inc=1;
X superclass_window.border_width=2;
X superclass_window.immutable=True;
X superclass_window.attributes.background_pixel=pixel_info[0].background_pixel;
X superclass_window.attributes.background_pixmap=(Pixmap) NULL;
X superclass_window.attributes.backing_store=WhenMapped;
X superclass_window.attributes.bit_gravity=ForgetGravity;
X superclass_window.attributes.border_pixel=pixel_info[0].border_pixel;
X superclass_window.attributes.colormap=colormap;
X superclass_window.attributes.cursor=arrow_cursor;
X superclass_window.attributes.do_not_propagate_mask=NoEventMask;
X superclass_window.attributes.event_mask=NoEventMask;
X superclass_window.attributes.override_redirect=False;
X superclass_window.attributes.save_under=False;
X superclass_window.attributes.win_gravity=NorthWestGravity;
X superclass_window.graphic_context=(GC) NULL;
X superclass_window.ximage=(XImage *) NULL;
X /*
X Initialize graphic context.
X */
X root_window=XRootWindow(display,visual_info->screen);
X XMakeWindow(display,root_window,argv,argc,class_hint,manager_hints,
X delete_property,&superclass_window);
X graphic_context_value.background=pixel_info[0].background_pixel;
X graphic_context_value.foreground=pixel_info[0].foreground_pixel;
X graphic_context_value.font=font_info->fid;
X graphic_context_value.function=GXcopy;
X graphic_context_value.graphics_exposures=False;
X graphic_context_value.plane_mask=AllPlanes;
X graphic_context=XCreateGC(display,superclass_window.id,GCBackground |
X GCFont | GCForeground | GCFunction | GCGraphicsExposures | GCPlaneMask,
X &graphic_context_value);
X if (graphic_context == (GC) NULL)
X Error("unable to create graphic context",(char *) NULL);
X superclass_window.graphic_context=graphic_context;
X /*
X Initialize icon window.
X */
X icon_window=superclass_window;
X icon_window.name="ImageMagick Icon";
X XBestIconSize(display,&icon_window,images[0]);
X icon_window.attributes.event_mask=ExposureMask | StructureNotifyMask;
X manager_hints->flags=InputHint | StateHint | WindowGroupHint;
X manager_hints->input=False;
X manager_hints->initial_state=IconicState;
X manager_hints->window_group=superclass_window.id;
X XMakeWindow(display,root_window,argv,argc,class_hint,manager_hints,
X delete_property,&icon_window);
X /*
X Create icon image.
X */
X icon_window.ximage=XMakeImage(display,resource_info,&icon_window,images[0],
X icon_window.width,icon_window.height);
X if (icon_window.ximage == (XImage *) NULL)
X Error("unable to create icon image",(char *) NULL);
X /*
X Initialize image window.
X */
X image_window=superclass_window;
X image_window.name=(char *) malloc(256);
X if (image_window.name == NULL)
X Error("unable to create image window","memory allocation failed");
X if (resource_info->title == (char *) NULL)
X (void) sprintf(image_window.name,"ImageMagick: %s\0",images[0]->filename);
X else
X (void) strcpy(image_window.name,resource_info->title);
X image_window.geometry=resource_info->image_geometry;
X image_window.width=images[0]->columns;
X if (image_window.width > XDisplayWidth(display,visual_info->screen))
X image_window.width=XDisplayWidth(display,visual_info->screen);
X image_window.height=images[0]->rows;
X if (image_window.height > XDisplayHeight(display,visual_info->screen))
X image_window.height=XDisplayHeight(display,visual_info->screen);
X image_window.border_width=resource_info->border_width;
X backdrop_window=superclass_window;
X if (resource_info->backdrop)
X {
X /*
X Initialize backdrop window.
X */
X backdrop_window.name="ImageMagick Background";
X backdrop_window.flags=USSize | USPosition;
X backdrop_window.width=XDisplayWidth(display,visual_info->screen);
X backdrop_window.height=XDisplayHeight(display,visual_info->screen);
X backdrop_window.border_width=0;
X backdrop_window.immutable=True;
X backdrop_window.attributes.do_not_propagate_mask=
X ButtonPressMask | ButtonReleaseMask;
X manager_hints->flags=IconWindowHint | InputHint | StateHint |
X WindowGroupHint;
X manager_hints->icon_window=icon_window.id;
X manager_hints->input=True;
X manager_hints->initial_state=
X resource_info->iconic ? IconicState : NormalState;
X manager_hints->window_group=superclass_window.id;
X XMakeWindow(display,root_window,argv,argc,class_hint,manager_hints,
X delete_property,&backdrop_window);
X XSetTransientForHint(display,backdrop_window.id,backdrop_window.id);
X XMapWindow(display,backdrop_window.id);
X /*
X Position image in the center the backdrop.
X */
X image_window.flags|=USPosition;
X image_window.x=XDisplayWidth(display,visual_info->screen)/2-
X (image_window.width+image_window.border_width)/2;
X image_window.y=XDisplayHeight(display,visual_info->screen)/2-
X (image_window.height+image_window.border_width)/2;
X }
X image_window.immutable=False;
X image_window.attributes.cursor=image_window.cursor;
X image_window.attributes.event_mask=ButtonMotionMask | ButtonPressMask |
X ButtonReleaseMask | EnterWindowMask | ExposureMask | KeyPressMask |
X LeaveWindowMask | OwnerGrabButtonMask | StructureNotifyMask;
X manager_hints->flags=
X IconWindowHint | InputHint | StateHint | WindowGroupHint;
X manager_hints->icon_window=icon_window.id;
X manager_hints->input=True;
X manager_hints->initial_state=
X resource_info->iconic ? IconicState : NormalState;
X manager_hints->window_group=superclass_window.id;
X XMakeWindow(display,(resource_info->backdrop ? backdrop_window.id :
X root_window),argv,argc,class_hint,manager_hints,delete_property,
X &image_window);
X XMapWindow(display,image_window.id);
X /*
X Create X image.
X */
X image_window.ximage=XMakeImage(display,resource_info,&image_window,images[0],
X images[0]->columns,images[0]->rows);
X if (image_window.ximage == (XImage *) NULL)
X Error("unable to create X image",(char *) NULL);
X /*
X Create X pixmap.
X */
X image_window.pixmaps=(Pixmap *) malloc(number_scenes*sizeof(Pixmap));
X if (image_window.pixmaps == (Pixmap *) NULL)
X Error("unable to animate images","memory allocation failed");
X image_window.pixmaps[0]=XCreatePixmap(display,image_window.id,
X images[0]->columns,images[0]->rows,image_window.depth);
X XPutImage(display,image_window.pixmaps[0],image_window.graphic_context,
X image_window.ximage,0,0,0,0,image_window.width,image_window.height);
X XDestroyImage(image_window.ximage);
X (void) free((char *) images[0]->pixels);
X images[0]->pixels=(RunlengthPacket *) NULL;
X /*
X Initialize menu window.
X */
X menu_window=superclass_window;
X menu_window.name="ImageMagick Menu";
X menu_window.flags=PSize | PPosition;
X menu_window.attributes.override_redirect=True;
X menu_window.attributes.save_under=True;
X menu_window.attributes.event_mask=ButtonMotionMask | ButtonPressMask |
X ButtonReleaseMask | EnterWindowMask | ExposureMask | LeaveWindowMask |
X OwnerGrabButtonMask;
X manager_hints->flags=InputHint | StateHint | WindowGroupHint;
X manager_hints->input=False;
X manager_hints->initial_state=NormalState;
X manager_hints->window_group=superclass_window.id;
X XMakeWindow(display,root_window,argv,argc,class_hint,manager_hints,
X delete_property,&menu_window);
X XSetTransientForHint(display,menu_window.id,image_window.id);
X /*
X Initialize info window.
X */
X info_window=superclass_window;
X info_window.name="ImageMagick Info";
X info_window.flags=PSize | PPosition;
X info_window.x=2;
X info_window.y=2;
X info_window.attributes.event_mask=StructureNotifyMask;
X manager_hints->flags=InputHint | StateHint | WindowGroupHint;
X manager_hints->input=False;
X manager_hints->initial_state=NormalState;
X manager_hints->window_group=superclass_window.id;
X XMakeWindow(display,image_window.id,argv,argc,class_hint,manager_hints,
X delete_property,&info_window);
X /*
X Initialize image pixmaps structure.
X */
X XDefineCursor(display,image_window.id,image_window.busy_cursor);
X XMapWindow(display,info_window.id);
X for (scene=1; scene < number_scenes; scene++)
X {
X /*
X Display information about the image in the info window.
X */
X (void) sprintf(text," [%d] %s %dx%d \0",images[scene]->scene,
X images[scene]->filename,image_window.width,image_window.height);
X if (images[scene]->colors > 0)
X (void) sprintf(text,"%s%dc \0",text,images[scene]->colors);
X info_window.width=XTextWidth(info_window.font_info,text,strlen(text));
X info_window.height=
X info_window.font_info->ascent+info_window.font_info->descent+4;
X XResizeWindow(display,info_window.id,info_window.width,info_window.height);
X XClearWindow(display,info_window.id);
X XDrawString(display,info_window.id,info_window.graphic_context,2,
X info_window.font_info->ascent+2,text,(unsigned int) strlen(text));
X /*
X Initialize colormap.
X */
X pixel_info[scene].pixels=(unsigned long *) NULL;
X if (resource_info->map_type == (char *) NULL)
X map_info[scene]=XMakeStandardColormap(display,visual_info,resource_info,
X &pixel_info[scene],images[scene]);
X else
X {
X /*
X Propogate identical Standard Colormap to each scene.
X */
X map_info[scene]=map_info[0];
X if (images[scene]->class == PseudoClass)
X {
X register int
X i;
X
X /*
X Initialize pixel array for images of type PseudoClass.
X */
X pixel_info[scene].pixels=(unsigned long *) malloc((unsigned int)
X images[scene]->colors*sizeof(unsigned long));
X if (pixel_info[scene].pixels == (unsigned long *) NULL)
X Error("unable to create colormap","memory allocation failed");
X for (i=0; i < images[scene]->colors; i++)
X pixel_info[scene].pixels[i]=
X XStandardPixel(map_info[scene],images[scene]->colormap[i],8);
X }
X pixel_info[scene].background_pixel=pixel_info[0].background_pixel;
X pixel_info[scene].border_pixel=pixel_info[0].border_pixel;
X pixel_info[scene].foreground_pixel=pixel_info[0].foreground_pixel;
X }
X if (colormap != map_info[scene]->colormap)
X {
X /*
X Set image window colormap.
X */
X colormap=map_info[scene]->colormap;
X XSetWindowColormap(display,image_window.id,colormap);
X XInductColormap(display,colormap);
X XSync(display,False);
X }
X /*
X Create X image.
X */
X image_window.map_info=map_info[scene];
X image_window.pixel_info=(&pixel_info[scene]);
X image_window.ximage=XMakeImage(display,resource_info,&image_window,
X images[scene],images[scene]->columns,images[scene]->rows);
X if (image_window.ximage == (XImage *) NULL)
X Error("unable to create X image",(char *) NULL);
X /*
X Create X pixmap.
X */
X image_window.pixmaps[scene]=XCreatePixmap(display,image_window.id,
X images[scene]->columns,images[scene]->rows,image_window.depth);
X XPutImage(display,image_window.pixmaps[scene],image_window.graphic_context,
X image_window.ximage,0,0,0,0,image_window.width,image_window.height);
X XDestroyImage(image_window.ximage);
X (void) free((char *) images[scene]->pixels);
X images[scene]->pixels=(RunlengthPacket *) NULL;
X /*
X Copy X pixmap to image window.
X */
X XCopyArea(display,image_window.pixmaps[scene],image_window.id,
X image_window.graphic_context,0,0,image_window.width,image_window.height,
X 0,0);
X XSync(display,False);
X }
X XWithdrawWindow(display,info_window.id,info_window.screen);
X XDefineCursor(display,image_window.id,image_window.cursor);
X /*
X Respond to events.
X */
X state=DefaultState;
X scene=0;
X do
X {
X if (XEventsQueued(display,QueuedAfterFlush) == 0)
X if ((state & PlayAnimationState) || (state & StepAnimationState))
X {
X if (state & InfoMappedState)
X XWithdrawWindow(display,info_window.id,info_window.screen);
X if (colormap != map_info[scene]->colormap)
X {
X /*
X Set image window colormap.
X */
X colormap=map_info[scene]->colormap;
X XSetWindowColormap(display,image_window.id,colormap);
X XInductColormap(display,colormap);
X XSync(display,False);
X }
X /*
X Copy X pixmap to image window.
X */
X XCopyArea(display,image_window.pixmaps[scene],image_window.id,
X image_window.graphic_context,0,0,image_window.width,
X image_window.height,0,0);
X XSync(display,False);
X if (state & StepAnimationState)
X {
X state&=(~StepAnimationState);
X UserCommand(display,&info_window,&image_window,"i",
X &images[scene],&state);
X }
X if (resource_info->delay > 0)
X Delay((unsigned long) resource_info->delay);
X if (state & ForwardAnimationState)
X {
X /*
X Forward animation: increment scene number.
X */
X scene++;
X if (scene == number_scenes)
X if (state & AutoReverseAnimationState)
X {
X state&=(~ForwardAnimationState);
X scene--;
X }
X else
X {
X if (!(state & RepeatAnimationState))
X state&=(~PlayAnimationState);
X scene=0;
X }
X }
X else
X {
X /*
X Reverse animation: decrement scene number.
X */
X scene--;
X if (scene < 0)
X if (state & AutoReverseAnimationState)
X {
X state|=ForwardAnimationState;
X scene=0;
X }
X else
X {
X if (!(state & RepeatAnimationState))
X state&=(~PlayAnimationState);
X scene=number_scenes-1;
X }
X }
X continue;
X }
X /*
X Handle a window event.
X */
X XNextEvent(display,&event);
X switch (event.type)
X {
X case ButtonPress:
X {
X if (event.xbutton.window == image_window.id)
X switch (event.xbutton.button)
X {
X case Button1:
X {
X static char
X command[256];
X
X /*
X Select a command from the pop-up menu.
X */
X XMenuWindow(display,&menu_window,event.xbutton.x_root,
X event.xbutton.y_root,command);
X UserCommand(display,&info_window,&image_window,command,
X &images[scene],&state);
X break;
X }
X default:
X break;
X }
X break;
X }
X case ClientMessage:
X {
X /*
X If client window delete message, exit.
X */
X if (event.xclient.message_type == protocols_property)
X if (*event.xclient.data.l == delete_property)
X if (event.xclient.window == image_window.id)
X state|=ExitState;
X else
X XWithdrawWindow(display,event.xclient.window,
X visual_info->screen);
X break;
X }
X case ConfigureNotify:
X {
X if (event.xconfigure.window == image_window.id)
X {
X /*
X Icon window has a new configuration.
X */
X image_window.width=event.xconfigure.width;
X image_window.height=event.xconfigure.height;
X break;
X }
X if (event.xconfigure.window == icon_window.id)
X {
X /*
X Icon window has a new configuration.
X */
X icon_window.width=event.xconfigure.width;
X icon_window.height=event.xconfigure.height;
X break;
X }
X }
X case EnterNotify:
X {
X /*
X Selectively install colormap.
X */
X if (colormap != XDefaultColormap(display,visual_info->screen))
X if (event.xcrossing.mode != NotifyUngrab)
X XInductColormap(display,colormap);
X break;
X }
X case Expose:
X {
X /*
X Repaint windows that are now exposed.
X */
X if (event.xexpose.window == image_window.id)
X if (event.xexpose.count == 0)
X {
X XCopyArea(display,image_window.pixmaps[scene],image_window.id,
X image_window.graphic_context,0,0,image_window.width,
X image_window.height,0,0);
X break;
X }
X if (event.xexpose.window == icon_window.id)
X {
X XPutImage(display,icon_window.id,icon_window.graphic_context,
X icon_window.ximage,event.xexpose.x,event.xexpose.y,
X event.xexpose.x,event.xexpose.y,
X (unsigned int) event.xexpose.width,
X (unsigned int) event.xexpose.height);
X break;
X }
X break;
X }
X case KeyPress:
X {
X static char
X command[256];
X
X static KeySym
X key_symbol;
X
X /*
X Respond to a user key press.
X */
X if (state & ConfigureWindowState)
X {
X XBell(display,0);
X break;
X }
X *command=(char) NULL;
X XLookupString((XKeyEvent *) &event.xkey,command,sizeof(command),
X &key_symbol,(XComposeStatus *) NULL);
X if (key_symbol == XK_Help)
X Usage((char *) NULL,False);
X else
X if (!IsCursorKey(key_symbol) && !isdigit(*command))
X UserCommand(display,&info_window,&image_window,command,
X &images[scene],&state);
X else
X if (isdigit(*command))
X resource_info->delay=(2 << atoi(command));
X break;
X }
X case LeaveNotify:
X {
X /*
X Selectively uninstall colormap.
X */
X if (colormap != XDefaultColormap(display,visual_info->screen))
X if (event.xcrossing.mode != NotifyUngrab)
X XUninductColormap(display,colormap);
X break;
X }
X case MapNotify:
X {
X if (event.xmap.window == image_window.id)
X {
X state=ForwardAnimationState | PlayAnimationState;
X break;
X }
X if (event.xmap.window == info_window.id)
X {
X state|=InfoMappedState;
X break;
X }
X break;
X }
X case MappingNotify:
X {
X XRefreshKeyboardMapping(&event.xmapping);
X break;
X }
X case UnmapNotify:
X {
X if (event.xunmap.window == info_window.id)
X {
X state&=(~InfoMappedState);
X break;
X }
X break;
X }
X default:
X break;
X }
X }
X while (!(state & ExitState));
X /*
X Free up memory.
X */
X XDestroyWindow(display,info_window.id);
X XDestroyWindow(display,menu_window.id);
X XDestroyWindow(display,image_window.id);
X (void) free((char *) image_window.name);
X if (resource_info->backdrop)
X XDestroyWindow(display,backdrop_window.id);
X XDestroyWindow(display,icon_window.id);
X if (icon_window.ximage != (XImage *) NULL)
X XDestroyImage(icon_window.ximage);
X XDestroyWindow(display,superclass_window.id);
X XFreeGC(display,graphic_context);
X XFree((char *) class_hint);
X XFree((char *) manager_hints);
X XFreeCursor(display,arrow_cursor);
X XFreeCursor(display,watch_cursor);
X XFreeFont(display,font_info);
X /*
X Discard pending events before freeing colormap.
X */
X while (XEventsQueued(display,QueuedAfterFlush) > 0)
X XNextEvent(display,&event);
X for (scene=0; scene < number_scenes; scene++)
X {
X XFreePixmap(display,image_window.pixmaps[scene]);
X DestroyImage(images[scene]);
X if (resource_info->map_type == (char *) NULL)
X {
X colormap=map_info[scene]->colormap;
X if (colormap != XDefaultColormap(display,visual_info->screen))
X XFreeColormap(display,colormap);
X else
X if ((visual_info->class == GrayScale) ||
X (visual_info->class == PseudoColor))
X XFreeColors(display,colormap,pixel_info[scene].pixels,
X (int) images[scene]->colors,0);
X }
X if (pixel_info[scene].pixels != (unsigned long *) NULL)
X (void) free((char *) pixel_info[scene].pixels);
X XFree((char *) map_info[scene]);
X }
X (void) free((char *) pixel_info);
X (void) free((char *) map_info);
X XFree((char *) visual_info);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% X M e n u W i n d o w %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Function XMenuWindow maps a menu and returns the command pointed to by the
% user when the button is released.
%
% The format of the XMenuWindow routine is:
%
% XMenuWindow(display,menu_window,x,y)
%
% A description of each parameter follows:
%
% o display: Specifies a connection to an X server; returned from
% XOpenDisplay.
%
% o menu_window: Specifies a pointer to a XWindowInfo structure.
%
% o x: Specifies an unsigned integer representing the root offset the
% x-direction.
%
% o y: Specifies an unsigned integer representing the root offset the
% x-direction.
%
% o command: Specifies a character array. The command selected from
% the menu is returned here.
%
%
*/
static void XMenuWindow(display,menu_window,x,y,command)
Display
X *display;
X
XXWindowInfo
X *menu_window;
X
int
X x,
X y;
X
char
X *command;
{
#define MaxMenuSelections 8
X
X typedef struct _Selection
X {
X int
X id,
X x,
X y;
X
X unsigned int
X width,
X height;
X } Selection;
X
X static char
X *MenuSelections[]=
X {
X "iImage Info ",
X "pPlay ",
X "sStep ",
X ".Repeat ",
X "aAuto Reverse",
X "fForward ",
X "rReverse ",
X "qQuit ",
X };
X
X char
X text[256];
X
X Selection
X last_selection,
X selection;
X
X unsigned int
X height,
X state,
X width;
X
X XEvent
X event;
X
X /*
X Size and position menu window under current pointer location and map.
X */
X (void) sprintf(text," %s\0",MenuSelections[0]);
X menu_window->width=XTextWidth(menu_window->font_info,text,strlen(text));
X menu_window->height=MaxMenuSelections*
X (menu_window->font_info->ascent+menu_window->font_info->descent+4);
X width=menu_window->width+2*menu_window->border_width;
X menu_window->x=x-(int) width/2;
X if (menu_window->x < 0)
X menu_window->x=0;
X else
X if (menu_window->x > (XDisplayWidth(display,menu_window->screen)-width))
X menu_window->x=XDisplayWidth(display,menu_window->screen)-width;
X height=menu_window->height+2*menu_window->border_width;
X menu_window->y=y-(int) menu_window->border_width;
X if (menu_window->y < 0)
X menu_window->y=0;
X else
X if (menu_window->y > (XDisplayHeight(display,menu_window->screen)-height))
X menu_window->y=XDisplayHeight(display,menu_window->screen)-height;
X XMoveResizeWindow(display,menu_window->id,menu_window->x,menu_window->y,
X menu_window->width,menu_window->height);
X XMapRaised(display,menu_window->id);
X XWindowEvent(display,menu_window->id,ExposureMask,&event);
X /*
X Draw menu selection selections.
X */
X selection.x=menu_window->font_info->max_bounds.rbearing-
X menu_window->font_info->min_bounds.lbearing;
X selection.y=menu_window->font_info->ascent+2;
X selection.width=strlen(MenuSelections[0]+1);
X selection.height=menu_window->font_info->descent+
X menu_window->font_info->ascent+4;
X for (selection.id=0; selection.id < MaxMenuSelections; selection.id++)
X {
X XDrawString(display,menu_window->id,menu_window->graphic_context,
X selection.x,selection.y,MenuSelections[selection.id]+1,selection.width);
X selection.y+=(int) selection.height;
X }
X /*
X Highlight menu as pointer moves; return command on button release.
X */
X selection.id=0;
X last_selection=selection;
X state=DefaultState;
X do
X {
X /*
X Wait for next event.
X */
X XMaskEvent(display,ButtonPressMask | Button1MotionMask |
X ButtonReleaseMask | EnterWindowMask | LeaveWindowMask,&event);
X switch (event.type)
X {
X case ButtonPress:
X break;
X case ButtonRelease:
X {
X /*
X Determine if user choose a menu item.
X */
X if (event.xbutton.button != Button1)
X break;
X state|=ExitState;
X break;
X }
X case EnterNotify:
X {
X if (event.xcrossing.window != menu_window->id)
X break;
X selection.id=event.xcrossing.y/(int) selection.height;
X /*
X Check boundary conditions.
X */
X if (selection.id < 0)
X selection.id=0;
X if (selection.id >= MaxMenuSelections)
X selection.id=MaxMenuSelections-1;
X /*
X Highlight this selection.
X */
X selection.y=
X menu_window->font_info->ascent+2+selection.id*selection.height;
X XSetBackground(display,menu_window->graphic_context,
X menu_window->pixel_info->foreground_pixel);
X XSetForeground(display,menu_window->graphic_context,
X menu_window->pixel_info->background_pixel);
X XDrawImageString(display,menu_window->id,
X menu_window->graphic_context,selection.x,selection.y,
X MenuSelections[selection.id]+1,selection.width);
X XSetBackground(display,menu_window->graphic_context,
X menu_window->pixel_info->background_pixel);
X XSetForeground(display,menu_window->graphic_context,
X menu_window->pixel_info->foreground_pixel);
X last_selection=selection;
X state|=HighlightState;
X break;
X }
X case LeaveNotify:
X {
X if (event.xcrossing.window != menu_window->id)
X break;
X /*
X Unhighlight last selection.
X */
X XDrawImageString(display,menu_window->id,
X menu_window->graphic_context,last_selection.x,last_selection.y,
X MenuSelections[last_selection.id]+1,last_selection.width);
X state&=(~HighlightState);
X break;
X }
X case MotionNotify:
X {
X /*
X Discard pending selection motion events.
X */
X while (XCheckMaskEvent(display,Button1MotionMask,&event));
X if (event.xmotion.window != menu_window->id)
X break;
X /*
X Check boundary conditions.
X */
X selection.id=event.xmotion.y/(int) selection.height;
X if (selection.id < 0)
X selection.id=0;
X if (selection.id >= MaxMenuSelections)
X selection.id=MaxMenuSelections-1;
X if (!(state & HighlightState))
X break;
X if (selection.id == last_selection.id)
X break;
X /*
X Unhighlight last selection.
X */
X XDrawImageString(display,menu_window->id,
X menu_window->graphic_context,last_selection.x,last_selection.y,
X MenuSelections[last_selection.id]+1,last_selection.width);
X /*
X Highlight this selection.
X */
X selection.y=
X menu_window->font_info->ascent+2+selection.id*selection.height;
X XSetBackground(display,menu_window->graphic_context,
X menu_window->pixel_info->foreground_pixel);
X XSetForeground(display,menu_window->graphic_context,
X menu_window->pixel_info->background_pixel);
X XDrawImageString(display,menu_window->id,
X menu_window->graphic_context,selection.x,selection.y,
X MenuSelections[selection.id]+1,selection.width);
X XSetBackground(display,menu_window->graphic_context,
X menu_window->pixel_info->background_pixel);
X XSetForeground(display,menu_window->graphic_context,
X menu_window->pixel_info->foreground_pixel);
X last_selection=selection;
X break;
X }
X default:
X break;
X }
X } while (!(state & ExitState));
X XWithdrawWindow(display,menu_window->id,menu_window->screen);
X *command=(char) NULL;
X if (state & HighlightState)
X (void) strcpy(command,MenuSelections[selection.id]);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% M a i n %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
*/
int main(argc,argv)
int
X argc;
X
char
X **argv;
{
X char
X *clip_geometry,
X *option,
X *scale_geometry,
X *server_name;
X
X Display
X *display;
X
X double
X gamma;
X
X Image
X **images;
X
X int
X degrees;
X
X register int
X i;
X
X unsigned int
X display_image,
X dither,
X gray,
X image_number,
X number_colors,
X reflect,
X tree_depth,
X verbose;
X
X XResourceInfo
X resource_info;
X
X /*
X Display usage profile if there are no command line arguments.
X */
X application_name=(*argv);
X if (argc < 2)
X Usage((char *) NULL,True);
X /*
X Set defaults.
X */
X clip_geometry=(char *) NULL;
X degrees=0;
X display=(Display *) NULL;
X display_image=True;
X dither=False;
X gamma=0.0;
X gray=False;
X number_colors=0;
X reflect=False;
X scale_geometry=(char *) NULL;
X server_name=(char *) NULL;
X tree_depth=0;
X verbose=False;
X images=(Image **) malloc((unsigned int) argc*sizeof(Image *));
X if (images == (Image **) NULL)
X Error("unable to animate images","memory allocation failed");
X /*
X Check for server name specified on the command line.
X */
X for (i=1; i < argc-1; i++)
X {
X /*
X Check command line for server name.
X */
X option=argv[i];
X if ((strlen(option) > 1) && ((*option == '-') || (*option == '+')))
X if (strncmp("display",option+1,3) == 0)
X {
X /*
X User specified server name.
X */
X display_image=(*option == '-');
X if (display_image)
X {
X i++;
X if (i == argc)
X Usage("missing server name on -display",True);
X server_name=argv[i];
X }
X break;
X }
X }
X if (display_image)
X {
X char
X *user_default;
X
X /*
X Open X server connection.
X */
X display=XOpenDisplay(server_name);
X if (display == (Display *) NULL)
X Error("unable to connect to X server",XDisplayName(server_name));
X /*
X Get user_defaults from X resource database.
X */
X user_default=XGetDefault(display,application_name,"backdrop");
X resource_info.backdrop=IsTrue(user_default);
X user_default=XGetDefault(display,application_name,"background");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Background");
X if (user_default == (char *) NULL)
X user_default="black";
X resource_info.background_color=user_default;
X user_default=XGetDefault(display,application_name,"borderColor");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"BorderColor");
X if (user_default == (char *) NULL)
X user_default="white";
X resource_info.border_color=user_default;
X user_default=XGetDefault(display,application_name,"borderWidth");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"BorderWidth");
X resource_info.border_width=
X (user_default == (char *) NULL) ? 2 : atoi(user_default);
X clip_geometry=XGetDefault(display,application_name,"clip");
X user_default=XGetDefault(display,application_name,"colors");
X number_colors=user_default ? atoi(user_default) : 0;
X user_default=XGetDefault(display,application_name,"delay");
X resource_info.delay=
X (user_default == (char *) NULL) ? 0 : atoi(user_default);
X user_default=XGetDefault(display,application_name,"dither");
X dither=IsTrue(user_default);
X user_default=XGetDefault(display,application_name,"font");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Font");
X resource_info.font_name=user_default;
X user_default=XGetDefault(display,application_name,"foreground");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Foreground");
X if (user_default == (char *) NULL)
X user_default="white";
X resource_info.foreground_color=user_default;
X user_default=XGetDefault(display,application_name,"gamma");
X gamma=(user_default == (char *) NULL) ? 0.0 : atof(user_default);
X user_default=XGetDefault(display,application_name,"geometry");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Geometry");
X resource_info.image_geometry=user_default;
X user_default=XGetDefault(display,application_name,"gray");
X gray=IsTrue(user_default);
X user_default=XGetDefault(display,application_name,"iconGeometry");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"IconGeometry");
X resource_info.icon_geometry=user_default;
X user_default=XGetDefault(display,application_name,"iconic");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Iconic");
X resource_info.iconic=IsTrue(user_default);
X resource_info.map_type=XGetDefault(display,application_name,"map");
X user_default=XGetDefault(display,application_name,"monochrome");
X resource_info.monochrome=IsTrue(user_default);
X user_default=XGetDefault(display,application_name,"name");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Name");
X resource_info.name=user_default;
X user_default=XGetDefault(display,application_name,"reflect");
X reflect=IsTrue(user_default);
X user_default=XGetDefault(display,application_name,"rotate");
X degrees=(user_default == (char *) NULL) ? 0 : atoi(user_default);
X user_default=XGetDefault(display,application_name,"scale");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Scale");
X scale_geometry=user_default;
X user_default=XGetDefault(display,application_name,"title");
X if (user_default == (char *) NULL)
X user_default=XGetDefault(display,application_name,"Title");
X resource_info.title=user_default;
X user_default=XGetDefault(display,application_name,"treedepth");
X tree_depth=(user_default == (char *) NULL) ? 0 : atoi(user_default);
X user_default=XGetDefault(display,application_name,"verbose");
X verbose=IsTrue(user_default);
X resource_info.visual_type=XGetDefault(display,application_name,"visual");
X }
X /*
X Parse command line.
X */
X image_number=0;
X for (i=1; i < argc; i++)
X {
X option=argv[i];
X if ((strlen(option) > 1) && ((*option == '-') || (*option == '+')))
X switch (*(option+1))
X {
X case 'b':
X {
X if (strncmp("backdrop",option+1,5) == 0)
X resource_info.backdrop=(*option == '-');
X else
X if (strncmp("background",option+1,5) == 0)
X {
X resource_info.background_color=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing color on -background",True);
X resource_info.background_color=argv[i];
X }
X }
X else
X if (strncmp("bordercolor",option+1,7) == 0)
X {
X resource_info.border_color=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing color on -bordercolor",True);
X resource_info.border_color=argv[i];
X }
X }
X else
X if (strncmp("borderwidth",option+1,7) == 0)
X {
X resource_info.border_width=0;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing width on -borderwidth",True);
X resource_info.border_width=atoi(argv[i]);
X }
X }
X else
X Usage(option,True);
X break;
X }
X case 'c':
X {
X if (strncmp("clip",option+1,2) == 0)
X {
X clip_geometry=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing geometry on -clip",True);
X clip_geometry=argv[i];
X }
X }
X else
X if (strncmp("colors",option+1,3) == 0)
X {
X number_colors=0;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing colors on -colors",True);
X number_colors=atoi(argv[i]);
X }
X }
X else
X Usage(option,True);
X break;
X }
X case 'd':
X {
X if (strncmp("delay",option+1,2) == 0)
X {
X resource_info.delay=0;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing seconds on -delay",True);
X resource_info.delay=atoi(argv[i]);
X }
X }
X else
X if (strncmp("display",option+1,3) == 0)
X {
X server_name=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing server name on -display",True);
X server_name=argv[i];
X }
X }
X else
X if (strncmp("dither",option+1,3) == 0)
X dither=(*option == '-');
X else
X Usage(option,True);
X break;
X }
X case 'f':
X {
X if (strncmp("font",option+1,3) == 0)
X {
X resource_info.font_name=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing font name on -font",True);
X resource_info.font_name=argv[i];
X }
X }
X else
X if (strncmp("foreground",option+1,3) == 0)
X {
X resource_info.foreground_color=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing foreground on -foreground",True);
X resource_info.foreground_color=argv[i];
X }
X }
X else
X Usage(option,True);
X break;
X }
X case 'g':
X {
X if (strncmp("gamma",option+1,2) == 0)
X {
X gamma=0.0;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing gamma on -gamma",True);
X gamma=atof(argv[i]);
X }
X }
X else
X if (strncmp("geometry",option+1,2) == 0)
X {
X resource_info.image_geometry=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing geometry on -geometry",True);
X resource_info.image_geometry=argv[i];
X }
X }
X else
X if (strncmp("gray",option+1,2) == 0)
X gray=(*option == '-');
X else
X Usage(option,True);
X break;
X }
X case 'h':
X {
X Usage((char *) NULL,True);
X break;
X }
X case 'i':
X {
X if (strncmp("iconGeometry",option+1,5) == 0)
X {
X resource_info.icon_geometry=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing geometry on -iconGeometry",True);
X resource_info.icon_geometry=argv[i];
X }
X }
X else
X if (strncmp("iconic",option+1,5) == 0)
X resource_info.iconic=(*option == '-');
X else
X Usage(option,True);
X break;
X }
X case 'm':
X {
X if (strncmp("map",option+1,3) == 0)
X {
X resource_info.map_type=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing map type on -map",True);
X resource_info.map_type=argv[i];
X }
X }
X else
X if (strncmp("monochrome",option+1,2) == 0)
X resource_info.monochrome=(*option == '-');
X else
X Usage(option,True);
X break;
X }
X case 'n':
X {
X if (strncmp("name",option+1,2) == 0)
X {
X resource_info.name=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing name on -name",True);
X resource_info.name=argv[i];
X }
X }
X else
X Usage(option,True);
X break;
X }
X case 'r':
X {
X if (strncmp("reflect",option+1,2) == 0)
X reflect=(*option == '-');
X else
X if (strncmp("rotate",option+1,3) == 0)
X {
X degrees=0.0;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing degrees on -rotate",True);
X degrees=atoi(argv[i]);
X }
X }
X else
X Usage(option,True);
X break;
X }
X case 's':
X {
X scale_geometry=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing scale geometry on -scale",True);
X scale_geometry=argv[i];
X }
X break;
X }
X case 't':
X {
X if (strncmp("title",option+1,2) == 0)
X {
X resource_info.title=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing title on -title",True);
X resource_info.title=argv[i];
X }
X }
X else
X if (strncmp("tree_depth",option+1,2) == 0)
X {
X tree_depth=0;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing depth on -treedepth",True);
X tree_depth=atoi(argv[i]);
X }
X }
X else
X Usage(option,True);
X break;
X }
X case 'v':
X {
X if (strncmp("verbose",option+1,2) == 0)
X verbose=(*option == '-');
X else
X if (strncmp("visual",option+1,2) == 0)
X {
X resource_info.visual_type=(char *) NULL;
X if (*option == '-')
X {
X i++;
X if (i == argc)
X Usage("missing visual class on -visual",True);
X resource_info.visual_type=argv[i];
X }
X }
X else
X Usage(option,True);
X break;
X }
X default:
X {
X Usage((char *) NULL,True);
X break;
X }
X }
X else
X {
X Image
X *image,
X info_image;
X
X /*
X Option is a file name: begin by reading image from specified file.
X */
X image=ReadImage(option);
X if (image == (Image *) NULL)
X continue;
X if (image->scene == 0)
X image->scene=image_number;
X info_image=(*image);
X /*
X Transform image as defined by the clip, image and scale geometries.
X */
X image=TransformImage(image,clip_geometry,resource_info.image_geometry,
X scale_geometry);
X if (reflect)
X {
X Image
X *reflected_image;
X
X /*
X Reverse image scanlines.
X */
X reflected_image=ReflectImage(image);
X if (reflected_image != (Image *) NULL)
X {
X DestroyImage(image);
X image=reflected_image;
X }
X }
X if ((degrees % 360) != 0)
X {
X Image
X *rotated_image;
X
X /*
X Rotate image.
X */
X rotated_image=RotateImage(image,(double) degrees,False);
X if (rotated_image != (Image *) NULL)
X {
X DestroyImage(image);
X image=rotated_image;
X }
X }
X if (gamma > 0.0)
X (void) GammaImage(image,gamma);
X if (gray)
X {
X /*
X Convert image to gray scale PseudoColor class.
X */
X (void) GrayImage(image);
X if (image->class == DirectClass)
X QuantizeImage(image,256,tree_depth,dither,True);
X }
X if (resource_info.monochrome)
X {
X register unsigned int
X bit;
X
X /*
X Convert image to resource_info.monochrome PseudoColor class.
X */
X (void) GrayImage(image);
X (void) QuantizeImage(image,2,tree_depth,dither,True);
X bit=Intensity(image->colormap[0]) > Intensity(image->colormap[1]);
X image->colormap[bit].red=0;
X image->colormap[bit].green=0;
X image->colormap[bit].blue=0;
X image->colormap[!bit].red=255;
X image->colormap[!bit].green=255;
X image->colormap[!bit].blue=255;
X }
X if (number_colors > 0)
X if ((image->class == DirectClass) || (image->colors > number_colors))
X QuantizeImage(image,number_colors,tree_depth,dither,True);
X if (verbose)
X {
X /*
X Display detailed info about the image.
X */
X (void) fprintf(stderr,"[%d] %s",(image->scene == 0 ? image_number :
X image->scene),image->filename);
X (void) fprintf(stderr," %dx%d",info_image.columns,info_image.rows);
X if ((info_image.columns != image->columns) ||
X (info_image.rows != image->rows))
X (void) fprintf(stderr,"=>%dx%d",image->columns,image->rows);
X if (image->class == DirectClass)
X (void) fprintf(stderr," DirectClass ");
X else
X (void) fprintf(stderr," PseudoClass ");
X (void) fprintf(stderr,"%dc \r",image->colors);
X }
X images[image_number++]=image;
X }
X }
X if (verbose)
X (void) fprintf(stderr,"\n");
X if (image_number == 0)
X Usage("missing an image file name",True);
X else
X XAnimateImage(display,&resource_info,argv,argc,images,image_number);
X (void) free((char *) images);
X if (display != (Display *) NULL)
X XCloseDisplay(display);
X return(False);
}
SHAR_EOF
echo 'File ImageMagick/animate.c is complete' &&
chmod 0755 ImageMagick/animate.c ||
echo 'restore of ImageMagick/animate.c failed'
Wc_c="`wc -c < 'ImageMagick/animate.c'`"
test 73911 -eq "$Wc_c" ||
echo 'ImageMagick/animate.c: original size 73911, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/PreR4Icccm.c ==============
if test -f 'ImageMagick/PreR4Icccm.c' -a X"$1" != X"-c"; then
echo 'x - skipping ImageMagick/PreR4Icccm.c (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/PreR4Icccm.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/PreR4Icccm.c' &&
/*
X Compatibility routines for pre X11R4 ICCCM.
*/
#include "display.h"
#include "X.h"
#ifdef PRE_R4_ICCCM
XXClassHint *XAllocClassHint()
{
X return((XClassHint *) malloc(sizeof(XClassHint)));
}
X
XXIconSize *XAllocIconSize()
{
X return((XIconSize *) malloc(sizeof(XIconSize)));
}
X
XXSizeHints *XAllocSizeHints()
{
X return((XSizeHints *) malloc(sizeof(XSizeHints)));
}
X
Status XReconfigureWMWindow(display,window,screen_number,value_mask,values)
Display
X *display;
X
Window
X window;
X
int
X screen_number;
X
unsigned int
X value_mask;
X
XXWindowChanges
X *values;
{
X return(XConfigureWindow(display,window,value_mask,values));
}
X
XXStandardColormap *XAllocStandardColormap()
{
X return((XStandardColormap *) malloc(sizeof(XStandardColormap)));
}
X
XXWMHints *XAllocWMHints()
{
X return((XWMHints *) malloc(sizeof(XWMHints)));
}
X
Status XGetRGBColormaps(display,window,colormap,count,property)
Display
X *display;
X
Window
X window;
X
XXStandardColormap
X **colormap;
X
int
X *count;
X
Atom
X property;
{
X *count=1;
X return(XGetStandardColormap(display,window,colormap,property));
}
X
Status XGetWMName(display,window,text_property)
Display
X *display;
X
Window
X window;
X
XXTextProperty
X *text_property;
{
X char
X *window_name;
X
X if (XFetchName(display,window,&window_name) == 0)
X return(False);
X text_property->value=(unsigned char *) window_name;
X text_property->encoding=XA_STRING;
X text_property->format=8;
X text_property->nitems=strlen(window_name);
X return(True);
}
X
void XSetWMProperties(display,window,window_name,icon_name,argv,argc,
X size_hints,manager_hints,class_hint)
Display
X *display;
X
Window
X window;
X
XXTextProperty
X *window_name,
X *icon_name;
X
char
X **argv;
X
int
X argc;
X
XXSizeHints
X *size_hints;
X
XXWMHints *manager_hints;
X
XXClassHint
X *class_hint;
{
X XSetStandardProperties(display,window,window_name->value,icon_name,None,
X argv,argc,size_hints);
X XSetWMHints(display,window,manager_hints);
X XSetClassHint(display,window,class_hint);
}
X
Status XSetWMProtocols(display,window,protocols,count)
Display
X *display;
X
Window
X window;
X
Atom
X *protocols;
X
int
X count;
{
X Atom
X protocols_property;
X
X protocols_property=XInternAtom(display,"WM_PROTOCOLS",False);
X XChangeProperty(display,window,protocols_property,XA_ATOM,32,PropModeReplace,
X (unsigned char *) protocols, count);
X return(True);
}
X
VisualID XVisualIDFromVisual(visual)
Visual
X *visual;
{
X return(visual->visualid);
}
X
Status XWithdrawWindow(display,window,screen)
Display
X *display;
X
Window
X window;
X
int
X screen;
{
X return(XUnmapWindow(display,window));
}
X
int XWMGeometry(display,screen,user_geometry,default_geometry,border_width,
X size_hints,x,y,width,height,gravity)
Display
X *display;
X
int
X screen;
X
char
X *user_geometry,
X *default_geometry;
X
unsigned int
X border_width;
X
XXSizeHints
X *size_hints;
X
int
X *x,
X *y,
X *width,
X *height,
X *gravity;
{
X int
X status;
X
X status=XGeometry(display,screen,user_geometry,default_geometry,border_width,
X 0,0,0,0,x,y,width,height);
X *gravity=NorthWestGravity;
X return(status);
}
#endif
SHAR_EOF
chmod 0755 ImageMagick/PreR4Icccm.c ||
echo 'restore of ImageMagick/PreR4Icccm.c failed'
Wc_c="`wc -c < 'ImageMagick/PreR4Icccm.c'`"
test 3056 -eq "$Wc_c" ||
echo 'ImageMagick/PreR4Icccm.c: original size 3056, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/patchlevel.h ==============
if test -f 'ImageMagick/patchlevel.h' -a X"$1" != X"-c"; then
echo 'x - skipping ImageMagick/patchlevel.h (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/patchlevel.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/patchlevel.h' &&
#define PATCHLEVEL 0
SHAR_EOF
chmod 0755 ImageMagick/patchlevel.h ||
echo 'restore of ImageMagick/patchlevel.h failed'
Wc_c="`wc -c < 'ImageMagick/patchlevel.h'`"
test 22 -eq "$Wc_c" ||
echo 'ImageMagick/patchlevel.h: original size 22, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
rm -f _shar_seq_.tmp
echo You have unpacked the last part
exit 0
--
Dan Heller
O'Reilly && Associates Z-Code Software Comp-sources-x:
Senior Writer President comp-sources-x at uunet.uu.net
argv at ora.com argv at zipcode.com
More information about the Comp.sources.x
mailing list