Mercurial > hg > aim92
diff xaim/graphics.c @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xaim/graphics.c Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,373 @@ +/* + Copyright (c) Applied Psychology Unit, Medical Research Council. 1993 + =========================================================================== + + Permission to use, copy, modify, and distribute this software without fee + is hereby granted for research purposes, provided that this copyright + notice appears in all copies and in all supporting documentation, and that + the software is not redistributed for any fee (except for a nominal + shipping charge). Anyone wanting to incorporate all or part of this + software in a commercial product must obtain a license from the Medical + Research Council. + + The MRC makes no representations about the suitability of this + software for any purpose. It is provided "as is" without express or + implied warranty. + + THE MRC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + THE A.P.U. 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. +*/ + +/* +* graphics.c +* ---------- +* Draws things ... +* +* NB: The method used for timing the animations (display a frame, wait until +* the clock has got above some threshold, display the next frame) doesn't +* seem to work on the linux 396 pc. Thus, it is ALL removed. This means +* you can't change the speed of that's animations. +* The 'flashtime' of the Control Buttons is also removed. +* For speed reasons, the bit that keeps the frame-nbumber in sync with +* the animations is also removed from the linux version (in animate_image) +* +* M. Akeroyd. July 1993. version 1.10 +* Revisions: MAA Christmas 1993. +* +*/ + + + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xos.h> +#include <X11/Xatom.h> +#include <stdio.h> + +#include "xreview.h" + +#define FLASHTIME 200 /* how long to flash a button for, in msecs. + * 200 works very well on a Sparc or DECStation. + * The linux 386 pc doesn't like counting times, + * so is therefore 0. */ +#ifdef HOST_SPARC + #define FLASHTIME 200 +#endif +#ifdef HOST_DECSTATION + #define FLASHTIME 200 +#endif +#ifdef HOST_LINUXPC + #define FLASHTIME 0 +#endif + + + +void drawtext(buttonWindow win, GC gc, XFontStruct *font_info_local, char *text); + + + +/* General variables ....*/ + +extern char progname[MAX_STRING_LENGTH]; + +extern char *data_pointer; +extern char *data_pointer_sideways; +extern long location[MAX_FRAMES]; +extern FILE *inputfp; +extern char inputfn[MAX_STRING_LENGTH]; + +extern int sidewaysflag; + + +/* X ....................*/ + +extern char display_name[MAX_STRING_LENGTH]; +extern char fontname[MAX_STRING_LENGTH]; + +extern Display *display; +extern int screen_num; +extern Screen *screen_ptr; +extern int depth; +extern unsigned int display_width, display_height; + +extern toplevelWindow control; +extern toplevelWindow axes; +extern buttonWindow info_frame; +extern XImage *reviewimage; + +extern XFontStruct *font_info; +extern GC button_gc; + + +/* .ctn ..................*/ + +extern int no_frames; +extern int frame; +extern long waittime_millisecs; +extern long waittime_microsecs; + + +/* Command line ..........*/ + +extern int verboseflag; + + + + + +/*--------------------------------------------------------------------*/ +/*--------------------------------------------------------------------*/ + + + + +void animate_image(int start, int stop, int skip) +{ + long localtime; + char tempstring[100]; + long address; + int reviewimage_bytesperline; + int x, y; + int tempy, tempx; + long frameconst, framesize; + int counter, counter2, counter3; + long framestop= 100000; + long limit; + long ylimit; + long newaddress; + long delta; + long required_bytes; + long lframe; + int framenth=1; + + waittime_microsecs = (long) waittime_millisecs * 1000; + + reviewimage_bytesperline = (int) ((int) ((axes.width -1) / 32) +1) *4; + + if (sidewaysflag == ON) { + framesize = reviewimage_bytesperline * axes.height *depth; + frameconst = framesize; + counter =-1; + counter2 = 0; + ylimit = axes.height*reviewimage_bytesperline*depth; + limit= (long) ylimit + no_frames*(frameconst); + + address=(long) location[start]; + delta = axes.height*0; + + for (lframe=1; lframe <=framestop; lframe++) { + if ((ylimit+(framenth*framesize)) >= limit){ + lframe=framestop+10; + continue;} + counter+=1; + for (y=0; y<axes.height; y++){ + tempy = y * reviewimage_bytesperline; + for (x=0; x<=(reviewimage_bytesperline-2); x+=1) + data_pointer[tempy+x] = data_pointer[tempy+x+1]; + x=reviewimage_bytesperline-1; + data_pointer[tempy+x] = data_pointer[tempy+frameconst+counter];} + if (counter == reviewimage_bytesperline-1){ + counter = -1; + frameconst += framesize; + framenth++;} + reviewimage->data = (char *) address; + counter2++; + if (counter2 == skip) { + counter2=0; + XPutImage(display, axes.win, axes.gc, reviewimage, \ + 0, 0, 0, 0, axes.width, axes.height);} + if ((lframe % 100) == 0) { + XClearWindow(display, info_frame.win); + sprintf(tempstring, "%i (%i)", framenth, no_frames); + drawtext(info_frame, button_gc, font_info, tempstring);}} + + required_bytes = no_frames*axes.height*reviewimage_bytesperline*depth; + for (x=location[0]; x<=location[0]+required_bytes-1; x++) + data_pointer[x] = data_pointer_sideways[x]; + XClearWindow(display, info_frame.win); + sprintf(tempstring, "%i (%i)", no_frames, no_frames); + drawtext(info_frame, button_gc, font_info, tempstring);} + + else { + for (frame=start; frame<=stop; frame += skip){ + reviewimage->data = (char *) location[frame]; + XPutImage(display, axes.win, axes.gc, reviewimage, \ + 0, 0, 0, 0, axes.width, axes.height); + /* Since this next bit only seems to work on a Sparc or DECstation, leave + * it out if we're on a 386 pc + */ +#ifndef HOST_LINUXPC + if (waittime_millisecs > 0) { + XClearWindow(display, info_frame.win); + sprintf(tempstring, "%i of %i", frame, no_frames); + drawtext(info_frame, button_gc, font_info, tempstring);} + localtime = (long) clock(); + while (clock() - localtime <= waittime_microsecs) + ; +#endif + } + frame=stop; + XClearWindow(display, info_frame.win); + sprintf(tempstring, "%i of %i", frame, no_frames); + drawtext(info_frame, button_gc, font_info, tempstring); + } +} + + + + + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + + + + +void drawimage(int frame) +{ + reviewimage->data = (char *) location[frame]; + + XPutImage(display, axes.win, axes.gc, reviewimage, 0, 0, 0, 0, axes.width, axes.height); +} + + + +/*-------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------*/ + + + + +void drawtext(buttonWindow win, GC gc, XFontStruct *font_info_local, char *text) +{ + /* + * Copied off basicwindow.c: place_text () + * Draws 'text' centered horizontally and vertically in the Window. + * Well, vertically ish. It looks reasonably centered. + * + */ + + int len_text, width_text; + int width = win.width; + int height = win.height; + + len_text = strlen(text); + width_text = XTextWidth(font_info_local, text, len_text); + + XDrawString(display, win.win, gc, (width - width_text)/2, \ + (height + font_info_local->ascent -1)/2, text, len_text); + +} + + + + +/*-----------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------*/ + + + + +void drawtext_xy(buttonWindow win, GC gc, XFontStruct *font_info_local, char text[], int width, int height) +{ + /* x, y specified version of drawtext() + * + */ + + int len_text, width_text; + + len_text = strlen(text); + width_text = XTextWidth(font_info_local, text, len_text); + + XDrawString(display, win.win, gc, (width - width_text)/2, \ + (height + font_info_local->ascent-1)/2, text, len_text); + +} + + + + +/*-------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------*/ + + + + +void drawbutton(toplevelWindow top_win, buttonWindow button_local, GC *button_local_gc, char *text, int fill_colour, int border_colour) +{ + int width = button_local.width; + int height = button_local.height; + + /* Draw shadow */ + XSetForeground(display, *button_local_gc, border_colour); + XmuDrawRoundedRectangle(display, button_local.win, *button_local_gc, 1, 1, + width-2, height-2, 5, 5); + XmuFillRoundedRectangle(display, button_local.win, *button_local_gc, 1, 1, + width-2, height-2, 5, 5); + + /* Draw button */ + XSetForeground(display, *button_local_gc, fill_colour); + XmuFillRoundedRectangle(display, button_local.win, *button_local_gc, 0, 0, + width-2, height-2, 5, 5); + XSetForeground(display, *button_local_gc, border_colour); + XmuDrawRoundedRectangle(display, button_local.win, *button_local_gc, 0, 0, + width-2, height-2, 5, 5); + + /* Draw text: border_colour */ + drawtext(button_local, *button_local_gc, font_info, text); + + XFlush(display); +} + + + + +/*-------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------*/ + + + + +void flashbutton(toplevelWindow top_win, buttonWindow button_local, GC *button_local_gc, char *text) +{ + int width = button_local.width; + int height = button_local.height; + long starttime; + int flashtime = FLASHTIME; /* msecs */ + + /* Redraw button where the shadow used to be */ + XClearWindow(display, button_local.win); + XSetForeground(display, *button_local_gc, WhitePixel(display, screen_num)); + XmuFillRoundedRectangle(display, button_local.win, *button_local_gc, 1, 1, + width-2, height-2, 5, 5); + XSetForeground(display, *button_local_gc, BlackPixel(display, screen_num)); + XmuDrawRoundedRectangle(display, button_local.win, *button_local_gc, 1, 1, + width-2, height-2, 5, 5); + + /* Redraw the text */ + drawtext_xy(button_local, *button_local_gc, font_info, \ + text, width+2, height+2); + XFlush(display); + + /* Wait ... */ + starttime = (long) clock(); + while ((clock() - starttime) <= (flashtime * 1000)) + ; + + /* Draw the old button */ + drawbutton(top_win, button_local, button_local_gc, text,\ + WhitePixel(display, screen_num), BlackPixel(display, screen_num)); + +} + + + +/* The end.*/ +/*-------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------*/ +