home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
vis-ftp.cs.umass.edu
/
vis-ftp.cs.umass.edu.tar
/
vis-ftp.cs.umass.edu
/
pub
/
Software
/
universal_plane_file_format
/
NewXShowPlane
/
callbacks.c
next >
Wrap
C/C++ Source or Header
|
1993-12-06
|
9KB
|
336 lines
/*
** Generated by X-Designer Evaluation version
** This code may not be used in any program
** offered for resale or commercial use.
*/
/*
**LIBS: -lXm -lXt -lX11
*/
#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <Xm/Xm.h>
#include <Xm/DrawingA.h>
#include <Xm/PushB.h>
#include <Xm/Text.h>
#include "widgets.h"
#include "llvs_per_plane.h"
static PLANE *pl = NULL;
static PLANE_INFO *pl_info = NULL;
static Window canvas_window = NULL;
static Display *canvas_display = NULL;
static unsigned int canvas_width = 0, canvas_height = 0, canvas_depth = 0;
static int first_time = TRUE;
static XImage *ximage = NULL;
static GC cgc = NULL;
static Colormap colormap = NULL;
static Pixel *pixel_mapping = NULL;
#define WHITE_VALUE 65535.0
#define NUMBER_COLORS 256
#define DITHER_PIXSIZE 8
static int pixelsize = 0;
static char *filename = NULL;
void
activate_proc (w, client_data, call_data )
Widget w;
caddr_t client_data;
XmAnyCallbackStruct *call_data;
{
int widget_num = (int) client_data;
switch (widget_num)
{
/* file pulldown menu */
case SHPL_EXIT: exit(1); break;
case SHPL_OPEN: if (!XtIsManaged(openmain_widget))
XtManageChild(openmain_widget); break;
/* file popup */
case SHPL_OPEN_OK:
if (filename != NULL)
{
XtFree(filename);
filename = NULL;
}
filename = XmTextGetString(selected_file_widget);
if (filename && canvas_window)
{
if (pl != NULL) {free(pl); pl = NULL;}
if (pl_info != NULL) {free(pl_info); pl_info = NULL;}
init_load_image(filename);
if (pl == NULL) {
Arg al[1]; /* Arg List */
XmString temp;
temp = XmStringCreateLtoR(filename,(XmStringCharSet)XmSTRING_DEFAULT_CHARSET);
XtSetArg(al[0],XmNlabelString,temp);
XtSetValues(errormessage_widget,al,1);
XmStringFree (temp);
if (!XtIsManaged(messagebox_widget))
XtManageChild(messagebox_widget);
}
if (ximage != NULL) XDestroyImage(ximage);
pixelsize = compute_pixel_size(pl_info,
canvas_width,canvas_height);
if (canvas_depth == 1) dither_pixmap(canvas_widget);
else if (canvas_depth == 8) grey_pixmap(canvas_widget);
XClearArea(canvas_display,
canvas_window,0,0,
canvas_width,
canvas_height,TRUE);
}
case SHPL_OPEN_CANCEL: if (XtIsManaged(openmain_widget))
XtUnmanageChild(openmain_widget); break;
case SHPL_ERROR_OK:
case SHPL_ERROR_CANCEL:
if (XtIsManaged(messagebox_widget))
XtUnmanageChild(messagebox_widget);
break;
default: break;
}
}
void
expose_proc (w, client_data, call_data )
Widget w;
caddr_t client_data;
XmDrawingAreaCallbackStruct *call_data;
{
int widget_num = (int) client_data;
switch (widget_num)
{
case SHPL_CANVAS: draw_canvas(w,call_data); break;
default: break;
}
}
void
resize_proc (w, client_data, call_data )
Widget w;
caddr_t client_data;
XmDrawingAreaCallbackStruct *call_data;
{
int widget_num = (int) client_data;
switch (widget_num)
{
case SHPL_CANVAS: resize_canvas(w,call_data); break;
default: break;
}
}
void InstallColorMap(Widget w, XEvent *event, char **params, int num_param)
{
XWindowAttributes xwa;
XFlush(XtDisplay(w));
XGetWindowAttributes(XtDisplay(w), XtWindow(w), &xwa);
if (colormap != NULL && xwa.map_installed == FALSE)
XInstallColormap(canvas_display,colormap);
}
void UninstallColorMap(Widget w, XEvent *event, char **params, int num_param)
{
XWindowAttributes xwa;
XFlush(XtDisplay(w));
XGetWindowAttributes(XtDisplay(w), XtWindow(w), &xwa);
if (xwa.map_installed == TRUE && colormap != NULL)
XUninstallColormap(canvas_display,colormap);
}
int compute_pixel_size(PLANE_INFO *pl_info,int width,int height)
{
int im_width, im_height;
int pw, ph;
im_width = pl_info->column_dimension;
im_height = pl_info->row_dimension;
pw = (width / ((double) im_width)) + .75;
ph = (height / ((double) im_height)) + .75;
if (pw < 1 || ph < 1) return(1);
else if (pw < ph) return(pw);
else return(ph);
}
draw_canvas(Widget w,XmDrawingAreaCallbackStruct *draw_area)
{
XExposeEvent *xpe = (XExposeEvent *) draw_area->event;
Window root;
int x, y;
unsigned int bw;
if (xpe == NULL) return;
if (draw_area->window == NULL) canvas_window = XtWindow(w);
else canvas_window = draw_area->window;
if (canvas_window == NULL) return;
if (xpe->window != canvas_window) return;
if (first_time) {
canvas_display = XtDisplay(w);
XGetGeometry(canvas_display,canvas_window,&root,&x,&y,
&canvas_width,&canvas_height,&bw,&canvas_depth);
if (canvas_depth == 8)
{
int icolor;
XColor color;
double grey_level;
Arg al[1];
colormap = XCreateColormap(canvas_display,canvas_window,
XDefaultVisualOfScreen(XDefaultScreenOfDisplay(canvas_display)),
AllocNone);
if (colormap == NULL)
{
/*** error ***/
}
pixel_mapping = (Pixel *) XtCalloc(NUMBER_COLORS,sizeof(Pixel));
for (icolor = 0;icolor < NUMBER_COLORS;icolor++)
{
grey_level = (icolor / ((double)(NUMBER_COLORS-1))) * WHITE_VALUE;
color.blue = color.green = color.red = grey_level;
color.flags = DoRed | DoGreen | DoBlue;
if (XAllocColor(canvas_display,colormap,&color))
pixel_mapping[icolor] = color.pixel;
else
{
printf("XAllocColor() failed for grey_level = %f\n",grey_level);
}
}
XSetWindowColormap(canvas_display,canvas_window,colormap);
XtSetArg(al[0],XNColormap,colormap);
XtSetValues(w,al,1);
}
cgc = XCreateGC(canvas_display,canvas_window,0L,NULL);
XSetState(canvas_display,cgc,0L,255L,GXcopy,AllPlanes);
XSetLineAttributes(canvas_display,cgc,2,
LineSolid,CapNotLast,JoinMiter);
first_time = FALSE;
}
if (ximage == NULL) return;
XPutImage(canvas_display,canvas_window,cgc,ximage,xpe->x, xpe->y,
xpe->x, xpe->y,
xpe->width, xpe->height);
XSync(canvas_display,FALSE);
}
resize_canvas(Widget w,XmDrawingAreaCallbackStruct *draw_area)
{
Window root;
int x, y;
unsigned int bw;
int newpixsize;
if (canvas_window == NULL) return;
XGetGeometry(XtDisplay(w),canvas_window,&root,&x,&y,
&canvas_width,&canvas_height,&bw,&canvas_depth);
if (first_time) return;
if (pl == NULL) return;
newpixsize = compute_pixel_size(pl_info,canvas_width,canvas_height);
if (newpixsize != pixelsize)
{
pixelsize = newpixsize;
XDestroyImage(ximage);
if (canvas_depth == 1) dither_pixmap(w);
else if (canvas_depth == 8) grey_pixmap(w);
}
}
init_load_image(char *filename)
{
static char *ass = NULL;
if (read_plane(&pl,&pl_info,&ass,filename) < 0) pl = NULL;
if (ass != NULL) free(ass);
}
dither_pixmap(Widget w)
{
Display *display;
Screen *screen;
unsigned char *data;
static LIMITS limits;
display = XtDisplay(w);
screen = XDefaultScreenOfDisplay(display);
data = (unsigned char *)
XtCalloc((((pl_info->column_dimension*pixelsize)+7)/8)*
pl_info->row_dimension*pixelsize,
sizeof(unsigned char));
ximage = XCreateImage(display,XDefaultVisualOfScreen(screen),1,
ZPixmap,0,data,
pl_info->column_dimension*pixelsize,
pl_info->row_dimension*pixelsize,8,0);
limits.level = pl_info->level;
limits.deltarow = 1;
limits.deltacol = 1;
limits.startrow = pl_info->row_location;
limits.startcol = pl_info->column_location;
limits.endrow = pl_info->row_location + pl_info->row_dimension - 1;
limits.endcol = pl_info->column_location + pl_info->column_dimension - 1;
XShpl_dither(pl,pl_info,&limits,0.0,0.0,pixelsize,FALSE,FALSE,
ximage);
}
grey_pixmap(Widget w)
{
Display *display;
Screen *screen;
unsigned char *data;
static LIMITS limits;
display = XtDisplay(w);
screen = XDefaultScreenOfDisplay(display);
data = (unsigned char *)
XtCalloc(pl_info->column_dimension*pixelsize*
pl_info->row_dimension*pixelsize,
sizeof(unsigned char));
ximage = XCreateImage(display,XDefaultVisualOfScreen(screen),8,
ZPixmap,0,data,pl_info->column_dimension*pixelsize,
pl_info->row_dimension*pixelsize,8,0);
limits.level = pl_info->level;
limits.deltarow = 1;
limits.deltacol = 1;
limits.startrow = pl_info->row_location;
limits.startcol = pl_info->column_location;
limits.endrow = pl_info->row_location + pl_info->row_dimension - 1;
limits.endcol = pl_info->column_location + pl_info->column_dimension - 1;
XShpl_grey(pl,pl_info,&limits,0.0,0.0,pixelsize,FALSE,FALSE,ximage,
pixel_mapping,NUMBER_COLORS);
}