switch to colorarray in graph to string all color data,

one set per each graph.
If we are zooming or selecting a cutout, copy the
source graph's colors to the new graph. Transfer the
old graphs id to the new graph via graph->graphid.
This commit is contained in:
Holger Vogt 2020-02-12 21:17:41 +01:00
parent 0d4fe21269
commit f1972850ec
1 changed files with 61 additions and 26 deletions

View File

@ -151,7 +151,6 @@ X11_Init(void)
XGCValues gcvalues;
/* grrr, Xtk forced contortions */
char *argv[2];
int argc = 2;
@ -245,11 +244,11 @@ initcolors(GRAPH *graph)
if (numdispplanes == 1) {
/* black and white */
xmaxcolors = 2;
DEVDEP(graph).colors[0] = DEVDEP(graph).view->core.background_pixel;
if (DEVDEP(graph).colors[0] == WhitePixel(display, DefaultScreen(display)))
DEVDEP(graph).colors[1] = BlackPixel(display, DefaultScreen(display));
graph->colorarray[0] = DEVDEP(graph).view->core.background_pixel;
if (graph->colorarray[0] == WhitePixel(display, DefaultScreen(display)))
graph->colorarray[1] = BlackPixel(display, DefaultScreen(display));
else
DEVDEP(graph).colors[1] = WhitePixel(display, DefaultScreen(display));
graph->colorarray[1] = WhitePixel(display, DefaultScreen(display));
} else {
if (numdispplanes < NXPLANES)
@ -298,7 +297,7 @@ initcolors(GRAPH *graph)
(void) sprintf(ErrorMessage,
"can't get color %s\n", colorstring);
externalerror(ErrorMessage);
DEVDEP(graph).colors[i] = i ? BlackPixel(display,
graph->colorarray[i] = i ? BlackPixel(display,
DefaultScreen(display))
: WhitePixel(display, DefaultScreen(display));
continue;
@ -313,26 +312,24 @@ initcolors(GRAPH *graph)
/* switch the grid and text color depending on background */
int tcolor = (int)bgcolor.red + (int)(1.5 * bgcolor.green) + (int)bgcolor.blue;
if (tcolor > 92160) {
DEVDEP(graph).colors[1] = BlackPixel(display, DefaultScreen(display));
graph->colorarray[1] = BlackPixel(display, DefaultScreen(display));
strncpy(DEVDEP(graph).txtcolor, "black", 15);
}
else {
DEVDEP(graph).colors[1] = WhitePixel(display, DefaultScreen(display));
graph->colorarray[1] = WhitePixel(display, DefaultScreen(display));
strncpy(DEVDEP(graph).txtcolor, "white", 15);
}
}
else {
DEVDEP(graph).colors[i] = visualcolor.pixel;
graph->colorarray[i] = visualcolor.pixel;
if (i == 1)
strncpy(DEVDEP(graph).txtcolor, colorstring, 15);
}
}
/* MW. Set Beackgroound here */
XSetWindowBackground(display, DEVDEP(graph).window, DEVDEP(graph).colors[0]);
}
for (i = xmaxcolors; i < NUMCOLORS; i++) {
DEVDEP(graph).colors[i] = DEVDEP(graph).colors[i + 1 - xmaxcolors];
graph->colorarray[i] = graph->colorarray[i + 1 - xmaxcolors];
}
}
@ -422,6 +419,7 @@ X11_NewViewport(GRAPH *graph)
XSetWindowAttributes w_attrs;
XGCValues gcvalues;
XGCValues gridgcvalues;
GRAPH *pgraph = NULL;
static Arg formargs[ ] = {
{ XtNleft, (XtArgVal) XtChainLeft },
@ -553,15 +551,34 @@ X11_NewViewport(GRAPH *graph)
XChangeWindowAttributes(display, DEVDEP(graph).window, CWBitGravity,
&w_attrs);
int linewidth, gridwidth;
int linewidth, gridlinewidth;
/* If we had a previous graph, e.g. after zooming, we
have to set the background color already here, because
background is set below */
if (graph->mgraphid > 0) {
pgraph = FindGraph(graph->mgraphid);
}
/* get linewidth information from .spiceinit or .control section */
if (!cp_getvar("xbrushwidth", CP_NUM, &linewidth, 0))
gcvalues.line_width = MW_LINEWIDTH;
linewidth = MW_LINEWIDTH;
if (linewidth < 0)
linewidth = MW_LINEWIDTH;
if (pgraph)
gcvalues.line_width = graph->graphwidth = pgraph->graphwidth;
else
gcvalues.line_width = linewidth;
if (!cp_getvar("gridwidth", CP_NUM, &gridwidth, 0))
gridgcvalues.line_width = MW_LINEWIDTH;
gcvalues.line_width = graph->graphwidth = linewidth;
/* get linewidth information from .spiceinit or .control section */
if (!cp_getvar("gridwidth", CP_NUM, &gridlinewidth, 0))
gridlinewidth = MW_LINEWIDTH;
if (gridlinewidth < 0)
gridlinewidth = MW_LINEWIDTH;
if (pgraph)
gridgcvalues.line_width = graph->gridwidth = pgraph->gridwidth;
else
gridgcvalues.line_width = gridwidth;
gridgcvalues.line_width = graph->gridwidth = gridlinewidth;
gridgcvalues.cap_style = gcvalues.cap_style = CapNotLast;
gridgcvalues.function = gcvalues.function = GXcopy;
#ifndef HAVE_LIBXFT
@ -586,6 +603,15 @@ X11_NewViewport(GRAPH *graph)
initlinestyles();
initcolors(graph);
/* we have a 'mother' graph and want to get its colors */
int i;
if(pgraph) {
for(i = 0; i < 25; i++)
graph->colorarray[i] = pgraph->colorarray[i];
}
XSetWindowBackground(display, DEVDEP(graph).window, graph->colorarray[0]);
/* set up cursor */
cursor = XCreateFontCursor(display, XC_left_ptr);
XDefineCursor(display, DEVDEP(graph).window, cursor);
@ -738,7 +764,16 @@ int X11_DefineXft(GRAPH *graph)
Colormap cmap = DefaultColormap(display, 0);
XftColor color;
XftColorAllocName(display, DefaultVisual(display, 0), cmap, DEVDEP(graph).txtcolor, &color);
XRenderColor rcolor;
XColor xxcolor;
/* pixel -> XColor -> XftColor */
xxcolor.pixel = graph->colorarray[1];
XQueryColor(display, cmap, &xxcolor);
rcolor.alpha = 65535;
rcolor.red = xxcolor.red;
rcolor.green = xxcolor.green;
rcolor.blue = xxcolor.blue;
XftColorAllocValue(display, DefaultVisual(display, 0), cmap, &rcolor, &color);
DEVDEP(graph).color = color;
DEVDEP(graph).cmap = cmap;
DEVDEP(graph).draw = XftDrawCreate(
@ -803,13 +838,13 @@ X11_SetLinestyle(int linestyleid)
int
X11_SetColor(int colorid)
X11_SetColor(int colorid, GRAPH *graph)
{
currentgraph->currentcolor = colorid;
XSetForeground(display, DEVDEP(currentgraph).gc,
DEVDEP(currentgraph).colors[colorid]);
currentgraph->colorarray[colorid]);
XSetForeground(display, DEVDEP(currentgraph).gridgc,
DEVDEP(currentgraph).colors[colorid]);
currentgraph->colorarray[colorid]);
return 0;
}
@ -1010,12 +1045,12 @@ zoomin(GRAPH *graph)
if (!eq(plot_cur->pl_typename, buf2)) {
(void) sprintf(buf,
"setplot %s; %s xlimit %.20e %.20e ylimit %.20e %.20e; setplot $curplot\n",
buf2, graph->commandline, fx0, fx1, fy0, fy1);
"setplot %s; %s xlimit %.20e %.20e ylimit %.20e %.20e sgraphid %d; setplot $curplot\n",
buf2, graph->commandline, fx0, fx1, fy0, fy1, graph->graphid);
} else {
/* set the foreground and background colors to the "calling" window's colors */
(void) sprintf(buf, "set color0=%s; set color1=%s; %s xlimit %e %e ylimit %e %e\n",
DEVDEP(graph).bgcolor, DEVDEP(graph).txtcolor, graph->commandline, fx0, fx1, fy0, fy1);
(void) sprintf(buf, "%s xlimit %e %e ylimit %e %e sgraphid %d\n",
graph->commandline, fx0, fx1, fy0, fy1, graph->graphid);
}
/* don't use the following if using GNU Readline or BSD EditLine */