Merge remote-tracking branch 'origin/6.1'
[scilab.git] / scilab / modules / graphics / macros / getcolor.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2012 - 2016 - Scilab Enterprises
4 // Copyright (C) 2017, 2021 - Samuel GOUGEON
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function [c] = getcolor(Title,cini)
14
15     [lhs,rhs] = argn(0)
16
17     if rhs==0 then
18         Title = "";
19         cini = 1;
20     elseif rhs==1 then
21         if type(Title)~=10 then
22             msg = gettext("%s: Wrong type for input argument #%d: string expected.\n")
23             error(msprintf(msg, "getcolor", 1));
24         end
25         if size(Title, "*")~=1 then
26             msg = gettext("%s: Wrong size for input argument #%d: string expected.\n")
27             error(msprintf(msg, "getcolor", 1));
28         end
29         cini = 1;
30     elseif rhs==2 then
31         if type(Title)~=10 then
32             msg = gettext("%s: Wrong type for input argument #%d: string expected.\n")
33             error(msprintf(msg, "getcolor", 1));
34         end
35         if size(Title, "*")~=1 then
36             msg = gettext("%s: Wrong size for input argument #%d: string expected.\n")
37             error(msprintf(msg, "getcolor", 1));
38         end
39         if type(cini)~=1 then
40             msg = gettext("%s: Wrong type for input argument #%d: A real expected.\n")
41             error(msprintf(msg, "getcolor", 2));
42         end
43         if size(cini, "*")~=1 then
44             msg = gettext("%s: Wrong size for input argument #%d: A real expected.\n")
45             error(msprintf(msg, "getcolor", 2));
46         end
47     else
48         msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
49         error(msprintf(msg, "getcolor", 2, 0, 2));
50     end
51
52     if winsid()~=[] then
53         curFig = gcf();
54         cmap = curFig.color_map;
55         curwin = curFig.figure_id;
56     else
57         cmap = []
58         curwin = []
59     end
60
61     // create the window for getcolor
62     fig = figure("visible","off","background",-2); //scf();
63     win = fig.figure_id;
64
65     sdf;    // quite agressive. Not sure it is actually useful
66     sda;    // same remark
67     if cmap~=[] then
68         fig.color_map = cmap;
69         fig.figure_name = gettext("Current colormap")
70     else
71         cmap = fig.color_map;
72         fig.figure_name = gettext("Default colormap")
73     end;
74
75     N = size(cmap,1);
76     wdim = [1,1];
77     m = ceil(sqrt(N));
78     n = ceil(N/m);
79     [W, H] = (max(m*35,320), n*40)  // minW=320 for infos in status bar
80     fig.axes_size = [W,H];
81     // position = center of screen:
82     c = get(0,"screensize_px")
83     fig.figure_position = [c(3)-W, c(4)-fig.figure_size(2)]/2
84
85     toolbar(win, "off")
86     delmenu(win, gettext("&File"))
87     delmenu(win, gettext("&Tools"))
88     delmenu(win, gettext("&Edit"))
89     delmenu(win, gettext("&?"))
90
91     dx = wdim(1)/m;
92     dy = wdim(2)/n;
93     x = -dx;
94     y = wdim(2);
95     R = [0;0;dx*0.95;dy*0.95];
96     rects = [];
97     for k = 1:N
98         if modulo(k,n)==1 then
99             x = x+dx;
100             y = wdim(2);
101         end;
102         rects = [rects,R+[x;y;0;0]];
103         y = y-dy;
104     end
105
106     if Title~="" then
107         xsetech([-1/8,0,1+1/6,1+1/6-1/8],[0,0,wdim(1),wdim(2)]);
108     else
109         xsetech([-1/8,-1/8,1+1/6,1+1/6],[0,0,wdim(1),wdim(2)]);
110     end
111     // rectangles with the colors
112     xrects(rects,1:N);
113
114     // frame around the colors
115     r = m*n-N;
116     ddx = 0.05*dx;
117     ddy = 0.05*dy;
118     if abs(r)<0.1 then
119         xpoly([-ddx,1,1,-ddx],[0,0,1+ddy,1+ddy],"lines",1);
120     else
121         xpoly([-ddx, 1-dx, 1-dx, 1   ,   1  ,-ddx],..
122               [  0 ,   0 , r*dy, r*dy, 1+ddy,1+ddy], "lines",1);
123     end
124
125     // title
126     if Title~="" then
127         title(Title, "fontsize",3, "font_style",6)
128     end
129
130     k1 = min(max(cini,1),N);
131     xrects(rects(eye(),k1),-k1);
132     e = gce();
133     rector = e.children;
134     rector.thickness = 4;
135     rector.foreground = color(255*(1-cmap(k1,1)),255*(1-cmap(k1,2)),255*(1-cmap(k1,3)));
136
137     //add a menu and its callback
138     done = %f;
139     Ok = "execstr("+gettext("Ok")+"_"+string(win)+"(1))";
140     Cancel = "execstr("+gettext("Cancel")+"_"+string(win)+"(1))";
141
142     addmenu(win, gettext("Ok"));
143     addmenu(win, gettext("Cancel"));
144     set(gca(),"tight_limits","on","axes_bounds",[0 0 1 1],"margins",[.05 .05 .15 .05]);
145     fig.visible = "on";
146
147     c_i = 0;
148     c = cini;
149     windowCloseButton = -1000;
150     while %t
151         str = "";
152         [c_i,cx,cy,cw,str] = xclick();
153         if (c_i == windowCloseButton) then
154             // window has been closed
155             k = [];
156             c = [];
157             break;
158         elseif (c_i== -2) then
159             if str==Ok then k = k1; c = k; break;end;
160             if str==Cancel then k = []; c = []; break;end;
161         end
162
163         mc = int(cx/dx)+1;
164         nc = n-int(cy/dy);
165         k = (mc-1)*n+nc;
166         if or(c_i==[0,3])&k<=N&k>0 then
167             if k1~=0 then
168                 move(rector,[rects(1,k)-rects(1,k1),rects(2,k)-rects(2,k1)]);
169                 rector.foreground = color(255*(1-cmap(k,1)),255*(1-cmap(k,2)),255*(1-cmap(k,3)));
170             end;
171             k1 = k;
172             name = rgb2name(cmap(k,eye())*255);
173             txt = msprintf("RGB(%d)=[%d %d %d]",k,cmap(k,1:3)*255);
174             if name~=[]
175                 txt = txt + " : """ + name(1) + """"
176             end
177             fig.info_message = txt
178         end
179     end
180
181     if (c_i <> windowCloseButton) then
182         delete(fig);
183     end
184
185     if curwin~=[] then
186         scf(curwin);
187     end
188 endfunction
189