Fix help compilation (was broken since https://codereview.scilab.org/#/c/16319/)
[scilab.git] / scilab / modules / graphics / macros / scatterScanVargin.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) Scilab Enterprises - 2015 - 2012 - Juergen Koch <juergen.koch@hs-esslingen.de>
3 // 
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at    
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 function [S,C,thickness,markStyle,markFg,markBg,fill,scanFailed] = scatterScanVargin(argins,nextArgin,n)
11
12     scanFailed = %F;
13     
14     // check for size argument
15     S = [];
16     if  size(argins) >= nextArgin then
17         if isempty(argins(nextArgin)) then
18             nextArgin = nextArgin + 1;
19         else
20             if type(argins(nextArgin)) == 1 then
21                 [n1,n2] = size(argins(nextArgin));
22                 if (n1 == 1 & n2 == 1) | (n1 == n & n2 == 1) | (n1 == 1 & n2 == n) then
23                     S = argins(nextArgin);
24                     if iscolumn(S) then
25                         S = S.';
26                     end
27                     nextArgin = nextArgin + 1;
28                 else
29                     warning("S must be a scalar or a vector of the same length as X.");
30                     scanFailed = %T;
31                     return;
32                 end
33             end
34         end
35     end
36
37     // check for color argument
38     C = [];
39     if  size(argins) >= nextArgin then
40         if isempty(argins(nextArgin)) then
41             nextArgin = nextArgin + 1;
42         else
43             [n1,n2] = size(argins(nextArgin));
44             if type(argins(nextArgin)) == 1 then
45                 if (n1 == n & n2 == 1) | (n1 == 1 & n2 == n) then
46                     C = scatterLinearColorMap(argins(nextArgin));
47                     nextArgin = nextArgin + 1;
48                 elseif n1 == n & n2 == 3 then
49                     C = addcolor(argins(nextArgin));            
50                     nextArgin = nextArgin + 1;
51                 else
52                     warning("C must be a vector or a matrix of the same length as X.");
53                     scanFailed = %T;
54                     return;
55                 end
56                 if iscolumn(C) then
57                     C = C.';
58                 end
59             elseif type(argins(nextArgin)) == 10 then
60                 if n1 == 1 & n2 == 1 then
61                     // check if string specifies a color
62                     colorRGB = name2rgb(argins(nextArgin));
63                     if ~isempty(colorRGB) then
64                         C = addcolor(colorRGB/255);
65                         nextArgin = nextArgin + 1;
66                     end        
67                 elseif (n1 == n & n2 == 1) | (n1 == 1 & n2 == n) then
68                     C = addcolor(name2rgb(argins(nextArgin))/255);
69                     if isempty(C) then
70                         warning("Wrong color specified.");
71                         scanFailed = %T;
72                         return;
73                     else
74                          nextArgin = nextArgin + 1;
75                     end
76                 end
77             end
78         end
79     end
80
81     // check for "fill" argument
82     fill = %F;
83     if  size(argins) >= nextArgin then
84         if type(argins(nextArgin)) == 10 then
85             if argins(nextArgin) == "fill" then
86                 fill = %T;
87                 nextArgin = nextArgin + 1;
88             end
89         end
90     end
91
92     // check for marker argument
93     markStyle = 9; // default circle
94     if  size(argins) >= nextArgin then
95         if type(argins(nextArgin)) == 10 then
96             ms = getMarkStyle(argins(nextArgin));
97             if ms >= 0 & ms <= 14 then
98                 markStyle = ms;
99                 nextArgin = nextArgin + 1;
100             end
101         end
102     end
103
104     // check for property-value pairs
105     markFg = -1;
106     markBg = -1;
107     thickness = 1.0; // default
108     while  size(argins) >= nextArgin do
109         if size(argins) == nextArgin then
110             warning("Incorrect number of inputs for property-value pairs.");
111             scanFailed = %T;
112             return;
113         else
114             select argins(nextArgin)
115             case "marker"
116                 markStyle = getMarkStyle(argins(nextArgin+1));
117                 if markStyle == -1 then
118                     warning(strcat([argins(nextArgin+1) " is not a valid value for property marker."]));
119                     scanFailed = %T;
120                     return;
121                 end
122             case "markerStyle"
123                 markStyle = getMarkStyle(argin(nextArgin+1));
124                 if markStyle == -1 then
125                     warning(strcat([argins(nextArgin+1) " is not a valid value for property markerStyle."]));
126                     scanFailed = %T;
127                     return;
128                 end
129             case "markerEdgeColor"
130                 markFg = colorIndex(argins(nextArgin+1));
131                 if markFg == -1 then
132                     warning(strcat([argins(nextArgin+1) " is not a valid value for property markerEdgeColor."]));
133                     scanFailed = %T;
134                     return;
135                 end;
136             case "markerForeground"
137                 markFg = colorIndex(argins(nextArgin+1));
138                 if markFg == -1 then
139                     warning(strcat([argins(nextArgin+1) " is not a valid value for property markerForeground."]));
140                     scanFailed = %T;
141                     return;
142                 end;
143             case "markerFaceColor"
144                 fill = %T;
145                 markBg = colorIndex(argins(nextArgin+1));
146                 if markBg == -1 then
147                     warning(strcat([argins(nextArgin+1) " is not a valid value for property markerFaceColor."]));
148                     scanFailed = %T;
149                     return;
150                 end;
151             case "markerBackground"
152                 fill = %T;
153                 markBg = colorIndex(argins(nextArgin+1));
154                 if markBg == -1 then
155                     warning(strcat([argins(nextArgin+1) " is not a valid value for property markerBackground."]));
156                     scanFailed = %T;
157                     return;
158                 end;
159             case "linewidth"
160                 if type(argins(nextArgin+1)) == 1 then
161                     thickness = argins(nextArgin+1);
162                 else
163                     warning(strcat([argins(nextArgin+1) " is not a valid value for property linewidth."]));
164                     scanFailed = %T;
165                     return;
166                 end 
167             case "thickness"
168                 if type(argins(nextArgin+1)) == 1 then
169                     thickness = argins(nextArgin+1);
170                 else
171                     warning(strcat([argins(nextArgin+1) " is not a valid value for property thickness."]));
172                     scanFailed = %T;
173                     return;
174                 end
175             else
176                 warning(strcat(["There is no " argins(nextArgin) " property on the Scatter class."]));
177                 scanFailed = %T;
178                 return;
179             end
180         end
181         nextArgin = nextArgin + 2;
182     end
183
184 endfunction
185
186 function colorInd = colorIndex(colorSpec)
187     colorInd = -1;
188     if type(colorSpec) == 10 & size(colorSpec) == [1 1] then
189         colorRGB = name2rgb(colorSpec);
190         if ~isempty(colorRGB) then
191             colorInd = addcolor(colorRGB/255);
192             return;
193         end
194     elseif type(colorSpec) == 1 & (size(colorSpec) == [1 3] | size(colorSpec) == [3 1]) then
195         colorInd = addcolor(colorSpec);
196         return; 
197     end
198     warning("Specified string is an invalid color value.");
199 endfunction
200
201 function markStyle = getMarkStyle(name)
202     if type(name) ~= 10 then
203         markStyle = -1;
204     else
205         select name
206         case "."
207             markStyle = 0;
208         case "+"
209             markStyle = 1;
210         case "x"
211             markStyle = 2;
212         case "circle plus"
213             markStyle = 3;
214         case "filled diamond"
215             markStyle = 4;
216         case "d"
217             markStyle = 5;
218         case "diamond"
219             markStyle = 5;
220         case "^"
221             markStyle = 6;
222         case "v"
223             markStyle = 7;
224         case "diamond plus"
225             markStyle = 8;
226         case "o"
227             markStyle = 9;
228         case "*"
229             markStyle = 10;
230         case "s"
231             markStyle = 11;
232         case "square"
233             markStyle = 11;
234         case ">"
235             markStyle = 12;
236         case "<"
237             markStyle = 13;
238         case "p"
239             markStyle = 14;
240         case "pentagram"
241             markStyle = 14;
242         else
243             markStyle = -1;
244         end
245     end
246 endfunction
247
248 function colorIndex = scatterLinearColorMap(colorValue)
249     cMin = min(colorValue);
250     cMax = max(colorValue);
251     cmap = get(gcf(),"color_map");
252     numColors = size(cmap,1);
253     if (cMax-cMin > %eps) then
254         colorIndex = (numColors-1)*(colorValue - cMin)/(cMax - cMin) + 1;
255     else
256         colorIndex = 1; // default color index
257     end
258 endfunction