razdan@oakhill.UUCP (Anshuman Razdan) (12/07/89)
ANOTHER PLEA FOR HELP !!!
I am trying to install a private colormap for my application. I am following
the procedure listed below :
1. Open the display and initialize the toolkit
2. Get display (mxdisplay).
3. Allocate 16(thats howmany colors I can have on a 4 plane system) c
lor cells and initialize their flagsd to DoRed|DoGreen|DoBlue.
4. Since all the 16 colors I want (stored in char array colornames) are
in the default rgb.txt, I next used XParseColor to get the RGB values
XError: BadMatch, invalid parameter attributes
Request Major Code 78 ()
Request Minor Code
ResourceID 0x800000
Error Serial #6
Current Serial #23
I am including the sorce code here for perusal of XGuru's
#include <stdio.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/StringDefs.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
Display *mxdisplay;
static int colorflag = MFALSE;
static char *colornames[] = { "black",
"white",
"red",
"DarkGreen",
"blue",
"gold",
"magenta",
"maroon",
"cyan",
"pink",
"orange",
"violet",
"khaki",
"dark olive green",
"thistle",
"brown",
"tan",
"gray",
"plum",
"firebrick",
"lime green",
"coral",
"green yellow",
"navy",
"cornflower blue",
"blue violet",
""
} ;
main(argc,argv )
int argc;
char *argv[];
{
extern MXcreateAndInstallCmap();
extern char *MPpaste();
extern char *getenv();
char *home;
char *mpostrc;
mxdisplay = XOpenDisplay(NULL);
MXcreateAndInstallCmap();
}
/***************************************************************************/
/* see what happens */
MXcreateAndInstallCmap()
{
XColor cells[16], *exact;
int ncolors, i;
int scrn = DefaultScreen(mxdisplay);
Colormap defcmap = XDefaultColormap(mxdisplay,scrn);
Visual *visual;
visual = DefaultVisual(mxdisplay,scrn);
ncolors = DisplayCells(mxdisplay,scrn);
cmap = XCreateColormap(mxdisplay,RootWindow(mxdisplay,scrn),visual,AllocAll);
for(i = 0; i < 16; i++){ /* 16 to ncolors */
cells[i].flags = DoRed | DoGreen | DoBlue;
cells[i].pixel = i;
XParseColor(mxdisplay,defcmap,colornames[i],cells[i]);
} /* for */
XStoreColors(mxdisplay,cmap,&cells[0],16); /* 16 to ncolors */
} /* End of install Color map */
If the above is succesfull( given I am doing something wrong some where)
I want to access the colors by their pixels i.e. if I want to find pixel value
of "blue" I call the following routine :
/**************************************************************************/
/** Routine : MXgetColor
Function:Using installed or default color map of the system it converts a string
to pixel from the default colormap. It gets the color map
just once at time of initialiasing the application **/
/**************************************************************************/
Pixel MXgetColor(name)
char *name;
{
static Colormap defcmap;
XColor *scdef, *exactdef;
Pixel pixel;
int cells;
char *colorname;
if(cmap == NULL && !colorflag){
defcmap = XDefaultColormap(mxdisplay, DefaultScreen(mxdisplay));
cells = XDisplayCells(mxdisplay,XDefaultScreen(mxdisplay));
colorflag = MTRUE;
} /* if */
else defcmap = cmap;
scdef = NULL;exactdef = NULL;
scdef = (XColor *)XtMalloc(sizeof(XColor));
exactdef = (XColor *)XtMalloc(sizeof(XColor));
if(XAllocNamedColor(mxdisplay,defcmap,name,scdef,exactdef) == 0)
return((Pixel)1);
pixel = exactdef->pixel;
XtFree(scdef); XtFree(exactdef);
return(pixel);
} /* End fo MXgetColor */
************************************************************
What am I doing wrong ?? or better Is ther a better way to approach this problem ?
Thanx in advance
Pl. e-mail or post any solutions.
Anshuman Razdan
Sector CAD
Motorola Austin Tx.