/*
 * -- $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);
}
