📄 viz2d-f77.c
字号:
if( ncolors > 256 ) ncolors = 256; pixels = (unsigned long *)calloc(sizeof(unsigned long),ncolors+1); /* I'm not sure what these plane_masks do, I don't use them */ nplanes = 0; plane_masks = (unsigned long *)calloc(sizeof(unsigned long),nplanes+1); if( XAllocColorCells( theDisplay, theDefaultColormap, True, plane_masks, nplanes, pixels, ncolors ) ){ /* Figure out how many colors we can actually use */ colors_created = *request_colors; colormapsize = theDefaultVisual->map_entries; mapstart = (int)pixels[0]; colorcell_defs = (XColor *)calloc( sizeof(XColor),colors_created+1 ); colors_to_store = colors_created; aColormap = theDefaultColormap; aVisual = theDefaultVisual; defstart = 0; }else{ /* Couldn't allocate enough default colormap entries so, */ /* make our own colormap */ vinfo_mask = VisualClassMask; vinfo_template.class = PseudoColor; vlist = XGetVisualInfo( theDisplay, vinfo_mask, &vinfo_template, &nitems ); if( !vlist ){ fprintf(stderr,"\nERROR: No PseudoColor visuals found.\n"); return 0; } aVisual = vlist->visual; aColormap = XCreateColormap(theDisplay, aWindow, aVisual, AllocAll); colormap_created = TRUE; /* Copy the first entries of the server's default colormap */ colormapsize = aVisual->map_entries; colors_to_copy = MAX_COLORS_TO_COPY; if( colormapsize < colors_to_copy ) colors_to_copy = colormapsize; theDefColorDefs = (XColor *)calloc(sizeof(XColor),colors_to_copy); for( iii=0; iii<colors_to_copy; iii++ ){ theDefColorDefs[iii].pixel = iii; } XQueryColors(theDisplay, theDefaultColormap, theDefColorDefs, colors_to_copy); /* Now copy in the first N default colormap entries */ colorcell_defs = (XColor *)calloc(sizeof(XColor),colormapsize+1); /* Initialize my colorcell definition array */ for( iii=0; iii<colormapsize; iii++ ){ colorcell_defs[iii].pixel = iii; colorcell_defs[iii].red = 0; colorcell_defs[iii].green = 0; colorcell_defs[iii].blue = 0; colorcell_defs[iii].flags = 0; } for( iii=0; iii<colors_to_copy; iii++ ){ colorcell_defs[iii].pixel = iii; colorcell_defs[iii].red = theDefColorDefs[iii].red; colorcell_defs[iii].green = theDefColorDefs[iii].green; colorcell_defs[iii].blue = theDefColorDefs[iii].blue; colorcell_defs[iii].flags = theDefColorDefs[iii].flags; } /* Figure out how many colors we can actually use */ colors_created = *request_colors; if( colors_created > 256 ) colors_created = 256; if( colors_created > colormapsize ) colors_created = colormapsize; mapstart = colormapsize - colors_created; colors_to_store = colormapsize; defstart = mapstart; } /* Now calculate the colormaps depending on request */ /* HERE a programmer may want to customize or add colormaps */ if( *colormap_type == 2 ){ /* Create the Blue to Red colormap */ delta = (int)(MAX_INTENSITY/(colors_created-1)); an8bitFlag = DoRed | DoGreen | DoBlue; for( iii=0; iii<colors_created; iii++ ){ colorcell_defs[iii+defstart].pixel = iii + mapstart; colorcell_defs[iii+defstart].red = iii * delta; colorcell_defs[iii+defstart].green = 0; colorcell_defs[iii+defstart].blue = MAX_INTENSITY - (iii * delta); colorcell_defs[iii+defstart].flags = an8bitFlag; } }else if( *colormap_type == 3 ){ /* Create the Blue to Green to Red colormap */ delta = (int)(2*(MAX_INTENSITY/(colors_created-1))); an8bitFlag = DoRed | DoGreen | DoBlue; midmap = colors_created/2; for( iii=0; iii<midmap; iii++ ){ colorcell_defs[iii+defstart].pixel = iii + mapstart; colorcell_defs[iii+defstart].red = 0; colorcell_defs[iii+defstart].green = iii * delta; colorcell_defs[iii+defstart].blue = MAX_INTENSITY - (iii * delta); colorcell_defs[iii+defstart].flags = an8bitFlag; } for( iii=midmap; iii<colors_created; iii++ ){ colorcell_defs[iii+defstart].pixel = iii + mapstart; colorcell_defs[iii+defstart].red = (iii-midmap)*delta; colorcell_defs[iii+defstart].green = MAX_INTENSITY - ((iii-midmap)*delta); colorcell_defs[iii+defstart].blue = 0; colorcell_defs[iii+defstart].flags = an8bitFlag; } }else{ /* Create the grayscale colormap */ delta = (int)(MAX_INTENSITY/(colors_created-1)); an8bitFlag = DoRed | DoGreen | DoBlue; for( iii=0; iii<colors_created; iii++ ){ colorcell_defs[iii+defstart].pixel = iii + mapstart; colorcell_defs[iii+defstart].red = iii * delta; colorcell_defs[iii+defstart].green = iii * delta; colorcell_defs[iii+defstart].blue = iii * delta; colorcell_defs[iii+defstart].flags = an8bitFlag; } } XStoreColors( theDisplay, aColormap, colorcell_defs, colors_to_store ); XInstallColormap( theDisplay, aColormap ); XSetWindowColormap( theDisplay, aWindow, aColormap ); XFlush( theDisplay ); /* Create and display the key buffer (the bottom color ramp) */ if( *display_key ){ for( iii=0; iii<KEY_HEIGHT; iii++ ){ for( jjj=0; jjj<width; jjj++ ){ key_buffer[iii*width+jjj] = mapstart + (int)((jjj*colors_created)/width); } } keyImage = XCreateImage( theDisplay, aVisual, theDepth, ZPixmap, 0, key_buffer, width, KEY_HEIGHT, 8, 0 ); XPutImage( theDisplay, aWindow, theGC, keyImage, 0,0,0,height+3, width,KEY_HEIGHT ); } XFlush( theDisplay ); viz2d_was_initialized = 1; return 1;}/* * 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 only if init_viz2d() * successfully created things. */quit_viz2d_(){ if( viz2d_was_initialized ){ cfree( trans_buffer ); cfree( key_buffer ); cfree( colorcell_defs ); XDestroyImage( keyImage ); if( colormap_created ) XFreeColormap( theDisplay, aColormap ); XCloseDisplay( theDisplay ); }}/* * initX() * * This function is not used by the user. It is used by the init_viz2d() * function to initialize X windows. */int initX(){ theDisplay = XOpenDisplay( NULL ); if( theDisplay == NULL ){ fprintf(stderr,"ERROR: Can't open connection to %s\n", XDisplayName( NULL ) ); return 0; } theScreen = DefaultScreen( theDisplay ); theDepth = DefaultDepth( theDisplay, theScreen ); theBlackPixel = BlackPixel( theDisplay, theScreen ); theWhitePixel = WhitePixel( theDisplay, theScreen ); return 1;}/* * openWindow() * * This function is not used by the user. It is used by the init_viz2d() * function to create an X window. */Window openWindow( x, y, width, height, flag, theNewGC )int x, y, width, height, flag;GC *theNewGC;{XSetWindowAttributes theWindowAttributes;XSizeHints theSizeHints;unsigned long theWindowMask;Window theNewWindow;Pixmap theIconPixmap;XWMHints theWMHints; theWindowAttributes.border_pixel = theWhitePixel; theWindowAttributes.background_pixel = theBlackPixel; theWindowAttributes.override_redirect = False; theWindowMask = CWBackPixel | CWBorderPixel | CWOverrideRedirect; theNewWindow = XCreateWindow( theDisplay, RootWindow( theDisplay, theScreen ), x, y, width, height, BORDER_WIDTH, theDepth, InputOutput, CopyFromParent, theWindowMask, &theWindowAttributes ); theIconPixmap = XCreateBitmapFromData( theDisplay, theNewWindow, icon_viz50x50_bits, icon_viz50x50_width, icon_viz50x50_height ); theWMHints.icon_pixmap = theIconPixmap; theWMHints.initial_state = NormalState; theWMHints.flags = IconPixmapHint | StateHint; XSetWMHints( theDisplay, theNewWindow, &theWMHints ); theSizeHints.flags = PPosition | PSize; theSizeHints.x = x; theSizeHints.y = y; theSizeHints.width = width; theSizeHints.height = height; XSetNormalHints( theDisplay, theNewWindow, &theSizeHints ); if( createGC(theNewWindow, theNewGC ) == 0 ){ XDestroyWindow( theDisplay, theNewWindow ); return( (Window) 0 ); } XMapWindow( theDisplay, theNewWindow ); XFlush( theDisplay ); return( theNewWindow );}/* * createGC() * * This function is not used by the user. It is used by the openWindow() * function to create a graphics context to be associated with the * new window. */createGC( theNewWindow, theNewGC )Window theNewWindow;GC *theNewGC;{XGCValues theGCValues; *theNewGC = XCreateGC( theDisplay, theNewWindow, (unsigned long) 0, &theGCValues ); if( *theNewGC == 0 ){ return 0; }else{ XSetForeground( theDisplay, *theNewGC, theWhitePixel ); XSetBackground( theDisplay, *theNewGC, theBlackPixel ); return( 1 ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -