home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / graphics / degas2ps / degas2ps.c next >
C/C++ Source or Header  |  1989-06-20  |  33KB  |  1,071 lines

  1. /*******************************************************************/
  2. /*                                                                                                                                */
  3. /*         DEGAS2PS.PRG                                                                                                 */
  4. /* Programme d'impression d'images provenant de DEGAS (.PI3).      */
  5. /* La sortie se fait en PostScript vers un fichier ou une laser.   */
  6. /* Il est possible de sélectionner une partie de l'image,                  */
  7. /* la réduction ou l'augmentation ainsi que la position sur                 */
  8. /* la page.                                                                                                                */
  9. /* IRISA de RENNES                                                                                                    */
  10. /*                                                                                                                               */
  11. /* Matériels : ATARI 1040 STFM + LaserWriter II NT                               */
  12. /* Langage : Megamax C                                                                                       */
  13. /*                                                                                                                               */
  14. /* ecrit par :     Bertrand DECOUTY (IRISA-INRIA, Rennes)                         */
  15. /*                            Philippe LE THOMAS (stage IUT Lannion 1988)                 */
  16. /*                                                                                                                                 */
  17. /*******************************************************************/
  18. char version[]= "DEGAS2PS 1.53";
  19.  
  20. /* 1= francais, 0= anglais */
  21. #define FRANCAIS 0
  22.  
  23. #include <stdio.h>
  24. #include <osbind.h>
  25. #include <gembind.h>
  26. #include <gemdefs.h>
  27. #include <obdefs.h>
  28. #include <string.h>
  29. #include "DEGAS2PS.H"
  30. #define RESSOURCE "DEGAS2PS.RSC"
  31.  
  32. #if FRANCAIS
  33. #define MESS0 "[3][ | Le fichier ressource | est introuvable... ][ STOP ]"
  34. #define MESS1 "[2][ | Le périphérique n'est | pas connecté... ][ OK | ANNULER ]"
  35. #define MESS2 "[3][ | Erreur lors de l'ouverture | du fichier de sortie... ][ STOP ]"
  36. #define MESS3 "[2][ | Voulez-vous réellement | stopper l'impression ? ][ NON | OUI ]"
  37. #define MESS4 "[3][ Erreur d'écriture | du fichier PostScript ...| disque plein ? ][ STOP ]"
  38. #define MESS5 "[3][ | Erreur lors de l'ouverture | du fichier image... ][ STOP ]"
  39.  
  40. #else         /* messages en anglais */
  41. #define MESS0 "[3][ | Resource file | not found... ][ STOP ]"
  42. #define MESS1 "[2][ | Peripheral device | not connected or off-line... ][ OK | CANCEL ]"
  43. #define MESS2 "[3][ | I can't open | output file... ][ STOP ]"
  44. #define MESS3 "[2][ | Do you really want | to stop printing ? ][ NO | YES ]"
  45. #define MESS4 "[3][ I/O error while | writing PostScript file | disk full ?][ Sorry.. ]"
  46. #define MESS5 "[3][ | I can't open | image file... ][ STOP ]"
  47. #endif
  48.  
  49. #define void /**/
  50. #define VRAI 1
  51. #define FAUX 0
  52. #define RESW 639                                                            /* Largeur maximale de l'écran */
  53. #define RESH 399                                                            /* Hauteur maximale de l'écran */
  54. #define Souris_Croix graf_mouse(5,&dummy)
  55. #define Souris_Normale graf_mouse(0,&dummy)
  56. #define Cache_Souris graf_mouse(256,&dummy)
  57. #define Montre_Souris graf_mouse(257,&dummy)
  58.  
  59. /* structure pour informations sur fichier */
  60. /*
  61. typedef struct {
  62.     long b_free;
  63.     long b_total;
  64.     long b_secsiz;
  65.     long b_clsiz;
  66. } disk_info;
  67. */
  68.  
  69. /* variables utilisées par le GEM */
  70.  
  71. int work_in[] = {1,1,1,1,1,1,1,1,1,1,2};
  72. int work_out[57],contrl[12],intin[256],intout[256],
  73.     ptsin[128],ptsout[128];
  74.  
  75. /* variables globales */
  76.  
  77. int periph; /* indique le peripherique de sortie : 0 = centronics (PRT:) */
  78.                         /*                                                                         1 = RS 232     (AUX:) */
  79.                         /*                                                                         2 = fichier (file.PS) */
  80. int    handle,x,y,w,h,xres,yres,nombre,sortie,
  81.     xsouris,ysouris,etatbout,etatclav,codeclav,nbpress,event,
  82.     xdial,ydial,wdial,hdial,test,mgbuf[11],debut,lon,
  83.     xstart,ystart,width,height,xso,yso,swo,sho,ouvert,
  84.     rx,ry,rw,rh,dummy,boxw,boxh,deja,sw,sh,suppl,
  85.     w_handle,wx,wy,wh,ww,lecture,ecriture;
  86.  
  87. MFDB dfbb;
  88. MFDB dfbs ={0L,0,0,0,0,0,0,0,0};
  89. int frmary[8],clpry[4],fin;
  90. long buffer,ecran;
  91. char source[80],tex[4][80],mode[80],cheminlecture[80],
  92.          cheminecriture[80],nomfenetre[50],nomsortie[30];
  93. OBJECT *barre,*dial;
  94. /**************************************************************************/
  95. /* initialisation des tableaux contenant les coordonnées des     */
  96. /* blocs pour le clipping                                                                         */
  97.  
  98. void init()
  99.  
  100. {        
  101. /*    xres = work_out[0]+1;
  102.     yres = work_out[1]+1;*/
  103. /*    vq_extnd(handle,1,work_out);    */
  104. /*    dfbb.fd_addr initialise ulterieurement  */
  105.     dfbb.fd_w                = work_out[0]+1;
  106.     dfbb.fd_h                = work_out[1]+1;
  107.     dfbb.fd_wdwidth    = dfbb.fd_w / 16;
  108.     dfbb.fd_stand        =0;
  109.     dfbb.fd_nplanes    =1;
  110.     ouvert = lecture = ecriture = FAUX;
  111. /* lecture des coordonnées maximales de la fenetre */
  112.     wind_get(0,WF_WORKXYWH,&wx,&wy,&ww,&wh);
  113.     buffer = Malloc((long)(32000+256+256));
  114.     w_handle = wind_create(NAME,wx,wy,ww,wh);
  115. }
  116. /**************************************************************************/
  117. void main()
  118.  
  119. {
  120.     int i;
  121.     register int boucle;
  122.     
  123. /* Initialisation des variables utilisées par le système */
  124.     for (boucle=1; boucle<10; work_in[boucle++]=1);
  125.     work_in[10]=2;
  126.     appl_init();
  127.     Cache_Souris;
  128. /* ouverture de la station de travail virtuelle */
  129.     handle = graf_handle(&i,&i,&i,&i);
  130.     v_opnvwk(work_in,&handle,work_out);
  131.     init();                            
  132.     Montre_Souris;
  133. /* chargement du fichier ressource contenant le menu, */
  134. /* les boites de dialogue et les différentes icones */
  135.     if (!rsrc_load(RESSOURCE))
  136.     {
  137.         form_alert(1,MESS0);
  138.     }
  139.     else
  140.     {
  141. /* affichage du menu et lecture de son adresse dans l'arbre    */            
  142.         Souris_Normale;
  143.         rsrc_gaddr(R_TREE,MENU,&barre);
  144.         edition();
  145.     }                                                
  146.     quitter();
  147. }
  148. /**************************************************************************/
  149. /* fermeture de la station, de le fenetre et liberation de la    */
  150. /* memoire                                                                                                         */
  151. void quitter()
  152.  
  153. {
  154.     menu_bar(barre,FAUX);
  155. /* on libère la mémoire occupée par l'image */
  156.     Mfree(buffer);
  157.     if (ouvert) 
  158.     {
  159. /* effacement de la fenetre */
  160.         wind_close(w_handle);
  161.         wind_delete(w_handle);
  162.     }
  163.     v_clsvwk(handle);
  164.     Souris_Normale;
  165.     Montre_Souris;
  166.     appl_exit();
  167. }
  168. /**************************************************************************/
  169. /* routine de copie de bloc                                                             */
  170. /* drap : 1 = copie sans changement, 0 = inversion video */
  171. void image(sx,sy,dx,dy,l,h,drap)
  172.  
  173. register int sx,sy,dx,dy,l,h,drap;
  174. {
  175.     frmary[0]=sx;        
  176.     frmary[1]=sy;            
  177.     frmary[2]=sx+l-1;    
  178.     frmary[3]=sy+h-1;        
  179.     frmary[4]=dx;        
  180.     frmary[5]=dy;        
  181.     frmary[6]=dx+l-1;    
  182.     frmary[7]=dy+h-1;
  183.     clpry[0]=dx;
  184.     clpry[1]=dy;
  185.     clpry[2]=dx+l-1;
  186.     clpry[3]=dy+h-1;
  187.     vs_clip(handle,1,clpry);
  188.     Cache_Souris;
  189.     if (drap) 
  190.         vro_cpyfm(handle,3,frmary,dfbb,dfbs);
  191.     else 
  192.         vro_cpyfm(handle,12,frmary,dfbb,dfbs);
  193.     Montre_Souris;
  194. }
  195. /**************************************************************************/
  196. /* attend un appui sur le bouton gauche pour renvoyer les coordonnées */
  197. /* de la souris, si bouton droit => on quitte. Un appui sur ALTERNATE */
  198. /* réinitialise l'ecran                                                                                             */
  199. void gestion()
  200.  
  201. {
  202.     int bouton,key;
  203.  
  204.     Souris_Croix;
  205.     undo();
  206.     do
  207.     {
  208.         event = evnt_mouse(0,0,0,RESW,RESH,&xsouris,&ysouris,&bouton,&key);
  209. /* test le bouton gauche */
  210.         if (bouton & 0x0001) souris();
  211. /* test la touche ALT */
  212.         if (key & 0x0008) undo();
  213.     }    
  214. /* test le bouton droit */
  215.     while (!(bouton & 0x0002));
  216.     Souris_Normale;
  217. }
  218. /**************************************************************************/
  219. /* restitution de l'écran original */
  220. void undo()
  221.  
  222. {
  223.     deja = FAUX;
  224.     sho = 400; swo = 640;
  225.     image(0,0,0,0,RESW+1,RESH+1,VRAI);
  226. }
  227. /**************************************************************************/
  228. /* affichage d'un rectangle de sélection pour indiquer la zone */
  229. /* que l'on désire imprimer                                                                            */
  230. void souris()
  231.  
  232. {
  233.     int status,x,y,xx,yy,xd,yd;
  234.     char message[80],texte[50];
  235.     
  236.     undo();
  237.     deja = VRAI;
  238.     xx = x = 0; yy = y = 0;
  239.     xd = xsouris;
  240.     yd = ysouris;
  241.     Cconout(0x07);
  242.     do
  243.     {
  244.         vq_mouse(handle,&status,&x,&y);
  245.         if ((xx != x) || (yy != y)) 
  246.         {
  247.             image(xd,yd,xd,yd,xx-xd+1,yy-yd+1,VRAI);
  248.             image(xd,yd,xd,yd,x-xd+1,y-yd+1,FAUX);
  249.             xx = x; yy = y;
  250.         }
  251.     }
  252.     while ((status & 0x0001));
  253. /*    form_alert(1,MESS6);*/
  254.     Souris_Croix;
  255.     if (xd <= x) { xso = xd;swo = x - xso; }
  256.     else { xso = x;swo = xd - xso; }
  257.     if (yd <= y) { yso = yd;sho = y - yso; }
  258.     else { yso = y;sho = yd - yso; }
  259.     Cconout(0x07);
  260. }
  261. /**************************************************************************/
  262. /* gestion des évènements : menu, raffraichissement écran */
  263. void edition()
  264.  
  265. {
  266.     int xstart,ystart,wstart,hstart,rx,ry,rh,rw;
  267.     
  268.     Souris_Normale;
  269.     menu_ienable(barre,IMPRIMER,FAUX);
  270.     menu_ienable(barre,EDITER,FAUX);
  271.     menu_bar(barre,VRAI);
  272.     while (fin != 1)
  273.     {
  274.         event = evnt_mesag(mgbuf);
  275.         wind_update(VRAI);
  276.         switch (mgbuf[0])
  277.         {
  278. /* un menu a ete selectionne */
  279.             case MN_SELECTED : selection();
  280.                 break;
  281. /* rafraichissement de la fenetre */
  282.             case WM_REDRAW :
  283.                 wind_get(mgbuf[3],WF_WORKXYWH,&xstart,&ystart,&wstart,&hstart);
  284.                 wind_get(mgbuf[3],WF_FIRSTXYWH,&rx,&ry,&rw,&rh);
  285.                 frmary[0]=0;        
  286.                 frmary[1]=0;            
  287.                 frmary[2]=wstart-1;    
  288.                 frmary[3]=hstart-1;        
  289.                 frmary[4]=xstart;        
  290.                 frmary[5]=ystart;        
  291.                 frmary[6]=xstart+wstart-1;    
  292.                 frmary[7]=ystart+hstart-1;
  293.                 clpry[0]=rx;
  294.                 clpry[1]=ry;
  295.                 clpry[2]=rx+rw-1;
  296.                 clpry[3]=ry+rh-1;
  297.                 vs_clip(handle,1,clpry);
  298.                 Cache_Souris;
  299.                 vro_cpyfm(handle,3,frmary,dfbb,dfbs);
  300.                 Montre_Souris;
  301.                 break;
  302.         }
  303.         wind_update(FAUX);
  304.     }
  305. }
  306. /**************************************************************************/
  307. /* aiguillage vers le choix fait par l'utilisateur */
  308. void selection()
  309.  
  310. {    
  311.     switch (mgbuf[4])
  312.     {
  313.         case COPY :
  314. /* affichage du copyright */ 
  315.             apropos();
  316.         break;
  317.         case QUITTER : 
  318. /* quitte le programme */
  319.             fin = 1;
  320.         break;
  321. /* affiche la boite d'aide */
  322.         case AIDE :
  323.             aide();
  324.         break;
  325.         case IMPRIMER : 
  326. /* affiche les boites de dialogue pour l'impression */
  327.         impression();
  328.         break;
  329.         case OUVRIR :
  330. /* reservation de la memoire pour l'image */
  331.             ecran = (0xffff00&buffer);
  332.             ecran += (0x200);
  333. /* selection d'un fichier image *.PI? */
  334.             if (dialogue(source,0,"PI?")>0)
  335.             {
  336.                 strcpy(nomsortie,rindex(source,'\\')+1);
  337.                 strcpy(nomfenetre," ");
  338.                 strcat(nomfenetre,rindex(source,'\\')+1);
  339.                 strcat(nomfenetre," ");
  340. /* si une fenetre était déjà ouverte, on la ferme */
  341.                 if (ouvert) wind_close(w_handle);
  342.                 ouvert = VRAI;
  343.                 menu_ienable(barre,IMPRIMER,VRAI);
  344.                 menu_ienable(barre,EDITER,VRAI);
  345. /* initialise la palette des couleurs */
  346. /*                Setpalette(ecran+2);    */
  347.                 dfbb.fd_addr=(ecran+34);
  348.                 menu_bar(barre,FAUX);
  349.                 gestion();
  350. /*            impression();*/
  351. /* ouvre une fenetre contenant l'image */
  352.                 wind_set(w_handle,WF_NAME,nomfenetre);
  353.                 wind_open(w_handle,wx,wy,ww,wh);
  354.                 menu_bar(barre,VRAI);
  355.             }
  356.         break;
  357.         case EDITER :
  358. /* edite une image en memoire */
  359.             if (ouvert) 
  360.             {
  361.                 wind_close(w_handle);
  362.                 menu_bar(barre,FAUX);
  363.                 gestion();
  364. /*            impression();*/
  365.                 wind_open(w_handle,wx,wy,ww,wh);
  366.                 menu_bar(barre,VRAI);
  367.             }
  368.         break;
  369.     }
  370.     menu_tnormal(barre,mgbuf[3],VRAI);
  371. }
  372. /**************************************************************************/
  373. /* sélection de la sortie : rs 232, fichier, centronics */
  374. int sortieimprimante()
  375.  
  376. {    
  377.     rsrc_gaddr(R_TREE,SORTIE,&dial);
  378.     Cache_Souris;
  379.     afficheboite();
  380.     Montre_Souris;
  381.     sortie = form_do(dial,FAUX);
  382.     Cache_Souris;
  383.     effaceboite();
  384.     Montre_Souris;
  385.     if (sortie != ANN1) 
  386.     {
  387.         switch (sortie)
  388.         {
  389.             case FICHIER : periph = 2;
  390. /* selection du fichier de sortie *.PS */
  391.                 if (dialogue(source,1,"PS")>0)
  392.                 {
  393.                     strcpy(mode,source);
  394.                     return(VRAI);
  395.                 }
  396.                 else return(FAUX);
  397.                 break; 
  398.             case LASER : strcpy(mode,"AUX:"); periph = 1;
  399.                 break;
  400.             case PRINTER : strcpy(mode,"PRT:"); periph = 0;
  401.                 break;
  402.         }
  403. /* test si le peripherique est pret ou connecte */
  404.         while (!Bcostat(periph)) if (form_alert(1,MESS1) == 2) return(FAUX);
  405.         return(VRAI);
  406.     }
  407.     else return(FAUX);
  408. }
  409.  
  410. /**************************************************************************/
  411. /* conversion points => centimetre */
  412. float calculpoint(width,resolution)
  413.  
  414. float width,resolution;
  415. {
  416.     return((width*resolution*2.540*1)/300.0);
  417. }
  418.  
  419. /**************************************************************************/
  420. sens_off(page)
  421.  
  422. int *page;
  423.  
  424. /*     selection du sens (portrait, paysage) de l'impression et invalidation    *
  425.  *    du sens non-retenu                                                                                                        */
  426. {
  427.     if (swo<=sho)
  428.     {
  429.         objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
  430.         objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  431.         *page = FAUX;
  432.     }
  433.     else
  434.     {
  435.         objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  436.         objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
  437.         *page = VRAI;
  438.     }
  439.     objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  440.     objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  441.     objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  442.     objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  443.     objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  444.     dial[PLUS].ob_flags=NONE;
  445.     dial[MOINS].ob_flags=NONE;
  446.  
  447. }
  448.  
  449. /**************************************************************************/
  450. sens_on(page)
  451.  
  452. int *page;
  453.  
  454. /*     selection du sens (portrait, paysage) de l'impression et validation        *
  455.  *    de l'autre choix                                                                                                            */
  456. {
  457.     if (swo<=sho)
  458.     {
  459.         objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
  460.         objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  461.         *page = FAUX;
  462.     }
  463.     else
  464.     {
  465.         objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  466.         objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
  467.         *page = VRAI;
  468.     }
  469.     objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  470.     objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  471.     objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  472.     objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  473.     objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  474.     dial[PLUS].ob_flags=TOUCHEXIT;
  475.     dial[MOINS].ob_flags=TOUCHEXIT;
  476. }
  477.  
  478.  
  479. /**************************************************************************/
  480. /* sélection des options de mise en page */
  481.  
  482. int choixformat(page,centre,copie,latex,reduction)
  483.  
  484. int *page,*centre,*copie,*latex;
  485. float *reduction;
  486. {    
  487.     char cop[5],reduc[5],haut[10],larg[10];
  488.     float agrand,largeur,hauteur;
  489.     
  490.     rsrc_gaddr(R_TREE,FORMAT,&dial);
  491.     Cache_Souris;
  492.     agrand = 4.00;
  493.     largeur = calculpoint((float)swo,agrand);
  494.     hauteur = calculpoint((float)sho,agrand);
  495.     strcpy(cop,"01");
  496.     sprintf(reduc,"%04.0f",agrand*100);
  497.     sprintf(larg,"%05.0f",largeur*100);
  498.     sprintf(haut,"%05.0f",hauteur*100);
  499.     ((TEDINFO *)dial[REDUC].ob_spec)->te_ptext = reduc;
  500.     ((TEDINFO *)dial[REDUC].ob_spec)->te_txtlen = 5;
  501.     ((TEDINFO *)dial[COPIE].ob_spec)->te_ptext = cop;
  502.     ((TEDINFO *)dial[COPIE].ob_spec)->te_txtlen = 3;
  503.     ((TEDINFO *)dial[LARGEUR].ob_spec)->te_ptext = larg;
  504.     ((TEDINFO *)dial[LARGEUR].ob_spec)->te_txtlen = 6;
  505.     ((TEDINFO *)dial[HAUTEUR].ob_spec)->te_ptext = haut;
  506.     ((TEDINFO *)dial[HAUTEUR].ob_spec)->te_txtlen = 6;
  507.     afficheboite();
  508.     
  509. /* initialise la boite de selection */
  510.     
  511.     objc_change(dial,REEL,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
  512.     objc_change(dial,NOLATEX,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
  513.     objc_change(dial,LATEX,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  514.     objc_change(dial,AUTO,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  515.     objc_change(dial,CUSTOM,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  516.     objc_change(dial,TMAXTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  517.     objc_change(dial,TREELTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  518.     objc_change(dial,PERSOTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  519.     objc_change(dial,COPIE,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  520.     dial[PORTRAIT].ob_flags=TOUCHEXIT | RBUTTON | SELECTABLE;
  521.     dial[PAYSAGE].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
  522.     dial[CUSTOM].ob_flags=  TOUCHEXIT | RBUTTON | SELECTABLE;
  523.     dial[COPIE].ob_flags=   EDITABLE;
  524.     dial[AUTO].ob_flags=    TOUCHEXIT | RBUTTON | SELECTABLE;
  525.     dial[REEL].ob_flags=    TOUCHEXIT | RBUTTON | SELECTABLE;
  526.     sens_off(page);
  527.     Montre_Souris;
  528.     *latex = FAUX;
  529.     *centre = 0;
  530.     do
  531.     {
  532.         sortie = form_do(dial,0);
  533.         switch (sortie) 
  534.         {
  535.         case AUTO : *centre = 1; sens_off(page);
  536.             break;
  537.         case REEL : *centre = 0; sens_off(page);
  538.             break;
  539.         case CUSTOM : *centre = 2;sens_on(page);
  540.             break;
  541.         case PAYSAGE : *page = VRAI;
  542.             break;
  543.         case PORTRAIT : *page = FAUX;
  544.             break;
  545.         case LATEX : *latex = VRAI;
  546.             objc_change(dial,TMAXTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  547.             objc_change(dial,TREELTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  548.             objc_change(dial,PERSOTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  549.             objc_change(dial,COPIE,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  550.             objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  551.             objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  552.             objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  553.             objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  554.             objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  555.             dial[PLUS].ob_flags=    NONE;
  556.             dial[MOINS].ob_flags=   NONE;
  557.             dial[COPIE].ob_flags=   NONE;
  558.             dial[PORTRAIT].ob_flags=NONE;
  559.             dial[PAYSAGE].ob_flags= NONE;
  560.             dial[CUSTOM].ob_flags=  NONE;
  561.             dial[AUTO].ob_flags=    NONE;
  562.             dial[REEL].ob_flags=    NONE;
  563.             break;
  564.         case NOLATEX : *latex = FAUX;
  565.             objc_change(dial,TMAXTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  566.             objc_change(dial,TREELTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  567.             objc_change(dial,PERSOTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  568.             objc_change(dial,COPIE,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  569.             if(*centre==2)
  570.             {
  571.                 objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  572.                 objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  573.                 objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  574.                 objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  575.                 objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  576.                 dial[PLUS].ob_flags=    TOUCHEXIT;
  577.                 dial[MOINS].ob_flags=   TOUCHEXIT;
  578.             } else
  579.             {
  580.                 objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  581.                 objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
  582.             }
  583.             dial[PORTRAIT].ob_flags=TOUCHEXIT | RBUTTON | SELECTABLE;
  584.             dial[PAYSAGE].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
  585.             dial[CUSTOM].ob_flags=  TOUCHEXIT | RBUTTON | SELECTABLE;
  586.             dial[COPIE].ob_flags=   EDITABLE;
  587.             dial[AUTO].ob_flags=    TOUCHEXIT | RBUTTON | SELECTABLE;
  588.             dial[REEL].ob_flags=    TOUCHEXIT | RBUTTON | SELECTABLE;
  589.             break;
  590.         case PLUS :
  591.             if (agrand+0.050<99.9)
  592.             { 
  593.                 agrand += 0.050;
  594.                 largeur = calculpoint((float)swo,agrand);
  595.                 hauteur = calculpoint((float)sho,agrand);
  596.                 sprintf(reduc,"%04.0f",agrand*100);
  597.                 sprintf(larg,"%05.0f",largeur*100);
  598.                 sprintf(haut,"%05.0f",hauteur*100);
  599.                 objc_draw(dial,REDUC,0,xdial,ydial,wdial,hdial);
  600.                 objc_draw(dial,HAUTEUR,0,xdial,ydial,wdial,hdial);
  601.                 objc_draw(dial,LARGEUR,0,xdial,ydial,wdial,hdial);
  602.             }
  603.             objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  604.             break;
  605.         case MOINS : 
  606.             if (agrand-0.050>0.99)
  607.             {
  608.                 agrand -= 0.050;
  609.                 largeur = calculpoint((float)swo,agrand);
  610.                 hauteur = calculpoint((float)sho,agrand);
  611.                 sprintf(reduc,"%04.0f",agrand*100);
  612.                 sprintf(larg,"%05.0f",largeur*100);
  613.                 sprintf(haut,"%05.0f",hauteur*100);
  614.                 objc_draw(dial,REDUC,0,xdial,ydial,wdial,hdial);
  615.                 objc_draw(dial,HAUTEUR,0,xdial,ydial,wdial,hdial);
  616.                 objc_draw(dial,LARGEUR,0,xdial,ydial,wdial,hdial);
  617.             }
  618.             objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
  619.             break;
  620.         }
  621.     }
  622.     while ((sortie != PRINT) && (sortie != ANN2));
  623.     if (*centre == 0) strcpy(reduc,"400");
  624.     *copie = atoi(cop);
  625.     *reduction=agrand;
  626.     Cache_Souris;
  627.     effaceboite();
  628.     Montre_Souris;
  629.     if (sortie == PRINT) 
  630.         return(VRAI);
  631.     else 
  632.         return(FAUX);
  633. }
  634.  
  635. /**************************************************************************/
  636. /* calcul des coordonnées d'un bloc pour l'envoi vers la laser */
  637. void calcul(masqueg,masqued,masquageg,masquaged)
  638.  
  639. int *masqueg,*masqued,*masquageg,*masquaged;
  640. {
  641.     register int x,y,h,w,bitdroite,bitgauche;
  642.     
  643.     x = xso;y = yso;h = sho;w = swo;
  644.     *masquageg = FAUX;
  645.     *masquaged = FAUX;
  646.     if (x % 8)
  647.     {
  648.         *masquageg = VRAI;    
  649.         bitgauche = (x % 8);
  650.         *masqueg = 0xff >> bitgauche;
  651.         x -= bitgauche;
  652.     }
  653.     if ((w % 8) != 7)
  654.     {
  655.         *masquaged = VRAI;
  656.         bitdroite = 7 - (w % 8);
  657.         *masqued = (0x00ff << bitdroite) & 0x00ff;
  658.         w += bitdroite;
  659.     }    
  660.     debut = (int)(x / 8) + y*80;
  661.     lon = (int)(w / 8);
  662.     if (w % 8) lon ++;
  663.     nombre = h * lon;
  664. }
  665. /**************************************************************************/        
  666. void impression()
  667.  
  668. /* impression de l'image avec toutes les options */
  669.  
  670. {
  671.     register FILE *fd;
  672.     register int i,j,k,buf_ptr;
  673.     register long inc;
  674.     unsigned int date,time;
  675.     int hauteur,largeur,x,bouton,compteur,dep,masqueg,masqued;
  676.     int masquaged,masquageg,page,centre,copie,latex;
  677.     int llx,lly,urx,ury;
  678.     float reduction,unite;
  679.     unsigned char buf[512], tamp1,tamp2;
  680.     date=Tgetdate(); time=Tgettime();
  681.     if (choixformat(&page,¢re,&copie,&latex,&reduction))
  682.     {
  683.         if (sortieimprimante())
  684.         {
  685.             if ((fd = fopen(mode,"w")) == NULL)
  686.             {
  687.                 form_alert(1,MESS2);
  688.             }
  689.             else
  690.             {
  691.                 Cache_Souris;
  692.                 calcul(&masqueg,&masqued,&masquageg,&masquaged);
  693.                 rsrc_gaddr(R_TREE,ANNONCE,&dial);
  694.                 if (deja){
  695.                     hauteur = sho;
  696.                     largeur = lon * 8;
  697.                 }
  698.                 else{
  699.                     hauteur = 400;                    
  700.                     largeur = 640;                    
  701.                 }
  702.                 dial[CADRE].ob_width = (dial[CADRE].ob_width/dial[BOITE].ob_width)*dial[BOITE].ob_width;
  703.                 objc_change(dial,CADRE,0,xdial,ydial,wdial,hdial,NORMAL,1);
  704.                 dial[BOITE].ob_x = 0;
  705.                 objc_change(dial,BOITE,0,xdial,ydial,wdial,hdial,NORMAL,1);
  706.                 afficheboite();
  707.                 resetboite();    
  708. /* début du code PostScript */
  709.                 if (periph!=2) fprintf(fd,"\004"); /* initialisation de l'imprimante */
  710.                 if (copie == 0) copie = 1;
  711.                 llx=72; lly=72; unite=(72.0*4.0)/300.0;
  712.                 urx=llx+(((float)largeur)*unite); ury=lly+(((float)hauteur)*unite);
  713.                 if (latex)
  714.                 {    fprintf(fd,"%%!PS-Adobe-2.0 EPSF-2.0");
  715.                     fprintf(fd,"%%%%BoundingBox: %d %d %d %d\n",llx,lly,urx,ury);
  716.                     fprintf(fd,"%%%%Creator: DEGAS2PS on Atari ST\n");
  717.                     fprintf(fd,"%%%%Title: %s\n",rindex(source,'\\')+1);
  718.                     fprintf(fd,"%%%%CreationDate: %02d/%02d/%4d  %02d:%02d\n",
  719.                                       date&0x1f,(date>>5)&0x0f,((date>>9)&0x7f)+1980,
  720.                                       (time>>11)&0x1f,(time>>5)&0x3f);
  721.                     fprintf(fd,"%%%%EndComments\n");
  722.                     fprintf(fd,"%%%%Pages 1\n%%%%EndComments\n%%%%Page: 1 1\n");
  723.                     fprintf(fd,"gsave 72 72 translate /height %d def /width %d def\n",hauteur, largeur);
  724.                     fprintf(fd,"/dot {%1.2f mul}def width dot height dot scale\n",unite);
  725.                 } else{
  726.                     fprintf(fd,"%%!\ngsave initmatrix /#copies %d def\n",copie);
  727.                     fprintf(fd,"/reduc %2.2f def /page %d def /centre %d def\n",reduction,page,centre);
  728.                     fprintf(fd,"/height %d def /width %d def\n",hauteur,largeur);
  729.                     fprintf(fd,"/devit { dtransform 2 copy dup mul exch dup mul exch add sqrt\n");
  730.                     fprintf(fd,"         dup 3 1 roll div 3 1 roll div exch idtransform } def\n");
  731.                     fprintf(fd,"/xdev 1 0 devit pop def /ydev 0 1 devit exch pop def\n");
  732.                     fprintf(fd,"xdev reduc mul ydev reduc mul scale\n/reduc2 1 def\n");
  733.                     fprintf(fd,"clippath pathbbox\n");                                    /* On récupère les valeurs */
  734.                     fprintf(fd,"/yhaut exch def /xhaut exch def\n");        /* exactes des coordonnées */
  735.                     fprintf(fd,"/ybas  exch def /xbas  exch def\n");        /* de l'imprimante                */
  736.                     fprintf(fd,"/yutil yhaut ybas sub def /xutil xhaut xbas sub def\n");
  737.                     fprintf(fd,"centre 1 le\n");
  738.                     fprintf(fd," { height width gt\n");
  739.                     fprintf(fd,"  { /page 0 def } { /page 1 def } ifelse } if\n");
  740.                     fprintf(fd,"centre 1 eq\n");
  741.                     fprintf(fd," { /reduc2 0.05 def\n");
  742.                     fprintf(fd,"  { /h reduc2 height mul def\n");
  743.                     fprintf(fd,"    /l reduc2 width mul def\n");
  744.                     fprintf(fd,"    h xutil le l yutil le and\n");
  745.                     fprintf(fd,"     { /reduc2 reduc2 0.05 add def } {exit} ifelse");
  746.                     fprintf(fd,"  } loop\n");
  747.                     fprintf(fd," /reduc2 reduc2 0.05 sub def }if \n");
  748.                      fprintf(fd,"1 page eq { /topoffset  { yutil width  dot sub 2 div cvi } def\n");
  749.                     fprintf(fd,"            /leftoffset { xutil height dot sub 2 div cvi } def }\n");
  750.                     fprintf(fd,"          { /leftoffset { xutil width  dot sub 2 div cvi } def\n");
  751.                     fprintf(fd,"            /topoffset  { yutil height dot sub 2 div cvi } def } ifelse\n");
  752.                     fprintf(fd,"/dot { reduc2 mul } def xbas ybas translate\n");
  753.                     fprintf(fd,"1 page eq\n");
  754.                     fprintf(fd,"{ xutil 0 translate 90 rotate topoffset leftoffset translate }\n");
  755.                     fprintf(fd,"{ leftoffset topoffset translate } ifelse\n");
  756.                     fprintf(fd,"width dot height dot scale\n");
  757.                 }
  758.                 fprintf(fd,"/imagedegas { width height 1 [width 0 0 height neg 0 height]\n");
  759.                 fprintf(fd,"{ currentfile picstr readhexstring pop } image } def\n");
  760.                 fprintf(fd,"/picstr width 8 idiv string def\n");
  761.                 fprintf(fd,"{ 1 exch sub } settransfer\n");
  762.                 fprintf(fd,"imagedegas\n");
  763.                 
  764.                 compteur = 0;
  765.                 dep = (int)(dial[CADRE].ob_width/dial[BOITE].ob_width);
  766.                 /* envoi d'une partie d'image */
  767.                 if (deja)
  768.                 {
  769.                     inc = debut + 34;
  770.                     dep = (int)(nombre/dep);            
  771.                     for (j=1; j<=sho; j++)
  772.                     {
  773.                         if (testarret() == 2) { if (periph == 2) fclose(fd); Montre_Souris;return;}
  774.                         compteur++;
  775.                         if (masquageg) fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++) & masqueg);
  776.                         else fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++));
  777.                         for (i=2; i<lon; i++)
  778.                         {
  779.                             if (periph == 1) gestionerreur();
  780.                             fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++));
  781.                             if (compteur++ >= dep)
  782.                             {
  783.                                 compteur = 0;
  784.                                 dial[BOITE].ob_x += dial[BOITE].ob_width;
  785.                                 objc_draw(dial,CADRE,xdial,ydial,wdial,hdial);
  786.                                 objc_draw(dial,BOITE,xdial,ydial,wdial,hdial);
  787.                             }
  788.                         }
  789.                         if (masquaged) fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++) & masqued);
  790.                         else fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++));
  791.                         if(fprintf(fd,"\n")<0) {
  792.                                 form_alert(1,MESS4);
  793.                                 if (periph == 2) fclose(fd);    Montre_Souris;
  794.                                 return;
  795.                         }                    
  796.                         inc += (80 - lon);
  797.                         compteur++;
  798.                     }
  799.                 }
  800.                 else
  801.                 /* envoi de l'image entière */    
  802.                 {
  803.                     dep = (int)(32000/dep);        inc=0L;    
  804.                     for (i=0; i<=RESH;i++)
  805.                     {
  806.                         if (testarret() == 2) {if (periph == 2) fclose(fd); Montre_Souris;return;}
  807.                         if (periph == 1) gestionerreur();
  808.                         
  809.                         for(j=buf_ptr=0; j<80; j++){
  810.                             tamp1=*(unsigned char *)((ecran+34)+(inc++));
  811.                             tamp2=(tamp1&0x0F0)>>4;
  812.                             buf[buf_ptr++]=tamp2+(tamp2<10 ? 0x030 : 0x037);
  813.                             tamp2=(tamp1&0x00F);
  814.                             buf[buf_ptr++]=tamp2+(tamp2<10 ? 0x030 : 0x037);
  815.                         }
  816.                         buf[160]='\0';
  817.                         if(fprintf(fd,"%s\n",buf)<0) {
  818.                                 form_alert(1,MESS4);
  819.                                 if (periph == 2) fclose(fd);    Montre_Souris;
  820.                                 return;
  821.                         }
  822.                         if ((compteur=compteur+80) >= dep){
  823.                             compteur = 0;
  824.                             dial[BOITE].ob_x += dial[BOITE].ob_width;
  825.                             objc_draw(dial,CADRE,xdial,ydial,wdial,hdial);
  826.                             objc_draw(dial,BOITE,xdial,ydial,wdial,hdial);
  827.                         }
  828.                     } /* for i=*/
  829.                 } /* fin else*/
  830.                 if (fprintf(fd,"grestore showpage\n%%%%Trailer\n")<0){
  831.                     form_alert(1,MESS4);
  832.                 };
  833.                 if (periph == 2) fclose(fd); else fflush(fd); /* on ne ferme pas si AUX ou PRN */
  834.                 Cconout(0x07);
  835.                 /* attend les messages de la laser */
  836.                 if (periph != 2)
  837.                 {
  838.                     Bconout(periph,0x04);
  839.                     k = 0;
  840.                     if (periph == 1)
  841.                     do
  842.                     {    
  843.                         evnt_mouse(0,0,0,RESW,RESH,&x,&x,&bouton,&x);
  844.                         if (k++ == 1000) 
  845.                         {
  846.                             Bconout(periph,0x14);
  847.                             k = 0;
  848.                         }
  849.                         gestionerreur();
  850.                     }
  851.                     while (!(bouton & 0x0002));
  852.                 }
  853.                 effaceboite();
  854.                 Montre_Souris;
  855.             }
  856.       }
  857.   }
  858. }
  859. /**************************************************************************/
  860. /* test si on appuie sur le bouton de droite pour l'arret de     */
  861. /* l'impression                                                                                                */
  862. int testarret()
  863.  
  864. {
  865.     int status,x;
  866.     
  867.     vq_mouse(handle,&status,&x,&x);
  868.     if (status & 0x0002)
  869.         return(form_alert(1,MESS3));
  870.     else return(0);
  871. }
  872. /**************************************************************************/
  873. /* initialise la boite de dialogue */
  874. void resetboite()
  875.  
  876. {
  877.     register int i;
  878.     char mess[80];
  879.     
  880.     strcpy(mess,"");
  881.     for (i=PHRASE1; i<=PHRASE4; i++)
  882.     {
  883.         ((TEDINFO *)dial[i].ob_spec)->te_ptext = mess;
  884.         ((TEDINFO *)dial[i].ob_spec)->te_txtlen = 40;
  885.         objc_draw(dial,i,0,xdial,ydial,wdial,hdial);
  886.     }
  887.     for (i=0; i<=3; i++) strcpy(tex[i],"");
  888. }
  889. /**************************************************************************/
  890. /* test si l'imprimante envoie des messages pour signaler des    */
  891. /* anomalies lors de l'impression    */
  892. void gestionerreur()
  893.  
  894. {
  895.     register int i,j,l;
  896.     char texte[20],mess[80];
  897.     
  898.     while (Bconstat(periph))
  899.     {
  900.         while (((l = (int)Bconin(periph)) != 13) && ( l <= 122) && (l >= 32))
  901.         {
  902.             strcpy(texte,"");
  903.             if ((l != 37) && (l != 91) && (l != 93))
  904.             {
  905.                 sprintf(texte,"%c",l);
  906.                 strcat(mess,texte);
  907.             }
  908.         }
  909.         if (l == 13)
  910.         {
  911.             l = (int)Bconin(periph);
  912.             for (i = 0; i <= 2; i++) strcpy(tex[i],tex[i+1]);
  913.             strcpy(tex[3],mess);
  914.             j = 0;
  915.             for (i=PHRASE1; i<=PHRASE4; i++)
  916.             {
  917.                 ((TEDINFO *)dial[i].ob_spec)->te_ptext = tex[j++];
  918.                 ((TEDINFO *)dial[i].ob_spec)->te_txtlen = 40;
  919.                 objc_draw(dial,i,0,xdial,ydial,wdial,hdial);
  920.             }
  921.             strcpy(mess,"");
  922.         }
  923.     }
  924. }
  925. /**************************************************************************/
  926. /* réserve la place pour l'affichage d'une boite de dialogue */
  927. void afficheboite()
  928.  
  929. {
  930.     form_center(dial,&xdial,&ydial,&wdial,&hdial);
  931.     form_dial(FMD_START,1,1,10,10,xdial,ydial,wdial,hdial);
  932.     form_dial(FMD_GROW,1,1,10,10,xdial,ydial,wdial,hdial);
  933.     objc_draw(dial,ROOT,MAX_DEPTH,xdial,ydial,wdial,hdial);
  934. }
  935. /**************************************************************************/
  936. /* libère la place occupée par la boite et l'efface */
  937. void effaceboite()
  938.  
  939. {
  940.     form_dial(FMD_SHRINK,1,1,10,10,xdial,ydial,wdial,hdial);
  941.     form_dial(FMD_FINISH,1,1,10,10,xdial,ydial,wdial,hdial);
  942.     objc_change(dial,sortie,0,xdial,ydial,wdial,hdial,NORMAL,FAUX);
  943. }
  944. /**************************************************************************/
  945. /* affiche une fenetre d'aide */
  946. void aide()
  947.  
  948. {    
  949.     rsrc_gaddr(R_TREE,HELP,&dial);
  950.     Cache_Souris;
  951.     afficheboite();
  952.     Montre_Souris;
  953.     sortie = form_do(dial,FAUX);
  954.     Cache_Souris;
  955.     effaceboite();
  956.     Montre_Souris;
  957. }
  958. /**************************************************************************/
  959. /* affiche le copyright */
  960. void apropos()
  961.  
  962. {
  963.     rsrc_gaddr(R_TREE,COPYRIG,&dial);
  964.     ((TEDINFO *)dial[NUMVER].ob_spec)->te_ptext=version;
  965.     ((TEDINFO *)dial[NUMVER].ob_spec)->te_txtlen=strlen(version);
  966.     Cache_Souris;
  967.     afficheboite();
  968.     Montre_Souris;
  969.     sortie = form_do(dial,FAUX);
  970.     Cache_Souris;
  971.     effaceboite();
  972.     Montre_Souris;
  973. }
  974. /**************************************************************************/
  975. /* sélection d'un fichier à partir d'un disque */
  976. int dialogue(source,type,suffixe)
  977.  
  978. char *source;
  979. int type;
  980. char *suffixe;
  981. {
  982.     int fichier,drive;
  983.     char nomfich[80];
  984.     char inpath[80];               /* chemin d'acces */
  985.     char insel[80];                   /* selection document */
  986.     int bouton,res;
  987.     long longueur = 32034;    /* longueur d'un fichier DEGAS */
  988.     disk_info diskinfo;
  989.     long space;
  990.  
  991. /* Obtention du nom du fichier source */
  992. /* On affiche les fichiers dans le repertoire */
  993. /* courant, sur le drive actif */
  994.  
  995.     drive=Dgetdrv();
  996.     inpath[0]=drive+0x41;
  997.     inpath[1]=NULL;
  998.     strcat(inpath,":");
  999.     Dgetpath(&inpath[2],drive+1);
  1000.     strcat(inpath,"\\*.");
  1001.     strcat(inpath,suffixe);
  1002.     insel[0]='\0';
  1003.     if (lecture && (!type)) 
  1004.     {
  1005.         strcpy(inpath,cheminlecture);
  1006.         strcpy(rindex(inpath,'.')+1,suffixe);
  1007.     }    
  1008.     if (ecriture && (type))
  1009.     {
  1010.         strcpy(inpath,cheminecriture);
  1011.         strcpy(rindex(inpath,'.')+1,suffixe);
  1012.     }
  1013.     if (type) 
  1014.     {
  1015.         strcpy(insel,nomsortie);
  1016.         strcpy(rindex(insel,'.')+1,suffixe);
  1017.     }
  1018.     if (!fsel_input(inpath,insel,&bouton)) return(FAUX);
  1019.     if (((bouton) && (insel[0] == '\0')) || (!bouton)) return(FAUX);
  1020.     else
  1021.     {
  1022. /* sauve le chemin pour le lecture des fichiers PI3 */
  1023.         if (type)
  1024.         {
  1025.             strcpy(cheminecriture,inpath);
  1026.             ecriture = VRAI;
  1027.         } 
  1028.         else 
  1029.         { 
  1030. /* sauve le chemin pour l'écriture des fichiers PS */
  1031.             strcpy(cheminlecture,inpath);
  1032.             lecture = VRAI;
  1033.         }
  1034.         strcpy(nomfich,inpath);
  1035.         strcpy(rindex(nomfich,'\\')+1,insel);
  1036.         strcpy(source,nomfich);    
  1037.         if (type) 
  1038.         {
  1039. /*
  1040.             Dfree(&diskinfo,(source[0]-'A')+1);
  1041.             space = diskinfo.b_free * diskinfo.b_clsiz * diskinfo.b_secsiz;
  1042.             if (space < 70000) 
  1043.             {
  1044.                 form_alert(1,MESS4);
  1045.                 return(FAUX);
  1046.             }
  1047.             else 
  1048. */
  1049.                 return(VRAI);
  1050.         }
  1051.         else
  1052.         {      
  1053.             if ((fichier = Fopen(nomfich,0)) < 0) 
  1054.             {
  1055.                 form_alert(1,MESS5);
  1056.                 return(FAUX);
  1057.             }
  1058.             else 
  1059.             {        
  1060.                 Fread(fichier,longueur,ecran);
  1061.                 Fclose(fichier);    
  1062.                 return(VRAI); 
  1063.             }
  1064.         }
  1065.     }
  1066.  
  1067. /**********************************/
  1068. /* fin du programme ST_PostScript */
  1069. /***********************************************************************/
  1070. }
  1071.