From 1fda03382e38aece33e855039bd0ded384dc50cc Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Mon, 13 Jan 2020 23:11:01 +0100 Subject: [PATCH] color input for text/grids (color1), background (color0) and graphs (color2-22) on Windows via set color2=red set color2=rgb:ff/0/0 set color2=rgbd:255,0,0 several examples given in the example files --- examples/utf-8/стекло/ext-utf8-2.cir | 6 +-- examples/utf-8/стекло/ext-utf8-c.cir | 2 +- examples/utf-8/стекло/ext-utf8-c2.cir | 59 ++++++++++++++++++++++ src/frontend/wdisp/wincolor.c | 70 +++++++++++++++++++++++++-- 4 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 examples/utf-8/стекло/ext-utf8-c2.cir diff --git a/examples/utf-8/стекло/ext-utf8-2.cir b/examples/utf-8/стекло/ext-utf8-2.cir index 53f2072dc..e12d0cb08 100644 --- a/examples/utf-8/стекло/ext-utf8-2.cir +++ b/examples/utf-8/стекло/ext-utf8-2.cir @@ -1,10 +1,10 @@ * test de titré .control set hcopydevtype = postscript -set hcopypscolor=25 +set hcopypscolor=18 set hcopypstxcolor=21 set hcopyscale=1 -set color2=rgb:F/0/0 +set color2=rgb:FF/0/0 setcs hcopyfont=Arial set hcopyfontsize=18 @@ -18,8 +18,6 @@ setcs xfont='Noto Sans Chinese' set gridwidth=4 set xbrushwidth=1 -hardcopy - plot y vs x xlabel 'Labellisé X' ylabel 'Labellisé Y: ÜüÖöÄäÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ' title 'Titré' plot y vs x xlabel '我能吞下玻璃而不伤身体' ylabel 'Я могу есть стекло, оно мне не вредит' title ' أنا قادر على أكل الزجاج و هذا لا يؤلمني.' * With Linux the next one requires: export LC_CTYPE ="de_DE.UTF-8" diff --git a/examples/utf-8/стекло/ext-utf8-c.cir b/examples/utf-8/стекло/ext-utf8-c.cir index 4ee9ec66b..149977a56 100644 --- a/examples/utf-8/стекло/ext-utf8-c.cir +++ b/examples/utf-8/стекло/ext-utf8-c.cir @@ -1,4 +1,4 @@ -* test de titré +titré 'test of various color inputs for background, text/grid and graphs 1' .control set hcopydevtype = postscript set hcopypscolor=25 diff --git a/examples/utf-8/стекло/ext-utf8-c2.cir b/examples/utf-8/стекло/ext-utf8-c2.cir new file mode 100644 index 000000000..08eea2af8 --- /dev/null +++ b/examples/utf-8/стекло/ext-utf8-c2.cir @@ -0,0 +1,59 @@ +* titré 'test of various color inputs for background, text/grid and graphs 2' +.control +set hcopydevtype = postscript +set hcopypscolor=25 +set hcopypstxcolor=21 +set hcopyscale=1 +*set color2=rgb:F/0/0 + +setcs hcopyfont=Arial +set hcopyfontsize=18 + + +let x = vector(5) +let y = exp(x) +setcs wfont=Arial +set wfont_size=18 +setcs xfont='Noto Sans' +*set xfont_size=18 + +set gridwidth=4 +set xbrushwidth=1 +set color0=white +*set color2=brown +set color2=rgbd:255/0/0 +plot y vs x xlabel 'Labellisé X' ylabel 'Labellisé Y: ÜüÖöÄäÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ' title 'Titré' +set color0=black +plot y vs x xlabel '我能吞下玻璃而不伤身体' ylabel 'Я могу есть стекло, оно мне не вредит' title ' أنا قادر على أكل الزجاج و هذا لا يؤلمني.' +* With Linux the next one requires: export LC_CTYPE ="de_DE.UTF-8" +*gnuplot test.gn y vs x xlabel 'Labellisé X' ylabel 'tüTÄtö Äü @µ€~' title 'ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ ' +set color0=Blue +set color1=Yellow +set color2=rgb:00/FF/00 +set gridwidth=1 +set xbrushwidth=4 +plot y vs x+0.001 xlabel 'Labellisé X' ylabel 'Labellisé Y' title 'Titré 私はガラスを食べられます。それは私を傷つけません' loglog +unset color1 +set color0=MediumBlue +set color2=Magenta +plot y vs x+0.001 xlabel 'Labellisé X' title 'Titré' loglog +set color0=GreenYellow +set color2=rgbd:128/128/75 +plot y vs x+0.001 xlabel 'Labellisé X' title 'Titré' loglog +set color0=black +set color2=pink +plot y vs x xlabel '래도 아프지 않아요' ylabel '私はガラスを食べられます' title ' أنا قادر على أكل الزجاج و هذا لا يؤلمني.' + +* With Linux the next one requires: export LC_CTYPE ="de_DE.UTF-8" +*gnuplot test2.gn y vs x xlabel 'Labellisé X' ylabel 'tüTÄtö Äü @µ€~' title 'ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ ' + +*hardcopy plot_5.ps y vs x xlabel 'Labellisé X' ylabel 'Labellisé Y' title 'Titré Äü @µ€~' +*shell Start /B plot_5.ps +*shell gv plot_5.ps & + +echo 나는 유리를 먹을 수 있어요. 그래도 아프지 않아요 +echo 私はガラスを食べられます。それは私を傷つけません +echo 我能吞下玻璃而不伤身体 + +*quit +.endc diff --git a/src/frontend/wdisp/wincolor.c b/src/frontend/wdisp/wincolor.c index 7b5b361ce..d5382c84c 100644 --- a/src/frontend/wdisp/wincolor.c +++ b/src/frontend/wdisp/wincolor.c @@ -43,7 +43,57 @@ void wincolor_init_hash(COLORREF *ColorTable, int noc) ColorTable[i] = 0; } } +/* evaluate rgb:0/FF/F0 rgb:0/F/0 rgbd:295/0/128 */ +static COLORREF get_wincolor_rgb(char *costr) +{ + char *tmpstr; + if (ciprefix("rgb:", costr)) { + char *t1, *t2, *t3; + tmpstr = costr + 4; + if (tmpstr) { + t1 = gettok_char(&tmpstr, '/', FALSE, FALSE); + tmpstr++; + t2 = gettok_char(&tmpstr, '/', FALSE, FALSE); + tmpstr++; + t3 = copy(tmpstr); + if (t1 && t2 && t3) { + int c1, c2, c3; + c1 = (int) strtol(t1, NULL, 16); + c2 = (int) strtol(t2, NULL, 16); + c3 = (int) strtol(t3, NULL, 16); + tfree(t1); + tfree(t2); + tfree(t3); + return RGB(c1, c2, c3); + } + } + } + else if (ciprefix("rgbd:", costr)) { + char *t1, *t2, *t3; + tmpstr = costr + 5; + if (tmpstr) { + t1 = gettok_char(&tmpstr, '/', FALSE, FALSE); + tmpstr++; + t2 = gettok_char(&tmpstr, '/', FALSE, FALSE); + tmpstr++; + t3 = copy(tmpstr); + if (t1 && t2 && t3) { + int c1, c2, c3; + c1 = (int) strtol(t1, NULL, 10); + c2 = (int) strtol(t2, NULL, 10); + c3 = (int) strtol(t3, NULL, 10); + tfree(t1); + tfree(t2); + tfree(t3); + return RGB(c1, c2, c3); + } + } + } + + fprintf(stderr, "Error: Cannot detect color in string %s, setting Web Green\n", costr); + return RGB(0, 128, 0); +} /* ColorTable[0]: background, ColorTable[1]: grid, text */ void wincolor_init(COLORREF* ColorTable, int noc) @@ -64,8 +114,9 @@ void wincolor_init(COLORREF* ColorTable, int noc) if (!cp_getvar(buf, CP_STRING, colorstring, sizeof(colorstring))) { if (i == 1) { /* switch the grid and text color depending on background */ - int tcolor = GetRValue(ColorTable[0]) + GetGValue(ColorTable[0]) + GetBValue(ColorTable[0]); - if (tcolor > 250) { + int tcolor = GetRValue(ColorTable[0]) + + (int)(1.5 * GetGValue(ColorTable[0])) + GetBValue(ColorTable[0]); + if (tcolor > 360) { ColorTable[1] = RGB(0, 0, 0); i++; bgisblack = FALSE; @@ -84,6 +135,11 @@ void wincolor_init(COLORREF* ColorTable, int noc) else (void)strcpy(colorstring, stdcolornames[i]); } + else if (ciprefix("rgb", colorstring)){ + ColorTable[i] = get_wincolor_rgb(colorstring); + i++; + continue; + } ColorTable[i] = get_wincolor(colorstring, nocolor); i++; } @@ -97,7 +153,10 @@ void wincolor_redo(COLORREF* ColorTable, int noc) int nocolor = NUMELEMS(ctable); while (i < noc) { - /* when color0 is set to white and color1 is not given, set ColorTable[2] to black */ + /* when color0 is set to white and color1 is not given, set text and grid color + as ColorTable[1] to black, when color0 is any other color, select black or + white text and grid color according to a weighted value derived from color0. + This selection is a compromise based on visibility.*/ (void)sprintf(buf, "color%d", i); if (!cp_getvar(buf, CP_STRING, colorstring, sizeof(colorstring))) { if (i == 1) { @@ -123,6 +182,11 @@ void wincolor_redo(COLORREF* ColorTable, int noc) else (void)strcpy(colorstring, stdcolornames[i]); } + else if (ciprefix("rgb", colorstring)) { + ColorTable[i] = get_wincolor_rgb(colorstring); + i++; + continue; + } ColorTable[i] = get_wincolor(colorstring, nocolor); i++; }