/*
 * -- $Header: /cec/src/nestor/servers/R3/shXlib/XAllPlanes.c,v 1.1.1.1 90/04/23 09:51:34 spanachi Exp $
 */
#include "copyright.h"

/* $XConsortium: XAllPlanes.c,v 11.15 88/09/06 16:11:45 jim Exp $ */
/* Copyright    Massachusetts Institute of Technology    1986	*/
/* -- MULTIPLEX Extension -- */
#define NEED_REPLIES
#include "Xlibint.h"

/* -- additional includes -- */
#include "utils.h"
#include "map.h"

Status XAllocColorPlanes(calling_dpy, cmap, contig, pixels, ncolors, 
			 nreds, ngreens, 
                         nblues, rmask, gmask, bmask)
register Display *calling_dpy;
Colormap cmap;
Bool contig;
unsigned long pixels[]; /* LISTofCARD32 */ /* RETURN */
int ncolors;
int nreds, ngreens, nblues;
unsigned long *rmask, *gmask, *bmask; /* CARD32 */ /* RETURN */
{
    xAllocColorPlanesReply rep;
    Status status;
    register xAllocColorPlanesReq *req;

    register Display *dpy ;
    unsigned long     new_masks[ 3 ] ,
                      dflt_masks[ 3 ] ,
                     *new_pixels  ;
    register int      i ;

    /* -- flush dpy to keep buffers aligned -- */
    XmuXFlushDefault( calling_dpy ) ;

    if( ncolors )
	if( ( new_pixels = ( unsigned long * ) 
	      Xmalloc( ncolors * sizeof( long ) ) ) == NULL ) 
	{
	    errno = ENOMEM ;
	    ( * _XIOErrorFunction )( calling_dpy ) ;
	}

    status = True ;
    for( i = 0 ; 
	 ( dpy = XmuXGetDisplay( calling_dpy , i ) ) != NULL && status ; i++ ) 
    {
	LockDisplay(dpy);
	GetReq(AllocColorPlanes,req);

	if( i )
	    req->cmap = XmuXMapID( dpy , cmap , FromClient );
	else
	    req->cmap = cmap ;

	req->colors = ncolors;
	req->red = nreds;
	req->green = ngreens;
	req->blue = nblues;
	req->contiguous = contig;

	status = _XReply(dpy, (xReply *)&rep, 0, xFalse);

	if (status) 
	{
	    if( i == 0 )
	    {
		*rmask = rep.redMask;
		*gmask = rep.greenMask;
		*bmask = rep.blueMask;
		/* sizeof(CARD32) = 4 */
		_XRead32 (dpy, (char *) pixels, (long)(ncolors * 4));
		
		if( XmuXStoreResources( dpy ) )
		{
		    dflt_masks[ 0 ] = rep.redMask;
		    dflt_masks[ 1 ] = rep.greenMask ;
		    dflt_masks[ 2 ] = rep.blueMask ;
		    XmuXUpdateColormapInfo( dpy , req->cmap , pixels , 
					    ncolors , dflt_masks , 3 , False ,
					    False ) ;
		}
	    }
	    else
	    {
		new_masks[ 0 ] = rep.redMask;
		new_masks[ 1 ] = rep.greenMask ;
		new_masks[ 2 ] = rep.blueMask ;
		/* sizeof(CARD32) = 4 */
		_XRead32 (dpy, (char *) new_pixels, (long)(ncolors * 4));
		
		XmuXInsertPrivateCells( dpy , req->cmap , new_pixels , pixels ,
				        ncolors , new_masks , dflt_masks , 3 , 
				        False ) ;
	    }
	}

	UnlockDisplay(dpy);
	SyncHandle();
    }
    if( new_pixels )
	Xfree( ( char * ) new_pixels ) ;
    return(status);
}    
