⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viz2d-f77.c

📁 xy时域有限差分的fortran数值模拟 xy时域有限差分的fortran数值模拟
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *      viz2d-f77.c				Revision 1.2 (8-30-91)
 *						by Jeff 'Lockheed' Sheffel
 *
 *      viz2d-f77 is a package of functions written in C with a Fortran
 *      interface.  This package of functions allows a Fortrash programmer
 *      to display 8-bit bitmap data in an X11 window.  The programmer
 *      interface is via three simple functions:
 *
 *      call init_viz2d( width, height, colormap_type, colormap_size,
 *			 display_key )
 *
 *              The first two parameters are 'width' of the data and 'height'
 *              of the data.  'width' and 'height' will be the width and
 *              height of the window and the data.  The 'colormap-type' is an
 *              integer code with 1=gray-scale, 2=blue-to-red, and
 *              3=blue-to-green-to-red.  The 'colormap_size' is a request for
 *              the number of colors to display the data.  If the
 *		'display_key' parameter is non-zero, then a gradient of the 
 *		colors representing the data values from 0 to 255 is
 *		included at the bottom of the window.
 *
 *      	init_viz2d() returns 0 upon failure and 1 upon success.  Failure
 *      	may result upon failure to connect to the server (inwhich case
 *      	the user is told) or failure to open a window or failure to
 *      	create a colormap (which must be of type PseudoColor - this
 *		could be modified).
 *
 *      call viz2d( buffer )
 *
 *              This subroutine displays the bitmap data in the window that
 *              was created by init_viz2d().  The argument 'buffer' is a
 *              pointer to an 8-bit (character) array of data.  The width and
 *              height of the buffer must match the width and height as
 *              specified in the call to init_viz2d().
 *
 *      call quit_viz2d
 *
 *              This subroutine is called when the program is finished
 *              with the viz2d window.  It removes the window and frees
 *              the memory that was allocated by viz2d.  quit_viz2d() may
 *		be called even if init_viz2d() failed.
 *
 *	viz2d USAGE:
 *
 *	init_viz2d() must be called before the displaying routine viz2d()
 *	can be called.  Any 'colormap-size' between 2 and 256 may specified.
 *	Since the 8-bit data can only take on values between 0 and 256, more
 *	than 256 colors would not be useful.  If 256 is selected and a
 *	virtual colormap of that size is supported by the server, then all
 *	possible values of the data will be represented by a unique color.
 *	If fewer than 256 is selected or a virtual colormap of less than
 *	256 colors is supported, then in the viz2d() routine, all of
 *	the currently passed data in the buffer is scaled (squeezed) such
 *	that each color represents more than one data value.  The init_viz2d()
 *	routine will ensure that the most colors will be displayed if too
 *	many colors were selected and can not be supported.  In such cases of
 *	filling an entire colormap, the server's default colormap will be
 *	temporarily over-written and normal screen colors will temporarily
 *	be lost (but controlled by mouse cursor movement).
 *
 *	To avoid core dumps, do not call viz2d() unless viz2d_init() returns
 *	a non-zero value (1). For example,
 *
 *		if( init_viz2d( 200, 200, 3, 128, 1 ) ) then
 *			do while( keep_displaying_data )
 *				call calculate_data( buffer )
 *				call viz2d( buffer )
 *			end do
 *		endif
 *		call quit_viz2d
 *
 *	viz2d COMPILATION:
 *
 *	After including viz2d routines in a Fortrash program (my_viz2d.f),
 *	then compile with:
 *
 *		f77 my_viz2d.f viz2d-f77.c -lX11 -lm
 *
 */

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <stdio.h>

#define BORDER_WIDTH	5
#define MAX_COLORS_TO_COPY 32	/* # colors to copy from default colormap, */
				/*	# colors may be changed */
#define MAX_INTENSITY 65535	/* X Color RGB max intensity (2**16) */
#define KEY_HEIGHT 20		/* Height of key (color ramp) */
#define	TRUE 1
#define	FALSE 0

Display	*theDisplay;			/* for eg. "unix:0.0" */
int	 theScreen;			/* Which screen on the display */
int	 theDepth;			/* Number of color planes */
unsigned long	theBlackPixel;
unsigned long	theWhitePixel;
GC		theGC;			/* An X graphics context */
Visual		*aVisual;
int		colormapsize;
int		colors_created;		/* # colors in colormap for viz2d */
XImage		*anImage;		/* The viz2d image */
XImage		*keyImage = NULL;	/* The optional bottom color key */
Window		aWindow;		/* The viz2d window */
int		width, height;		/* The viz2d window width & height */
int		mapstart;		/* Viz2d colormap entries start */
char		*trans_buffer = NULL;	/* Temp. buffer used in viz2d */
char		*key_buffer = NULL;	/* Data buffer used for keyImage */
Colormap	aColormap;		/* The created viz2d colormap */
XColor		*colorcell_defs = NULL;	/* Viz2d colormap definitions */
int		colormap_created = FALSE;
int		viz2d_was_initialized = FALSE;

#define icon_viz50x50_width 50
#define icon_viz50x50_height 50
static char icon_viz50x50_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x48,
   0x25, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xc0, 0x03, 0x00, 0x00,
   0x00, 0xa8, 0x2a, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0xc0,
   0x03, 0x00, 0x00, 0x48, 0x25, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x08, 0x20,
   0x00, 0x00, 0xc0, 0x01, 0x00, 0xa8, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x08, 0x20, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x48, 0x25, 0x40, 0x40, 0x00,
   0x0c, 0x00, 0x08, 0x20, 0x40, 0xe0, 0x00, 0x0e, 0x00, 0xa8, 0x2a, 0x40,
   0xf0, 0x01, 0x0f, 0x00, 0x08, 0x20, 0x40, 0xf8, 0x83, 0x0f, 0x00, 0x08,
   0x20, 0x40, 0xfc, 0xc7, 0x0f, 0x00, 0xf8, 0x3f, 0xc0, 0xfe, 0xef, 0x0f,
   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x10, 0x00, 0xc0, 0xfe,
   0xef, 0x0f, 0x00, 0x20, 0x00, 0x40, 0xfc, 0xc7, 0x0f, 0x00, 0x20, 0x00,
   0x40, 0xf8, 0x83, 0x0f, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x01, 0x0f, 0x00,
   0x80, 0x00, 0x40, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x40, 0x40, 0x00,
   0x0c, 0x00, 0x00, 0x01, 0x40, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x02, 0x40,
   0xf0, 0x01, 0x0f, 0x00, 0x00, 0x04, 0x40, 0xf8, 0x83, 0x0f, 0x00, 0x00,
   0x08, 0x40, 0xfc, 0xc7, 0x0f, 0x00, 0x00, 0x08, 0xc0, 0xfe, 0xef, 0x0f,
   0x00, 0x00, 0x10, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x20, 0xc0, 0xfe,
   0xef, 0x0f, 0x00, 0x00, 0x20, 0x40, 0xfc, 0xc7, 0x0f, 0x00, 0x00, 0x40,
   0x40, 0xf8, 0x83, 0x0f, 0x00, 0x00, 0x80, 0x40, 0xf0, 0x01, 0x0f, 0x00,
   0x00, 0x00, 0x41, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x41, 0x40, 0x00,
   0x0c, 0x00, 0x00, 0x00, 0x42, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x44,
   0xf0, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x48, 0xf8, 0x03, 0x0f, 0x00, 0x00,
   0x00, 0x48, 0xfc, 0x87, 0x0f, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0xcf, 0x0f,
   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00};

/*
 *	viz2d()
 *
 *      This subroutine displays the bitmap data in the window that
 *      was created by init_viz2d().  The argument 'buffer' is a
 *      pointer to an 8-bit (character) array of data.  The width and
 *      height of the buffer must match the width and height as
 *      specified in the call to init_viz2d().
 *
 *	If a 256 color colormap is used, then viz2d() simply blasts the
 *	image to the window.  But if less than 256 colors are used, then
 *	the data is contracted down into 'trans_buffer'.  This will
 *	obviously create minute errors in the image representation.
 */

viz2d_( buffer )
char *buffer;
{
int	iii, ival;
float	scaledown, fval;
	if( colors_created < colormapsize ){
		/* Must contract the data since less than 256 colors */
	    scaledown = 256.0/(float)colors_created;
	    for(iii=0; iii<width*height; iii++){
		trans_buffer[iii] =
		    (unsigned char)( (((unsigned char)buffer[iii])/scaledown) +
						mapstart );
	    }
	    anImage = XCreateImage( theDisplay, aVisual, theDepth, ZPixmap, 0,
			trans_buffer, width, height, 8, 0 );
	}else{
		/* No need to use the translation buffer */
	    anImage = XCreateImage( theDisplay, aVisual, theDepth, ZPixmap, 0,
			buffer, width, height, 8, 0 );
	}
	XPutImage( theDisplay, aWindow, theGC, anImage, 0,0,0,0, width,height );
	XDestroyImage( anImage );
	XFlush( theDisplay );
}

/*
 *	init_viz2d()
 *
 *      The first two parameters are 'width' of the data and 'height'
 *      of the data.  'width' and 'height' will be the width and
 *      height of the window and the data.  The 'colormap-type' is an
 *      integer code with 1=gray-scale, 2=blue-to-red, and
 *      3=blue-to-green-to-red.  The 'colormap-size' is a request for
 *      the number of colors to display the data.  If 'display_key' is
 *	non-zero, then a color key representing the data values 0 to 255
 *	will be displayed at the bottom of the viz2d window.
 *
 *	init_viz2d() will first try to allocate (write) entries from
 *	the (server's) default colormap.  If this is successful, then the
 *	server doesn't have to swap our colormap in and out and the viz2d
 *	window will not go black when the cursor is not in our window.
 *
 *	init_viz2d() returns 0 upon failure and 1 upon success.  Failure
 *	may result upon failure to connect to the server (inwhich case 
 *	the user is told) or failure to open a window or failure to
 *	create a colormap (which must be of type PseudoColor - this could
 *	be modified).
 *
 *	POTENTIAL MODIFICATIONS:
 *	1) Don't fail if can't create a colormap of type PseudoColor,
 *	2) Add or modify different colormaps (this may be desired change
 *		by joe-blow programmer if he is not satisfied with my
 *		colormaps).
 *	3) Read in colormaps (pallets) created by the ximage program.
 */

int init_viz2d_(request_width, request_height, colormap_type, request_colors,
			display_key)
int     *request_width, *request_height, *colormap_type, *request_colors,
			*display_key;
{
Window	openWindow();
Colormap theDefaultColormap;
XSetWindowAttributes attrib;
int	nitems, iii, jjj;
XVisualInfo *vlist, vinfo_template;
Visual	*theDefaultVisual;
int	colors_to_copy;		/* # colors to copy from default colormap */
int	delta;			/* Step size in our colormap definitions */
int	midmap;			/* Midpoint of our colormap */
int	defstart;		/* Start index into colormap definitions */
int	colors_to_store;	/* # colors to write to colormap */
long	vinfo_mask;		/* Visual information mask */
char	an8bitFlag;
XColor	*theDefColorDefs;
unsigned long	*plane_masks;	/* Plane masks for XAllocColorCells, not used?*/
unsigned int	nplanes;	/* # planes for XAllocColorCells, not used?*/
unsigned long	*pixels;	/* Returned pixel values from XAllocColorCells*/
unsigned int	ncolors;	/* # of requested colors in XAllocColorCells */
	if( !initX() ) return 0;
		/* Create the transformation buffer (oversized) */
	width = *request_width;
	height = *request_height;
        trans_buffer = (char *)calloc(sizeof(char),width*height+width+height);
		/* Create a window of the requested data size */
	if( *display_key ){
		/* but a slightly larger window if a colorkey is requested */
		aWindow = openWindow( 200, 200, width, height+KEY_HEIGHT+3,
				0, &theGC );	 /* 0 = NOT popup */
		key_buffer = (char *)calloc(sizeof(char),width*(KEY_HEIGHT+1));
	}else{
		aWindow = openWindow( 200, 200, width, height,
				0, &theGC );	 /* 0 = NOT popup */
	}
	XSetIconName( theDisplay, aWindow, "2D fd-td" );
	XStoreName( theDisplay, aWindow, "2D fd-td" );
	sleep(1);		/* Must wait or graphics won't work?? */
	theDefaultVisual = DefaultVisual( theDisplay, theScreen );
	theDefaultColormap = DefaultColormap(theDisplay, theScreen);
		/* 1st try to allocate colors from server's default colormap */
	ncolors = *request_colors;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -