Also update the URL to the CeCILL license. Thanks to Paul for noticing that
[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 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at
7 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
8
9 function [c] = getcolor(Title,cini)
10
11     [lhs,rhs] = argn(0)
12
13     if rhs==0 then
14         Title = "";
15         cini = 1;
16     elseif rhs==1 then
17         if type(Title)~=10 then
18             error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"), "getcolor", 1));
19         end
20         if size(Title, "*")~=1 then
21             error(msprintf(gettext("%s: Wrong size for input argument #%d: A string expected.\n"), "getcolor", 1));
22         end
23         cini = 1;
24     elseif rhs==2 then
25         if type(Title)~=10 then
26             error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"), "getcolor", 1));
27         end
28         if size(Title, "*")~=1 then
29             error(msprintf(gettext("%s: Wrong size for input argument #%d: A string expected.\n"), "getcolor", 1));
30         end
31         if type(cini)~=1 then
32             error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected.\n"), "getcolor", 2));
33         end
34         if size(cini, "*")~=1 then
35             error(msprintf(gettext("%s: Wrong size for input argument #%d: A real expected.\n"), "getcolor", 2));
36         end
37     else
38         error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"), "getcolor", 2, 0, 2));
39     end
40
41     if winsid()~=[] then
42         curFig = gcf();
43         cmap = curFig.color_map;
44         curwin = curFig.figure_id;
45     else
46         cmap = []
47         curwin = []
48     end;
49
50     // create the window for getcolor
51     win = max(winsid()) + 1;
52     scf(win);
53
54     sdf;
55     sda;
56     fig = gcf();
57     if cmap~=[] then
58         fig.color_map = cmap;
59     else
60         cmap = fig.color_map;
61     end;
62
63     N = size(cmap,1);
64     wdim = [1,1];
65     r = wdim(1)/wdim(2);
66     n = round(sqrt(N/r));
67     m = int(n*r);
68     H = m*45; // These numbers set the size of the getcolor window
69     W = n*45;
70     fig.figure_size = [H,W];
71
72     toolbar(win, "off")
73
74     delmenu(win,gettext("&File"))
75     delmenu(win,gettext("&Tools"))
76     delmenu(win,gettext("&Edit"))
77     delmenu(win,gettext("&?"))
78
79     dx = wdim(1)/m;
80     dy = wdim(2)/n;
81     x = -dx;
82     y = wdim(2);
83     R = [0;0;dx*0.95;dy*0.95];
84     rects = [];
85     for k = 1:N
86         if modulo(k,n)==1 then
87             x = x+dx;
88             y = wdim(2);
89         end;
90         rects = [rects,R+[x;y;0;0]];
91         y = y-dy;
92     end;
93
94     if Title~="" then
95         xsetech([-1/8,0,1+1/6,1+1/6-1/8],[0,0,wdim(1),wdim(2)]);
96     else
97         xsetech([-1/8,-1/8,1+1/6,1+1/6],[0,0,wdim(1),wdim(2)]);
98     end;
99     // rectangles with the colors
100     xrects(rects,1:N);
101     // frame around the colors
102     r = m*n-N;
103     ddx = 0.05*dx;
104     ddy = 0.05*dy;
105     if r==0 then
106         xpoly([-ddx,1,1,-ddx],[0,0,1+ddy,1+ddy],"lines",1);
107     else
108         xpoly([-ddx,1-1/n,1-1/n,1,1,-ddx],[0,0,r/m,r/m,1+ddy,1+ddy],"lines",1);
109     end;
110
111     // title
112     if Title~="" then
113         xtitle(Title);
114         t = gce();
115         t.font_size = 4;
116         t.font_style = 6;
117     end;
118
119     k1 = min(max(cini,1),N);
120     xrects(rects(eye(),k1),-k1);
121     e = gce();
122     rector = e.children;
123     rector.thickness = 4;
124     rector.foreground = color(255*(1-cmap(k1,1)),255*(1-cmap(k1,2)),255*(1-cmap(k1,3)));
125
126     //add a menu and its callback
127     done = %f;
128     Ok = "execstr("+gettext("Ok")+"_"+string(win)+"(1))";
129     Cancel = "execstr("+gettext("Cancel")+"_"+string(win)+"(1))";
130
131     addmenu(win, gettext("Ok"));
132     addmenu(win, gettext("Cancel"));
133
134     c_i = 0;
135     c = cini;
136     windowCloseButton = -1000;
137     while %t
138         str = "";
139         [c_i,cx,cy,cw,str] = xclick();
140         if (c_i == windowCloseButton) then
141             // window has been closed
142             k = [];
143             c = [];
144             break;
145         elseif (c_i== -2) then
146             if str==Ok then k = k1; c = k; break;end;
147             if str==Cancel then k = []; c = []; break;end;
148         end;
149
150         mc = int(cx/dx)+1;
151         nc = n-int(cy/dy);
152         k = (mc-1)*n+nc;
153         if or(c_i==[0,3])&k<=N&k>0 then
154             if k1~=0 then
155                 move(rector,[rects(1,k)-rects(1,k1),rects(2,k)-rects(2,k1)]);
156                 rector.foreground = color(255*(1-cmap(k,1)),255*(1-cmap(k,2)),255*(1-cmap(k,3)));
157             end;
158             k1 = k;
159             name = rgb2name(cmap(k,eye())*255);
160             fig.info_message = ..
161             gettext("Color number")+" "+string(k)+": R="+string(floor(cmap(k,1)*255))+" G="+string(floor(cmap(k,2)*255))+" B="+string(floor(cmap(k,3)*255))+" "+gettext("Name")+"="""+name(1)+"""";
162
163
164         end;
165     end;
166
167     if (c_i <> windowCloseButton) then
168         delete(fig);
169     end
170
171     if curwin~=[] then
172         scf(curwin);
173     end;
174
175
176 endfunction
177