bug 11411: save function used unsigned char to store length of string, now it is...
[scilab.git] / scilab / modules / graphics / macros / %h_save.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 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at    
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10
11
12 function %h_save(h,fd)
13   version=[5 4 0 1]
14   mput(version,'uc',fd)
15   
16   // There are issues when saving characters with 'c' format
17   // characterFormat format behave smoothly
18   characterFormat = 'uc';
19   stringFormat = 'il';
20   
21   hsize = size(h);
22   mput(hsize,characterFormat,fd); 
23   // introduced in version 3 1 0 2 to handle 
24   // the case where we have a matrix of handles to save
25   
26   if or(hsize>1)
27     for i=1:hsize(1)
28       for j=1:hsize(2)
29         save_graphichandle(h(i,j),fd)
30       end
31     end
32   else
33     save_graphichandle(h,fd)
34   end
35 endfunction
36
37 function save_graphichandle(h,fd)
38   if ~is_handle_valid(h) then
39     warning(msprintf(gettext("%s: handle no more valid ignored.\n"),"save_graphichandle"));
40     return
41   end
42   typ=h.type
43   select h.type
44   
45   case "Figure"   
46     mput( length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
47     // handle => new style
48     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
49     mput(h.figure_position,'sl',fd) // figure_position
50     mput(h.figure_size,'sl',fd) // figure size
51     mput(h.axes_size,'sl',fd) // axes_size
52     mput(h.viewport,'sl',fd) // viewport
53     mput(length(ascii(h.info_message)),stringFormat,fd) ; // info_message
54     mput(ascii(h.info_message),characterFormat,fd) ;
55     mput(length(ascii(h.tag)),characterFormat,fd) ; // tag
56     mput(ascii(h.tag),characterFormat,fd) ;
57     mput(bool2s(h.auto_resize=='on'),characterFormat,fd) // auto_resize
58     mput(length(ascii(h.figure_name)),stringFormat,fd); // figure_name
59     mput(ascii(h.figure_name),characterFormat,fd);
60     mput(h.figure_id,'sl',fd); // figure_id
61     
62     mput(size(h.color_map,'*'),'il',fd); // color_map
63     mput(h.color_map,'dl',fd) ;
64     mput(bool2s(h.pixmap=='on'),characterFormat,fd) ; // pix_map
65     mput(length(h.pixel_drawing_mode),characterFormat,fd); // pixel_drawing_mode
66     mput(ascii(h.pixel_drawing_mode),characterFormat,fd);
67     mput(length(h.anti_aliasing),characterFormat,fd); // anti_aliasing
68     mput(ascii(h.anti_aliasing),characterFormat,fd);
69     mput(bool2s(h.immediate_drawing=='on'),characterFormat,fd) // immediate_drawing
70     mput(h.background,'il',fd) // background
71     mput(length(h.rotation_style),characterFormat,fd); // rotation style
72     mput(ascii(h.rotation_style),characterFormat,fd);
73     
74     mput(length(ascii(h.event_handler)),characterFormat,fd); // event_handler 
75     mput(ascii(h.event_handler),characterFormat,fd);
76     mput(length(h.event_handler_enable),characterFormat,fd); // even_handler_enable
77     mput(ascii(h.event_handler_enable),characterFormat,fd); // need to be put after event_handler
78     
79     mput(length(ascii(h.resizefcn)),characterFormat,fd) ; // resizefcn
80     mput(ascii(h.resizefcn),characterFormat,fd) ;
81     mput(length(ascii(h.closerequestfcn)),characterFormat,fd) ; // closerequestfcn
82     mput(ascii(h.closerequestfcn),characterFormat,fd) ;
83
84     // children
85     c=h.children;
86     n=size(c,'*')
87     mput(n,'il',fd)
88     for k=n:-1:1
89       save_graphichandle(c(k),fd)
90     end
91     
92     user_data=h.user_data; // user_data
93     save(fd,user_data) ;
94     
95     
96   case "Axes" 
97     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
98     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
99     mput(size(h.axes_visible,'*'),characterFormat,fd); // axes_visible
100     mput(bool2s(h.axes_visible=='on'),characterFormat,fd) ;
101     mput(size(h.axes_reverse,'*'),characterFormat,fd); // axes_reverse
102     mput(bool2s(h.axes_reverse=='on'),characterFormat,fd) ;
103     mput(size(h.grid,'*'),characterFormat,fd); mput(h.grid,'il',fd); // grid
104         mput(length(h.grid_position),characterFormat,fd); // grid_position
105     mput(ascii(h.grid_position),characterFormat,fd);
106     mput(length(h.x_location),characterFormat,fd); // x_location
107     mput(ascii(h.x_location),characterFormat,fd);
108     mput(length(h.y_location),characterFormat,fd); // y_location
109     mput(ascii(h.y_location),characterFormat,fd);
110     mput(ascii(h.view),characterFormat,fd) ; // view
111     
112     // title
113     l=h.title;
114     mput(bool2s(l.visible=='on'),characterFormat,fd) ; // title.visible
115     save_text_matrix( l.text, fd ) ;
116     mput(l.font_foreground,'il',fd); // title_label.font_foreground
117     mput(bool2s(l.fractional_font=='on'),characterFormat,fd) // title.fractional_font
118     mput(l.foreground,'il',fd) // title.foreground
119     mput(l.background,'il',fd) // title.background
120     mput(bool2s(l.fill_mode=='on'),characterFormat,fd) // title.fill_mode
121     mput(l.font_style,characterFormat,fd) ; // title.font_style
122     mput(l.font_size,characterFormat,fd)  ; // title.font_size
123       
124     mput(bool2s(l.auto_rotation=='on'),characterFormat,fd) // title.auto_rotation
125     mput(l.font_angle,'dl',fd) // title.font_angle
126     mput(bool2s(l.auto_position=='on'),characterFormat,fd) // title.auto_position
127     mput(l.position,'dl',fd) // title.position
128     
129     // x_label
130     l=h.x_label
131     mput(bool2s(l.visible=='on'),characterFormat,fd) // x_label.visible
132     save_text_matrix( l.text, fd ) ;
133     mput(l.font_foreground,'il',fd); // x_label.font_foreground
134     mput(bool2s(l.fractional_font=='on'),characterFormat,fd) // x_label.fractional_font
135     mput(l.foreground,'il',fd) // x_label.foreground
136     mput(l.background,'il',fd) // x_label.background
137     mput(bool2s(l.fill_mode=='on'),characterFormat,fd) // x_label.fill_mode
138     mput(l.font_style,characterFormat,fd) // x_label.font_style
139     mput(l.font_size,characterFormat,fd)  // x_label.font_size
140   
141     mput(bool2s(l.auto_rotation=='on'),characterFormat,fd) // x_label.auto_rotation
142     mput(l.font_angle,'dl',fd) // x_label.font_angle
143     mput(bool2s(l.auto_position=='on'),characterFormat,fd) // x_label.auto_position
144     mput(l.position,'dl',fd) // x_label.position
145   
146     // y_label
147     l=h.y_label
148     mput(bool2s(l.visible=='on'),characterFormat,fd) // y_label.visible
149     save_text_matrix( l.text, fd ) ;
150     mput(l.font_foreground,'il',fd); // y_label.font_foreground
151     mput(bool2s(l.fractional_font=='on'),characterFormat,fd) // y_label.fractional_font
152     mput(l.foreground,'il',fd) // y_label.foreground
153     mput(l.background,'il',fd) // y_label.background
154     mput(bool2s(l.fill_mode=='on'),characterFormat,fd) // y_label.fill_mode
155     mput(l.font_style,characterFormat,fd) // y_label.font_style
156     mput(l.font_size,characterFormat,fd) // y_label.font_size
157     
158     mput(bool2s(l.auto_rotation=='on'),characterFormat,fd) // y_label.auto_rotation
159     mput(l.font_angle,'dl',fd) // y_label.font_angle
160     mput(bool2s(l.auto_position=='on'),characterFormat,fd) // y_label.auto_position
161     mput(l.position,'dl',fd) // y_label.position
162     
163     if h.view=='3d' then
164       // z_label
165       l=h.z_label
166       mput(bool2s(l.visible=='on'),characterFormat,fd) // z_label.visible
167       save_text_matrix( l.text, fd ) ;
168       mput(l.font_foreground,'il',fd); // z_label.font_foreground
169       mput(bool2s(l.fractional_font=='on'),characterFormat,fd) // z_label.fractional_font
170       mput(l.foreground,'il',fd) // z_label.foreground
171       mput(l.background,'il',fd) // z_label.background
172       mput(bool2s(l.fill_mode=='on'),characterFormat,fd) // z_label.fill_mode
173       mput(l.font_style,characterFormat,fd) // z_label.font_style
174       mput(l.font_size,characterFormat,fd) // z_label.font_size
175       mput(bool2s(l.auto_rotation=='on'),characterFormat,fd) // z_label.auto_rotation
176       mput(l.font_angle,'dl',fd) // z_label.font_angle
177       mput(bool2s(l.auto_position=='on'),characterFormat,fd) // z_label.auto_position
178       mput(l.position,'dl',fd) // z_label.position
179     end
180     
181     mput(size(h.auto_ticks,'*'),characterFormat,fd); // auto_ticks
182     mput(bool2s(h.auto_ticks=='on'),characterFormat,fd)
183     // x_ticks
184     sz=size(h.x_ticks.locations,'*');
185     mput(sz,'sl',fd); 
186     if sz>0 then
187       mput(h.x_ticks.locations,'dl',fd)
188       mput(length(h.x_ticks.labels),characterFormat,fd); // x_ticks.labels
189       mput(ascii(strcat(h.x_ticks.labels)),characterFormat,fd);
190     end
191      // y_ticks
192     sz=size(h.y_ticks.locations,'*');
193     mput(sz,'sl',fd);
194     if sz>0 then
195       mput(h.y_ticks.locations,'dl',fd)
196       mput(length(h.y_ticks.labels),characterFormat,fd); // y_ticks.labels
197       mput(ascii(strcat(h.y_ticks.labels)),characterFormat,fd);
198     end
199     // z_ticks
200     sz=size(h.z_ticks.locations,'*');
201     mput(sz,'sl',fd); 
202     if sz>0 then
203       mput(h.z_ticks.locations,'dl',fd)
204       mput(length(h.z_ticks.labels),characterFormat,fd); // z_ticks.labels
205       mput(ascii(strcat(h.z_ticks.labels)),characterFormat,fd);
206     end
207     mput(length(h.box), characterFormat, fd ) ; // box
208     mput(ascii(h.box),  characterFormat, fd ) ;
209     mput(bool2s(h.filled == 'on'),characterFormat,fd); // filled
210     mput(size(h.sub_tics,'*'),characterFormat,fd);mput(h.sub_tics,characterFormat,fd); // sub_ticks
211     //mput(-1,'il',fd) // tics_color is removed F.Leray 15.03.05
212     mput(h.font_style,characterFormat,fd) // font_style
213     mput(h.font_size,characterFormat,fd) //font_size
214     mput(h.font_color,'il',fd) // font_color
215     mput(bool2s(h.fractional_font=='on'),characterFormat,fd) // fractional_font
216     mput(bool2s(h.isoview=='on'),characterFormat,fd)    // isoview
217     mput(bool2s(h.cube_scaling=='on'),characterFormat,fd) // cube_scaling
218     mput(h.rotation_angles,'dl',fd) // rotation_angles
219     mput(ascii(h.log_flags),characterFormat,fd) // log_flags
220     mput(bool2s(h.tight_limits=='on'),characterFormat,fd) // tight_limits
221     mput(size(h.data_bounds,'*'),characterFormat,fd); // data_bounds
222     mput(h.data_bounds,'dl',fd);
223     mput(size(h.zoom_box,'*'),characterFormat,fd);  // zoom_box
224     if size(h.zoom_box,'*')>0 then mput(h.zoom_box,'dl',fd);end
225     mput(h.margins,'dl',fd); // margins
226     mput(h.axes_bounds,'dl',fd); // axes_bounds
227     mput(bool2s(h.auto_clear=='on'),characterFormat,fd) // auto_clear
228     mput(bool2s(h.auto_scale=='on'),characterFormat,fd) // auto_scale
229     mput(h.hidden_axis_color,'il',fd); // hidden_axis_color
230     mput(length(h.arc_drawing_method),characterFormat,fd); // arc_drawing_method
231     mput(ascii(h.arc_drawing_method),characterFormat,fd);
232     mput(h.hiddencolor,'il',fd) // hidden_color
233     mput(bool2s(h.line_mode=='on'),characterFormat,fd) // line_mode
234     mput(h.line_style,characterFormat,fd) // line_style
235     mput(h.thickness,'sl',fd) // thickness
236     mput(bool2s(h.mark_mode=='on'),characterFormat,fd) // mark_mode
237     mput(h.mark_style,characterFormat,fd) // mark_style
238     mput(h.mark_size,characterFormat,fd) // mark_size
239     mput(ascii(part(h.mark_size_unit,1)),characterFormat,fd) // mark_size_unit
240     mput(h.mark_foreground,'il',fd) // mark_foreground
241     mput(h.mark_background,'il',fd) // mark_background
242
243     mput(h.foreground,'il',fd) // foreground
244     mput(h.background,'il',fd) // background
245        
246     mput(length(h.clip_state),characterFormat,fd); // clip_state
247     mput(ascii(h.clip_state),characterFormat,fd);
248     if h.clip_state=='on' then
249       mput(h.clip_box,'dl',fd) // clip_box
250     end
251     
252     // children
253     c=h.children;
254     n=size(c,'*')
255     mput(n,'il',fd)
256     for k=n:-1:1
257       save_graphichandle(c(k),fd)
258     end
259     
260     user_data=h.user_data;save(fd,user_data) // user_data
261     
262   case "Polyline"
263     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
264     
265     mput(bool2s(h.visible=='on'),characterFormat,fd) ; // visible
266     mput(size(h.data),'il',fd);mput(h.data,'dl',fd) // data
267     mput(bool2s(h.closed=='on'),characterFormat,fd) // closed
268     mput(bool2s(h.line_mode=='on'),characterFormat,fd) // line_mode
269     mput(bool2s(h.fill_mode=='on'),characterFormat,fd) // fill_mode
270     mput(h.line_style,characterFormat,fd) // line_style
271     mput(h.thickness,'sl',fd) // thickness
272     mput(h.arrow_size_factor,'sl',fd) // arrow_size_factor
273     mput(max(1,h.polyline_style),characterFormat,fd) // ployline_style
274     
275     mput( size( h.interp_color_vector, '*' ), 'sl', fd ) ; // interp_color_vector
276     mput( h.interp_color_vector, 'dl', fd ) ;
277     mput( bool2s(h.interp_color_mode=='on'), characterFormat, fd ) ; // interp_color_mode
278     
279     mput(bool2s(h.mark_mode=='on'),characterFormat,fd) // mark_mode
280     mput(h.mark_style,characterFormat,fd) // mark_style
281     mput(h.mark_size,characterFormat,fd) // mark_size
282     mput(ascii(part(h.mark_size_unit,1)),characterFormat,fd) // mark_size_unit
283     mput(h.foreground,'il',fd) // foreground
284     mput(h.background,'il',fd) // background
285     mput(h.mark_foreground,'il',fd) // mark_foreground
286     mput(h.mark_background,'il',fd) // mark_background
287     
288     mput(size(h.x_shift,'*'),'sl',fd); mput(h.x_shift,'dl',fd); // x_shift
289     mput(size(h.y_shift,'*'),'sl',fd); mput(h.y_shift,'dl',fd); // y_shift
290     mput(size(h.z_shift,'*'),'sl',fd); mput(h.z_shift,'dl',fd); // z_shift
291     
292     mput( h.bar_width, 'dl', fd ) ; // bar_width
293     mput(length(h.clip_state),characterFormat,fd); // clip_state
294     mput(ascii(h.clip_state),characterFormat,fd);
295     if h.clip_state=='on' then
296        mput(h.clip_box,'dl',fd) // clip_box
297     end
298     user_data=h.user_data;save(fd,user_data) // user_data
299     
300   case "Plot3d";
301     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
302     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
303     mput(bool2s(h.surface_mode=='on'),characterFormat,fd) // surface_mode
304     mput(h.foreground,'il',fd) // foreground
305     mput(h.thickness,'sl',fd) // thickness
306     mput(bool2s(h.mark_mode=='on'),characterFormat,fd) // mark_mode
307     mput(h.mark_style,characterFormat,fd) // mark_style
308     mput(h.mark_size,characterFormat,fd) // mark_size
309     mput(ascii(part(h.mark_size_unit,1)),characterFormat,fd) // mark_size_unit
310     mput(h.mark_foreground,'il',fd) // mark_foreground
311     mput(h.mark_background,'il',fd) // mark_background
312     mput(h.color_mode,'il',fd) // color_mode
313     mput(h.color_flag,'il',fd) // color_flag
314     x=h.data.x;sz=size(x)
315     mput(sz,'il',fd) // data.x
316     mput(x,'dl',fd)
317     y=h.data.y;sz=size(y)
318     mput(sz,'il',fd) // data.y
319     mput(y,'dl',fd)
320     z=h.data.z;sz=size(z)
321     mput(sz,'il',fd) // data.z
322     mput(z,'dl',fd)
323     if or(h.color_flag==[2 5]) then
324       clr=h.data.color;sz=size(clr)
325       mput(sz,'il',fd) // data.color
326       mput(clr,'il',fd)
327     end
328     mput(h.hiddencolor,'il',fd) // hidden_color
329     mput(length(h.clip_state),characterFormat,fd); // clip_state
330     mput(ascii(h.clip_state),characterFormat,fd);
331     if h.clip_state=='on' then
332       mput(h.clip_box,'dl',fd) // clip_box
333     end
334     user_data=h.user_data;save(fd,user_data) // user_data
335     
336   case "Fac3d";
337     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd) ; // type
338     mput(bool2s(h.visible=='on'),characterFormat,fd) ; // visible
339     mput(bool2s(h.surface_mode=='on'),characterFormat,fd) // surface_mode
340     mput(h.foreground,'il',fd) // foreground
341     mput(h.thickness,'sl',fd) // thickness
342     mput(bool2s(h.mark_mode=='on'),characterFormat,fd) // mark_mode
343     mput(h.mark_style,characterFormat,fd) // mark_style
344     mput(h.mark_size,characterFormat,fd) // mark_size
345     mput(ascii(part(h.mark_size_unit,1)),characterFormat,fd) // mark_size_unit
346     mput(h.mark_foreground,'il',fd) // mark_foreground
347     mput(h.mark_background,'il',fd) // mark_background
348     mput(h.color_mode,'il',fd) // color_mode
349     mput(h.color_flag,'il',fd) // color_flag
350     x=h.data.x;sz=size(x)
351     mput(sz,'il',fd) // data.x
352     mput(x,'dl',fd)
353     y=h.data.y;sz=size(y)
354     mput(sz,'il',fd) // data.y
355     mput(y,'dl',fd)
356     z=h.data.z;sz=size(z)
357     mput(sz,'il',fd) // data.z
358     mput(z,'dl',fd)
359     if h.color_flag >=2 then
360       clr=h.data.color;sz=size(clr) // data.color
361       mput(sz,'il',fd)
362       mput(clr,'il',fd)
363       mput(ascii(part(h.cdata_mapping,1)),characterFormat,fd) ; // cdata_mapping
364     end
365     mput(h.hiddencolor,'il',fd) // hidden_color
366     mput(length(h.clip_state),characterFormat,fd); // clip_state
367     mput(ascii(h.clip_state),characterFormat,fd);
368     if h.clip_state=='on' then
369       mput(h.clip_box,'dl',fd) // clip_box
370     end
371     user_data=h.user_data;save(fd,user_data) // user_data
372   
373   case "Compound"
374     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
375     
376     // children
377     children=h.children
378     n=size(children,'*')
379     mput(n,'il',fd)
380     for k=1:n
381       save_graphichandle(children(k),fd)
382     end
383     mput( bool2s( h.visible=='on'), characterFormat, fd ) ; // visible
384
385     user_data=h.user_data;save(fd,user_data) // user_data
386     
387   case "Rectangle"
388     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
389     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
390     mput(h.thickness,'sl',fd) // thickness
391     mput(bool2s(h.mark_mode=='on'),characterFormat,fd) // mark_mode
392     mput(h.mark_style,characterFormat,fd) // mark_style
393     mput(h.mark_size,characterFormat,fd) // mark_size
394     mput(ascii(part(h.mark_size_unit,1)),characterFormat,fd) // mark_size_unit
395     mput(h.mark_foreground,'il',fd) // mark_foreground
396     mput(h.mark_background,'il',fd) // mark_background
397     mput(bool2s(h.line_mode=='on'),characterFormat,fd) // line_mode
398     mput(h.line_style,characterFormat,fd) // line_style
399     mput(bool2s(h.fill_mode=='on'),characterFormat,fd) // fill_mode
400     mput(h.foreground,'il',fd) // foreground
401     mput(h.background,'il',fd) // background
402         mput(size(h.data, '*'), 'il', fd); // data
403     mput(h.data,'dl',fd);
404     mput(length(h.clip_state),characterFormat,fd); // clip_state
405     mput(ascii(h.clip_state),characterFormat,fd);
406     if h.clip_state=='on' then
407        mput(h.clip_box,'dl',fd) // clip_box
408     end
409     
410     user_data=h.user_data;save(fd,user_data) ; // user_data
411     
412   case "Arc"
413     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
414     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
415     mput(h.thickness,'sl',fd) // thickness
416     mput(h.line_style,characterFormat,fd) // line_style
417     mput(bool2s(h.line_mode=='on'),characterFormat,fd) ;// line_mode
418     mput(bool2s(h.fill_mode=='on'),characterFormat,fd) // fill_mode
419     mput(h.foreground,'il',fd) // foreground
420     mput(h.background,'il',fd) ; // background
421         mput(size(h.data, '*'), 'il', fd); // data
422     mput(h.data,'dl',fd);
423     mput(length(h.arc_drawing_method),characterFormat,fd); // arc_drawing_method
424     mput(ascii(h.arc_drawing_method),characterFormat,fd);
425     mput(length(h.clip_state),characterFormat,fd); // clip_state
426     mput(ascii(h.clip_state),characterFormat,fd);
427     if h.clip_state=='on' then
428       mput(h.clip_box,'dl',fd) // clip_box
429     end
430     user_data=h.user_data;save(fd,user_data) // user_data
431   
432   case "Champ"
433     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
434     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
435     x=h.data.x;sz=size(x)
436     mput(sz,'il',fd) // data.x
437     mput(x,'dl',fd)
438     y=h.data.y;sz=size(y)
439     mput(sz,'il',fd) // data.y
440     mput(y,'dl',fd)
441     fx=h.data.fx;sz=size(fx)
442     mput(sz,'il',fd) // data.fx
443     mput(fx,'dl',fd)
444     fy=h.data.fy;sz=size(fy)
445     mput(sz,'il',fd) // data.fz
446     mput(fy,'dl',fd)
447     mput(h.line_style,characterFormat,fd) // line_style
448     mput(h.thickness,'sl',fd) // thickness
449     mput(bool2s(h.colored=='on'),characterFormat,fd) // colored
450     mput(h.arrow_size,'dl',fd) // arrow_size
451     mput(length(h.clip_state),characterFormat,fd); // clip_state
452     mput(ascii(h.clip_state),characterFormat,fd);
453     if h.clip_state=='on' then
454       mput(h.clip_box,'dl',fd) // clip_box
455     end
456     user_data=h.user_data;save(fd,user_data) // user_data
457   
458   case "Segs"
459     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
460     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
461     mput(size(h.data),'il',fd);mput(h.data,'dl',fd) // data
462     mput(bool2s(h.line_mode=='on'),characterFormat,fd) // line_mode
463     mput(h.line_style,characterFormat,fd) // line_style
464     mput(h.thickness,'sl',fd) // thickness
465     mput(h.arrow_size,'dl',fd) // arrow_size
466     mput(size(h.segs_color,'*'),'il',fd); // segs_color
467     mput(h.segs_color,'il',fd)
468     mput(bool2s(h.mark_mode=='on'),characterFormat,fd) // mark_mode
469     mput(h.mark_style,characterFormat,fd) // mark_style
470     mput(h.mark_size,characterFormat,fd) // mark_size
471     mput(ascii(part(h.mark_size_unit,1)),characterFormat,fd) // mark_size_unit
472     mput(h.mark_foreground,'il',fd) // mark_foreground
473     mput(h.mark_background,'il',fd) // mark_background
474     mput(length(h.clip_state),characterFormat,fd); // clip_state
475     mput(ascii(h.clip_state),characterFormat,fd); // clip_state
476     if h.clip_state=='on' then
477       mput(h.clip_box,'dl',fd) // clip_box
478     end  
479     user_data=h.user_data;save(fd,user_data) // user_data
480   
481   case "Grayplot"
482     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
483     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
484     x=h.data.x;sz=size(x)
485     mput(sz,'il',fd) // data.x
486     mput(x,'dl',fd)
487     y=h.data.y;sz=size(y)
488     mput(sz,'il',fd) // data.y
489     mput(y,'dl',fd)
490     z=h.data.z;sz=size(z)
491     mput(sz,'il',fd) // data.z
492     mput(z,'dl',fd)
493     mput(length(h.data_mapping),characterFormat,fd); // data_mapping
494     mput(ascii(h.data_mapping),characterFormat,fd);
495     mput(length(h.clip_state),characterFormat,fd); // clip_state
496     mput(ascii(h.clip_state),characterFormat,fd);
497     if h.clip_state=='on' then
498       mput(h.clip_box,'dl',fd) // clip_box
499     end
500     user_data=h.user_data;save(fd,user_data) // user_data
501   
502   case "Matplot"
503     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
504     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
505     mput(size(h.data),'il',fd);mput(h.data,'dl',fd) // datat
506 //    mput(length(h.data_mapping),characterFormat,fd);mput(ascii(h.data_mapping),characterFormat,fd);
507     mput(length(h.clip_state),characterFormat,fd); // clip_state
508     mput(ascii(h.clip_state),characterFormat,fd);
509     if h.clip_state=='on' then
510       mput(h.clip_box,'dl',fd) // clip_box
511     end
512     user_data=h.user_data;save(fd,user_data) // user_data
513     
514   case "Fec"
515     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
516     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
517     mput(size(h.data),'il',fd);mput(h.data,'dl',fd) // data
518     mput(size(h.triangles),'il',fd);mput(h.triangles,'dl',fd) // triangles
519     mput(h.z_bounds,'dl',fd); // z_bounds
520         mput(h.color_range,'dl',fd); // color_range
521         mput(h.outside_colors,'dl',fd); // outside_colors
522         mput(bool2s(h.line_mode=='on'),characterFormat,fd) // line_mode
523         mput(h.foreground,'il',fd) // foreground
524     mput(length(h.clip_state),characterFormat,fd); // clip_state
525     mput(ascii(h.clip_state),characterFormat,fd);
526     if h.clip_state=='on' then
527       mput(h.clip_box,'dl',fd) // clip_box
528     end
529     user_data=h.user_data;save(fd,user_data) // user_data
530     
531   case "Legend"
532     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); //type
533     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
534     save_text_vector(h.text,fd); // text
535     mput(h.font_style,characterFormat,fd) // font_style
536     mput(h.font_size,characterFormat,fd) // font_size
537     mput(h.font_color,'il',fd) // font_color
538     mput(bool2s(h.fractional_font=='on'),characterFormat,fd) // fractional_font
539     //replace links by a path relative to the parent axes
540     links=h.links;nlegends=size(links,'*');
541     mput(nlegends,characterFormat,fd)
542     for kl=1:nlegends
543       p=get_entity_path(links(kl))
544       mput(size(p,'*'),'il',fd)
545       mput(p,'il',fd)
546     end
547     mput(length(h.legend_location),characterFormat,fd);mput(ascii(h.legend_location),characterFormat,fd); //legend_location
548     mput(h.position,'dl',fd); 
549     mput(bool2s(h.line_mode=='on'),characterFormat,fd) // line_mode
550     mput(h.thickness,'sl',fd) // thickness
551     mput(h.foreground,'il',fd) // foreground
552     mput(bool2s(h.fill_mode=='on'),characterFormat,fd) // fill_mode
553     mput(h.background,'il',fd) ; // background
554
555     mput(length(h.clip_state),characterFormat,fd); // clip_state
556     mput(ascii(h.clip_state),characterFormat,fd);
557     if h.clip_state=='on' then
558       mput(h.clip_box,'dl',fd) // clip_box
559     end
560     user_data=h.user_data;save(fd,user_data) // user_data
561  
562   case "Text"
563     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
564     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
565     //save_text_vector(h.text,fd) // text
566     save_text_matrix( h.text, fd ) ;
567     mput(size(h.data),characterFormat,fd); // data // size could be 2 or 3
568     mput(h.data,'dl',fd); 
569     mput(h.text_box,'dl',fd); // text_box
570     mput(length(h.text_box_mode),characterFormat,fd);
571     mput(ascii(h.text_box_mode),characterFormat,fd); // text_box_mode
572     
573     mput(h.foreground,'il',fd) // foreground
574     mput(h.font_style,characterFormat,fd) // font_style
575     mput(h.font_size,characterFormat,fd) // font_size
576     mput(h.font_angle,'dl',fd) // font_angle
577     
578     //adding JB Silvy 28/11/05
579     // box drawing
580     mput( bool2s( h.box       == 'on' ), characterFormat, fd ) ; // box
581     mput( bool2s( h.line_mode == 'on' ), characterFormat, fd ) ; // line_mode
582     mput( bool2s( h.fill_mode == 'on' ), characterFormat, fd ) ; // fill_mode
583     
584     mput( h.font_foreground, 'il', fd ) ; // font_foreground
585     mput( h.background     , 'il', fd ) ; // background
586     
587     mput(length(h.alignment),characterFormat,fd);
588     mput(ascii(h.alignment),characterFormat,fd) ; // alignment
589     mput(bool2s(h.fractional_font=='on'),characterFormat,fd) // fractional_font
590     
591     mput(length(h.clip_state),characterFormat,fd); // clip_state
592     mput(ascii(h.clip_state),characterFormat,fd);
593     if h.clip_state=='on' then
594       mput(h.clip_box,'dl',fd) // clip_box
595     end
596     user_data=h.user_data;save(fd,user_data) // user_data
597     
598   case "Axis"
599     mput(length(h.type),characterFormat,fd);mput(ascii(h.type),characterFormat,fd); // type
600     mput(bool2s(h.visible=='on'),characterFormat,fd) // visible
601     mput(length(h.tics_direction),'il',fd); // ticks_direction
602     mput(ascii(h.tics_direction),characterFormat,fd);
603     mput(size(h.xtics_coord,'*'),'il',fd); // xtics_coord
604     mput(h.xtics_coord,'dl',fd) 
605     mput(size(h.ytics_coord,'*'),'il',fd); // ytics_coord
606     mput(h.ytics_coord,'dl',fd)
607     mput(h.tics_color,'il',fd) // tics_color
608     mput(bool2s(h.tics_segment=='on'),characterFormat,fd) // tics_segment
609     mput(ascii(h.tics_style),characterFormat,fd) // tics_style
610     mput(h.sub_tics,'il',fd) // sub_tics
611     save_text_vector(h.tics_labels,fd) // tics_labels
612     mput(h.labels_font_size,'il',fd) // label_font_size
613     mput(h.labels_font_color,'il',fd) // labels_font_color
614     mput(bool2s(h.fractional_font=='on'),characterFormat,fd) // fractional_font
615     mput(length(h.clip_state),characterFormat,fd); // clip_state
616     mput(ascii(h.clip_state),characterFormat,fd);
617     if h.clip_state=='on' then
618       mput(h.clip_box,'dl',fd) // clip_box
619     end
620     user_data=h.user_data;save(fd,user_data) // user_data
621     
622   case "uimenu"
623     mput(length(h.type),"c",fd);mput(ascii(h.type),"c",fd); // Type
624     mput(bool2s(h.enable=="on"),"c",fd); // Enable
625     mput(size(h.foregroundcolor,'*'),"il",fd); // ForegroundColor (size)
626     mput(h.foregroundcolor,"dl",fd); // ForegroundColor (data)
627     mput(length(h.label),"c",fd);mput(ascii(h.label),"c",fd); // Label
628     mput(bool2s(h.visible=="on"),"c",fd); // Visible
629     mput(length(h.callback),stringFormat,fd);mput(ascii(h.callback),"c",fd); // Callback
630     mput(h.callback_type,"il",fd); // Callback Type
631     mput(length(h.tag),"c",fd);mput(ascii(h.tag),"c",fd); // Tag
632     mput(bool2s(h.checked=="on"),"c",fd); // Checked
633     // children
634     c=h.children;
635     n=size(c,"*")
636     mput(n,"il",fd)
637     for k=1:n
638       save_graphichandle(c(k),fd)
639     end
640     
641   case "uicontextmenu"
642     mput(length(h.type),"c",fd);mput(ascii(h.type),"c",fd); // Type
643     // children
644     c=h.children;
645     n=size(c,"*")
646     mput(n,"il",fd)
647     for k=1:n
648       save_graphichandle(c(k),fd)
649     end
650     
651   case "uicontrol"
652     mput(length(h.type),"c",fd);mput(ascii(h.type),"c",fd); // Type
653     mput(length(h.style),"c",fd);mput(ascii(h.style),"c",fd); // Style
654     mput(size(h.backgroundcolor,'*'),"il",fd); // BackgroundColor (size)
655     mput(h.backgroundcolor,"dl",fd); // BackgroundColor (data)
656     mput(bool2s(h.enable=="on"),"c",fd); // Enable
657     mput(length(h.fontangle),"c",fd);mput(ascii(h.fontangle),"c",fd); // FontAngle
658     mput(length(h.fontname),"c",fd);mput(ascii(h.fontname),"c",fd); // FontName
659     mput(h.fontsize,"dl",fd); // FontSize
660     mput(length(h.fontunits),"c",fd);mput(ascii(h.fontunits),"c",fd); // FontUnits
661     mput(length(h.fontweight),"c",fd);mput(ascii(h.fontweight),"c",fd); // FontWeight
662     mput(size(h.foregroundcolor,'*'),"il",fd); // ForegroundColor (size)
663     mput(h.foregroundcolor,"dl",fd); // ForegroundColor (data)
664     mput(length(h.horizontalalignment),"c",fd);mput(ascii(h.horizontalalignment),"c",fd); // HorizontalAlignment
665     mput(size(h.listboxtop,'*'),"il",fd); // ListboxTop (size)
666     mput(h.listboxtop,"dl",fd); // ListboxTop (data)
667     mput(h.max,"dl",fd); // Max
668     mput(h.min,"dl",fd); // Min
669     mput(size(h.position,'*'),"il",fd); // Position (size)
670     mput(h.position,"dl",fd); // Position (data)
671     mput(length(h.relief),"c",fd);mput(ascii(h.relief),"c",fd); // Relief
672     mput(size(h.sliderstep,'*'),"il",fd); // SliderStep (size)
673     mput(h.sliderstep,"dl",fd); // SliderStep (data)
674     save_text_matrix( h.string, fd ) ; // String
675     save_text_matrix( h.tooltipstring, fd ) ; // TooltipString
676     mput(length(h.units),"c",fd);mput(ascii(h.units),"c",fd); // Units
677     mput(size(h.value,'*'),"il",fd); // Value (size)
678     mput(h.value,"dl",fd); // Value (data)
679     mput(length(h.verticalalignment),"c",fd);mput(ascii(h.verticalalignment),"c",fd); // VerticalAlignment
680     mput(bool2s(h.visible=="on"),"c",fd); // Visible
681     mput(length(h.callback),stringFormat,fd);mput(ascii(h.callback),"c",fd); // Callback
682     mput(h.callback_type,"il",fd); // Callback Type
683     user_data=h.user_data;save(fd,user_data); // Userdata
684     mput(length(h.tag),"c",fd);mput(ascii(h.tag),"c",fd); // Tag
685   
686   else
687     warning("handle of type "+h.type+" unhandled")
688   end
689
690 endfunction
691
692 function save_text_vector(t,fd)
693     t=ascii(strcat(t,ascii(10)));
694     mput(length(t),'il',fd);mput(t,characterFormat,fd);
695 endfunction
696
697 // save a text matrix
698 function save_text_matrix(strMat,fd)
699   // put nbRow and nbCol
700   nbRow = size( strMat, 1 ) ;
701   nbCol = size( strMat, 2 ) ;
702   mput( nbRow, 'il', fd ) ;
703   mput( nbCol, 'il', fd ) ;
704   for i = 1:nbRow
705     for j = 1:nbCol
706       mput(length(ascii(strMat(i,j))), stringFormat, fd) ;
707       mput(ascii(strMat(i,j)),characterFormat,fd) ;
708     end
709   end
710 endfunction
711
712 function p=get_entity_path(e)
713 // given a handle e on an entity this function returns its path relative
714 // to its parent axes.
715 // the path is a vector of child index.
716   p=[];parent=e.parent;
717
718   while  %t
719     pos=find(parent.children==e,1)
720     if pos==[] then
721       error(msprintf(_("%s : Invalid entity %s\n"),"save","Legend"))
722     end
723     p=[pos p]
724     if parent.type=='Axes' then break,end
725     e=parent
726     parent=e.parent;
727   end
728 endfunction