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