bug 11411: save function used unsigned char to store length of string, now it is...
[scilab.git] / scilab / modules / graphics / macros / %h_load.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2004 - INRIA - Serge Steer
3 // Copyright (C) 2004-2006 - INRIA - Fabrice Leray
4 // Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5 // Copyright (C) 2010 - DIGITEO - Manuel Juliachs
6 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at
10 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11
12
13 function h=%h_load(fd)
14   global init_immediate_drawing
15   init_immediate_drawing = 0;
16
17   version=mget(4,'uc',fd)
18   // saving/loading character with 'c' is actually quite buggy
19   characterFormat = 'uc';
20   stringFormat = 'il';
21
22   immediate_drawing="";
23
24   h=[];
25
26   if is_higher_than([3 1 0 1]) then // case 3 1 0 2 and after
27     hsize = mget(2,characterFormat,fd)
28     for i=1:hsize(1)
29       for j=1:hsize(2)
30         [htmp,immediate_drawing] = load_graphichandle(fd)
31         h = [h htmp];
32       end
33     end
34   else
35     [h,immediate_drawing] = load_graphichandle(fd) // a single handle only can be loaded before 3 1 0 2
36   end
37   f=gcf();
38   f.immediate_drawing = immediate_drawing;
39   clearglobal init_immediate_drawing
40   clear init_immediate_drawing
41 endfunction
42
43 function [h,immediate_drawing] = load_graphichandle(fd)
44   global init_immediate_drawing
45   typ=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))
46   if typ<>'Figure'
47     f=gcf();
48     if init_immediate_drawing == 0
49       immediate_drawing = f.immediate_drawing;
50       f.immediate_drawing ='off';
51       init_immediate_drawing = 1;
52     end
53   end
54 //  mprintf('----------------------------- %s ----------------------\n',typ)
55     // Determines whether %h_load has been called by the xload macro
56     // in which case xload_mode is set to true
57     [lnums, fnames] = where();
58     ind = grep(fnames, 'xload');
59     xload_mode = (ind ~= []);
60
61   select typ
62   case "Figure"
63     if xload_mode then
64       h=gcf()
65       visible=toggle(mget(1,characterFormat,fd)); // visible
66       figure_position=mget(2,'sl',fd); // figure_position
67       figure_size=mget(2,'sl',fd); // figure_size
68       axes_size=mget(2,'sl',fd); //axes_size
69       if ( is_higher_than([4 1 2 0]) ) then
70         viewport = mget(2,'sl',fd) ; // viewport
71         if is_higher_than([5 4 0 0]) then
72             info_message = ascii(mget(mget(1,stringFormat,fd),characterFormat,fd)) ; // info_message
73         else
74             info_message = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // info_message
75         end
76         tag = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // tag
77       end
78       auto_resize=toggle(mget(1,characterFormat,fd)); // auto_resize
79       if is_higher_than([5 4 0 0]) then
80           figure_name=ascii(mget(mget(1,stringFormat,fd),characterFormat,fd)) // figure_name
81       else
82           figure_name=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // figure_name
83       end
84       figure_id=mget(1,'sl',fd); // figure_id
85       h.color_map=matrix(mget(mget(1,'il',fd),"dl",fd),-1,3) // color_map
86       pixmap=toggle(mget(1,characterFormat,fd)); // pixmap
87       pixel_drawing_mode=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // pixel_drawing_mode
88           if (is_higher_than([5 1 0 0])) then
89             anti_aliasing=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)); // anti_aliasing
90           end
91       immediate_drawing=toggle(mget(1,characterFormat,fd));// immediate drawing // init. global variable immediate_drawing
92       h.immediate_drawing = 'off';  // set it to 'off' to pass useless redraw due to several 'set' calls
93       h.background=mget(1,'il',fd) // background
94       rotation_style=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // rotation_style
95     else
96       visible=toggle(mget(1,characterFormat,fd)); // visible
97       figure_position=mget(2,'sl',fd); // figure_position
98       // if figure is iconified in old scilab version, its position is -32000, -32000]
99       figure_position = max(figure_position, [0,0]);
100       figure_size=mget(2,'sl',fd); // figure_size
101       axes_size=mget(2,'sl',fd); // axes_size
102       if ( is_higher_than([4 1 2 0]) ) then
103         viewport = mget(2,'sl',fd) ; // viewport
104         if is_higher_than([5 4 0 0]) then
105             info_message = ascii(mget(mget(1,stringFormat,fd),characterFormat,fd)) ; // info_message
106         else
107             info_message = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // info_message
108         end
109         tag = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // tag
110       end
111       auto_resize=toggle(mget(1,characterFormat,fd)); // auto_resize
112       if is_higher_than([5 4 0 0]) then
113           figure_name=ascii(mget(mget(1,stringFormat,fd),characterFormat,fd)) // figure_name
114       else
115           figure_name=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // figure_name
116       end
117       figure_id=mget(1,'sl',fd); // figure_id
118       // create the figure
119       h=scf(figure_id);
120        h.visible=visible;  // can be set now as we act on immediate_drawing everywhere else F.Leray 18.02.05
121       h.figure_position=figure_position
122           // set auto_resize first otherwise viewport modification may not have any effect.
123           h.auto_resize = auto_resize;
124           h.figure_size = figure_size;
125           // set axes_size last because it's more important than figure_size
126           h.axes_size = axes_size;
127
128       if ( is_higher_than([4 1 2 0]) ) then
129         h.viewport = viewport;
130         h.info_message = info_message ;
131         h.tag = tag ;
132       end
133       h.figure_name=figure_name
134       h.color_map=matrix(mget(mget(1,'il',fd),"dl",fd),-1,3) // color_map
135       h.pixmap=toggle(mget(1,characterFormat,fd)); // pixmap
136       h.pixel_drawing_mode=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // pixel_drawing_mode
137           if (is_higher_than([5 1 0 0])) then
138             h.anti_aliasing=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)); // anti_aliasing
139           end
140       immediate_drawing=toggle(mget(1,characterFormat,fd)); // immediate_drawing  // init. global variable immediate_drawing
141       h.immediate_drawing = 'off'; // set it to 'off' to pass useless redraw due to several 'set' calls
142       h.background=mget(1,'il',fd); // background
143       h.rotation_style = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // rotation_style
144
145     end
146
147     if ( is_higher_than([4 1 2 0]) ) then
148       h.event_handler = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // event_handler
149       h.event_handler_enable = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // event_handler_enable
150     end
151
152     if ( is_higher_than([5 2 0 0]) ) then // Added in 5.4.0 version
153         h.resizefcn = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // resizefcn
154         h.closerequestfcn = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // closerequestfcn
155     end
156
157     // children
158     n_axes=mget(1,'il',fd);
159     if n_axes==1 then
160       load_graphichandle(fd)
161     else
162       load_graphichandle(fd);
163       for k=2:n_axes
164         xsetech(wrect=[0 0 .1 .1])
165         load_graphichandle(fd)
166       end
167     end
168     load_user_data(fd); // user_data
169   case "Axes"
170     // Hack to determine whether %h_load has been called by the %h_copy macro
171     // in which case a new Axes object is created
172     [lnums, fnames]=where();
173     ind=grep(fnames, '%h_copy');
174
175     if(ind<>[]) then
176         newaxes();
177     end;
178
179     a=gca() ;
180     titl=a.title ;
181     x_label=a.x_label ;
182     y_label=a.y_label ;
183     set(a,"visible"              , toggle(mget(1,characterFormat,fd))) // visible
184     if and(version==[3 0 0 0]) then // axes_visible
185       axes_visible= toggle(mget(1,characterFormat,fd));
186       axes_visible=emptystr(1,3)+axes_visible
187     else
188       axes_visible= toggle(mget(mget(1,characterFormat,fd),characterFormat,fd)) ;
189     end
190
191     if is_higher_than( [3 1 0 1] ) then // axes_reverse
192       axes_reverse = toggle(mget(mget(1,characterFormat,fd),characterFormat,fd)) ;
193     end
194
195     set(a,"axes_visible", axes_visible)
196     set(a,"axes_reverse", axes_reverse)
197     set(a,"grid"        , mget(mget(1,characterFormat,fd),'il',fd)) //grid
198         if (is_higher_than([5 0 3 0])) then
199           set(a,"grid_position",ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))); // grid_position
200         else
201           set(a,"grid_position","background"); // grid_position
202         end
203     set(a,"x_location"  , ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))) // x_location
204     set(a,"y_location"  , ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))) // y_location
205
206     view            =  ascii(mget(2,characterFormat,fd)); // view
207
208     // title
209     set(titl,"visible"   , toggle(mget(1,characterFormat,fd))) // title.visible
210     if is_higher_than( [4 1 2 0] ) then
211       set(titl, "text", load_text_matrix( fd ) ) ;
212     else
213       set(titl,"text"      , ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))) // title.text
214     end
215     if is_higher_than([4 1 2 0]) then
216       set(titl,"font_foreground", mget(1,'il',fd)); // title.font_foreground
217       set(titl,"fractional_font", toggle(mget(1,characterFormat,fd))); //title.fractional_font
218     end
219     set(titl,"foreground", mget(1,'il',fd)); // title.foreground
220     if is_higher_than([3 1 0 0]) then
221       set(titl,"background"       , mget(1,'il',fd)); // title.background
222       set(titl,"fill_mode"        , toggle(mget(1,characterFormat,fd))); //title.fill_mode
223     end
224
225     set(titl,"font_style"       , mget(1,characterFormat,fd)); // title.font_style
226     set(titl,"font_size"        , mget(1,characterFormat,fd)); // title.font_size
227
228     if is_higher_than([3 1 0 0]) then
229       auto_rotation =  toggle(mget(1,characterFormat,fd)) ; // title.auto_rotation
230       set(titl,"font_angle"   , mget(1,'dl',fd)); // title.font_angle
231       auto_position = toggle(mget(1,characterFormat,fd)) ;  // title.auto_position
232       set(titl,"position"     , mget(2,'dl',fd)); // title.position
233       set( titl, "auto_rotation", auto_rotation ) ;
234       set( titl, "auto_position", auto_position ) ;
235     end
236
237     // x_label
238     set(x_label,"visible"   , toggle(mget(1,characterFormat,fd))) // x_label.visible
239     if is_higher_than( [4 1 2 0] ) then
240       set(x_label, "text", load_text_matrix( fd ) ) ;
241     else
242       set(x_label,"text"      , ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))) // title.text
243     end
244     if is_higher_than([4 1 2 0]) then
245       set(x_label,"font_foreground", mget(1,'il',fd)); // x_label.font_foreground
246       set(x_label,"fractional_font", toggle(mget(1,characterFormat,fd))); //x_label.fractional_font
247     end
248     set(x_label,"foreground", mget(1,'il',fd)); // x_label.foreground
249     if is_higher_than([3 0 0 0]) then
250       set(x_label,"background"       , mget(1,'il',fd)); // x_label.background
251       set(x_label,"fill_mode"        , toggle(mget(1,characterFormat,fd))); // x_label.fill_mode
252     end
253     set(x_label,"font_style"     , mget(1,characterFormat,fd)); // x_label.font_style
254     set(x_label,"font_size"      , mget(1,characterFormat,fd)); // x_label.font_size
255
256     if is_higher_than([3 0 0 0]) then
257       auto_rotation =  toggle(mget(1,characterFormat,fd)) ; // x_label.auto_rotation
258       set(x_label,"font_angle"   , mget(1,'dl',fd)); // x_label.font_angle
259       auto_position = toggle(mget(1,characterFormat,fd)) ; // x_label.auto_position
260       set( x_label,"position"     , mget(2,'dl',fd)); // x_label.position
261       set( x_label, "auto_rotation", auto_rotation ) ;
262       set( x_label, "auto_position", auto_position ) ;
263     end
264
265     // y_label
266     set(y_label,"visible"        , toggle(mget(1,characterFormat,fd)))
267     if is_higher_than( [4 1 2 0] ) then
268       set(y_label, "text", load_text_matrix( fd ) ) ;
269     else
270       set(y_label,"text"      , ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))) // title.text
271     end
272     if is_higher_than([4 1 2 0]) then
273       set(y_label,"font_foreground", mget(1,'il',fd)); // y_label.font_foreground
274       set(y_label,"fractional_font", toggle(mget(1,characterFormat,fd))); //y_label.fractional_font
275     end
276     set(y_label,"foreground"     , mget(1,'il',fd));
277     if is_higher_than([3 0 0 0]) then
278       set(y_label,"background"       , mget(1,'il',fd));
279       set(y_label,"fill_mode"        , toggle(mget(1,characterFormat,fd)));
280     end
281     set(y_label,"font_style"     , mget(1,characterFormat,fd));
282     set(y_label,"font_size"      , mget(1,characterFormat,fd));
283
284     if is_higher_than([3 0 0 0]) then
285       auto_rotation =  toggle(mget(1,characterFormat,fd)) ; // y_label.auto_rotation
286       set(y_label,"font_angle"   , mget(1,'dl',fd)); // y_label.font_angle
287       auto_position = toggle(mget(1,characterFormat,fd)) ; // y_label.auto_position
288       set( y_label,"position"     , mget(2,'dl',fd)); // y_label.position
289       set( y_label, "auto_rotation", auto_rotation ) ;
290       set( y_label, "auto_position", auto_position ) ;
291     end
292
293     if view=='3d' then
294       // z_label
295       z_label=a.z_label
296       set(z_label,"visible"        , toggle(mget(1,characterFormat,fd)))
297       if is_higher_than( [4 1 2 0] ) then
298         set(z_label, "text", load_text_matrix( fd ) ) ;
299       else
300         set(z_label,"text"      , ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))) // title.text
301       end
302       if is_higher_than([4 1 2 0]) then
303         set(z_label,"font_foreground", mget(1,'il',fd)); // z_label.font_foreground
304         set(z_label,"fractional_font", toggle(mget(1,characterFormat,fd))); //z_label.fractional_font
305       end
306       set(z_label,"foreground"     , mget(1,'il',fd));
307       if is_higher_than([3 0 0 0]) then
308         set(z_label,"background"       , mget(1,'il',fd));
309         set(z_label,"fill_mode"        , toggle(mget(1,characterFormat,fd)));
310       end
311       set(z_label,"font_style"     , mget(1,characterFormat,fd));
312       set(z_label,"font_size"      , mget(1,characterFormat,fd));
313
314       if is_higher_than([3 0 0 0]) then
315         auto_rotation =  toggle(mget(1,characterFormat,fd)) ; // z_label.auto_rotation
316         set(z_label,"font_angle"   , mget(1,'dl',fd)); // z_label.font_angle
317         auto_position = toggle(mget(1,characterFormat,fd)) ; // z_label.auto_position
318         set( z_label,"position"     , mget(2,'dl',fd)); // z_label.position
319         set( z_label, "auto_rotation", auto_rotation ) ;
320         set( z_label, "auto_position", auto_position ) ;
321       end
322     end
323
324
325
326     if is_higher_than([3 0 0 0]) then
327       auto_ticks=toggle(mget(mget(1,characterFormat,fd),characterFormat,fd)); // auto_ticks
328
329       ticks=['ticks','locations','labels']
330       sz=mget(1,'sl',fd) // x_ticks.locations
331       if sz>0 then
332         x_ticks_locations=mget(sz,'dl',fd)'
333         lz=mget(sz,characterFormat,fd) // x_ticks.label
334         x_ticks_labels=[];for ks=1:sz,x_ticks_labels(ks)=ascii(mget(lz(ks),characterFormat,fd));end
335         set(a,'x_ticks',tlist(ticks,x_ticks_locations,x_ticks_labels))
336       end
337
338       sz=mget(1,'sl',fd) // y_ticks.locations
339       if sz>0 then
340         y_ticks_locations=mget(sz,'dl',fd)'
341         lz=mget(sz,characterFormat,fd) // y_ticks.label
342         y_ticks_labels=[];for ks=1:sz,y_ticks_labels(ks)=ascii(mget(lz(ks),characterFormat,fd));end
343         set(a,'y_ticks',tlist(ticks,y_ticks_locations,y_ticks_labels))
344       end
345     
346       sz=mget(1,'sl',fd) // z_ticks.locations
347       if sz>0 then
348         z_ticks_locations=mget(sz,'dl',fd)'
349         lz=mget(sz,characterFormat,fd) // z_ticks.labels
350         z_ticks_labels=[];for ks=1:sz,z_ticks_labels(ks)=ascii(mget(lz(ks),characterFormat,fd));end
351         set(a,'z_ticks',tlist(ticks,z_ticks_locations,z_ticks_labels))
352       end
353       set(a,"auto_ticks"           , auto_ticks)
354     end
355     if is_higher_than([4 1 2 0]) then
356       // migth be now 'off','hidden_axis','back_half' or 'on'
357       boxtype = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ;
358       set( a, "box", boxtype  ) // box
359       set(a,"filled",  toggle(mget(1,characterFormat,fd) )); // filled
360     else
361       set(a, "box", toggle(mget(1,characterFormat,fd) ) ) // box
362     end
363
364     set(a,"sub_tics"             , mget(mget(1,characterFormat,fd),characterFormat,fd)) // sub_tics
365     if ~(is_higher_than([3 1 0 1]) ) then
366       mget(1,'il',fd); // tics_color is removed F.Leray 15.03.05
367     end
368     set(a,"font_style"           , mget(1,characterFormat,fd));  // font_style
369     set(a,"font_size"            , mget(1,characterFormat,fd));  // font_size
370     set(a,"font_color"           , mget(1,'il',fd)); // font_color
371     if is_higher_than([4 1 2 0]) then
372       set(a,"fractional_font", toggle(mget(1,characterFormat,fd))); // fractional_font
373     end
374     set(a,"isoview"              , toggle(mget(1,characterFormat,fd))) // isoview
375
376     cube_scaling    = toggle(mget(1,characterFormat,fd)) // cube_scaling
377     rotation_angles = mget(2,'dl',fd); // rotation_angles
378
379     if a.view=='2d' then
380       set(a,"view"               , view);
381     end
382     if a.view=='3d' then
383       set(a,"cube_scaling"      , cube_scaling)
384       if view=='3d' then
385         set(a,"rotation_angles"   , rotation_angles)
386       end
387     end
388
389     if is_higher_than([3 0 0 0]) then // log_flags
390       log_flags= ascii(mget(3,characterFormat,fd));
391     else
392       log_flags= ascii(mget(2,characterFormat,fd));
393     end
394
395
396     set(a,"tight_limits"         , toggle(mget(1,characterFormat,fd))) // tight_limits
397     data_bounds = matrix(mget(mget(1,characterFormat,fd),'dl',fd),2,-1) // data_bounds
398
399
400     if view=='2d'& a.view=='3d' then
401       data_bounds(2,3)=0;
402     end
403     if xload_mode
404       // check if a had at least a child previously
405       // if not the axes is considered unused
406       // and we don't merge the data_bounds.
407       if a.children <> []  then
408         old_bounds=a.data_bounds;
409         for k=1:size(old_bounds,2)
410           data_bounds(1,k)=min(data_bounds(1,k),old_bounds(1,k));
411           data_bounds(2,k)=max(data_bounds(2,k),old_bounds(2,k));
412         end
413       end
414     end
415     if is_higher_than([3 0 0 0]) then
416       zoom_box_size = mget(1,characterFormat,fd);
417       if zoom_box_size<>0 then
418         set(a,"zoom_box"          , mget(zoom_box_size,'dl',fd))  // zoom_box
419       end
420     end
421     if is_higher_than([3 1 0 1]) then
422       set(a,"margins"              , mget(4,'dl',fd))  // margins
423     end
424
425     set(a,"axes_bounds"          , mget(4,'dl',fd))  // axes_bounds
426     set(a,"auto_clear"           , toggle(mget(1,characterFormat,fd))) // auto_clear
427     set(a,"auto_scale"           , toggle(mget(1,characterFormat,fd))) // auto_scale
428
429     if is_higher_than([4 1 2 0] ) then // 4 0 0 0 and after
430       set(a,"hidden_axis_color", mget(1,'il',fd)) ; // hidden_axis_color
431       set(a, "arc_drawing_method", ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))); // arc_drawing_method
432     else
433       set(a, "arc_drawing_method", "nurbs"); // default value, real circle
434     end
435
436     set(a,"hiddencolor"          , mget(1,'il',fd)), // hidden_color
437     set(a,"line_mode"            , toggle(mget(1,characterFormat,fd))), // line_mode
438     line_style = mget(1,characterFormat,fd);
439     if line_style==0 then // 0 and 1 are equivalents and 0 is obsolete since Scilab 5.4.0
440         line_style=1;
441     end
442     set(a,"line_style"           , line_style) // line_style
443     set(a,"thickness"            , mget(1,'sl',fd)), // thickness
444     set(a,"mark_mode"            , toggle(mget(1,characterFormat,fd))), //mark_mode
445     set(a,"mark_style"           , mget(1,characterFormat,fd)) // mark_style
446     set(a,"mark_size"            , mget(1,characterFormat,fd)) // mark_size
447     if is_higher_than([3 0 0 0]) then
448
449       if ascii(mget(1,characterFormat,fd))=='t' then // mark_size_unit
450         msu='tabulated' ;
451       else
452         msu='point';
453       end
454
455       set(a,"mark_size_unit"   , msu)
456       set(a,"mark_foreground"      , mget(1,'il',fd)) ; // mark_foreground
457       set(a,"mark_background"      , mget(1,'il',fd)) ; // mark_background
458     else
459       set(a,"mark_size_unit"     , 'tabulated')
460     end
461     set(a,"foreground"           , mget(1,'il',fd)), // foreground
462     set(a,"background"           , mget(1,'il',fd)), // background
463     clip_state                   = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
464     if clip_state=='on' then // clip_box
465       set(a,"clip_box",mget(4,'dl',fd)) ;
466     end
467     set(a,"clip_state"           ,clip_state);
468
469     // children
470     nbChildren = mget(1,'il',fd) ;
471     for k = 1 : nbChildren
472        load_graphichandle(fd) ;
473     end
474     //next lines because tools used to rebuild children change the
475     //data_bounds an axes_visible properties
476     set(a,"data_bounds"          , data_bounds) ;
477     set(a,"log_flags"            , log_flags);
478
479     set(a,"axes_visible"          , axes_visible) ;
480     if is_higher_than([4 1 2 0] ) then
481       set(a, "box", boxtype ) ;
482     end
483
484     h=a;
485     load_user_data(fd) ; // user_data
486     global %LEG
487
488     if %LEG<>[] then
489       //get handles from paths
490       links=get_links_from_path(a,%LEG.paths)
491       if links<>[] then
492         L=captions(links,%LEG.text)
493         L.visible         = %LEG.visible
494         L.font_style      = %LEG.font_style
495         L.font_size       = %LEG.font_size
496         L.font_color      = %LEG.font_color
497         L.fractional_font = %LEG.fractional_font
498         L.mark_mode       = 'off';
499         L.legend_location = %LEG.legend_location
500         L.position        = %LEG.position
501         L.line_mode       = %LEG.line_mode
502         L.thickness       = %LEG.thickness
503         L.foreground      = %LEG.foreground
504         L.fill_mode       = %LEG.fill_mode
505         L.background      = %LEG.background
506         L.clip_state      = %LEG.clip_state
507         if %LEG.clip_state=='on' then
508           L.clip_box      = %LEG.clip_box
509         end
510         L.user_data       = %LEG.user_data
511       else
512          warning(msprintf(_("%s: Legend does not fit with the current context. Skipped\n"),"load"));
513       end
514     end
515     clearglobal %LEG
516
517   case "Polyline"
518
519     visible=toggle(mget(1,characterFormat,fd)) // visible
520     sz=mget(2,'il',fd); // data
521     data=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
522     if is_higher_than([3 1 0 0]) then
523       closed      = toggle(mget(1,characterFormat,fd)) // closed
524     end
525     line_mode      = toggle(mget(1,characterFormat,fd)) // line_mode
526     if is_higher_than([3 1 0 0]) then
527       fill_mode      = toggle(mget(1,characterFormat,fd)) // fill_mode
528     end
529     line_style     = mget(1,characterFormat,fd); // line_style
530     if line_style==0 then // 0 and 1 are equivalents and 0 is obsolete since Scilab 5.4.0
531         line_style=1;
532     end
533     thickness      = mget(1,'sl',fd); // thickness
534     if is_higher_than([3 1 0 1]) then
535       arrow_size_factor = mget(1,'sl',fd); // arrow_size_factor
536     end
537     polyline_style = mget(1,characterFormat,fd); // polyline_style
538
539     if is_higher_than([3 1 0 1] ) then
540       size_interp_color = mget(1,'sl',fd) ; // interp_color_vector
541       interp_color_vector = mget( size_interp_color, 'dl', fd ) ;
542       interp_color_mode   = toggle( mget( 1, characterFormat, fd ) ) ; // interp_color_mode
543     end
544
545     mark_mode      = toggle(mget(1,characterFormat,fd)) // mark_mode
546     mark_style     = mget(1,characterFormat,fd); // mark_style
547     mark_size      = mget(1,characterFormat,fd); // mark_size
548
549     msu='tabulated'
550     if is_higher_than([3 0 0 0]) then
551       if ascii(mget(1,characterFormat,fd))=='t' then // mark_size_unit
552         msu='tabulated' ;
553       else
554         msu='point';
555       end
556     end
557
558     foreground     = mget(1,'il',fd); // foreground
559
560     if is_higher_than([3 1 0 0]) then
561       background     = mget(1,'il',fd); // background
562     end
563
564     if is_higher_than([3 0 0 0]) then
565       mark_foreground=mget(1,'il',fd) // mark_foreground
566       mark_background=mget(1,'il',fd) // mark_background
567     end
568
569     if is_higher_than([3 1 0 0]) then
570       sz_x_shift=mget(1,'sl',fd) // x_shift
571       x_shift=mget(sz_x_shift,'dl',fd)'
572
573       sz_y_shift=mget(1,'sl',fd) // y_shift
574       y_shift=mget(sz_y_shift,'dl',fd)'
575
576       sz_z_shift=mget(1,'sl',fd) // z_shift
577       z_shift=mget(sz_z_shift,'dl',fd)'
578     end
579
580     if is_higher_than([3 1 0 1]) then
581       bar_width = mget( 1, 'dl', fd ) ; // bar_width
582     end
583
584     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
585
586     if clip_state=='on' then
587       clip_box     = mget(4,'dl',fd) ; // clip_box
588     else
589       clip_box = [] ;
590     end
591     // draw the polyline and set properties
592     xpoly(data(:,1),data(:,2))
593     //plot2d( data(:,1),data(:,2));
594     h=get('hdl')
595     set(h,"data",data)
596     set(h,"visible",visible)
597     set(h,"line_mode",line_mode),
598     set(h,"line_style",line_style)
599     set(h,"thickness",thickness)
600     set(h,"arrow_size_factor",arrow_size_factor);
601     set(h,"polyline_style",max(1,polyline_style)),
602     set(h,"mark_style",mark_style),
603     set(h,"mark_size",mark_size),
604     set(h,"mark_mode",mark_mode),
605     set(h,"foreground",foreground),
606     if is_higher_than([3 0 0 0]) then
607       set(h,"mark_size_unit",msu)
608       set(h,"mark_foreground",mark_foreground),
609       set(h,"mark_background",mark_background)
610     end
611     if is_higher_than([3 1 0 0]) then
612       set(h,"background",background)
613       set(h,"fill_mode",fill_mode)
614       set(h,"closed",closed);
615       set(h,'x_shift',x_shift);
616       set(h,'y_shift',y_shift);
617       set(h,'z_shift',z_shift);
618     end
619
620     if is_higher_than([3 1 0 1]) then
621       if interp_color_mode == 'on' & interp_color_vector~=[] then
622           set(h,"interp_color_vector",interp_color_vector);
623           set(h,"interp_color_mode","on");
624       else
625           if interp_color_vector~=[]
626               h.interp_color_vector = interp_color_vector
627           end
628           h.interp_color_mode = interp_color_mode
629       end
630       set(h,"bar_width",bar_width);
631     end
632
633     if clip_state =='' then clip_state='clipgrf',end
634     if clip_state=='on' then set(h,"clip_box",clip_box),end
635     set(h,"clip_state",clip_state);
636
637     load_user_data(fd) // user_data
638
639   case "Plot3d" then
640     visible=toggle(mget(1,characterFormat,fd)) // visible
641     surface_mode   = toggle(mget(1,characterFormat,fd)) // surface_mode
642     foreground     = mget(1,'il',fd); // foreground
643     thickness      = mget(1,'sl',fd); // thickness
644     mark_mode      = toggle(mget(1,characterFormat,fd)) // mark_mode
645     mark_style     = mget(1,characterFormat,fd); // mark_style
646     mark_size      = mget(1,characterFormat,fd); // mark_size
647
648     if is_higher_than([3 0 0 0]) then
649       if ascii(mget(1,characterFormat,fd))=='t' then // mark_size_unit
650           msu='tabulated' ;
651       else
652           msu='point';
653       end
654       mark_foreground=mget(1,'il',fd) // mark_foreground
655       mark_background=mget(1,'il',fd) // mark_background
656     else
657       msu='tabulated'
658     end
659
660     if is_higher_than([5 1 1 0]) then
661           color_mode     = mget(1,'il',fd); // color_mode
662           color_flag     = mget(1,'il',fd); // color_flag
663         else
664           color_mode     = mget(1,characterFormat,fd);
665           color_flag     = mget(1,characterFormat,fd);
666         end
667
668     sz=mget(2,'il',fd); // data.x
669     x=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
670     sz=mget(2,'il',fd); // data.y
671     y=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
672     sz=mget(2,'il',fd); // data.z
673     z=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
674
675     if or(color_flag==[2,5]) then
676          sz=mget(2,'il',fd); // data.color
677          clr=matrix(mget(prod(sz),'il',fd),sz(1),-1);
678     end
679     hiddencolor    = mget(1,'il',fd); // hidden_color
680
681     // plot3d modify the given rotation angles
682     // trick to force keeping the good rotation angles F.Leray 18.02.05
683     // same issue with axes properties... B.Jofret 21.04.09
684     a=gca();
685     rotation_angles = a.rotation_angles;
686     axes_visible = a.axes_visible;
687     box = a.box;
688     margins = a.margins;
689     x_label_visible = a.x_label.visible;
690     y_label_visible = a.y_label.visible;
691     z_label_visible = a.z_label.visible;
692         x_label_text = a.x_label.text;
693         y_label_text = a.y_label.text;
694         z_label_text = a.z_label.text;
695         axes_isoview = a.isoview;
696
697
698     if or(color_flag==[2 5]) then
699       plot3d1(x,y,list(z,clr))
700     else
701       plot3d(x,y,z)
702     end
703
704     // Restore this properties after plot3d.
705     a.rotation_angles = rotation_angles;
706     a.axes_visible = axes_visible;
707     a.box = box;
708     a.margins = margins;
709     a.x_label.visible = x_label_visible;
710     a.y_label.visible = y_label_visible;
711     a.z_label.visible = z_label_visible;
712         a.x_label.text = x_label_text;
713         a.y_label.text = y_label_text;
714         a.z_label.text = z_label_text;
715         a.isoview = axes_isoview;
716
717
718     h=gce();
719     set(h,"visible",visible)
720     set(h,"surface_mode",surface_mode)
721     set(h,"thickness",thickness)
722     set(h,"foreground",foreground),
723     set(h,"color_mode",color_mode),
724     set(h,"mark_style",mark_style),
725     set(h,"mark_size",mark_size),
726     if is_higher_than([3 0 0 0]) then
727       set(h,"mark_size_unit",msu),
728       set(h,"mark_foreground",mark_foreground),
729       set(h,"mark_background",mark_background)
730     end
731     set(h,"mark_mode",mark_mode)
732     set(h,"color_flag",color_flag),
733     set(h,"hiddencolor",hiddencolor),
734
735     if is_higher_than([4 1 2 0])
736       clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
737       if clip_state=='on' then
738         set(h,"clip_box", mget(4,'dl',fd)) // clip_box
739       end
740       set(h,"clip_state",clip_state);
741     end
742
743     load_user_data(fd)
744
745   case "Fac3d" then
746
747     visible=toggle(mget(1,characterFormat,fd)) // visible
748     surface_mode   = toggle(mget(1,characterFormat,fd)) // surface_mode
749     foreground     = mget(1,'il',fd); // foreground
750     thickness      = mget(1,'sl',fd); // thickness
751     mark_mode      = toggle(mget(1,characterFormat,fd)) // mark_mode
752     mark_style     = mget(1,characterFormat,fd); // mark_style
753     mark_size      = mget(1,characterFormat,fd); // mark_size
754     if is_higher_than([3 0 0 0]) then
755       if ascii(mget(1,characterFormat,fd))=='t' then // mark_size_unit
756         msu='tabulated';
757       else
758           msu='point';
759       end
760       mark_foreground=mget(1,'il',fd) ; // mark_foreground
761       mark_background=mget(1,'il',fd) ; // mark_background
762     end
763     if is_higher_than([5 1 1 0]) then
764           color_mode     = mget(1,'il',fd); // color_mode
765           color_flag     = mget(1,'il',fd); // color_flag
766         else
767           color_mode     = mget(1,characterFormat,fd);
768           color_flag     = mget(1,characterFormat,fd);
769         end
770
771     sz=mget(2,'il',fd); // data.x
772     x=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
773     sz=mget(2,'il',fd); // data.y
774     y=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
775     sz=mget(2,'il',fd); // data.z
776     z=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
777
778     if is_higher_than([3 1 0 1]) & color_flag >= 2 then
779       sz=mget(2,'il',fd); // data.z
780       clr=matrix(mget(prod(sz),'il',fd),sz(1),-1);
781
782       if ascii(mget(1,characterFormat,fd)) == 's' then // cdata_mapping
783         cdata_mapping = 'scaled' ;
784       else
785         cdata_mapping = 'direct'  ;
786       end
787
788     elseif or(color_flag==[2 5]) then
789       // compatibility with old version
790       sz=mget(2,'il',fd); // data.z
791       clr=matrix(mget(prod(sz),'il',fd),sz(1),-1);
792     end
793     hiddencolor    = mget(1,'il',fd); // hiddencolor
794
795     // plot3d modify the given rotation angles
796     // trick to force keeping the good rotation angles F.Leray 18.02.05
797     // same issue with axes properties... B.Jofret 21.04.09
798         // and labels text and isoview
799     a=gca();
800     rotation_angles = a.rotation_angles;
801     axes_visible = a.axes_visible;
802     box = a.box;
803     margins = a.margins;
804     x_label_visible = a.x_label.visible;
805     y_label_visible = a.y_label.visible;
806     z_label_visible = a.z_label.visible;
807         x_label_text = a.x_label.text;
808         y_label_text = a.y_label.text;
809         z_label_text = a.z_label.text;
810         axes_isoview = a.isoview;
811
812     if is_higher_than([3 1 0 1]) & color_flag >= 2 then
813       plot3d1(x,y,list(z,clr))
814     elseif or(color_flag==[2 5]) then
815       plot3d1(x,y,list(z,clr))
816     else
817       plot3d(x,y,z)
818     end
819
820    // Restore this properties after plot3d.
821     a.rotation_angles = rotation_angles;
822     a.axes_visible = axes_visible;
823     a.box = box;
824     a.margins = margins;
825     a.x_label.visible = x_label_visible;
826     a.y_label.visible = y_label_visible;
827     a.z_label.visible = z_label_visible;
828         a.x_label.text = x_label_text;
829         a.y_label.text = y_label_text;
830         a.z_label.text = z_label_text;
831         a.isoview = axes_isoview;
832
833     h=gce();
834     set(h,"visible",visible)
835     set(h,"surface_mode",surface_mode)
836     set(h,"thickness",thickness)
837     set(h,"foreground",foreground),
838     set(h,"color_mode",color_mode),
839     set(h,"color_flag",color_flag),
840     set(h,"hiddencolor",hiddencolor),
841     set(h,"mark_style",mark_style),
842     set(h,"mark_size",mark_size),
843     set(h,"mark_mode",mark_mode)
844     if is_higher_than([3 0 0 0]) then
845       set(h,"mark_size_unit",msu),
846       set(h,"mark_foreground",mark_foreground),
847       set(h,"mark_background",mark_background)
848     end
849
850     if is_higher_than([3 1 0 1]) & color_flag >= 2 then
851       set(h,"cdata_mapping",cdata_mapping);
852     end
853
854     if is_higher_than([4 1 2 0])
855       clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
856       if clip_state=='on' then
857         set(h,"clip_box", mget(4,'dl',fd)) // clip_box
858       end
859       set(h,"clip_state",clip_state);
860     end
861
862     load_user_data(fd) ; // user_data
863
864   case "Compound"
865     // children
866     n=mget(1,'il',fd)
867     H=[]
868     for k=1:n
869       htmp = load_graphichandle(fd)
870       H=[htmp H]
871     end
872     h=glue(H)
873     if is_higher_than([3 1 0 1]) then // visible
874      h.visible = toggle(mget(1,characterFormat,fd)) ;
875     end
876
877     load_user_data(fd) // user_data
878
879
880   case "Agregation" // for compatibility with old save
881
882     // children
883     n=mget(1,'il',fd)
884     H=[]
885     for k=1:n
886       htmp = load_graphichandle(fd)
887       H=[htmp H]
888     end
889     h=glue(H)
890
891     if is_higher_than([3 1 0 1]) then // visible
892       h.visible = toggle(mget(1,characterFormat,fd)) ;
893     end
894
895     load_user_data(fd) // user_data
896
897   case "Rectangle"
898     visible        = toggle(mget(1,characterFormat,fd)) // visible
899     thickness      = mget(1,'sl',fd); // thickness
900     mark_mode      = toggle(mget(1,characterFormat,fd)) // mark_mode
901     mark_style     = mget(1,characterFormat,fd); // mark_style
902     mark_size      = mget(1,characterFormat,fd); // mark_size
903     if is_higher_than([3 0 0 0]) then
904       if ascii(mget(1,characterFormat,fd))=='t' then // mark_size_unit
905         msu='tabulated' ;
906       else
907         msu='point';
908       end
909       mark_foreground=mget(1,'il',fd) // mark_foreground
910       mark_background=mget(1,'il',fd) // mark_background
911     else
912       msu='tabulated'
913     end
914
915     line_mode      = toggle(mget(1,characterFormat,fd)) ; // line_mode
916     line_style     = mget(1,characterFormat,fd); // line_style
917     if line_style==0 then // 0 and 1 are equivalents and 0 is obsolete since Scilab 5.4.0
918         line_style=1;
919     end
920     fill_mode      = toggle(mget(1,characterFormat,fd)) ; // fill_mode
921     foreground     = mget(1,'il',fd); // foreground
922
923     if is_higher_than([3 1 0 1]) then
924       background = mget(1,'il',fd); // background
925     end
926     if (is_higher_than([5 0 3 0])) then
927           // data size might be 4 or 5
928           data = mget(mget(1,'il',fd),'dl',fd); // data
929         else
930           parentAxes = gca();
931           if (parentAxes.view == "2d") then
932         data = mget(4,'dl',fd);
933           else
934             data = mget(5,'dl',fd);
935           end
936         end
937     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ; // clip_stata
938     if clip_state=='on' then
939       clip_box     = mget(4,'dl',fd) // clip_box
940     else
941       clip_box=[]
942     end
943
944     // draw the rectangle
945     xrect(0,1,1,1); // create the rectangle with dummy values
946     h=get('hdl')
947         set(h,"data",data);
948     set(h,"visible",visible)
949     set(h,"thickness",thickness)
950     set(h,"mark_style",mark_style),
951     set(h,"mark_size",mark_size),
952     set(h,"mark_size_unit",msu),
953     if is_higher_than([3 0 0 0]) then
954       set(h,"mark_foreground",mark_foreground) ;
955       set(h,"mark_background",mark_background) ;
956     end
957     set(h,"mark_mode",mark_mode)
958     set(h,"line_style",line_style)
959     set(h,"fill_mode",fill_mode)
960     set(h,"foreground",foreground) ;
961     if is_higher_than([3 1 0 1]) then
962       set(h,"background",background) ;
963     end
964     set(h,"line_mode",line_mode)
965     if clip_state=='on' then set(h,"clip_box",clip_box),end
966     set(h,"clip_state",clip_state);
967
968     load_user_data(fd) ; // user_data
969
970   case "Arc"
971     visible        = toggle(mget(1,characterFormat,fd)) // visible
972     thickness      = mget(1,'sl',fd); // thickness
973     line_style     = mget(1,characterFormat,fd);  // line_style
974     if line_style==0 then // 0 and 1 are equivalents and 0 is obsolete since Scilab 5.4.0
975         line_style=1;
976     end
977
978     if is_higher_than([3 1 0 1])
979       line_mode = toggle(mget(1,characterFormat,fd)) ; // line_mode
980     end
981
982     fill_mode      = toggle(mget(1,characterFormat,fd)) // fill_mode
983     foreground     = mget(1,'il',fd); // foreground
984
985     if is_higher_than([3 1 0 1]) then
986       background = mget(1,'il',fd) ; // background
987     end
988
989     if (is_higher_than([5 0 3 0])) then
990           // data size might be 6 or 7
991           data = mget(mget(1,'il',fd),'dl',fd); // data
992         else
993       parentAxes = gca();
994           if (parentAxes.view == "2d") then
995         data = mget(6,'dl',fd);
996           else
997             data = mget(7,'dl',fd);
998           end
999         end
1000
1001     if is_higher_than([4 1 2 0]) then
1002       drawing_method = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)); // drawing_method
1003     else
1004       drawing_method = "nurbs";
1005     end
1006
1007     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1008     if clip_state=='on' then
1009       clip_box     = mget(4,'dl',fd) // clip_box
1010     else
1011       clip_box=[]
1012     end
1013         xarc(0,1,1,1,0,360); // create the arc dummy values
1014     h=get('hdl')
1015         if ~is_higher_than([4 1 2 0]) then
1016       // angle wass stored by 64th of degree
1017       data($) = data($) / 64;
1018           data($-1) = data($-1) / 64;
1019     end
1020         set(h,"data",data);
1021     set(h,"visible",visible)
1022     set(h,"thickness",thickness)
1023     set(h,"line_style",line_style)
1024     set(h,"line_mode",line_mode);
1025     set(h,"fill_mode",fill_mode)
1026     set(h,"foreground",foreground) ;
1027     set(h,"background",background) ;
1028     set(h,"arc_drawing_method", drawing_method) ;
1029     if clip_state=='on' then set(h,"clip_box",clip_box),end
1030     set(h,"clip_state",clip_state);
1031
1032     load_user_data(fd) // user_data
1033
1034   case "Champ"
1035     visible        = toggle(mget(1,characterFormat,fd)) // visible
1036     sz=mget(2,'il',fd); // data.x
1037     x=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1038     sz=mget(2,'il',fd); // data.y
1039     y=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1040     sz=mget(2,'il',fd); // data.fx
1041     fx=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1042     sz=mget(2,'il',fd); // data.fy
1043     fy=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1044
1045     // draw the champ
1046     champ(x,y,fx,fy);
1047     h=gce();
1048
1049     set(h,"visible",visible);
1050     line_style = mget(1,characterFormat,fd);
1051     if line_style==0 then // 0 and 1 are equivalents and 0 is obsolete since Scilab 5.4.0
1052         line_style=1;
1053     end
1054     set(h,"line_style",line_style); // line_style
1055     set(h,"thickness",mget(1,'sl',fd)) // thickness
1056     set(h,"colored",toggle(mget(1,characterFormat,fd))) // colored
1057     set(h,"arrow_size",mget(1,'dl',fd)) // arrow_size
1058
1059     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1060     if clip_state=='on' then
1061       set(h,"clip_box", mget(4,'dl',fd)) // clip_box
1062     end
1063     set(h,"clip_state",clip_state);
1064     load_user_data(fd) // user_data
1065
1066   case "Segs"
1067     visible        = toggle(mget(1,characterFormat,fd)) // visible
1068     sz             = mget(2,'il',fd) // data
1069     data           = matrix(mget(prod(sz),'dl',fd),sz(1),-1)
1070
1071     // draw the segs
1072     xsegs(data(:,1),data(:,2))
1073     h=gce()
1074     if size(data,2)==3 then
1075       h.data=data
1076     end
1077     set(h,"visible",visible);
1078     set(h,"line_mode" ,toggle(mget(1,characterFormat,fd))) // line_mode
1079     line_style = mget(1,characterFormat,fd);
1080     if line_style==0 then // 0 and 1 are equivalents and 0 is obsolete since Scilab 5.4.0
1081         line_style=1;
1082     end
1083     set(h,"line_style",line_style); // line_style
1084     set(h,"thickness",mget(1,'sl',fd)) // thickness
1085     set(h,"arrow_size",mget(1,'dl',fd)) // arrow_size
1086
1087     n=mget(1,'il',fd) // segs_color
1088     set(h,"segs_color",mget(n,'il',fd))
1089     // it is needed to set it at the end, ut I don't know why
1090     mark_mode = toggle(mget(1,characterFormat,fd)) ; // mark_mode
1091     set(h,"mark_style"           , mget(1,characterFormat,fd)) // mark_style
1092     set(h,"mark_size"            , mget(1,characterFormat,fd)) // mark_size
1093     if is_higher_than([3 0 0 0]) then
1094       if ascii(mget(1,characterFormat,fd))=='t' then // mark_size_unit
1095         msu='tabulated'
1096       else
1097         msu='point';
1098       end
1099       set(h,"mark_size_unit"     , msu) ;
1100       set(h,"mark_foreground"    , mget(1,'il',fd)) ; // mark_foreground
1101       set(h,"mark_background"    , mget(1,'il',fd)) ; // mark_background
1102     else
1103       set(h,"mark_size_unit"     , 'tabulated') ; // mark_size_unit
1104     end
1105
1106     set(h,"mark_mode", mark_mode ) ;
1107
1108     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1109     if clip_state=='on' then
1110       set(h,"clip_box", mget(4,'dl',fd)) // clip_box
1111     end
1112     set(h,"clip_state",clip_state);
1113     load_user_data(fd) // user_data
1114
1115   case "Grayplot"
1116     visible        = toggle(mget(1,characterFormat,fd)) // visible
1117     if is_higher_than([3 0 0 0]) then
1118       sz=mget(2,'il',fd); // data.x
1119       x=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1120       sz=mget(2,'il',fd); // data.y
1121       y=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1122       sz=mget(2,'il',fd); // data.z
1123       z=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1124     else
1125       sz = mget(2,'il',fd) // data
1126       data = matrix(mget(prod(sz),'dl',fd),sz(1),-1)
1127     end
1128
1129     data_mapping   = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // data_mapping
1130     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1131     if clip_state=='on' then
1132       clip_box     = mget(4,'dl',fd) // clip_box
1133     else
1134       clip_box=[]
1135     end
1136
1137     // draw the grayplot
1138     if is_higher_than([3 0 0 0]) then
1139       grayplot(x,y,z)
1140     else
1141       grayplot(data(2:$,1),data(1,2:$),data(2:$,2:$))
1142     end
1143
1144     h=get('hdl')
1145     set(h,"visible",visible)
1146     set(h,"data_mapping",data_mapping)
1147     if clip_state=='on' then
1148       set(h,"clip_box",  clip_box)
1149     end
1150     set(h,"clip_state",clip_state);
1151
1152     load_user_data(fd) // user_data
1153
1154   case "Matplot"
1155     visible        = toggle(mget(1,characterFormat,fd)) // visible
1156     sz=mget(2,'il',fd); // data
1157     data=matrix(mget(prod(sz),'dl',fd),sz(1),-1);
1158 //    data_mapping   = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))
1159     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1160     if clip_state=='on' then
1161       clip_box     = mget(4,'dl',fd) // clip_box
1162     else
1163       clip_box=[]
1164     end
1165
1166     // draw the matplot
1167     Matplot(data);
1168
1169     h=get('hdl')
1170     set(h,"visible",visible)
1171 //    set(h,"data_mapping",data_mapping)
1172     if clip_state=='on' then
1173       set(h,"clip_box",  clip_box)
1174     end
1175     set(h,"clip_state",clip_state);
1176     // user_data
1177     load_user_data(fd)
1178
1179   case "Fec"
1180     visible        = toggle(mget(1,characterFormat,fd)) // visible
1181     sz             = mget(2,'il',fd) // data
1182     data           = matrix(mget(prod(sz),'dl',fd),sz(1),-1)
1183     sz             = mget(2,'il',fd) // triangles
1184     triangles      = matrix(mget(prod(sz),'dl',fd),sz(1),-1)
1185     z_bounds       = mget(2,'dl',fd) // z_bounds
1186     // draw the fec
1187     fec(data(:,1),data(:,2),triangles,data(:,3))
1188     h=unglue(get('hdl'))
1189     set(h,"visible",visible)
1190     set(h,"z_bounds",z_bounds)
1191         if is_higher_than( [5 0 3 0] ) then
1192           set(h,"color_range",mget(2,'dl',fd)); // color_range
1193           set(h,"outside_colors",mget(2,'dl',fd)); // color_range
1194           set(h,"line_mode" ,toggle(mget(1,characterFormat,fd))) // line_mode
1195           set(h,"foreground", mget(1,'il',fd)); // foreground
1196         end
1197     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1198     if clip_state=='on' then
1199       set(h,"clip_box", mget(4,'dl',fd)) // clip_box
1200     end
1201     set(h,"clip_state",clip_state);
1202     load_user_data(fd) // user_data
1203
1204    case "Legend"
1205     if is_higher_than( [5 0 0 0] ) then
1206       global %LEG
1207       %LEG=[];
1208       %LEG.visible         = toggle(mget(1,characterFormat,fd)) // visible
1209       %LEG.text            = load_text_vector(fd); // text
1210       %LEG.font_style      = mget(1,characterFormat,fd); // font_style
1211       %LEG.font_size       = mget(1,characterFormat,fd); // font_size
1212       %LEG.font_color      = mget(1,'il',fd); // font_size
1213       %LEG.fractional_font = toggle(mget(1,characterFormat,fd)); // fractional_font
1214       nlegends             = mget(1,characterFormat,fd);
1215       paths = list()
1216       for kl=1:nlegends
1217         paths($+1)         = mget(mget(1,'il',fd),'il',fd);
1218       end
1219       %LEG.paths           = paths
1220       %LEG.legend_location = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd))
1221       %LEG.position        = mget(2,'dl',fd)
1222       %LEG.line_mode       = toggle(mget(1,characterFormat,fd))
1223       %LEG.thickness       = mget(1,'sl',fd)
1224       %LEG.foreground      = mget(1,'il',fd)
1225       %LEG.fill_mode       = toggle(mget(1,characterFormat,fd))
1226       %LEG.background      = mget(1,'il',fd)
1227
1228       %LEG.clip_state      = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1229       if %LEG.clip_state=='on' then
1230         %LEG.clip_box      = mget(4,'dl',fd); // clip_box
1231       end
1232       %_load(fd,"user_data")
1233       %LEG.user_data       = user_data;
1234     else
1235       visible         = toggle(mget(1,characterFormat,fd)) // visible
1236       line_mode       = toggle(mget(1,characterFormat,fd)) // line_mode
1237       mark_mode       = toggle(mget(1,characterFormat,fd)) // mark_mode
1238       mark_foreground = mget(1,'il',fd) ; // mark_foreground
1239       mark_background = mget(1,'il',fd) ; // mark_background
1240
1241       //text=ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // text
1242
1243       text = load_text_vector(fd); // text
1244
1245       //create the legend
1246       //get the number of lines of the legend
1247       lineFeedPosition = strindex(text,'@')
1248       nbLines = size( lineFeedPosition ) ;
1249       nbLines = nbLines(2) + 1
1250       //create as many curves as lines in the text
1251       nullVector = zeros(1,nbLines);
1252       //draw the legend
1253       plot2d(0,nullVector,leg=text) ;
1254       H=unglue(get('hdl'));
1255       h=H(1);
1256       delete(H(2));
1257
1258       set(h,"visible",visible)
1259       set(h,"line_mode",line_mode);
1260       set(h,"mark_mode",mark_mode);
1261       set(h,"mark_foreground",mark_foreground) ;
1262       set(h,"mark_background",mark_background) ;
1263       set(h,"foreground", mget(1,'il',fd)); // foreground
1264
1265       set(h,"font_style", mget(1,characterFormat,fd)); // font_style
1266       set(h,"font_size" , mget(1,characterFormat,fd)); // font_size
1267       if is_higher_than( [4 1 2 0] ) then
1268         set(h,"fractional_font" , toggle(mget(1,characterFormat,fd))); // fractional_font
1269       end
1270       clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1271       if clip_state=='on' then
1272         set(h,"clip_box",mget(4,'dl',fd)); // clip_box
1273       end
1274       set(h,"clip_state",clip_state);
1275     end
1276
1277   case "Text"
1278     visible         = toggle(mget(1,characterFormat,fd)) // visible
1279
1280     if is_higher_than( [4 1 2 0] ) then
1281       text            = load_text_matrix( fd ) ;
1282     else
1283       text            = load_text_vector(fd) // text
1284     end
1285     sz              = mget(2,characterFormat,fd)
1286     data            = matrix(mget(prod(sz),'dl',fd),sz(1),-1) // data
1287     text_box        = mget(2,'dl',fd) // text_box
1288     text_box_mode   = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)); // text_box_mode
1289
1290     // draw the text
1291     if text_box_mode == 'off' then
1292       xstring(data(1),data(2),text)
1293     else
1294       xstringb(data(1),data(2),text,text_box(1),text_box(2))
1295     end
1296
1297     h=get('hdl');
1298         set(h,"data",data);
1299     set(h,"visible",visible) ;
1300     set(h,"text_box_mode",text_box_mode)
1301     set(h,"foreground"           , mget(1,'il',fd)); // foreground
1302     set(h,"font_style"           , mget(1,characterFormat,fd)); // font_style
1303
1304     if text_box_mode == 'filled' then // font_size
1305       mget(1,characterFormat,fd) ;
1306     else
1307       set(h,"font_size", mget(1,characterFormat,fd));
1308     end
1309
1310     set(h,"font_angle"           , mget(1,'dl',fd)); // font_angle
1311
1312     //adding JB Silvy 28/11/05
1313     // box drawing
1314     if is_higher_than([3 1 0 1]) then
1315       set( h, "box"      , toggle( mget( 1, characterFormat, fd ) ) ) ; // box
1316       set( h, "line_mode", toggle( mget( 1, characterFormat, fd ) ) ) ; // line_mode
1317       set( h, "fill_mode", toggle( mget( 1, characterFormat, fd ) ) ) ; // fill_mode
1318
1319       set( h, "font_foreground", mget( 1, 'il', fd ) ) ; // font_foreground
1320       set( h, "background"     , mget( 1, 'il', fd ) ) ; // background
1321     end
1322
1323     if is_higher_than( [4 1 2 0] ) then
1324       set( h, "alignment", ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)  ) ) ; // alignment
1325       set( h, "fractional_font", toggle( mget( 1, characterFormat, fd ) ) ) ; // fractional_font
1326     end
1327
1328     clip_state     = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1329     if clip_state=='on' then
1330       clip_box     = mget(4,'dl',fd) // clip_box
1331       set(h,"clip_box",clip_box) ; // clip_box
1332     else
1333       clip_box=[]
1334     end
1335     set(h,"clip_state",clip_state);
1336     load_user_data(fd) // user_data
1337   case 'Axis'
1338     if is_higher_than([3 1 0 0]) then
1339
1340       visible          = toggle(mget(1,characterFormat,fd)) // visible
1341       n                = mget(1,'il',fd) // tics_direction
1342       tics_direction   = ascii(mget(n,characterFormat,fd));
1343       nx               = mget(1,'il',fd) // xtics_coord
1344       xtics_coord      = mget(nx,'dl',fd)'
1345       ny               = mget(1,'il',fd) // ytics_coord
1346       ytics_coord      = mget(ny,'dl',fd)'
1347
1348       if tics_direction == "bottom" then axisdir='d';
1349       elseif tics_direction == "top" then axisdir='u';
1350       elseif tics_direction == "left" then axisdir='l';
1351       elseif tics_direction == "right" then axisdir='r';
1352       elseif nx>1 then axisdir='u';
1353       else axisdir='l';
1354       end
1355
1356       drawaxis(x=xtics_coord,y=ytics_coord,dir=axisdir);
1357       h=gce()
1358
1359       h.tics_color       = mget(1,'il',fd) // tics_color
1360       h.tics_segment     = toggle(mget(1,characterFormat,fd)) // tics_segment
1361       h.tics_style       = ascii(mget(1,characterFormat,fd)) // tics_style
1362       h.sub_tics         = mget(1,'il',fd) // sub_tics
1363       h.tics_labels     = load_text_vector(fd)' // tics_label
1364       labelfontsize = mget(1,'il',fd);
1365       // Bug fix: there was a bug in Scilab <=4.1.2 which used -1 as default value for labels_font_size
1366       // Scilab 5 needs font size to be >= 0 so we change the value to avoid an error message due to a Scilab bug...
1367       if labelfontsize == -1 then
1368         //labelfontsize = 0;
1369       end
1370       h.labels_font_size = labelfontsize // label_font_size
1371       h.labels_font_color= mget(1,'il',fd); // labels_font_color
1372       if is_higher_than( [4 1 2 0] ) then
1373         set( h, "fractional_font", toggle( mget( 1, characterFormat, fd ) ) ) ; // fractional_font
1374       end
1375       // h.tics_style=tics_style // jb Silvy apparently strange
1376
1377       clip_state       = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) // clip_state
1378       if clip_state == 'on' then
1379         set(h,"clip_box",clip_box)
1380       end
1381       set(h,"clip_state",clip_state);
1382       load_user_data(fd) // user_data
1383     end
1384
1385   case "uimenu"
1386     if is_higher_than( [4 1 2 0] ) then
1387       h = uimenu("parent", gcf());
1388       h.enable = toggle(mget(1,"c",fd)); // Enable
1389       ncolors = mget(1,"il",fd); // Foregroundcolor (size)
1390       h.foregroundcolor = mget(ncolors,"dl",fd); // ForegroundColor (data)
1391       h.label = ascii(mget(mget(1,"c",fd),"c",fd)); // Label
1392       h.visible = toggle(mget(1,"c",fd)); // Visible
1393       if is_higher_than( [5 4 0 0] ) then
1394         h.callback = ascii(mget(mget(1, stringFormat,fd),"c",fd)); // Callback
1395       else
1396         h.callback = ascii(mget(mget(1,"c",fd),"c",fd)); // Callback
1397       end
1398       h.callback_type = mget(1,"il",fd); // Callback Type
1399       h.tag = ascii(mget(mget(1,"c",fd),"c",fd)); // Tag
1400     end
1401     if is_higher_than( [5 1 2 0] ) then // 5.2 and higher
1402       h.checked = toggle(mget(1,"c",fd)); // Checked
1403     end
1404     if is_higher_than( [5 1 1 0] ) then // 5.1.2 and higher
1405       // children
1406       nbChildren = mget(1,"il",fd) ;
1407       for k = 1 : nbChildren
1408         htmp = load_graphichandle(fd) ;
1409         set(htmp, "Parent", h);
1410       end
1411     end
1412
1413   case "uicontextmenu"
1414       h = uicontextmenu();
1415       // children
1416       nbChildren = mget(1,"il",fd) ;
1417       for k = 1 : nbChildren
1418         htmp = load_graphichandle(fd) ;
1419         set(htmp, "Parent", h);
1420       end
1421
1422   case "uicontrol"
1423     if is_higher_than( [4 1 2 0] ) then
1424       uistyle = ascii(mget(mget(1,"c",fd),"c",fd)); // Style
1425       h = uicontrol("parent",gcf(), "style", uistyle);
1426       ncolors = mget(1,"il",fd); // BackgroundColor (size)
1427       h.backgroundcolor = mget(ncolors,"dl",fd); // BackgroundColor (data)
1428       h.enable = toggle(mget(1,"c",fd)); // Enable
1429       h.fontangle = ascii(mget(mget(1,"c",fd),"c",fd)); // FontAngle
1430       h.fontname = ascii(mget(mget(1,"c",fd),"c",fd)); // FontName
1431       fontsize_in_units = mget(1,"dl",fd); // FontSize
1432       h.fontunits = ascii(mget(mget(1,"c",fd),"c",fd)); // FontUnits
1433       h.fontsize = fontsize_in_units; // FontSize written after 'FontUnits' to avoid them to be computed again
1434       h.fontweight = ascii(mget(mget(1,"c",fd),"c",fd)); // FontWeight
1435       ncolors = mget(1,"il",fd); // Foregroundcolor (size)
1436       h.foregroundcolor = mget(ncolors,"dl",fd); // ForegroundColor (data)
1437       h.horizontalalignment = ascii(mget(mget(1,"c",fd),"c",fd)); // HorizontalAlignment
1438       ndata = mget(1,"il",fd); // ListboxTop (size)
1439       h.listboxtop = mget(ndata,"dl",fd); // ListboxTop (data)
1440       h.max = mget(1,"dl",fd); // Max
1441       h.min = mget(1,"dl",fd); // Min
1442       ndata = mget(1,"il",fd); // Position (size)
1443       position_in_units = mget(ndata,"dl",fd); // Position (data)
1444       h.relief = ascii(mget(mget(1,"c",fd),"c",fd)); // Relief
1445       ndata = mget(1,"il",fd); // SliderStep (size)
1446       h.sliderstep = mget(ndata,"dl",fd); // SliderStep (data)
1447       h.string = load_text_matrix(fd) ; // String
1448       if ( is_higher_than([5 2 0 0]) ) then // Added in 5.4.0 version
1449           h.tooltipstring = load_text_matrix(fd) ; // TooltipString
1450       end
1451       h.units = ascii(mget(mget(1,"c",fd),"c",fd)); // Units
1452       h.position = position_in_units; // Position written after 'Units' to avoid them to be computed again
1453       ndata = mget(1,"il",fd); // Value (size)
1454       h.value = mget(ndata,"dl",fd); // Value (data)
1455       h.verticalalignment = ascii(mget(mget(1,"c",fd),"c",fd)); // VerticalAlignment
1456       h.visible = toggle(mget(1,"c",fd)); // Visible
1457       if is_higher_than( [5 4 0 0] ) then
1458         h.callback = ascii(mget(mget(1, stringFormat,fd),"c",fd)); // Callback
1459       else
1460         h.callback = ascii(mget(mget(1,"c",fd),"c",fd)); // Callback
1461       end
1462       h.callback_type = mget(1,"il",fd); // Callback Type
1463       load_user_data(fd); // Userdata
1464       h.tag = ascii(mget(mget(1,"c",fd),"c",fd)); // Tag
1465     end
1466
1467   else
1468       warning("type " +typ+" unhandled");
1469   end
1470
1471 endfunction
1472
1473 function r=toggle(k)
1474   r=emptystr(k)+'on'
1475   r(k==0)='off'
1476 endfunction
1477
1478 function load_user_data(fd)
1479   if is_higher_than([3 1 0 0]) then
1480     h; //make a copy of the calling context h here
1481     %_load(fd,'user_data')
1482     if ~isempty(user_data) then
1483       set(h, "user_data", user_data);
1484     end
1485   end
1486 endfunction
1487
1488 function r=is_higher_than(v)
1489 //check if current version is strictly higher than the given one
1490   r=%f
1491   for k=1:4
1492     if version(k)>v(k) then r=%t,break,end
1493     if version(k)<v(k) then r=%f,break,end
1494   end
1495 endfunction
1496
1497 function text=load_text_vector(fd)
1498   T=mget(mget(1,'il',fd),characterFormat,fd)
1499   newline=[find(T==10) size(T,'*')+1];
1500   text=[]
1501   p=1
1502   for k=1:size(newline,'*')
1503     text=[text;ascii(T(p:newline(k)-1))];
1504     p=newline(k)+1
1505   end
1506 endfunction
1507
1508 // retrieve a string matrix saved by save_text_matrix
1509 function strMat = load_text_matrix( fd )
1510   nbRow = mget( 1, 'il', fd ) ;
1511   nbCol = mget( 1, 'il', fd ) ;
1512   for i = 1:nbRow
1513     for j = 1:nbCol
1514       if is_higher_than([5 4 0 0]) then
1515         strMat(i,j) = ascii(mget(mget(1,stringFormat,fd),characterFormat,fd)) ;
1516       else
1517         strMat(i,j) = ascii(mget(mget(1,characterFormat,fd),characterFormat,fd)) ;
1518       end
1519     end
1520   end
1521 endfunction
1522
1523 function links=get_links_from_path(ax,paths)
1524 //  ax is a  handle on an axes entity
1525 //  paths a list or row vector which gives the set of paths relative to
1526 //  the axes
1527   links=[];ok=%t
1528   for p=paths
1529     e=ax;
1530     p(1)=p(1)-1// the caption does not exists yet
1531     for kp=1:size(p,'*'),
1532       if or(e.type==['Axes','Compound'])&p(kp)<=size(e.children,'*') then
1533         e=e.children(p(kp)),
1534       else
1535         ok=%f
1536         break
1537       end
1538     end
1539     if ~ok then break,end
1540     links=[links,e]
1541   end
1542   if ~ok then links=[],end
1543 endfunction