1 /*------------------------------------------------------------\
2 |                                                             |
3 | This file is part of the Alliance CAD System Copyright      |
4 | (C) Laboratoire LIP6 - D�partement ASIM Universite P&M Curie|
5 |                                                             |
6 | Home page      : http://www-asim.lip6.fr/alliance/          |
7 | E-mail support : mailto:alliance-users@asim.lip6.fr         |
8 |                                                             |
9 | This progam is  free software; you can redistribute it      |
10 | and/or modify it under the  terms of the GNU General Public |
11 | License as  published by the Free Software Foundation;      |
12 | either version 2 of the License, or (at your option) any    |
13 | later version.                                              |
14 |                                                             |
15 | Alliance VLSI  CAD System  is distributed  in the hope that |
16 | it  will be useful, but WITHOUT  ANY WARRANTY;              |
17 | without even the  implied warranty of MERCHANTABILITY or    |
18 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General       |
19 | Public License for more details.                            |
20 |                                                             |
21 | You should have received a copy  of the GNU General Public  |
22 | License along with the GNU C Library; see the file COPYING. |
23 | If not, write to the Free Software Foundation, Inc.,        |
24 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.                     |
25 |                                                             |
26 \------------------------------------------------------------*/
27 /*------------------------------------------------------------\
28 |                                                             |
29 | Tool    :                   XSCH                            |
30 |                                                             |
31 | File    :                  Tools.c                          |
32 |                                                             |
33 | Authors :              Jacomme Ludovic                      |
34 |                                                             |
35 | Date    :                   01.06.96                        |
36 |                                                             |
37 \------------------------------------------------------------*/
38 /*------------------------------------------------------------\
39 |                                                             |
40 |                         Include Files                       |
41 |                                                             |
42 \------------------------------------------------------------*/
43 
44 # include <stdio.h>
45 # include <math.h>
46 # include <Xm/Xm.h>
47 # include <Xm/PushBG.h>
48 
49 # include "mut.h"
50 # include "aut.h"
51 # include "mlo.h"
52 # include "scl.h"
53 # include "XSB.h"
54 # include "XTB.h"
55 # include "XMX.h"
56 # include "XSC.h"
57 # include "XMT.h"
58 # include "XMV.h"
59 
60 # include "XMT_tools.h"
61 # include "XMT_message.h"
62 # include "XMX_event.h"
63 
64 /*------------------------------------------------------------\
65 |                                                             |
66 |                           Constants                         |
67 |                                                             |
68 \------------------------------------------------------------*/
69 /*------------------------------------------------------------\
70 |                                                             |
71 |                            Types                            |
72 |                                                             |
73 \------------------------------------------------------------*/
74 /*------------------------------------------------------------\
75 |                                                             |
76 |                          Variables                          |
77 |                                                             |
78 \------------------------------------------------------------*/
79 
80    xschhierarchy *XschHeadHierarchy = (xschhierarchy *)0;
81 
82    char XschToolsFilter[ 10 ]    = "*.";
83    char XschToolsExtention[ 10 ] = ".";
84 
85    char XschToolsBuffer[ 128 ];
86    char XschToolsDirectoryBuffer[ 512 ];
87 
88    static FILE *XschXfigFile  = (FILE *)0;
89    static int   XschXfigColor = 0;
90    static int   XschXfigDepth = 0;
91    static long  XschXfigDy    = 0;
92 
93 /*------------------------------------------------------------\
94 |                                                             |
95 |                          Functions                          |
96 |                                                             |
97 \------------------------------------------------------------*/
98 /*------------------------------------------------------------\
99 |                                                             |
100 |                       XschAllocHierarchy                   |
101 |                                                             |
102 \------------------------------------------------------------*/
103 
XschAllocHierarchy()104 xschhierarchy *XschAllocHierarchy ()
105 
106 {
107   return ( (xschhierarchy *)autallocheap( sizeof ( xschhierarchy ) ));
108 }
109 
110 /*------------------------------------------------------------\
111 |                                                             |
112 |                       XschFreeHierarchy                    |
113 |                                                             |
114 \------------------------------------------------------------*/
115 
XschFreeHierarchy(FreeHierarchy)116 void XschFreeHierarchy ( FreeHierarchy )
117 
118   xschhierarchy *FreeHierarchy;
119 
120 {
121   autfreeheap( (char *)FreeHierarchy, sizeof(FreeHierarchy) );
122 }
123 
124 /*------------------------------------------------------------\
125 |                                                             |
126 |                       XschAddHierarchy                     |
127 |                                                             |
128 \------------------------------------------------------------*/
129 
XschAddHierarchy(Name)130 void XschAddHierarchy( Name )
131 
132   char *Name;
133 {
134   xschhierarchy *XschHierarchy;
135 
136   autbegin();
137 
138   XschHierarchy       = XschAllocHierarchy ();
139   XschHierarchy->NAME = Name;
140   XschHierarchy->X    = XschUnitGridX;
141   XschHierarchy->Y    = XschUnitGridY;
142   XschHierarchy->DX   = XschUnitGridDx;
143   XschHierarchy->DY   = XschUnitGridDy;
144   XschHierarchy->NEXT = XschHeadHierarchy;
145   XschHeadHierarchy   = XschHierarchy;
146 
147   autend();
148 }
149 
150 /*------------------------------------------------------------\
151 |                                                             |
152 |                         XschDelHierarchy                   |
153 |                                                             |
154 \------------------------------------------------------------*/
155 
XschDelHierarchy()156 char XschDelHierarchy()
157 
158 {
159   xschhierarchy *XschHierarchy;
160 
161   if ( XschHeadHierarchy != (xschhierarchy *) NULL )
162   {
163     autbegin();
164 
165     XschHierarchy     = XschHeadHierarchy;
166     XschHeadHierarchy = XschHeadHierarchy->NEXT;
167     XschFreeHierarchy( XschHierarchy );
168 
169     autend();
170     return( XSCH_TRUE );
171   }
172 
173   return( XSCH_FALSE );
174 }
175 
176 /*------------------------------------------------------------\
177 |                                                             |
178 |                      XschToolsHierarchyDown                 |
179 |                                                             |
180 \------------------------------------------------------------*/
181 
XschToolsHierarchyDown()182 void XschToolsHierarchyDown()
183 {
184   xschobj_list    *Obj;
185   schbox_list     *SchBox;
186   loins_list      *LoIns;
187   char            *ModelName;
188 
189   autbegin();
190 
191   if ( XschHeadSelect != (xschselect_list *)0 )
192   {
193     Obj = XschHeadSelect->OBJECT;
194     XschDelSelect();
195 
196     XschDisplayObject( Obj );
197 
198     if ( IsXschSchBox( Obj ) )
199     {
200       SchBox = (schbox_list *)Obj->USER;
201 
202       if ( SchBox->SOURCE_TYPE == SCH_SOURCE_LOINS )
203       {
204         LoIns = (loins_list *)SchBox->SOURCE;
205         ModelName = LoIns->FIGNAME;
206 
207         XschAddHierarchy( XschFigureSch->NAME );
208 
209         XschFileOpen( ModelName, 1 );
210       }
211     }
212   }
213 
214   autend();
215 }
216 
217 /*------------------------------------------------------------\
218 |                                                             |
219 |                     XschToolsHierarchyUp                   |
220 |                                                             |
221 \------------------------------------------------------------*/
222 
XschToolsHierarchyUp()223 void XschToolsHierarchyUp()
224 {
225   if ( XschHeadHierarchy == (xschhierarchy *)0 )
226   {
227     XschErrorMessage( XschMainWindow, "No previous model !" );
228   }
229   else
230   {
231     XschFileOpen( XschHeadHierarchy->NAME, 0 );
232 
233     XschUnitGridX  = XschHeadHierarchy->X;
234     XschUnitGridY  = XschHeadHierarchy->Y;
235     XschUnitGridDx = XschHeadHierarchy->DX;
236     XschUnitGridDy = XschHeadHierarchy->DY;
237 
238     XschComputeUnitGrid();
239     XschComputeAndDisplayMap();
240 
241     XschZoomRefresh();
242     XschDelHierarchy();
243   }
244 }
245 
246 /*------------------------------------------------------------\
247 |                                                             |
248 |                      XschToolsHierarchyReload               |
249 |                                                             |
250 \------------------------------------------------------------*/
251 
XschToolsHierarchyReload()252 void XschToolsHierarchyReload()
253 {
254   long SaveUnitGridX;
255   long SaveUnitGridY;
256   long SaveUnitGridDx;
257   long SaveUnitGridDy;
258 
259   if ( XschFigureSch != (schfig_list *)NULL )
260   {
261     SaveUnitGridX  = XschUnitGridX;
262     SaveUnitGridY  = XschUnitGridY;
263     SaveUnitGridDx = XschUnitGridDx;
264     SaveUnitGridDy = XschUnitGridDy;
265 
266     XschFileOpen( XschFigureSch->NAME, 0 );
267 
268     XschUnitGridX  = SaveUnitGridX;
269     XschUnitGridY  = SaveUnitGridY;
270     XschUnitGridDx = SaveUnitGridDx;
271     XschUnitGridDy = SaveUnitGridDy;
272 
273     XschComputeUnitGrid();
274     XschComputeAndDisplayMap();
275 
276     XschZoomRefresh();
277   }
278 }
279 
280 /*------------------------------------------------------------\
281 |                                                             |
282 |                      XschToolsDelAllHierarchy               |
283 |                                                             |
284 \------------------------------------------------------------*/
285 
XschToolsDelAllHierarchy()286 void XschToolsDelAllHierarchy()
287 {
288   while ( XschHeadHierarchy != (xschhierarchy *)0 )
289   {
290     XschDelHierarchy();
291   }
292 }
293 
294 /*------------------------------------------------------------\
295 |                                                             |
296 |                      XschToolsSaveXfigLine                  |
297 |                                                             |
298 \------------------------------------------------------------*/
299 
XschToolsSaveXfigLine(X1r,Y1r,X2r,Y2r)300 static void XschToolsSaveXfigLine( X1r, Y1r, X2r, Y2r )
301 
302   long          X1r;
303   long          Y1r;
304   long          X2r;
305   long          Y2r;
306 {
307   fprintf( XschXfigFile,
308            "2 1 0 1 %d 0 %d  0 -1 0.000 0 0 -1 0 0 2\n", XschXfigColor, XschXfigDepth );
309   /*        ^ ^ ^ ^ ^  ^ ^   ^  ^ ^     ^ ^  ^ ^ ^ ^
310    *        | | | | |  | |   |  | |     | |  | | | + Number Points
311    *        | | | | |  | |   |  | |     | |  | | + Backward Arrow
312    *        | | | | |  | |   |  | |     | |  | + Forward Arrow
313    *        | | | | |  | |   |  | |     | |  + Radius
314    *        | | | | |  | |   |  | |     | + Cap style
315    *        | | | | |  | |   |  | |     + Join style
316    *        | | | | |  | |   |  | + Style Val
317    *        | | | | |  | |   |  + Area Fill
318    *        | | | | |  | |   + Pen Style
319    *        | | | | |  | + Depth
320    *        | | | | |  + Fill Color
321    *        | | | | + Pen Color
322    *        | | | + Width
323    *        | | + Line Style
324    *        | + Poly Line
325    *        + Poly Line
326    */
327 
328   fprintf( XschXfigFile, "  %ld %ld %ld %ld\n", X1r, XschXfigDy - Y1r,
329                                                 X2r, XschXfigDy - Y2r );
330 }
331 
332 /*------------------------------------------------------------\
333 |                                                             |
334 |                      XschToolsSaveXfigRectangle             |
335 |                                                             |
336 \------------------------------------------------------------*/
337 
XschToolsSaveXfigRectangle(X1r,Y1r,X2r,Y2r)338 static void XschToolsSaveXfigRectangle( X1r, Y1r, X2r, Y2r )
339 
340   long          X1r;
341   long          Y1r;
342   long          X2r;
343   long          Y2r;
344 {
345   fprintf( XschXfigFile,
346            "2 2 0 1 %d 0 %d  0 -1 0.000 0 0 -1 0 0 5\n", XschXfigColor, XschXfigDepth );
347   /*        ^ ^ ^ ^ ^  ^ ^   ^  ^ ^     ^ ^  ^ ^ ^ ^
348    *        | | | | |  | |   |  | |     | |  | | | + Number Points
349    *        | | | | |  | |   |  | |     | |  | | + Backward Arrow
350    *        | | | | |  | |   |  | |     | |  | + Forward Arrow
351    *        | | | | |  | |   |  | |     | |  + Radius
352    *        | | | | |  | |   |  | |     | + Cap style
353    *        | | | | |  | |   |  | |     + Join style
354    *        | | | | |  | |   |  | + Style Val
355    *        | | | | |  | |   |  + Area Fill
356    *        | | | | |  | |   + Pen Style
357    *        | | | | |  | + Depth
358    *        | | | | |  + Fill Color
359    *        | | | | + Pen Color
360    *        | | | + Width
361    *        | | + Line Style
362    *        | + Poly Line
363    *        + Poly Line
364    */
365 
366   fprintf( XschXfigFile, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n",
367            X1r, XschXfigDy - Y1r,
368            X2r, XschXfigDy - Y1r,
369            X2r, XschXfigDy - Y2r,
370            X1r, XschXfigDy - Y2r,
371            X1r, XschXfigDy - Y1r );
372 }
373 
374 /*------------------------------------------------------------\
375 |                                                             |
376 |                      XschToolsSaveXfigCircle                |
377 |                                                             |
378 \------------------------------------------------------------*/
379 
XschToolsSaveXfigCircle(X1r,Y1r,Dx,Dy)380 static void XschToolsSaveXfigCircle( X1r, Y1r, Dx, Dy )
381 
382   long          X1r;
383   long          Y1r;
384   long          Dx;
385   long          Dy;
386 {
387   long Xc;
388   long Yc;
389   long Radx;
390   long Rady;
391 
392   Xc   = X1r + ( Dx / 2 );
393   Yc   = Y1r + ( Dy / 2 );
394   Radx = Dx / 2;
395   Rady = Dy / 2;
396 
397   fprintf( XschXfigFile,
398            "1 3 0 1 %d 0 %d  0 -1 0.000 1 0.000 %ld %ld %ld %ld %ld %ld %ld %ld\n",
399   /*        ^ ^ ^ ^ ^  ^ ^   ^  ^ ^     ^ ^     ^   ^   ^   ^   ^   ^   ^   ^
400    *        | | | | |  | |   |  | |     | |     |   |   |   |   |   |   |   + end_y
401    *        | | | | |  | |   |  | |     | |     |   |   |   |   |   |   +  end_x
402    *        | | | | |  | |   |  | |     | |     |   |   |   |   |   +  start_y
403    *        | | | | |  | |   |  | |     | |     |   |   |   |   + start_x
404    *        | | | | |  | |   |  | |     | |     |   |   |   + rad_y
405    *        | | | | |  | |   |  | |     | |     |   |   + rad_x
406    *        | | | | |  | |   |  | |     | |     |   + Cy
407    *        | | | | |  | |   |  | |     | |     + Cx
408    *        | | | | |  | |   |  | |     | + Angle
409    *        | | | | |  | |   |  | |     + Direction
410    *        | | | | |  | |   |  | + Style Val
411    *        | | | | |  | |   |  + Area Fill
412    *        | | | | |  | |   + Pen Style
413    *        | | | | |  | + Depth
414    *        | | | | |  + Fill Color
415    *        | | | | + Pen Color
416    *        | | | + Width
417    *        | | + Line Style
418    *        | + Poly Line
419    *        + Poly Line
420    */
421            XschXfigColor, XschXfigDepth, Xc, XschXfigDy - Yc, Radx, Rady,
422                           Xc, XschXfigDy - Yc,
423                           Xc + Radx, XschXfigDy - Yc );
424 }
425 
426 /*------------------------------------------------------------\
427 |                                                             |
428 |                      XschToolsSaveXfigArc                   |
429 |                                                             |
430 \------------------------------------------------------------*/
431 
432 # if 0
433 static void XschToolsSaveXfigArc( X1r, Y1r, Dx, Dy, AngleFrom, AngleTo )
434 
435   long          X1r;
436   long          Y1r;
437   long          Dx;
438   long          Dy;
439   long          AngleFrom;
440   long          AngleTo;
441 {
442   long   MiddleAngle;
443   long   Xc;
444   long   Yc;
445   long   Width;
446   long   Height;
447   long   X1;
448   long   Y1;
449   long   X2;
450   long   Y2;
451   long   X3;
452   long   Y3;
453   double Rad;
454 
455   Width  = Dx / 2;
456   Height = Dy / 2;
457   Xc     = X1r + Width;
458   Yc     = Y1r + Height;
459 
460   Rad = ( (double) AngleFrom * M_PI ) / ( 64.0 * 180.0 );
461 
462   X1 = Xc + (long)( (double)Width  * cos( Rad ) );
463   Y1 = Yc + (long)( (double)Height * sin( Rad ) );
464 
465   Rad = ( (double) ( AngleTo + AngleFrom ) * M_PI ) / ( 64.0 * 180.0 );
466 
467   X3 = Xc + (long)( (double)Width  * cos( Rad ) );
468   Y3 = Yc + (long)( (double)Height * sin( Rad ) );
469 
470   Rad = ( (double)( AngleTo + ( AngleFrom / 2 ) ) * M_PI ) / ( 2.0 * 64.0 * 180.0 );
471 
472   X2 = Xc + (long)( (double)Width  * cos( Rad ) );
473   Y2 = Yc + (long)( (double)Height * sin( Rad ) );
474 
475   fprintf( XschXfigFile,
476            "5 1 0 1 %d 0 %d  0 -1 0.000 0 1 0 0 %f %f %ld %ld %ld %ld %ld %ld\n",
477   /*        ^ ^ ^ ^ ^  ^ ^   ^  ^ ^     ^ ^ ^ ^ ^     ^       ^        ^
478    *        | | | | |  | |   |  | |     | | | | |     |       + Second  Third
479    *        | | | | |  | |   |  | |     | | | | |     + 1st Point
480    *        | | | | |  | |   |  | |     | | | | + Center
481    *        | | | | |  | |   |  | |     | | | + Backward Arrow
482    *        | | | | |  | |   |  | |     | | + Forward Arrow
483    *        | | | | |  | |   |  | |     | + Direction
484    *        | | | | |  | |   |  | |     + Cap style
485    *        | | | | |  | |   |  | + Style Val
486    *        | | | | |  | |   |  + Area Fill
487    *        | | | | |  | |   + Pen Style
488    *        | | | | |  | + Depth
489    *        | | | | |  + Fill Color
490    *        | | | | + Pen Color
491    *        | | | + Width
492    *        | | + Line Style
493    *        | + Arc
494    *        + Arc
495    */
496            XschXfigColor, XschXfigDepth,
497            (float)Xc, (float)Yc, X1, Y1, X2, Y2, X3, Y3 );
498 }
499 # endif
500 
XschToolsSaveXfigArc(X1r,Y1r,Dx,Dy,AngleFrom,AngleTo)501 static void XschToolsSaveXfigArc( X1r, Y1r, Dx, Dy, AngleFrom, AngleTo )
502 
503   long          X1r;
504   long          Y1r;
505   long          Dx;
506   long          Dy;
507   long          AngleFrom;
508   long          AngleTo;
509 {
510   long   Xc;
511   long   Yc;
512   long   Width;
513   long   Height;
514   long   X1;
515   long   Y1;
516   long   X2;
517   long   Y2;
518   long   X3;
519   long   Y3;
520   double Rad;
521 
522   Width  = Dx / 2;
523   Height = Dy / 2;
524   Xc     = X1r + Width;
525   Yc     = Y1r + Height;
526 
527   Rad = ( (double) AngleFrom * M_PI ) / ( 64.0 * 180.0 );
528 
529   X1 = Xc + (long)( (double)Width  * cos( Rad ) );
530   Y1 = Yc + (long)( (double)Height * sin( Rad ) );
531 
532   Rad = ( (double) ( AngleFrom + AngleTo ) * M_PI ) / ( 64.0 * 180.0 );
533 
534   X3 = Xc + (long)( (double)Width  * cos( Rad ) );
535   Y3 = Yc + (long)( (double)Height * sin( Rad ) );
536 
537   Rad = ( (double)( AngleFrom + ( AngleTo / 2 ) ) * M_PI ) / ( 2.0 * 64.0 * 180.0 );
538 
539   X2 = Xc + (long)( (double)Width  * cos( Rad ) );
540   Y2 = Yc + (long)( (double)Height * sin( Rad ) );
541 
542   fprintf( XschXfigFile,
543            "3 4 0 1 %d 0 %d  0 -1 0.000 0 0 0 3\n", XschXfigColor, XschXfigDepth );
544   /*        ^ ^ ^ ^ ^  ^ ^   ^  ^ ^     ^ ^ ^ ^
545    *        | | | | |  | |   |  | |     | | | |
546    *        | | | | |  | |   |  | |     | | | |
547    *        | | | | |  | |   |  | |     | | | + Number points
548    *        | | | | |  | |   |  | |     | | + Backward Arrow
549    *        | | | | |  | |   |  | |     | + Forward Arrow
550    *        | | | | |  | |   |  | |     + Cap style
551    *        | | | | |  | |   |  | + Style Val
552    *        | | | | |  | |   |  + Area Fill
553    *        | | | | |  | |   + Pen Style
554    *        | | | | |  | + Depth
555    *        | | | | |  + Fill Color
556    *        | | | | + Pen Color
557    *        | | | + Width
558    *        | | + Line Style
559    *        | + Arc
560    *        + Arc
561    */
562 
563   fprintf( XschXfigFile, "  %ld %ld %ld %ld %ld %ld\n",
564            X1, XschXfigDy - Y1,
565            X2, XschXfigDy - Y2,
566            X3, XschXfigDy - Y3 );
567 
568   fprintf( XschXfigFile, "  0.000 -1.000 0.000\n" );
569 }
570 
571 /*------------------------------------------------------------\
572 |                                                             |
573 |                 XschToolsSaveXfigBuffer                     |
574 |                                                             |
575 \------------------------------------------------------------*/
576 
XschToolsSaveXfigBuffer(X1r,Y1r,X2r,Y2r,Ycr,Obj)577 static void XschToolsSaveXfigBuffer( X1r, Y1r, X2r, Y2r, Ycr, Obj )
578 
579   long          X1r;
580   long          Y1r;
581   long          X2r;
582   long          Y2r;
583   long          Ycr;
584   xschobj_list *Obj;
585 {
586 /*
587 ** Fred Petrot  (The King ) has initially written those lines !
588 ** Ludo Jacomme (The Slave) has modified them :-)
589 */
590 /*long gs;*/
591   long is_x;
592   long is_y;
593   long cs;
594   long x, y1;
595   long DeltaX;
596   long DeltaY;
597 
598   DeltaX = X2r - X1r;
599   DeltaY = Y2r - Y1r;
600 
601   if ( DeltaX <= 0 ) DeltaX = 1;
602   if ( DeltaY <= 0 ) DeltaY = 1;
603 
604 /*gs = DeltaX;*/
605   is_x = ( 5 * DeltaX ) / 16;
606   is_y = ( 5 * DeltaY ) / 8;
607   cs = DeltaX / 8;
608 
609   y1 = Ycr;
610   x  = X1r + cs;
611 
612   XschToolsSaveXfigLine( x, y1 - is_y/2, x, y1 + is_y/2);
613   XschToolsSaveXfigLine( x       , y1 - is_y/2, x + is_x, y1);
614   XschToolsSaveXfigLine( x       , y1 + is_y/2, x + is_x, y1);
615 
616   if ( ( Obj->ARG1 ) == 0 )
617   {
618      /* input line : centered vertically */
619      XschToolsSaveXfigLine( x - cs, y1, x     , y1 );
620   }
621   else
622   {
623      /* Input circle */
624      XschToolsSaveXfigCircle( x - cs, y1 - cs/2, cs, cs );
625   }
626 
627   if ( ( Obj->ARG2 ) == 0 )
628   {
629      /* Output line : centered vertically */
630      XschToolsSaveXfigLine( x + is_x     , y1, x + is_x + cs, y1 );
631   }
632   else
633   {
634      /* Output circle */
635      XschToolsSaveXfigCircle( x + is_x, y1 - cs/2, cs, cs );
636   }
637 
638   XschToolsSaveXfigLine( x + is_x + cs, y1, X2r, y1 );
639 }
640 
641 
642 /*------------------------------------------------------------\
643 |                                                             |
644 |                   XschToolsSaveXfigTristate                 |
645 |                                                             |
646 \------------------------------------------------------------*/
647 
XschToolsSaveXfigTristate(X1r,Y1r,X2r,Y2r,Ycr,Obj)648 static void XschToolsSaveXfigTristate( X1r, Y1r, X2r, Y2r, Ycr, Obj )
649 
650   long          X1r;
651   long          Y1r;
652   long          X2r;
653   long          Y2r;
654   long          Ycr;
655   xschobj_list *Obj;
656 {
657 /*
658 ** Fred Petrot  (The King ) has initially written those lines !
659 ** Ludo Jacomme (The Slave) has modified them :-)
660 */
661 /*long gs;*/
662   long is_x;
663   long is_y;
664   long cs;
665   long csm;
666   long x, y1, y2,y0;
667   long DeltaX;
668   long DeltaY;
669 
670   DeltaX = X2r - X1r;
671   DeltaY = Y2r - Y1r;
672 
673   if ( DeltaX <= 0 ) DeltaX = 1;
674   if ( DeltaY <= 0 ) DeltaY = 1;
675 
676 /*gs = DeltaX;*/
677   is_x = ( 5 * DeltaX ) / 16;
678   is_y = ( 5 * DeltaY ) / 16;
679   cs = DeltaX / 8;
680   csm = DeltaX / 10;
681 
682   y1 = Ycr;
683 /*x1 = (X2r + X1r) / 2;*/
684   x  = X1r + cs;
685 
686   XschToolsSaveXfigLine( x, y1 - is_y/2, x, y1 + is_y/2);
687 
688   XschToolsSaveXfigLine( x       , y1 - is_y/2, x + is_x, y1);
689   XschToolsSaveXfigLine( x       , y1 + is_y/2, x + is_x, y1);
690 
691   y0 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
692   y0 -= XschBoundYmin;
693 
694   y2 = Obj->Y + ( SCP_BOX_CON_BASE_Y + SCP_BOX_CON_STEP_Y ) * XSCH_UNIT;
695   y2 -= XschBoundYmin;
696 
697   if ( ( Obj->ARG1 & 1) == 0 )
698   {
699      /* data line : centered vertically */
700      XschToolsSaveXfigLine( x - cs, y1, x     , y1 );
701   }
702   else
703   {
704      /* Data circle */
705      XschToolsSaveXfigCircle( x - cs, y1 - cs/2, cs, cs );
706   }
707 
708   /* Data Line */
709 
710   XschToolsSaveXfigLine( x - cs, y0, x - cs, y1  );
711 
712   if ( ( Obj->ARG1 & 2) == 0 )
713   {
714     /* Command Line */
715     XschToolsSaveXfigLine( x - cs, y2, x + is_x/2, y2 );
716 
717     XschToolsSaveXfigLine( x + is_x/2, y2, x + is_x/2, y1 - is_y/4 );
718   }
719   else
720   {
721     /* Command circle */
722     XschToolsSaveXfigCircle( x + is_x/2 - csm/2, y1 - is_y/2 - csm/4, csm, csm );
723 
724     /* Command Line */
725     XschToolsSaveXfigLine( x - cs, y2, x + is_x/2, y2 );
726 
727     XschToolsSaveXfigLine( x + is_x/2, y2, x + is_x/2, y2 + csm );
728   }
729 
730   if ( ( Obj->ARG2 ) == 0 )
731   {
732      /* Output line : centered vertically */
733      XschToolsSaveXfigLine( x + is_x     , y1, x + is_x + cs, y1 );
734   }
735   else
736   {
737      /* Output circle */
738      XschToolsSaveXfigCircle( x + is_x, y1 - cs/2, cs, cs );
739   }
740 
741   XschToolsSaveXfigLine( x + is_x + cs, y1, X2r, y1 );
742 }
743 
744 /*------------------------------------------------------------\
745 |                                                             |
746 |                 XschToolsSaveXfigConstant                   |
747 |                                                             |
748 \------------------------------------------------------------*/
749 
XschToolsSaveXfigConstant(X1r,Y1r,X2r,Y2r,Ycr,Obj)750 static void XschToolsSaveXfigConstant( X1r, Y1r, X2r, Y2r, Ycr, Obj )
751 
752   long          X1r;
753   long          Y1r;
754   long          X2r;
755   long          Y2r;
756   long          Ycr;
757   xschobj_list *Obj;
758 {
759  long cs;
760  long x, yc, y1,y2,y3;
761  long DeltaX;
762 /*long DeltaY;*/
763  int  i;
764  int  n;
765 
766  n = Obj->ARG1;
767 
768  DeltaX = X2r - X1r;
769 /* DeltaY = Y2r - Y1r;*/
770 
771  if ( DeltaX <= 0 ) DeltaX = 1;
772 /* if ( DeltaY <= 0 ) DeltaY = 1;*/
773 
774   cs = DeltaX / 8;
775   x  = X1r + cs;
776 
777   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
778   y1 -= XschBoundYmin;
779 
780   for ( i = 0; i < n; i++ )
781   {
782     yc = y1;
783 
784     if (( Obj->ARG2 & (1 << i)) == 0)
785     {
786       y2 = yc - cs;
787       y3 = y2 - cs;
788 
789       XschToolsSaveXfigLine(
790                  x, yc, x, y2 );
791 
792       XschToolsSaveXfigLine( x - cs, y2, x + cs, y2 );
793 
794       XschToolsSaveXfigLine( x - cs, y2, x, y3 );
795 
796       XschToolsSaveXfigLine( x + cs, y2, x, y3 );
797     }
798     else
799     {
800       y2 = yc + cs;
801       y3 = y2 + cs;
802 
803       XschToolsSaveXfigLine(
804                  x, yc, x, y2 );
805 
806       XschToolsSaveXfigLine(
807                  x, y2, x - cs, y3 );
808 
809       XschToolsSaveXfigLine(
810                  x, y2, x + cs, y3 );
811     }
812 
813     XschToolsSaveXfigLine( x, yc, X2r, yc );
814 
815     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
816   }
817 }
818 
819 /*------------------------------------------------------------\
820 |                                                             |
821 |                  XschToolsSaveXfigTransistor                |
822 |                                                             |
823 \------------------------------------------------------------*/
824 
XschToolsSaveXfigTransistor(X1r,Y1r,X2r,Y2r,Ycr,Obj)825 static void XschToolsSaveXfigTransistor( X1r, Y1r, X2r, Y2r, Ycr, Obj )
826 
827   long          X1r;
828   long          Y1r;
829   long          X2r;
830   long          Y2r;
831   long          Ycr;
832   xschobj_list *Obj;
833 {
834 /*
835 ** Fred Petrot  (The King ) has initially written those lines !
836 ** Ludo Jacomme (The Slave) has modified them :-)
837 */
838   long cs;
839   long x, x1, y1, y2,y0;
840   long DeltaX;
841 /*long DeltaY;*/
842 
843   DeltaX = X2r - X1r;
844 /*DeltaY = Y2r - Y1r;*/
845 
846   if ( DeltaX <= 0 ) DeltaX = 1;
847 /*if ( DeltaY <= 0 ) DeltaY = 1;*/
848 
849   cs = DeltaX / 8;
850 
851   y0 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
852   y0 -= XschBoundYmin;
853 
854   y2 = Obj->Y + ( SCP_BOX_CON_BASE_Y + SCP_BOX_CON_STEP_Y ) * XSCH_UNIT;
855   y2 -= XschBoundYmin;
856 
857   y1 = Ycr;
858   /*
859   x1 = X2r - cs;
860   */
861   x1 = X1r + 3 * cs;
862   x  = X1r;
863 
864   XschToolsSaveXfigLine( x, y0, x, y0 - cs );
865 
866   XschToolsSaveXfigLine( x, y0 - cs, x1 - cs, y0 - cs );
867 
868   XschToolsSaveXfigLine( x1 - cs, y0 - cs, x1 - cs, y2 + cs );
869 
870   XschToolsSaveXfigLine( x1 - cs, y2 + cs, x, y2 + cs );
871 
872   XschToolsSaveXfigLine( x, y2 + cs, x, y2 );
873 
874   XschToolsSaveXfigLine( x1, y0 - cs, x1, y2 + cs );
875 
876   if ( ( Obj->ARG1 ) == 0 )
877   {
878      /* Output line : centered vertically */
879      XschToolsSaveXfigLine( x1, y1, x1 + cs, y1 );
880   }
881   else
882   {
883      /* Output circle */
884      XschToolsSaveXfigCircle( x1, y1 - cs/2, cs, cs );
885   }
886 
887   XschToolsSaveXfigLine( x1 + cs, y1, X2r, y1 );
888 }
889 
890 /*------------------------------------------------------------\
891 |                                                             |
892 |                   XschToolsSaveXfigAnd                      |
893 |                                                             |
894 \------------------------------------------------------------*/
895 
XschToolsSaveXfigAnd(X1r,Y1r,X2r,Y2r,Ycr,Obj)896 static void XschToolsSaveXfigAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj )
897 
898   long          X1r;
899   long          Y1r;
900   long          X2r;
901   long          Y2r;
902   long          Ycr;
903   xschobj_list *Obj;
904 {
905 /*
906 ** Fred Petrot  (The King ) has initially written those lines !
907 ** Ludo Jacomme (The Slave) has modified them :-)
908 */
909   long gs_y;
910   long gs_x;
911   long cs;
912   int i;
913   int n;
914   long x, y;
915   long yc;
916   long y1;
917  long DeltaX;
918  long DeltaY;
919 
920  DeltaX = X2r - X1r;
921  DeltaY = Y2r - Y1r;
922 
923  if ( DeltaX <= 0 ) DeltaX = 1;
924  if ( DeltaY <= 0 ) DeltaY = 1;
925 
926   gs_y = ( 7 * DeltaY ) / 8;
927   gs_x = ( 6 * DeltaX ) / 8;
928   cs   = DeltaX / 8;
929 
930   yc = Ycr;
931   y  = Ycr - gs_y/2;
932   x = X1r + cs;
933   n = Obj->ARG1;
934 
935   /* And shape alone */
936 
937   XschToolsSaveXfigLine( x, y, x + gs_x/2, y );
938 
939   XschToolsSaveXfigLine( x         , y + gs_y, x + gs_x/2, y + gs_y );
940 
941   XschToolsSaveXfigArc( x, y, gs_x, gs_y, 90 * 64, -180 * 64);
942 
943   if ( Obj->ARG3 == 0 )
944   {
945      /* Output line : centered vertically */
946      XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
947   }
948   else
949   {
950      /* Output circle (for a NAND) */
951      XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
952   }
953 
954   /* Input lines */
955   XschToolsSaveXfigLine( x, y, x, y + gs_y);
956 
957   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
958   y1 -= XschBoundYmin;
959 
960   /* Circle for inversion */
961   for (i = 0; i < n; i++)
962   {
963     yc = y1;
964 
965     if (( Obj->ARG2 & (1 << i)) == 0)
966     {
967        XschToolsSaveXfigLine( x - cs, yc, x, yc );
968     }
969     else
970     {
971       XschToolsSaveXfigCircle( x  - cs, yc - cs/2, cs, cs );
972     }
973 
974     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
975   }
976 }
977 
978 /*------------------------------------------------------------\
979 |                                                             |
980 |                    XschToolsSaveXfigRegister                |
981 |                                                             |
982 \------------------------------------------------------------*/
983 
XschToolsSaveXfigRegister(X1r,Y1r,X2r,Y2r,Ycr,Obj)984 static void XschToolsSaveXfigRegister( X1r, Y1r, X2r, Y2r, Ycr, Obj )
985 
986   long          X1r;
987   long          Y1r;
988   long          X2r;
989   long          Y2r;
990   long          Ycr;
991   xschobj_list *Obj;
992 {
993 /*
994 ** Fred Petrot  (The King ) has initially written those lines !
995 ** Ludo Jacomme (The Slave) has modified them :-)
996 */
997   long gs_y;
998   long gs_x;
999   long cs;
1000   long es_x;
1001   long es_y;
1002   int i;
1003   int ni;
1004   long x, y;
1005   long yc;
1006   long xc;
1007   long y1;
1008   long DeltaX;
1009   long DeltaY;
1010 
1011   DeltaX = X2r - X1r;
1012   DeltaY = Y2r - Y1r;
1013 
1014   if ( DeltaX <= 0 ) DeltaX = 1;
1015   if ( DeltaY <= 0 ) DeltaY = 1;
1016 
1017   gs_y = ( 7 * DeltaY ) / 8;
1018   gs_x = ( 6 * DeltaX ) / 8;
1019   cs   = DeltaX / 8;
1020 
1021   es_y = DeltaX / 4;
1022   es_x = DeltaX / 8;
1023 
1024   yc = Ycr;
1025   y  = Ycr - gs_y/2;
1026   x = X1r + cs;
1027   xc = (X2r + X1r) /2;
1028   ni = Obj->ARG1;
1029 
1030   /* shape alone */
1031 
1032   XschToolsSaveXfigRectangle( x, y, x + gs_x, y + gs_y );
1033 
1034 /*
1035 ** Rising/Falling Edge
1036 */
1037   if ( ( Obj->ARG5 == 1 ) ||
1038        ( Obj->ARG5 == 2 ) )
1039   {
1040     XschToolsSaveXfigLine( xc, yc - es_y, xc, yc + es_y );
1041 
1042 /*
1043 ** Rising
1044 */
1045     if ( Obj->ARG5 == 1 )
1046     {
1047       XschToolsSaveXfigLine( xc, yc + es_y, xc - es_x, yc + es_y );
1048 
1049       XschToolsSaveXfigLine( xc, yc - es_y, xc + es_x, yc - es_y );
1050     }
1051     else
1052 /*
1053 ** Falling
1054 */
1055     {
1056       XschToolsSaveXfigLine( xc, yc - es_y, xc - es_x, yc - es_y );
1057 
1058       XschToolsSaveXfigLine( xc, yc + es_y, xc + es_x, yc + es_y );
1059     }
1060   }
1061 
1062   if ( Obj->ARG4 == 0 )
1063   {
1064      /* Output line : centered vertically */
1065      XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1066   }
1067   else
1068   {
1069      /* Output circle */
1070      XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1071   }
1072 
1073 
1074   /* Input lines */
1075   /* Circle for inversion */
1076 
1077   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1078   y1 -= XschBoundYmin;
1079 
1080   for (i = 0; i < ni; i++)
1081   {
1082     yc = y1;
1083 
1084     if (( Obj->ARG2 & (1 << i)) == 0)
1085     {
1086        XschToolsSaveXfigLine( x - cs, yc, x, yc );
1087     }
1088     else
1089     {
1090       XschToolsSaveXfigCircle( x  - cs, yc - cs/2, cs, cs );
1091     }
1092 
1093     /* Clock */
1094 
1095     if (( Obj->ARG3 & (1 << i)) != 0)
1096     {
1097        XschToolsSaveXfigLine( x, yc - cs/2, x + cs, yc  );
1098 
1099        XschToolsSaveXfigLine( x + cs, yc, x, yc + cs/2  );
1100     }
1101 
1102     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1103   }
1104 }
1105 
1106 /*------------------------------------------------------------\
1107 |                                                             |
1108 |                       XschToolsSaveXfigOr                   |
1109 |                                                             |
1110 \------------------------------------------------------------*/
1111 
XschToolsSaveXfigOr(X1r,Y1r,X2r,Y2r,Ycr,Obj)1112 static void XschToolsSaveXfigOr( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1113 
1114   long          X1r;
1115   long          Y1r;
1116   long          X2r;
1117   long          Y2r;
1118   long          Ycr;
1119   xschobj_list *Obj;
1120 {
1121 /*
1122 ** Fred Petrot  (The King ) has initially written those lines !
1123 ** Ludo Jacomme (The Slave) has modified them :-)
1124 */
1125   long gs_y;
1126   long gs_x;
1127   long cs;
1128   long Radius;
1129   int i;
1130   int n;
1131   long x, y;
1132   long yc;
1133   long y1;
1134   long DeltaX;
1135   long DeltaY;
1136 
1137   DeltaX = X2r - X1r;
1138   DeltaY = Y2r - Y1r;
1139 
1140   if ( DeltaX <= 0 ) DeltaX = 1;
1141   if ( DeltaY <= 0 ) DeltaY = 1;
1142 
1143   gs_y = ( 7 * DeltaY ) / 8;
1144   gs_x = ( 6 * DeltaX ) / 8;
1145   cs   = DeltaX / 8;
1146 
1147   yc = Ycr;
1148   y  = Ycr - gs_y/2;
1149   x = X1r + cs;
1150   n = Obj->ARG1;
1151 
1152   /* Or shape alone */
1153 
1154   XschToolsSaveXfigLine( x, y, x + gs_x/2, y );
1155 
1156   XschToolsSaveXfigLine( x         , y + gs_y, x + gs_x/2, y + gs_y );
1157 
1158   XschToolsSaveXfigArc( x, y, gs_x, gs_y, 90 * 64, -180 * 64);
1159 
1160   Radius = (float)(gs_y) * 0.707106781185;
1161 
1162   XschToolsSaveXfigArc(
1163             x - (Radius * 5 / 3), yc - Radius,
1164             Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1165 
1166   if ( Obj->ARG3 == 0 )
1167   {
1168      /* Output line : centered vertically */
1169      XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1170   }
1171   else
1172   {
1173      /* Output circle */
1174      XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1175   }
1176 
1177   /* Input lines */
1178 
1179   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1180   y1 -= XschBoundYmin;
1181 
1182   /* Circle for inversion */
1183   for (i = 0; i < n; i++)
1184   {
1185     yc = y1;
1186 
1187     if (( Obj->ARG2 & (1 << i)) == 0)
1188     {
1189        XschToolsSaveXfigLine( x - cs, yc, x, yc );
1190     }
1191     else
1192     {
1193       XschToolsSaveXfigCircle( x  - cs, yc - cs/2, cs, cs );
1194     }
1195 
1196     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1197   }
1198 }
1199 
1200 /*------------------------------------------------------------\
1201 |                                                             |
1202 |                       XschToolsSaveXfigXor                  |
1203 |                                                             |
1204 \------------------------------------------------------------*/
1205 
XschToolsSaveXfigXor(X1r,Y1r,X2r,Y2r,Ycr,Obj)1206 static void XschToolsSaveXfigXor( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1207 
1208   long          X1r;
1209   long          Y1r;
1210   long          X2r;
1211   long          Y2r;
1212   long          Ycr;
1213   xschobj_list *Obj;
1214 {
1215 /*
1216 ** Fred Petrot  (The King ) has initially written those lines !
1217 ** Ludo Jacomme (The Slave) has modified them :-)
1218 */
1219   long gs_y;
1220   long gs_x;
1221   long cs;
1222   long Radius;
1223   int i;
1224   int n;
1225   long x, y;
1226   long yc;
1227   long y1;
1228   long DeltaX;
1229   long DeltaY;
1230 
1231   DeltaX = X2r - X1r;
1232   DeltaY = Y2r - Y1r;
1233 
1234   if ( DeltaX <= 0 ) DeltaX = 1;
1235   if ( DeltaY <= 0 ) DeltaY = 1;
1236 
1237   gs_y = ( 7 * DeltaY ) / 8;
1238   gs_x = ( 6 * DeltaX ) / 8;
1239   cs   = DeltaX / 8;
1240 
1241   yc = Ycr;
1242   y  = Ycr - gs_y/2;
1243   x = X1r + cs;
1244   n = Obj->ARG1;
1245 
1246   /* Xor shape alone */
1247 
1248   XschToolsSaveXfigLine( x + gs_x/4, y, x + gs_x/2, y );
1249 
1250   XschToolsSaveXfigLine( x + gs_x/4, y + gs_y, x + gs_x/2, y + gs_y );
1251 
1252   XschToolsSaveXfigArc( x, y, gs_x, gs_y, 90 * 64, -180 * 64);
1253 
1254   Radius = (float)(gs_y) * 0.707106781185; /* sqrt(2) */
1255 
1256   XschToolsSaveXfigArc( x - (Radius * 5 / 3), yc - Radius,
1257             Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1258 
1259   XschToolsSaveXfigArc( x - (Radius * 4 / 3), yc - Radius,
1260             Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1261 
1262   if ( Obj->ARG3 == 0 )
1263   {
1264      /* Output line : centered vertically */
1265      XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1266   }
1267   else
1268   {
1269      /* Output circle */
1270      XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1271   }
1272 
1273   /* Input lines */
1274 
1275   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1276   y1 -= XschBoundYmin;
1277 
1278   /* Circle for inversion */
1279   for (i = 0; i < n; i++)
1280   {
1281      yc = y1;
1282 
1283      if (( Obj->ARG2 & (1 << i)) == 0)
1284      {
1285         XschToolsSaveXfigLine( x - cs, yc, x, yc );
1286      }
1287      else
1288      {
1289        XschToolsSaveXfigCircle( x  - cs, yc - cs/2, cs, cs );
1290      }
1291 
1292      y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1293   }
1294 }
1295 
1296 /*------------------------------------------------------------\
1297 |                                                             |
1298 |                    XschToolsSaveXfigAndOr                   |
1299 |                                                             |
1300 \------------------------------------------------------------*/
1301 
XschToolsSaveXfigAndOr(X1r,Y1r,X2r,Y2r,Ycr,Obj)1302 static void XschToolsSaveXfigAndOr( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1303 
1304   long          X1r;
1305   long          Y1r;
1306   long          X2r;
1307   long          Y2r;
1308   long          Ycr;
1309   xschobj_list *Obj;
1310 {
1311   long gs_y;
1312   long gs_x;
1313   long cs;
1314   int i;
1315   int n;
1316   int na;
1317   long gos_y;
1318   long gos_x;
1319   long gas_y;
1320   long gas_x;
1321   long Radius;
1322 
1323   long x, y;
1324   long yc;
1325   long y1;
1326   long DeltaX;
1327   long DeltaY;
1328 
1329  DeltaX = X2r - X1r;
1330  DeltaY = Y2r - Y1r;
1331 
1332  if ( DeltaX <= 0 ) DeltaX = 1;
1333  if ( DeltaY <= 0 ) DeltaY = 1;
1334 
1335   n = Obj->ARG1;
1336 
1337   gs_y = ( 7 * DeltaY ) / 8;
1338   gs_x = ( 6 * DeltaX ) / 8;
1339   cs   = DeltaX / 8;
1340 
1341   yc = Ycr;
1342   y  = Ycr - gs_y/2;
1343   x = X1r + cs;
1344 
1345   if ( Obj->ARG3 == 0 )
1346   {
1347      /* Output line : centered vertically */
1348      XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1349   }
1350   else
1351   {
1352      /* Output circle */
1353      XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1354   }
1355 
1356 /*
1357 ** Input connectors
1358 */
1359   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1360   y1 -= XschBoundYmin;
1361 
1362   /* Circle for inversion */
1363   for (i = 0; i < n; i++)
1364   {
1365     yc = y1;
1366 
1367     if (( Obj->ARG2 & (1 << i)) == 0)
1368     {
1369        XschToolsSaveXfigLine( x - cs, yc, x, yc );
1370     }
1371     else
1372     {
1373       XschToolsSaveXfigCircle( x  - cs, yc - cs/2, cs, cs );
1374     }
1375 
1376     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1377   }
1378 /*
1379 ** ToolsSaveXfig Input And gates
1380 */
1381   na     = n / 2;
1382 
1383   if ( n & 1 ) gas_y   = 7 * DeltaY / ( 8 * ( na + 1 ) );
1384   else         gas_y   = 7 * DeltaY / ( 8 * na );
1385 
1386   gas_x = gs_x / 3;
1387 
1388   y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1389   y1 -= XschBoundYmin;
1390   y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
1391 
1392   for ( i = 0; i < na; i++ )
1393   {
1394     yc = y1;
1395 
1396     XschToolsSaveXfigLine( x, yc - gas_y /2, x, yc + gas_y/2);
1397 
1398     /* And Shape */
1399 
1400     XschToolsSaveXfigLine(
1401                x, yc - gas_y/2, x + gas_x/2, yc - gas_y/2 );
1402 
1403     XschToolsSaveXfigLine(
1404                x         , yc + gas_y/2,
1405                x + gas_x/2, yc + gas_y/2 );
1406 
1407     XschToolsSaveXfigArc( x, yc - gas_y/2, gas_x, gas_y -1, 90 * 64, -180 * 64);
1408 
1409     y1 -= 2 * ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1410   }
1411 
1412   if ( n & 1 )
1413   {
1414     y1  = y1 + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1415     yc  = y1;
1416 
1417     XschToolsSaveXfigLine( x , yc, x + gas_x, yc  );
1418 
1419 
1420   }
1421 /*
1422 ** ToolsSaveXfig Output Or gate
1423 */
1424   /* Or shape alone */
1425   gos_y   = 2 * DeltaY / 3;
1426   gos_x   = ( 2 * gs_x ) / 3;
1427   yc      = Ycr;
1428   y       = yc + gos_y /2;
1429   x       = x + gas_x;
1430 
1431   XschToolsSaveXfigLine(
1432              x, y, x + gos_x/2, y );
1433 
1434   XschToolsSaveXfigLine(
1435              x          , y - gos_y,
1436              x + gos_x/2, y - gos_y );
1437 
1438   XschToolsSaveXfigArc( x, y - gos_y, gos_x, gos_y, 90 * 64, -180 * 64);
1439 
1440   Radius = (float)(gos_y) * 0.707106781185;
1441 
1442   XschToolsSaveXfigArc( x - (Radius * 5 / 3), yc - Radius,
1443                        Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1444 }
1445 
1446 /*------------------------------------------------------------\
1447 |                                                             |
1448 |                       XschToolsSaveXfigMux                  |
1449 |                                                             |
1450 \------------------------------------------------------------*/
1451 
XschToolsSaveXfigMux(X1r,Y1r,X2r,Y2r,Ycr,Obj)1452 static void XschToolsSaveXfigMux( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1453 
1454   long          X1r;
1455   long          Y1r;
1456   long          X2r;
1457   long          Y2r;
1458   long          Ycr;
1459   xschobj_list *Obj;
1460 {
1461   long gs_x;
1462   long ms_x;
1463   long ms_y;
1464   long cs;
1465   int i;
1466   int ni;
1467   int ns;
1468 
1469   long x;
1470   long yc;
1471   long y1;
1472   long y2;
1473   long y3;
1474   long x3;
1475   long DeltaX;
1476 /*long DeltaY;*/
1477 
1478  DeltaX = X2r - X1r;
1479 /* DeltaY = Y2r - Y1r;*/
1480 
1481  if ( DeltaX <= 0 ) DeltaX = 1;
1482 /* if ( DeltaY <= 0 ) DeltaY = 1;*/
1483 
1484  ns = Obj->ARG1;
1485  ni = Obj->ARG2;
1486 
1487 /*gs_y = ( 7 * DeltaY ) / 8;*/
1488   gs_x = ( 6 * DeltaX ) / 8;
1489   cs   = DeltaX / 8;
1490 
1491   yc = Ycr;
1492   x = X1r + cs;
1493 
1494 /*
1495 ** ToolsSaveXfig Mux Rectangle
1496 */
1497   ms_x = gs_x / 2;
1498 
1499   y1 = Obj->Y + (2 * SCP_BOX_CON_BASE_Y + (ni - 1) * SCP_BOX_CON_STEP_Y) * XSCH_UNIT;
1500   y1 -= XschBoundYmin;
1501 
1502   y2   = y1;
1503   ms_y = y2 - Y1r;
1504 
1505   XschToolsSaveXfigRectangle( x, y2, x + ms_x, y2 - ms_y );
1506 
1507   XschToolsSaveXfigLine( x, y2, x + ms_x, y2 - ms_y / 2 );
1508 
1509   XschToolsSaveXfigLine( x + ms_x, y2 - ms_y/2, x, y2 - ms_y );
1510 
1511   if ( Obj->ARG4 == 0 )
1512   {
1513      /* Output line : centered vertically */
1514      XschToolsSaveXfigLine( x + ms_x, y2 - ms_y/2, x + ms_x + cs, y2 - ms_y/2 );
1515   }
1516   else
1517   {
1518      /* Output circle */
1519      XschToolsSaveXfigCircle( x + ms_x, y2 - ms_y/2 - cs/2, cs, cs );
1520   }
1521 
1522   y3 = y2 - ms_y/2;
1523 
1524   XschToolsSaveXfigLine( x + ms_x + cs, y3, x + gs_x + cs, y3 );
1525 
1526   XschToolsSaveXfigLine( x + gs_x + cs, y3, x + gs_x + cs, yc );
1527 /*
1528 ** Input connectors
1529 */
1530   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1531   y1 -= XschBoundYmin;
1532 
1533   /* Circle for inversion */
1534   for (i = 0; i < ni; i++)
1535   {
1536     y3 = y1;
1537 
1538     if (( Obj->ARG3 & (1 << i)) == 0)
1539     {
1540       XschToolsSaveXfigLine( x - cs, y3, x, y3 );
1541     }
1542     else
1543     {
1544       XschToolsSaveXfigCircle( x - cs, y3 - cs/2, cs, cs );
1545     }
1546 
1547     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1548   }
1549 
1550   x3 = x;
1551 /*
1552 ** Select connectors
1553 */
1554   for (i = 0; i < ns; i++)
1555   {
1556     y3  = y1;
1557 
1558     x3 += ms_x / ( ns + 1 );
1559 
1560     XschToolsSaveXfigLine( x - cs, y3, x3, y3 );
1561 
1562     XschToolsSaveXfigLine( x3, y3, x3, y2 );
1563 
1564     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1565   }
1566 }
1567 
1568 
1569 /*------------------------------------------------------------\
1570 |                                                             |
1571 |                   XschToolsSaveXfigOrAnd                    |
1572 |                                                             |
1573 \------------------------------------------------------------*/
1574 
XschToolsSaveXfigOrAnd(X1r,Y1r,X2r,Y2r,Ycr,Obj)1575 static void XschToolsSaveXfigOrAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1576 
1577   long          X1r;
1578   long          Y1r;
1579   long          X2r;
1580   long          Y2r;
1581   long          Ycr;
1582   xschobj_list *Obj;
1583 {
1584 /*long gs_y;*/
1585   long gs_x;
1586   long cs;
1587   int i;
1588   int n;
1589   int no;
1590   long gos_y;
1591   long gos_x;
1592   long gas_y;
1593   long gas_x;
1594   long Radius;
1595 
1596   long x /*, y*/;
1597   long yc;
1598   long y1;
1599   long DeltaX;
1600   long DeltaY;
1601 
1602  DeltaX = X2r - X1r;
1603  DeltaY = Y2r - Y1r;
1604 
1605  if ( DeltaX <= 0 ) DeltaX = 1;
1606  if ( DeltaY <= 0 ) DeltaY = 1;
1607 
1608   n = Obj->ARG1;
1609 
1610 /*gs_y = ( 7 * DeltaY ) / 8;*/
1611   gs_x = ( 6 * DeltaX ) / 8;
1612   cs   = DeltaX / 8;
1613 
1614   yc = Ycr;
1615 /*y  = Ycr - gs_y/2;*/
1616   x = X1r + cs;
1617 
1618   if ( Obj->ARG3 == 0 )
1619   {
1620      /* Output line : centered vertically */
1621      XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1622   }
1623   else
1624   {
1625      /* Output circle */
1626      XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1627   }
1628 
1629 /*
1630 ** Input connectors
1631 */
1632   y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1633   y1 -= XschBoundYmin;
1634 
1635   /* Circle for inversion */
1636   for (i = 0; i < n; i++)
1637   {
1638     yc = y1;
1639 
1640     if (( Obj->ARG2 & (1 << i)) == 0)
1641     {
1642        XschToolsSaveXfigLine( x - cs, yc, x, yc );
1643     }
1644     else
1645     {
1646       XschToolsSaveXfigCircle( x  - cs, yc - cs/2, cs, cs );
1647     }
1648 
1649     y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1650   }
1651 /*
1652 ** ToolsSaveXfig Input Or gates
1653 */
1654   no     = n / 2;
1655 
1656   if ( n & 1 ) gos_y   = 7 * DeltaY / ( 8 * ( no + 1 ) );
1657   else         gos_y   = 7 * DeltaY / ( 8 * no );
1658 
1659   gos_x = gs_x / 3;
1660 
1661   y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1662   y1 -= XschBoundYmin;
1663   y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
1664 
1665   for ( i = 0; i < no; i++ )
1666   {
1667     yc = y1;
1668 
1669     /* Or shape alone */
1670   XschToolsSaveXfigLine( x          , yc + gos_y/2, x + gos_x/2, yc + gos_y/2 );
1671 
1672   XschToolsSaveXfigLine( x          , yc - gos_y/2, x + gos_x/2, yc - gos_y/2 );
1673 
1674   XschToolsSaveXfigArc( x, yc - gos_y/2, gos_x, gos_y-1, 90 * 64, -180 * 64);
1675 
1676   Radius = (float)(gos_y) * 0.707106781185;
1677 
1678   XschToolsSaveXfigArc( x - (Radius * 5 / 3), yc - Radius,
1679             Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1680 
1681 
1682     y1 -= 2 * ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1683   }
1684 
1685   if ( n & 1 )
1686   {
1687     y1  = y1 + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1688     yc  = y1;
1689 
1690     XschToolsSaveXfigLine( x , yc, x + gos_x, yc  );
1691 
1692   }
1693 
1694   /* ToolsSaveXfig output And Gate */
1695   gas_y   = 2 * DeltaY / 3;
1696   gas_x   = ( 2 * gs_x ) / 3;
1697   yc      = Ycr;
1698 /*y       = yc + gas_y /2;*/
1699   x       = x + gos_x;
1700 
1701   XschToolsSaveXfigLine( x, yc - gas_y /2, x, yc + gas_y/2);
1702 
1703 
1704   XschToolsSaveXfigLine( x, yc - gas_y/2, x + gas_x/2, yc - gas_y/2 );
1705 
1706   XschToolsSaveXfigLine( x         , yc + gas_y/2, x + gas_x/2, yc + gas_y/2 );
1707 
1708   XschToolsSaveXfigArc( x, yc - gas_y/2, gas_x, gas_y -1, 90 * 64, -180 * 64);
1709 }
1710 
1711 /*------------------------------------------------------------\
1712 |                                                             |
1713 |                      XschToolsSaveXfigPentagon              |
1714 |                                                             |
1715 \------------------------------------------------------------*/
1716 
XschToolsSaveXfigPentagon(X1,Y1,X2,Y2,Obj)1717 void XschToolsSaveXfigPentagon( X1, Y1, X2, Y2, Obj )
1718 
1719   long          X1;
1720   long          Y1;
1721   long          X2;
1722   long          Y2;
1723   xschobj_list *Obj;
1724 {
1725   long StepX;
1726   long StepY;
1727 
1728   StepY = ( Y2 - Y1 ) >> 1;
1729   StepX = StepY >> 1;
1730 
1731   if ( StepY <= 0 ) StepY = 1;
1732   if ( StepX <= 0 ) StepX = 1;
1733 
1734   fprintf( XschXfigFile,
1735           "2 3 0 1 %d 0 %d  0 -1 0.000 0 0 -1 0 0 7\n", XschXfigColor, XschXfigDepth );
1736   /*       ^ ^ ^ ^ ^  ^ ^   ^  ^ ^     ^ ^  ^ ^ ^ ^
1737    *       | | | | |  | |   |  | |     | |  | | | + Number Points
1738    *       | | | | |  | |   |  | |     | |  | | + Backward Arrow
1739    *       | | | | |  | |   |  | |     | |  | + Forward Arrow
1740    *       | | | | |  | |   |  | |     | |  + Radius
1741    *       | | | | |  | |   |  | |     | + Cap style
1742    *       | | | | |  | |   |  | |     + Join style
1743    *       | | | | |  | |   |  | + Style Val
1744    *       | | | | |  | |   |  + Area Fill
1745    *       | | | | |  | |   + Pen Style
1746    *       | | | | |  | + Depth
1747    *       | | | | |  + Fill Color
1748    *       | | | | + Pen Color
1749    *       | | | + Width
1750    *       | | + Line Style
1751    *       | + Poly Line
1752    *       + Poly Line
1753    */
1754 
1755   fprintf( XschXfigFile, "  %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n",
1756            X1        , XschXfigDy - Y1,
1757            X1        , XschXfigDy - Y2,
1758            X1        , XschXfigDy - Y2,
1759            X2 - StepX, XschXfigDy - Y2,
1760            X2        , XschXfigDy - ( Y1 + StepY ),
1761            X2 - StepX, XschXfigDy - Y1,
1762            X1        , XschXfigDy - Y1 );
1763 }
1764 
1765 /*------------------------------------------------------------\
1766 |                                                             |
1767 |                      XschToolsSaveXfigString                |
1768 |                                                             |
1769 \------------------------------------------------------------*/
1770 
XschToolsSaveXfigString(X1,Y1,Text,Justified)1771 void XschToolsSaveXfigString( X1, Y1, Text, Justified )
1772 
1773   long  X1;
1774   long  Y1;
1775   char *Text;
1776   int   Justified;
1777 {
1778   fprintf( XschXfigFile,
1779           "4 %d %d %d 0 0 0.0 0.0 0 0.0 0.0 %ld %ld %s\\001\n",
1780   /*       ^ ^  ^  ^  ^ ^ ^   ^   ^ ^   ^   ^   ^   ^
1781    *       | |  |  |  | | |   |   | |   |   |   |   + String
1782    *       | |  |  |  | | |   |   | |   |   |   + Y
1783    *       | |  |  |  | | |   |   | |   |   + X
1784    *       | |  |  |  | | |   |   | |   + Length
1785    *       | |  |  |  | | |   |   | + Height
1786    *       | |  |  |  | | |   |   + Font flags
1787    *       | |  |  |  | | |   + Font Angle
1788    *       | |  |  |  | | + Font size
1789    *       | |  |  |  | + Font
1790    *       | |  |  |  + Pen Style
1791    *       | |  |  + Depth
1792    *       | |  + Pen Color
1793    *       | + Justified
1794    *       + String
1795    */
1796           Justified, XschXfigColor, XschXfigDepth, X1, XschXfigDy - Y1, Text );
1797 }
1798 
1799 /*------------------------------------------------------------\
1800 |                                                             |
1801 |                          XschToolsSaveXfigObject            |
1802 |                                                             |
1803 \------------------------------------------------------------*/
1804 
XschToolsSaveXfigObject(Obj)1805 void XschToolsSaveXfigObject( Obj )
1806 
1807    xschobj_list *Obj;
1808 {
1809   long    X1r;
1810   long    X2r;
1811   long    Y1r;
1812   long    Y2r;
1813   long    Ycr;
1814   long    DeltaX;
1815   long    DeltaY;
1816   short   ObjType;
1817 
1818   if ( IsXschLineLeft( Obj ) )
1819   {
1820     X1r = Obj->X + Obj->DX;
1821     X2r = Obj->X;
1822   }
1823   else
1824   {
1825     X1r = Obj->X;
1826     X2r = Obj->X + Obj->DX;
1827   }
1828 
1829   if ( IsXschLineDown( Obj ) )
1830   {
1831     Y1r  = Obj->Y + Obj->DY;
1832     Y2r  = Obj->Y;
1833   }
1834   else
1835   {
1836     Y1r  = Obj->Y;
1837     Y2r  = Obj->Y + Obj->DY;
1838   }
1839 
1840   X1r -= XschBoundXmin;
1841   X2r -= XschBoundXmin;
1842   Y1r -= XschBoundYmin;
1843   Y2r -= XschBoundYmin;
1844 
1845   Ycr  = (float)( ( Y2r + Y1r) >> 1 );
1846   X1r  = (float)( X1r );
1847   Y1r  = (float)( Y1r );
1848   X2r  = (float)( X2r );
1849   Y2r  = (float)( Y2r );
1850 
1851   DeltaX = X2r - X1r;
1852   DeltaY = Y2r - Y1r;
1853 
1854   if ( DeltaX <= 0 ) DeltaX = 1;
1855   if ( DeltaY <= 0 ) DeltaY = 1;
1856 
1857   ObjType = GetXschObjectType( Obj );
1858 
1859   if ( ( ObjType >= XSCH_OBJECT_BUFFER ) &&
1860        ( ObjType <= XSCH_OBJECT_MUX    ) )
1861   {
1862     if ( ( DeltaX < 5 ) ||
1863          ( DeltaY < 5 ) ) ObjType = XSCH_OBJECT_RECTANGLE;
1864   }
1865 
1866   if ( ObjType >= XSCH_OBJECT_CROSS_BOX )
1867   {
1868     fprintf( XschXfigFile, "6 %ld %ld %ld %ld\n",
1869              X1r, XschXfigDy - Y1r,
1870              X2r, XschXfigDy - Y2r );
1871   }
1872 
1873   switch ( ObjType )
1874   {
1875     case XSCH_OBJECT_LINE :
1876 
1877       XschToolsSaveXfigLine( X1r, Y1r, X2r, Y2r );
1878 
1879     break;
1880 
1881     case XSCH_OBJECT_PENTAGON :
1882 
1883       XschToolsSaveXfigPentagon( X1r, Y1r, X2r, Y2r, Obj );
1884 
1885     break;
1886 
1887     case XSCH_OBJECT_RECTANGLE :
1888 
1889       XschToolsSaveXfigRectangle( X1r, Y1r, X2r, Y2r );
1890 
1891     break;
1892 
1893     case XSCH_OBJECT_CROSS_BOX :
1894 
1895       XschToolsSaveXfigRectangle( X1r, Y1r, X2r, Y2r );
1896       XschToolsSaveXfigLine( X1r, Y1r, X2r, Y2r );
1897       XschToolsSaveXfigLine( X1r, Y2r, X2r, Y1r );
1898 
1899     break;
1900 
1901     case XSCH_OBJECT_BUFFER :
1902 
1903       XschToolsSaveXfigBuffer( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1904 
1905     break;
1906 
1907     case XSCH_OBJECT_AND :
1908 
1909       XschToolsSaveXfigAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1910 
1911     break;
1912 
1913     case XSCH_OBJECT_OR :
1914 
1915       XschToolsSaveXfigOr( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1916 
1917     break;
1918 
1919     case XSCH_OBJECT_XOR :
1920 
1921       XschToolsSaveXfigXor( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1922 
1923     break;
1924 
1925     case XSCH_OBJECT_TRISTATE :
1926 
1927       XschToolsSaveXfigTristate( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1928 
1929     break;
1930 
1931     case XSCH_OBJECT_REGISTER :
1932 
1933       XschToolsSaveXfigRegister( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1934 
1935     break;
1936 
1937     case XSCH_OBJECT_TRANSISTOR :
1938 
1939       XschToolsSaveXfigTransistor( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1940 
1941     break;
1942 
1943     case XSCH_OBJECT_CONSTANT :
1944 
1945       XschToolsSaveXfigConstant( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1946 
1947     break;
1948 
1949     case XSCH_OBJECT_ANDOR :
1950 
1951       XschToolsSaveXfigAndOr( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1952 
1953     break;
1954 
1955     case XSCH_OBJECT_ORAND :
1956 
1957       XschToolsSaveXfigOrAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1958 
1959     break;
1960 
1961     case XSCH_OBJECT_MUX :
1962 
1963       XschToolsSaveXfigMux( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1964 
1965     break;
1966   }
1967 
1968   if ( Obj->NAME != (char *)0 )
1969   {
1970     if ( ( ( IsXschSchCon( Obj )                                 ) &&
1971            ( ( ( IsXschSchConExt( Obj )                        ) &&
1972                ( XSCH_ACTIVE_NAME_TABLE[ XSCH_CONNECTOR_NAME ] ) ) ||
1973              ( ( ! IsXschSchConExt( Obj )                      ) &&
1974                ( XSCH_ACTIVE_NAME_TABLE[ XSCH_INS_CON_NAME   ] ) ) ) ) ||
1975          ( ( IsXschSchBox( Obj                                   ) &&
1976              XSCH_ACTIVE_NAME_TABLE[ XSCH_INSTANCE_NAME  ]     ) )     ||
1977          ( ( IsXschSchNet( Obj                                   ) &&
1978              XSCH_ACTIVE_NAME_TABLE[ XSCH_NET_NAME       ]     ) ) )
1979     {
1980       if ( Obj->TYPE == XSCH_OBJECT_TEXT_RIGHT )
1981       {
1982         /* Left */
1983         XschToolsSaveXfigString( X1r, Y1r, Obj->NAME, 0 );
1984       }
1985       else
1986       if ( Obj->TYPE == XSCH_OBJECT_TEXT_LEFT )
1987       {
1988         /* Right */
1989         XschToolsSaveXfigString( X2r, Y1r, Obj->NAME, 2 );
1990       }
1991       else
1992       {
1993         /* Center */
1994         XschToolsSaveXfigString( ( X2r + X1r ) >> 1, Y1r, Obj->NAME, 1 );
1995       }
1996     }
1997   }
1998 
1999   if ( ObjType >= XSCH_OBJECT_CROSS_BOX )
2000   {
2001     fprintf( XschXfigFile, "-6\n" );
2002   }
2003 }
2004 
2005 /*------------------------------------------------------------\
2006 |                                                             |
2007 |                          XschToolsSaveXfig                  |
2008 |                                                             |
2009 \------------------------------------------------------------*/
2010 
XschToolsSaveXfig(FileName)2011 void XschToolsSaveXfig( FileName )
2012 
2013   char *FileName;
2014 {
2015   xschobj_list *Obj;
2016   int           Layer;
2017 
2018 
2019   FileName = autbasename( FileName, "fig" );
2020 
2021   XschXfigFile = mbkfopen( FileName, "fig", "w" );
2022 
2023   if ( XschXfigFile == (FILE *)0 )
2024   {
2025     XschErrorMessage( XschMainWindow, "Unable to save fig file !" );
2026 
2027     return;
2028   }
2029 
2030   XschSetMouseCursor( XschGraphicWindow, XSCH_WATCH_CURSOR );
2031 
2032   XschXfigDy = XschBoundYmax - XschBoundYmin;
2033 /*
2034 ** Xfig header file
2035 */
2036   fprintf( XschXfigFile,
2037       "#FIG 3.2\nLandscape\nCenter\nMetric\nA4\n100.00\nSingle\n-2\n1200 2\n" );
2038 
2039   for ( Layer = 0; Layer < XSCH_MAX_LAYER; Layer++ )
2040   {
2041     fprintf( XschXfigFile, "0 %d #%06lx\n", Layer + 32, (unsigned long)XSCH_LAYER_XFIG_COLOR[ Layer ] );
2042   }
2043 
2044   for ( Layer = 0; Layer < XSCH_MAX_LAYER; Layer++ )
2045   {
2046     if ( XSCH_ACTIVE_LAYER_TABLE[ Layer ] == 0 ) continue;
2047 
2048     XschXfigDepth = Layer;
2049     XschXfigColor = 32 + Layer;
2050 
2051     if ( ( XschXfigColor == 0 ) || ( XschXfigColor == 8 ) ) XschXfigColor++;
2052 
2053     for ( Obj  = XschFigure->OBJECT[ Layer ];
2054           Obj != (xschobj_list *)NULL;
2055           Obj  = Obj->NEXT )
2056     {
2057       if ( XSCH_ACTIVE_LAYER_TABLE[ Obj->LAYER ] == 0 ) continue;
2058 
2059       XschToolsSaveXfigObject( Obj );
2060 
2061     }
2062   }
2063 
2064   fclose( XschXfigFile );
2065 
2066   XschSetMouseCursor( XschGraphicWindow, XSCH_NORMAL_CURSOR );
2067 }
2068