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