[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference bulova::decw_jan-89_to_nov-90

Title:DECWINDOWS 26-JAN-89 to 29-NOV-90
Notice:See 1639.0 for VMS V5.3 kit; 2043.0 for 5.4 IFT kit
Moderator:STAR::VATNE
Created:Mon Oct 30 1989
Last Modified:Mon Dec 31 1990
Last Successful Update:Fri Jun 06 1997
Number of topics:3726
Total number of notes:19516

721.0. "X$CREATE/X$PUT_IMAGE: A non-working example" by SALSA::HUFF (cs) Wed May 03 1989 15:22

    Well...I've deliberated over the scale and location for this entry
    and decided here is best. While this is an example program, it is
    presently an example program that does not work. Urgency has forced
    a less-than-complete period of debugging. 
        
    I've included below the programming problem description from the
    the  customer, as well as the program. Any help would be greatly 
    appreciated!




	In my example program, I follow the example on page 7-8 of the
VMS DECWindows Guide to Xlib Programming, VAX Binding. The example for the
array comes from page 7-4, same book. This example seems to assume that the
DATA parameter should be as described in your message, NOT as described in
the Xlib Routines Ref., i.e. the correction for the Xlib Routines Ref. now
is in agreement with the Guide to Xlib Programming. The basic chunks from
my program are shown below:
 
      BYTE OUTMAP(262144)
      DATA OUTMAP/262144*'F0'X/
	.
	.
      CALL X$CREATE_IMAGE(DPY,VISUAL,DEPTH,X$C_Z_PIXMAP,
     1      0,OUTMAP,PIX_WIDTH,PIX_HEIGHT,BITMAP_PAD,
     1      BYTES_PER_LINE,IMAGE)
 
      CALL X$PUT_IMAGE(DPY,WINDOW,GC,IMAGE,SRC_X,SRC_Y,
     1  DST_X,DST_Y,PIX_WIDTH,PIX_HEIGHT)      
 
 
The result I expect is this: that the PUT_IMAGE should cause a 512x512 portion
of my window (which is 600x600) to be assigned whatever color happens to
correspond with the data value in the OUTMAP array. Changing the data value
should cause the color of the image to change.
 
The result I get is this: the 600x600 window is always assigned the default
window background pixel value, and the 512x512 portion I would expect to
see change due to the PUT_IMAGE never changes, regardless of the data value 
in array OUTMAP.
 
I need to know if:
 
	A: I'm doing something wrong? I can't see what else to do from the
	   examples in the documentation.
 
	B: The routine doesn't work? Based upon the info I have, I should 
	   at least see a 512x512 portion of the window change when the
	   PUT_IMAGE is applied.
 
Please see if we can get some help on this. I must say that a week and a half
just to get to here is not my idea of quick problem response. I know there
is not a lot you can do directly, but can you turn up the heat on your
problem resolution resources? Thanks again for all your efforts...
 
 
	HERE IS THE EXAMPLE FORTRAN PROGRAM TO PUT A RASTER IMAGE
UP IN A DECWINDOWS WINDOW. PROBLEM IS HOW TO PASS THE ARRAY ADDRESS
TO THE X$CREATE_IMAGE CALL.
 
      PROGRAM EXAMPLE
 
      INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF'
 
      INTEGER*4 DPY			! DISPLAY ID
      INTEGER*4 SCREEN			! SCREEN ID
      INTEGER*4 WINDOW			! WINDOW ID
      INTEGER*4 ATTR_MASK		! ATTRIBUTES MASK
      INTEGER*4 GC			! GC ID
      INTEGER*4 FONT			! FONT ID
      INTEGER*4 DEFINE_COLOR		! COLOR FUNCTION
      INTEGER*4 WINDOW_X, WINDOW_Y	! WINDOW ORIGIN
      INTEGER*4 DEPTH			! NUMBER OF PLANES
      INTEGER*4 STATUS, FUNC		! SYNCHRONOUS BEHAVIOR
      INTEGER*4 STATE			! FLAG FOR TEXT
      INTEGER*4 EXPOSE_FLAG
 
      RECORD /X$VISUAL/ VISUAL			! VISUAL TYPE
      RECORD /X$SET_WIN_ATTRIBUTES/ XSWDA	! WINDOW ATTRIBUTES
      RECORD /X$GC_VALUES/ XGCVL		! GC VALUES
      RECORD /X$SIZE_HINTS/ XSZHN		! HINTS
      RECORD /X$EVENT/ EVENT			! INPUT EVENT
      RECORD /X$IMAGE/ IMAGE
 
      CHARACTER*33 WINDOW_NAME
      DATA WINDOW_NAME /'Xlib Raster Graphics Test Program'/
      CHARACTER*60 FONT_NAME
      DATA FONT_NAME
     1 /'-ADOBE-NEW CENTURY SCHOOLBOOK-MEDIUM-R-NORMAL--*-140-*-*-P-*'/
 
      PARAMETER	WINDOW_W = 600, WINDOW_H = 600,
     1          PIX_WIDTH = 512, PIX_HEIGHT = 512,
     1          BITMAP_PAD = 8, BYTES_PER_LINE=0,
     1          SRC_X = 0, SRC_Y = 0, DST_X = 50, DST_Y = 50
 
      BYTE OUTMAP(262144)
 
      DATA OUTMAP/262144*250/
 
C
C	INITIALIZE DISPLAY ID AND SCREEN ID
C
      DPY = X$OPEN_DISPLAY()
      IF (DPY .EQ. 0) THEN
           WRITE(6,*) 'DISPLAY NOT OPENED!'
           CALL SYS$EXIT(%VAL(1))
      ENDIF
      SCREEN = X$DEFAULT_SCREEN_OF_DISPLAY(DPY)
 
      STATUS = X$SYNCHRONIZE(DPY,1,FUNC)
C
C	CREATE THE WINDOW WINDOW
C
      WINDOW_X = (X$WIDTH_OF_SCREEN(DPY) - WINDOW_W) / 2
      WINDOW_Y = (X$HEIGHT_OF_SCREEN(DPY) - WINDOW_H) / 2
      DEPTH = X$DEFAULT_DEPTH_OF_SCREEN(SCREEN)
      CALL X$DEFAULT_VISUAL_OF_SCREEN(SCREEN,VISUAL)
      ATTR_MASK = X$M_CW_EVENT_MASK .OR. X$M_CW_BACK_PIXEL
 
      XSWDA.X$L_SWDA_EVENT_MASK = X$M_EXPOSURE .OR. X$M_BUTTON_PRESS
      XSWDA.X$L_SWDA_BACKGROUND_PIXEL =
     1    DEFINE_COLOR(DPY,SCREEN,VISUAL,1)
 
      WINDOW = X$CREATE_WINDOW(DPY,
     1    X$ROOT_WINDOW_OF_SCREEN(SCREEN),
     1    WINDOW_X, WINDOW_Y, WINDOW_W, WINDOW_H, 0,
     1    DEPTH, X$C_INPUT_OUTPUT, VISUAL, ATTR_MASK, XSWDA)
C
C	CREATE GRAPHICS CONTEXT
C
      XGCVL.X$L_GCVL_FOREGROUND =
     1    DEFINE_COLOR(DPY,SCREEN,VISUAL,2)
 
      XGCVL.X$L_GCVL_BACKGROUND =
     1    DEFINE_COLOR(DPY,SCREEN,VISUAL,3)
 
      GC = X$CREATE_GC(DPY, WINDOW,
     1    (X$M_GC_FOREGROUND .OR. X$M_GC_BACKGROUND), XGCVL)
C
C	CREATE IMAGE
C
 
      CALL X$CREATE_IMAGE(DPY,VISUAL,DEPTH,X$C_Z_PIXMAP,
     1      0,OUTMAP,PIX_WIDTH,PIX_HEIGHT,BITMAP_PAD,
     1      BYTES_PER_LINE,IMAGE)
 
      CALL X$PUT_IMAGE(DPY,WINDOW,GC,IMAGE,SRC_X,SRC_Y,
     1  DST_X,DST_Y,PIX_WIDTH,PIX_HEIGHT)      
 
C
C	LOAD THE FONT FOR TEXT WRITING
C
      FONT = X$LOAD_FONT(DPY, FONT_NAME)
      CALL X$SET_FONT(DPY, GC, FONT)
C
C	DEFINE THE SIZE AND NAME OF WINDOW WINDOW
C
      XSZHN.X$L_SZHN_X = 362
      XSZHN.X$L_SZHN_Y = 282
      XSZHN.X$L_SZHN_WIDTH = 600
      XSZHN.X$L_SZHN_HEIGHT = 600
      XSZHN.X$L_SZHN_FLAGS = X$M_P_POSITION .OR. X$M_P_SIZE
 
      CALL X$SET_NORMAL_HINTS(DPY, WINDOW, XSZHN)
 
      CALL X$STORE_NAME(DPY, WINDOW, WINDOW_NAME)
 
C
C	MAP THE WINDOWS
C      
      CALL X$MAP_WINDOW(DPY, WINDOW)
 
C
C	HANDLE EVENTS
C
      DO WHILE (.TRUE.)
 
          CALL X$NEXT_EVENT(DPY, EVENT)
C
C	IF THIS IS AND EXPOSE EVENT ON OUR CHILD WINDOW,
C	THEN WRITE THE TEXT.
C
          IF (EVENT.EVNT_TYPE .EQ. X$C_EXPOSE) THEN
            CALL X$DRAW_IMAGE_STRING(DPY,WINDOW,GC,
     1       150,75,'To exit, click MB2')
            IF (EXPOSE_FLAG.EQ.0)THEN
               EXPOSE_FLAG = 1
            ELSE
               CALL X$DRAW_IMAGE_STRING(DPY,WINDOW,GC,
     1           150,75,'To exit, click MB2')
             ENDIF
           ENDIF
 
           IF (EVENT.EVNT_TYPE.EQ.X$C_BUTTON_PRESS .AND.
     1         EVENT.EVNT_BUTTON.X$L_BTEV_BUTTON.EQ.X$C_BUTTON1) THEN
               CALL X$DRAW_IMAGE_STRING(DPY,WINDOW,GC,
     1           150,75,'To exit, click MB2')
           ENDIF
 
           IF (EVENT.EVNT_TYPE.EQ.X$C_BUTTON_PRESS .AND.
     1         EVENT.EVNT_BUTTON.X$L_BTEV_BUTTON.EQ.X$C_BUTTON2) THEN
               CALL X$UNMAP_WINDOW(DPY, WINDOW)
               CALL X$DESTROY_WINDOW(DPY, WINDOW)
               CALL X$CLOSE_DISPLAY(DPY)
               CALL SYS$EXIT(%VAL(1))
           ENDIF
 
      ENDDO
      END
C
C
C	CREATE COLOR
C
      INTEGER*4 FUNCTION DEFINE_COLOR(DISP, SCRN, VISU, N)
 
      INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF'
 
      INTEGER*4 DISP, SCRN, N
      RECORD /X$VISUAL/ VISU
      RECORD /X$COLOR/ SCREEN_COLOR
      INTEGER*4 STR_SIZE, STATUS, COLOR_MAP
      CHARACTER*15 COLOR_NAME(3)
      DATA COLOR_NAME/'DARK SLATE BLUE','LIGHT GREY     ',
     1 'FIREBRICK      '/
 
      IF (VISU.X$L_VISU_CLASS .EQ. X$C_PSEUDO_COLOR .OR.
     1    VISU.X$L_VISU_CLASS .EQ. X$C_DIRECT_COLOR) THEN
          COLOR_MAP = X$DEFAULT_COLORMAP_OF_SCREEN(SCRN)
          STATUS = STR$TRIM(COLOR_NAME(N),
     1                COLOR_NAME(N), STR_SIZE)
          STATUS = X$ALLOC_NAMED_COLOR(DISP, COLOR_MAP,
     1                COLOR_NAME(N)(1:STR_SIZE), SCREEN_COLOR)
          IF (STATUS .NE. 0) THEN
              DEFINE_COLOR = SCREEN_COLOR.X$L_COLR_PIXEL
          ELSE
              WRITE (6,*) 'COLOR NOT ALLOCATED'
              CALL LIB$SIGNAL(%VAL(STATUS))
              DEFINE_COLOR = 0
          ENDIF
      ELSE
          IF (N .EQ. 1 .OR. N .EQ. 3)
     1        DEFINE_COLOR = X$BLACK_PIXEL_OF_SCREEN(DISP)
 
          IF (N .EQ. 2)
     1        DEFINE_COLOR = X$WHITE_PIXEL_OF_SCREEN(DISP)
      ENDIF
 
      RETURN
      END
 



T.RTitleUserPersonal
Name
DateLines
721.1PSW::WINALSKIPaul S. WinalskiWed May 03 1989 16:505
What's in color index 250 of the default color map?  I didn't see this being
set anywhere.

--PSW

721.2An exampleHGOVC::KENBERKUNPeople that meltThu May 04 1989 01:39181
    I have trouble with your FORTRANisms, but here is some color creation
    code that I use that works.  It is basically taken from Burns Fisher's
    code, from the color wheel program. You'll find my complete program
    (with lot's of create and put images) in note 126 in
    elktra::dw_examples notesfile.
    
    Sorry for the C code, you'll probably have as much trouble with
    that as I do with FORTRAN!
    

/*
**++
**  FUNCTIONAL DESCRIPTION:
**
**
**	SetUpColorMap creates the colormap
**
**
**--
*/

static void SetUpColorMap ()

{

	/* Set up the colormap */

	vInfoDummy.visualid = 
			(DefaultVisual(XtDisplay(toplevel),0))->visualid;
	pVisualInfo = 
			XGetVisualInfo(XtDisplay(toplevel),
			VisualIDMask,&vInfoDummy,&nVis);
	pixel = WhitePixel(XtDisplay(toplevel),
			   DefaultScreen(XtDisplay(toplevel)));
	updateColor = 0;

	if (pVisualInfo->class != PseudoColor &&
	    pVisualInfo->class != DirectColor &&
	    pVisualInfo->class != GrayScale)
	    {

		error("Unable to use this visual class");
		exit(0);
	    }

	if (colorCount > pVisualInfo->colormap_size)
	    colorCount = pVisualInfo->colormap_size-2;
	
	map = XDefaultColormap(XtDisplay(toplevel),
				DefaultScreen(XtDisplay(toplevel)));

	XSetWindowColormap(XtDisplay(toplevel),XtWindow(toplevel),map);
	
	/* Set up a graphics context: */

	colors = (XColor *)XtMalloc(sizeof(*colors)*colorCount);
	
}

/*
**++
**  FUNCTIONAL DESCRIPTION:
**
**
**	And then load some colors into the color map
**
**
**--
*/


static void LoadColorMap(count)

int *count;
{

    unsigned int i,j,fullcount;
    double h,r,g,b;
    int rx,gx,bx;
    int dummy;

	while (!XAllocColorCells(XtDisplay(toplevel),
				map,0,&dummy,0,pixels,*count) && *count >= 1)
	    {
	    (*count)--;
	    }
	if (*count < 1)
	    {
	    error("Could not allocate enough colors");
	    exit(0);
	    }

	/* This loop find out if we are using WhitePixel and BlackPixel */

	fullcount = *count;

	for (j=0,i=0; i < fullcount; i++)
	    {
	    if (pixels[i]==BlackPixel(XtDisplay(toplevel),
				DefaultScreen(XtDisplay(toplevel))) || 
			pixels[i]==WhitePixel(XtDisplay(toplevel),
				DefaultScreen(XtDisplay(toplevel))))
		{
		if (XAllocColorCells(XtDisplay(toplevel),
					map,0,&dummy,0,&pixels[i],1))
		    i--; /*Got a replacement value; try it again*/
		else
		    (*count)--; /*No replacement; forget this one*/
		}
	    else
		{
		colors[j++].pixel = pixels[i];
		}
	    }

	if (*count < 1)
	    {
	    error("Could not allocate enough colors");
	    exit(0);
	    }

    /*This loop fills in the colors*/


    for (i=0; i<*count ; i++)
	{
	colors[i].flags=7;
	colors[i].red = 0;
	colors[i].green = 0;
	colors[i].blue = 0;
	}
    XStoreColors(XtDisplay(toplevel),map,colors,*count);

    UpdateColorMap(count);
}
    
/*
**++
**  FUNCTIONAL DESCRIPTION:
**
**
**	UpdateColorMap - actually sticks new values into color map
**
**
**
**--
*/


static void UpdateColorMap(count)

int *count;

{

int i;

    for (i=0; i<*count ; i++)
	{
	if (effect)
		{
		colors[i].flags=doprimary;
		colors[i].red = ((i*256)/(*count)) * 256 * red_mult;
		colors[i].green = ((i*256)/(*count))* 256 * green_mult;
		colors[i].blue = ((i*256)/(*count))*256 * blue_mult;
		}
	else
		{
		colors[i].flags=doprimary;
		colors[i].red = ((i*256)/(*count)) * 256 << red_mult;
		colors[i].green = ((i*256)/(*count))* 256 << green_mult;
		colors[i].blue = ((i*256)/(*count))*256 << blue_mult;
		}
	}

    XStoreColors(XtDisplay(toplevel),map,colors,*count);

}

    

721.3X$CREATE_IMAGE example from Guide to Xlib Programming STAR::PARKERFri May 05 1989 15:05216
Here's the entire X$CREATE_IMAGE example from Guide to Xlib Programming. 
Note the use of X$SET_FOREGROUND to reset the foreground after the 
call to X$FILL_POLYGON.

Hope this helps.

****************

 
      INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF'
 
      INTEGER*4 DPY			! DISPLAY ID
      INTEGER*4 SCREEN			! SCREEN ID
      INTEGER*4 WINDOW			! WINDOW ID
      INTEGER*4 ATTR_MASK		! ATTRIBUTES MASK
      INTEGER*4 GC			! GC ID
      INTEGER*4 FONT			! FONT ID
      INTEGER*4 DEFINE_COLOR		! COLOR FUNCTION
      INTEGER*4 WINDOW_X, WINDOW_Y	! WINDOW ORIGIN
      INTEGER*4 PIXMAP                  ! PIXMAP ID
      INTEGER*4 DEPTH			! NUMBER OF PLANES
      INTEGER*4 STATUS, FUNC		! SYNCHRONOUS BEHAVIOR
      INTEGER*4 STATE			! FLAG FOR TEXT
      INTEGER*4 EXPOSE_FLAG
 
      RECORD /X$VISUAL/ VISUAL			! VISUAL TYPE
      RECORD /X$SET_WIN_ATTRIBUTES/ XSWDA	! WINDOW ATTRIBUTES
      RECORD /X$GC_VALUES/ XGCVL		! GC VALUES
      RECORD /X$SIZE_HINTS/ XSZHN		! HINTS
      RECORD /X$EVENT/ EVENT			! INPUT EVENT
      RECORD /X$IMAGE/ IMAGE
 
      CHARACTER*33 WINDOW_NAME
      DATA WINDOW_NAME /'Xlib Raster Graphics Test Program'/
      CHARACTER*60 FONT_NAME
      DATA FONT_NAME
     1 /'-ADOBE-NEW CENTURY SCHOOLBOOK-MEDIUM-R-NORMAL--*-140-*-*-P-*'/
 
      PARAMETER	WINDOW_W = 600, WINDOW_H = 600,
     1          PIX_WIDTH = 512, PIX_HEIGHT = 512,
     1          BITMAP_PAD = 8, BYTES_PER_LINE=0,
     1          SRC_X = 0, SRC_Y = 0, DST_X = 50, DST_Y = 50
 
      BYTE OUTMAP(262144)
 
      DATA OUTMAP/262144*250/
 
C
C	INITIALIZE DISPLAY ID AND SCREEN ID
C
      DPY = X$OPEN_DISPLAY()
      IF (DPY .EQ. 0) THEN
           WRITE(6,*) 'DISPLAY NOT OPENED!'
           CALL SYS$EXIT(%VAL(1))
      ENDIF
      SCREEN = X$DEFAULT_SCREEN_OF_DISPLAY(DPY)
 
      STATUS = X$SYNCHRONIZE(DPY,1,FUNC)
C
C	CREATE THE WINDOW WINDOW
C
      WINDOW_X = (X$WIDTH_OF_SCREEN(DPY) - WINDOW_W) / 2
      WINDOW_Y = (X$HEIGHT_OF_SCREEN(DPY) - WINDOW_H) / 2
      DEPTH = X$DEFAULT_DEPTH_OF_SCREEN(SCREEN)
      CALL X$DEFAULT_VISUAL_OF_SCREEN(SCREEN,VISUAL)
      ATTR_MASK = X$M_CW_EVENT_MASK .OR. X$M_CW_BACK_PIXEL
 
      XSWDA.X$L_SWDA_EVENT_MASK = X$M_EXPOSURE .OR. X$M_BUTTON_PRESS
      XSWDA.X$L_SWDA_BACKGROUND_PIXEL =
     1    DEFINE_COLOR(DPY,SCREEN,VISUAL,1)
 
      WINDOW = X$CREATE_WINDOW(DPY,
     1    X$ROOT_WINDOW_OF_SCREEN(SCREEN),
     1    WINDOW_X, WINDOW_Y, WINDOW_W, WINDOW_H, 0,
     1    DEPTH, X$C_INPUT_OUTPUT, VISUAL, ATTR_MASK, XSWDA)
C
C	CREATE GRAPHICS CONTEXT
C
      XGCVL.X$L_GCVL_FOREGROUND =
     1    DEFINE_COLOR(DPY,SCREEN,VISUAL,2)
 
      XGCVL.X$L_GCVL_BACKGROUND =
     1    DEFINE_COLOR(DPY,SCREEN,VISUAL,3)
 
      GC = X$CREATE_GC(DPY, WINDOW,
     1    (X$M_GC_FOREGROUND .OR. X$M_GC_BACKGROUND), XGCVL)
C
C	CREATE IMAGE
C
 
      CALL X$CREATE_IMAGE(DPY,VISUAL,DEPTH,X$C_Z_PIXMAP,
     1      0,OUTMAP,PIX_WIDTH,PIX_HEIGHT,BITMAP_PAD,
     1      BYTES_PER_LINE,IMAGE)
 
      CALL X$PUT_IMAGE(DPY,WINDOW,GC,IMAGE,SRC_X,SRC_Y,
     1  DST_X,DST_Y,PIX_WIDTH,PIX_HEIGHT)      
 
C
C	LOAD THE FONT FOR TEXT WRITING 
C 	
	FONT = X$LOAD_FONT(DPY, FONT_NAME)
	CALL X$SET_FONT(DPY, GC, FONT)

C
C    Create the pixmap
C
        PIXMAP = X$CREATE_PIXMAP(DPY, WINDOW, WINDOW_W, WINDOW_H, DEPTH)

	CALL X$FILL_RECTANGLE(DPY, PIXMAP, GC, 0, 0, WINDOW_W, WINDOW_H)

        CALL X$SET_FOREGROUND(DPY, GC, DEFINE_COLOR(DPY, SCREEN, 
	1              VISUAL, 3))
        CALL X$FILL_POLYGON(DPY, PIXMAP, GC, PT_ARR, 6, X$C_COMPLEX,
	1	       X$C_COORD_MODE_ORIGIN)
        CALL X$SET_FOREGROUND(DPY, GC, DEFINE_COLOR(DPY, SCREEN, 
	1              VISUAL, 2)) 
        

C
C	Define the size and name of the WINDOW window
C

	XSZHN.X$L_SZHN_X = 212
	XSZHN.X$L_SZHN_Y = 132
	XSZHN.X$L_SZHN_WIDTH = 600
	XSZHN.X$L_SZHN_HEIGHT = 600
	XSZHN.X$L_SZHN_FLAGS = X$M_P_POSITION .OR. X$M_P_SIZE

	CALL X$SET_NORMAL_HINTS(DPY, WINDOW, XSZHN)
	CALL X$STORE_NAME(DPY, WINDOW, 
	1   'Creating a Pixmap for Backing Store')

C
C	Map the window
C
	CALL X$MAP_WINDOW(DPY, WINDOW)

C
C	Handle events
C
	DO WHILE (.TRUE.)

	    CALL X$NEXT_EVENT(DPY, EVENT)

	    IF (EVENT.EVNT_TYPE .EQ. X$C_EXPOSE) THEN
		CALL X$DRAW_IMAGE_STRING(DPY, WINDOW, GC, 
	1	    150, 25, 'To create a filled polygon, press MB1')
		CALL X$DRAW_IMAGE_STRING(DPY, WINDOW, GC, 
	1	    150, 50, 'To exit, press MB2')
                IF (EXPOSE_FLAG .EQ. 0) THEN
                    EXPOSE_FLAG = 1
                ELSE
                    CALL X$COPY_AREA(DPY, PIXMAP, WINDOW, GC, 0, 0,
	1               WINDOW_W, WINDOW_H, 0, 0)
		    CALL X$DRAW_IMAGE_STRING(DPY, WINDOW, GC, 
	1	        150, 50, 'To exit, press MB2')
	        END IF           
            END IF 

	    IF (EVENT.EVNT_TYPE .EQ. X$C_BUTTON_PRESS .AND.
	1	EVENT.EVNT_BUTTON.X$L_BTEV_BUTTON .EQ. X$C_BUTTON1) THEN
                CALL X$COPY_AREA(DPY, PIXMAP, WINDOW, GC, 0, 0,
	1           WINDOW_W, WINDOW_H, 0, 0)
		CALL X$DRAW_IMAGE_STRING(DPY, WINDOW, GC, 
	1	    150, 50, 'To exit, press MB2')
	    ENDIF	

	    IF (EVENT.EVNT_TYPE .EQ. X$C_BUTTON_PRESS .AND.
	1	EVENT.EVNT_BUTTON.X$L_BTEV_BUTTON .EQ. X$C_BUTTON2) THEN
	        CALL X$FREE_PIXMAP(DPY, PIXMAP)
                CALL SYS$EXIT(%VAL(1))
	    END IF
	END DO

	END
C
C    Create color
C
	INTEGER*4 FUNCTION DEFINE_COLOR(DISP, SCRN, VISU, N)

	INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF'

	INTEGER*4 DISP, SCRN, N
	RECORD /X$VISUAL/ VISU	    ! visual type
    	RECORD /X$COLOR/ SCREEN_COLOR
	INTEGER*4 STR_SIZE, STATUS, COLOR_MAP
	CHARACTER*15 COLOR_NAME(3)
	DATA COLOR_NAME /'DARK SLATE BLUE','LIGHT GREY     ','WHITE          '/

	IF (VISU.X$L_VISU_CLASS .EQ. X$C_PSEUDO_COLOR .OR.
	1   VISU.X$L_VISU_CLASS .EQ. X$C_DIRECT_COLOR) THEN

	    COLOR_MAP = X$DEFAULT_COLORMAP_OF_SCREEN(SCRN)
	    STATUS = STR$TRIM(COLOR_NAME(N),
	1		COLOR_NAME(N), STR_SIZE)
	    STATUS = X$ALLOC_NAMED_COLOR(DISP, COLOR_MAP,
	1		 COLOR_NAME(N)(1:STR_SIZE), SCREEN_COLOR)
	    IF (STATUS .NE. 0) THEN
		DEFINE_COLOR = SCREEN_COLOR.X$L_COLR_PIXEL
	    ELSE
		WRITE(6,*) 'Color not allocated!'
		CALL LIB$SIGNAL(%VAL(STATUS))
		DEFINE_COLOR = 0
	    END IF
	ELSE
	    IF (N .EQ. 1 .OR. N .EQ. 3)
	1	 DEFINE_COLOR = X$BLACK_PIXEL_OF_SCREEN(DISP)

	    IF (N .EQ. 2 )
	1	 DEFINE_COLOR = X$WHITE_PIXEL_OF_SCREEN(DISP)
	END IF

	RETURN
	END


721.4colormap manipulation: same problemSALSA::HUFFcsMon May 08 1989 22:1146
Thanks Jim, for the complete and revised fortran example.
        
I have tried manipulating colormaps with the following code inserted before
the X$CREATE_IMAGE call:
 
	C
	C	CREATE THE COLOR MAP
	C
	      CMAP = X$CREATE_COLORMAP(DPY,WINDOW,VISUAL,X$C_ALLOC_ALL)
	C
	C       STORE COLOR VALUES IN THE COLORMAP
	C
	      COLOR.X$L_COLR_PIXEL = 250
	      COLOR.X$W_COLR_RED = 100
	      COLOR.X$W_COLR_GREEN = 200
	      COLOR.X$W_COLR_BLUE = 50
	      COLOR.X$B_COLR_FLAGS = X$M_DO_RED .OR. X$M_DO_GREEN 
	     1                             .OR. X$M_DO_BLUE
	      CALL X$STORE_COLOR(DPY,CMAP,COLOR)
	
 
The result of the above code is the following error message generated by
execution of the CALL X$STORE_COLOR instruction. The program continues to
put up the window as before, with no apparent mapping of the image to the
window.
 
I also tried:
 
	      DSCREEN = X$DEFAULT_SCREEN(DPY)
	      CMAP = X$DEFAULT_COLORMAP(DPY,DSCREEN)
 
	and
 
	      CMAP = X$DEFAULT_COLORMAP_OF_SCREEN(SCREEN)
 
	in place of 
 
	      CMAP = X$CREATE_COLORMAP(DPY,WINDOW,VISUAL,X$C_ALLOC_ALL)
 
	with the same results.
 
Any ideas?
    
    

721.5PSW::WINALSKIPaul S. WinalskiTue May 09 1989 15:537
>The result of the above code is the following error message generated by
>execution of the CALL X$STORE_COLOR instruction. The program continues to

Er, you never did tell us what the error message was!

--PSW

721.6Q.E.D.16631::HUFFcsThu May 18 1989 18:576
    It seems that the error message from the call to X$STORE_COLOR is
    no longer relevant. We've worked through the problems with the examples
    pointed to; thanks much.
    
    Ste