home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
graphics
/
utility
/
degas2ps
/
degas2ps.c01
< prev
next >
Wrap
Text File
|
1989-06-20
|
32KB
|
1,072 lines
/*******************************************************************/
/* */
/* DEGAS2PS.PRG */
/* Programme d'impression d'images provenant de DEGAS (.PI3). */
/* La sortie se fait en PostScript vers un fichier ou une laser. */
/* Il est possible de sélectionner une partie de l'image, */
/* la réduction ou l'augmentation ainsi que la position sur */
/* la page. */
/* IRISA de RENNES */
/* */
/* Matériels : ATARI 1040 STFM + LaserWriter II NT */
/* Langage : Megamax C */
/* */
/* ecrit par : Bertrand DECOUTY (IRISA-INRIA, Rennes) */
/* Philippe LE THOMAS (stage IUT Lannion 1988) */
/* */
/*******************************************************************/
char version[]= "DEGAS2PS 1.52";
/* 1= francais, 0= anglais */
#define FRANCAIS 0
#include <stdio.h>
#include <osbind.h>
#include <gembind.h>
#include <gemdefs.h>
#include <obdefs.h>
#include <string.h>
#include "DEGAS2PS.H"
#define RESSOURCE "DEGAS2PS.RSC"
#if FRANCAIS
#define MESS0 "[3][ | Le fichier ressource | est introuvable... ][ STOP ]"
#define MESS1 "[2][ | Le périphérique n'est | pas connecté... ][ OK | ANNULER ]"
#define MESS2 "[3][ | Erreur lors de l'ouverture | du fichier de sortie... ][ STOP ]"
#define MESS3 "[2][ | Voulez-vous réellement | stopper l'impression ? ][ NON | OUI ]"
#define MESS4 "[3][ Erreur d'écriture | du fichier PostScript ...| disque plein ? ][ STOP ]"
#define MESS5 "[3][ | Erreur lors de l'ouverture | du fichier image... ][ STOP ]"
#else /* messages en anglais */
#define MESS0 "[3][ | Resource file | not found... ][ STOP ]"
#define MESS1 "[2][ | Peripheral device | not connected or off-line... ][ OK | CANCEL ]"
#define MESS2 "[3][ | I can't open | output file... ][ STOP ]"
#define MESS3 "[2][ | Do you really want | to stop printing ? ][ NO | YES ]"
#define MESS4 "[3][ I/O ERROR while | writing PostScript file | disk full ?][ Sorry.. ]"
#define MESS5 "[3][ | I can't open | image file... ][ STOP ]"
#endif
#define void /**/
#define VRAI 1
#define FAUX 0
#define RESW 639 /* Largeur maximale de l'écran */
#define RESH 399 /* Hauteur maximale de l'écran */
#define Souris_Croix graf_mouse(5,&dummy)
#define Souris_Normale graf_mouse(0,&dummy)
#define Cache_Souris graf_mouse(256,&dummy)
#define Montre_Souris graf_mouse(257,&dummy)
/* structure pour informations sur fichier */
/*
typedef struct {
long b_free;
long b_total;
long b_secsiz;
long b_clsiz;
} disk_info;
*/
/* variables utilisées par le GEM */
int work_in[12],work_out[57],contrl[12],intin[256],intout[256],
ptsin[128],ptsout[128];
/* variables globales */
int periph; /* indique le peripherique de sortie : 0 = centronics (PRT:) */
/* 1 = RS 232 (AUX:) */
/* 2 = fichier (file.PS) */
int handle,x,y,w,h,xres,yres,nombre,sortie,
xsouris,ysouris,etatbout,etatclav,codeclav,nbpress,event,
xdial,ydial,wdial,hdial,test,mgbuf[11],debut,lon,
xstart,ystart,width,height,xso,yso,swo,sho,ouvert,
rx,ry,rw,rh,dummy,boxw,boxh,deja,sw,sh,suppl,
w_handle,wx,wy,wh,ww,lecture,ecriture,
dfbb[10],dfbs[10],frmary[8],clpry[4],fin;
long buffer,ecran;
char source[80],tex[4][80],mode[80],cheminlecture[80],
cheminecriture[80],nomfenetre[50],nomsortie[30];
OBJECT *barre,*dial;
/**************************************************************************/
/* initialisation des tableaux contenant les coordonnées des */
/* blocs pour le clipping */
void init()
{
xres = work_out[0]+1;
yres = work_out[1]+1;
vq_extnd(handle,1,work_out);
dfbb[0]=(ecran+34)>>16;
dfbb[1]=(ecran+34)&0xffff;
dfbb[2]=xres;
dfbb[3]=yres;
dfbb[4]=xres>>4;
dfbb[5]=0;
dfbb[6]=work_out[4];
dfbs[0]=dfbs[1]=0;
ouvert = lecture = ecriture = FAUX;
/* lecture des coordonnées maximales de la fenetre */
wind_get(0,WF_WORKXYWH,&wx,&wy,&ww,&wh);
buffer = Malloc((long)32000+256+256);
w_handle = wind_create(NAME,wx,wy,ww,wh);
}
/**************************************************************************/
void main()
{
int i;
register int boucle;
/* Initialisation des variables utilisées par le système */
for (boucle=1; boucle<10; work_in[boucle++]=1);
work_in[10]=2;
appl_init();
Cache_Souris;
/* ouverture de la station de travail virtuelle */
handle = graf_handle(&i,&i,&i,&i);
v_opnvwk(work_in,&handle,work_out);
init();
Montre_Souris;
/* chargement du fichier ressource contenant le menu, */
/* les boites de dialogue et les différentes icones */
if (!rsrc_load(RESSOURCE))
{
form_alert(1,MESS0);
}
else
{
/* affichage du menu et lecture de son adresse dans l'arbre */
Souris_Normale;
rsrc_gaddr(R_TREE,MENU,&barre);
edition();
}
quitter();
}
/**************************************************************************/
/* fermeture de la station, de le fenetre et liberation de la */
/* memoire */
void quitter()
{
menu_bar(barre,FAUX);
/* on libère la mémoire occupée par l'image */
Mfree(buffer);
if (ouvert)
{
/* effacement de la fenetre */
wind_close(w_handle);
wind_delete(w_handle);
}
v_clsvwk(handle);
Souris_Normale;
Montre_Souris;
appl_exit();
}
/**************************************************************************/
/* routine de copie de bloc */
/* drap : 1 = copie sans changement, 0 = inversion video */
void image(sx,sy,dx,dy,l,h,drap)
register int sx,sy,dx,dy,l,h,drap;
{
frmary[0]=sx;
frmary[1]=sy;
frmary[2]=sx+l-1;
frmary[3]=sy+h-1;
frmary[4]=dx;
frmary[5]=dy;
frmary[6]=dx+l-1;
frmary[7]=dy+h-1;
clpry[0]=dx;
clpry[1]=dy;
clpry[2]=dx+l-1;
clpry[3]=dy+h-1;
vs_clip(handle,1,clpry);
Cache_Souris;
if (drap)
vro_cpyfm(handle,3,frmary,dfbb,dfbs);
else
vro_cpyfm(handle,12,frmary,dfbb,dfbs);
Montre_Souris;
}
/**************************************************************************/
/* attend un appui sur le bouton gauche pour renvoyer les coordonnées */
/* de la souris, si bouton droit => on quitte. Un appui sur ALTERNATE */
/* réinitialise l'ecran */
void gestion()
{
int bouton,key;
Souris_Croix;
undo();
do
{
event = evnt_mouse(0,0,0,RESW,RESH,&xsouris,&ysouris,&bouton,&key);
/* test le bouton gauche */
if (bouton & 0x0001) souris();
/* test la touche ALT */
if (key & 0x0008) undo();
}
/* test le bouton droit */
while (!(bouton & 0x0002));
Souris_Normale;
}
/**************************************************************************/
/* restitution de l'écran original */
void undo()
{
deja = FAUX;
sho = 400; swo = 640;
image(0,0,0,0,RESW+1,RESH+1,VRAI);
}
/**************************************************************************/
/* affichage d'un rectangle de sélection pour indiquer la zone */
/* que l'on désire imprimer */
void souris()
{
int status,x,y,xx,yy,xd,yd;
char message[80],texte[50];
undo();
deja = VRAI;
xx = x = 0; yy = y = 0;
xd = xsouris;
yd = ysouris;
Cconout(0x07);
do
{
vq_mouse(handle,&status,&x,&y);
if ((xx != x) || (yy != y))
{
image(xd,yd,xd,yd,xx-xd+1,yy-yd+1,VRAI);
image(xd,yd,xd,yd,x-xd+1,y-yd+1,FAUX);
xx = x; yy = y;
}
}
while ((status & 0x0001));
/* form_alert(1,MESS6);*/
Souris_Croix;
if (xd <= x) { xso = xd;swo = x - xso; }
else { xso = x;swo = xd - xso; }
if (yd <= y) { yso = yd;sho = y - yso; }
else { yso = y;sho = yd - yso; }
}
/**************************************************************************/
/* gestion des évènements : menu, raffraichissement écran */
void edition()
{
int xstart,ystart,wstart,hstart,rx,ry,rh,rw;
Souris_Normale;
menu_ienable(barre,IMPRIMER,FAUX);
menu_ienable(barre,EDITER,FAUX);
menu_bar(barre,VRAI);
while (fin != 1)
{
event = evnt_mesag(mgbuf);
wind_update(VRAI);
switch (mgbuf[0])
{
/* un menu a ete selectionne */
case MN_SELECTED : selection();
break;
/* rafraichissement de la fenetre */
case WM_REDRAW :
wind_get(mgbuf[3],WF_WORKXYWH,&xstart,&ystart,&wstart,&hstart);
wind_get(mgbuf[3],WF_FIRSTXYWH,&rx,&ry,&rw,&rh);
frmary[0]=0;
frmary[1]=0;
frmary[2]=wstart-1;
frmary[3]=hstart-1;
frmary[4]=xstart;
frmary[5]=ystart;
frmary[6]=xstart+wstart-1;
frmary[7]=ystart+hstart-1;
clpry[0]=rx;
clpry[1]=ry;
clpry[2]=rx+rw-1;
clpry[3]=ry+rh-1;
vs_clip(handle,1,clpry);
Cache_Souris;
vro_cpyfm(handle,3,frmary,dfbb,dfbs);
Montre_Souris;
break;
}
wind_update(FAUX);
}
}
/**************************************************************************/
/* aiguillage vers le choix fait par l'utilisateur */
void selection()
{
switch (mgbuf[4])
{
case COPY :
/* affichage du copyright */
apropos();
break;
case QUITTER :
/* quitte le programme */
fin = 1;
break;
/* affiche la boite d'aide */
case AIDE :
aide();
break;
case IMPRIMER :
/* affiche les boites de dialogue pour l'impression */
impression();
break;
case OUVRIR :
/* reservation de la memoire pour l'image */
ecran = (0xffff00&buffer);
ecran += (0x200);
/* selection d'un fichier image *.PI? */
if (dialogue(source,0,"PI?")>0)
{
strcpy(nomsortie,rindex(source,'\\')+1);
strcpy(nomfenetre," ");
strcat(nomfenetre,rindex(source,'\\')+1);
strcat(nomfenetre," ");
/* si une fenetre était déjà ouverte, on la ferme */
if (ouvert) wind_close(w_handle);
ouvert = VRAI;
menu_ienable(barre,IMPRIMER,VRAI);
menu_ienable(barre,EDITER,VRAI);
/* initialise la palette des couleurs */
Setpalette(ecran+2);
dfbb[0]=(ecran+34)>>16;
dfbb[1]=(ecran+34)&0xffff;
menu_bar(barre,FAUX);
gestion();
/* impression();*/
/* ouvre une fenetre contenant l'image */
wind_set(w_handle,WF_NAME,nomfenetre);
wind_open(w_handle,wx,wy,ww,wh);
menu_bar(barre,VRAI);
}
break;
case EDITER :
/* edite une image en memoire */
if (ouvert)
{
wind_close(w_handle);
menu_bar(barre,FAUX);
gestion();
/* impression();*/
wind_open(w_handle,wx,wy,ww,wh);
menu_bar(barre,VRAI);
}
break;
}
menu_tnormal(barre,mgbuf[3],VRAI);
}
/**************************************************************************/
/* sélection de la sortie : rs 232, fichier, centronics */
int sortieimprimante()
{
rsrc_gaddr(R_TREE,SORTIE,&dial);
Cache_Souris;
afficheboite();
Montre_Souris;
sortie = form_do(dial,FAUX);
Cache_Souris;
effaceboite();
Montre_Souris;
if (sortie != ANN1)
{
switch (sortie)
{
case FICHIER : periph = 2;
/* selection du fichier de sortie *.PS */
if (dialogue(source,1,"PS")>0)
{
strcpy(mode,source);
return(VRAI);
}
else return(FAUX);
break;
case LASER : strcpy(mode,"AUX:"); periph = 1;
break;
case PRINTER : strcpy(mode,"PRT:"); periph = 0;
break;
}
/* test si le peripherique est pret ou connecte */
while (!Bcostat(periph)) if (form_alert(1,MESS1) == 2) return(FAUX);
return(VRAI);
}
else return(FAUX);
}
/**************************************************************************/
/* conversion points => centimetre */
float calculpoint(width,resolution)
float width,resolution;
{
return((width*resolution*2.540*1)/300.0);
}
/**************************************************************************/
sens_off(page)
int *page;
/* selection du sens (portrait, paysage) de l'impression et invalidation *
* du sens non-retenu */
{
if (swo<=sho)
{
objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
*page = FAUX;
}
else
{
objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
*page = VRAI;
}
objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
dial[PLUS].ob_flags=NONE;
dial[MOINS].ob_flags=NONE;
}
/**************************************************************************/
sens_on(page)
int *page;
/* selection du sens (portrait, paysage) de l'impression et validation *
* de l'autre choix */
{
if (swo<=sho)
{
objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
*page = FAUX;
}
else
{
objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
*page = VRAI;
}
objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
dial[PLUS].ob_flags=TOUCHEXIT;
dial[MOINS].ob_flags=TOUCHEXIT;
}
/**************************************************************************/
/* sélection des options de mise en page */
int choixformat(page,centre,copie,latex,reduction)
int *page,*centre,*copie,*latex;
float *reduction;
{
char cop[5],reduc[5],haut[10],larg[10];
float agrand,largeur,hauteur;
rsrc_gaddr(R_TREE,FORMAT,&dial);
Cache_Souris;
agrand = 4.00;
largeur = calculpoint((float)swo,agrand);
hauteur = calculpoint((float)sho,agrand);
strcpy(cop,"01");
sprintf(reduc,"%04.0f",agrand*100);
sprintf(larg,"%05.0f",largeur*100);
sprintf(haut,"%05.0f",hauteur*100);
((TEDINFO *)dial[REDUC].ob_spec)->te_ptext = reduc;
((TEDINFO *)dial[REDUC].ob_spec)->te_txtlen = 5;
((TEDINFO *)dial[COPIE].ob_spec)->te_ptext = cop;
((TEDINFO *)dial[COPIE].ob_spec)->te_txtlen = 3;
((TEDINFO *)dial[LARGEUR].ob_spec)->te_ptext = larg;
((TEDINFO *)dial[LARGEUR].ob_spec)->te_txtlen = 6;
((TEDINFO *)dial[HAUTEUR].ob_spec)->te_ptext = haut;
((TEDINFO *)dial[HAUTEUR].ob_spec)->te_txtlen = 6;
afficheboite();
/* initialise la boite de selection */
objc_change(dial,REEL,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
objc_change(dial,NOLATEX,0,xdial,ydial,wdial,hdial,SELECTED,VRAI);
objc_change(dial,LATEX,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,AUTO,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,CUSTOM,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,TMAXTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,TREELTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PERSOTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,COPIE,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
dial[PORTRAIT].ob_flags=TOUCHEXIT | RBUTTON | SELECTABLE;
dial[PAYSAGE].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
dial[CUSTOM].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
dial[COPIE].ob_flags= EDITABLE;
dial[AUTO].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
dial[REEL].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
sens_off(page);
Montre_Souris;
*latex = FAUX;
*centre = 0;
do
{
sortie = form_do(dial,0);
switch (sortie)
{
case AUTO : *centre = 1; sens_off(page);
break;
case REEL : *centre = 0; sens_off(page);
break;
case CUSTOM : *centre = 2;sens_on(page);
break;
case PAYSAGE : *page = VRAI;
break;
case PORTRAIT : *page = FAUX;
break;
case LATEX : *latex = VRAI;
objc_change(dial,TMAXTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,TREELTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PERSOTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,COPIE,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
/* objc_change(dial,PORTRAIT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);*/
/* objc_change(dial,PAYSAGE,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);*/
/* objc_change(dial,CUSTOM,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);*/
objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
dial[PLUS].ob_flags= NONE;
dial[MOINS].ob_flags= NONE;
dial[COPIE].ob_flags= NONE;
dial[PORTRAIT].ob_flags=NONE;
dial[PAYSAGE].ob_flags= NONE;
dial[CUSTOM].ob_flags= NONE;
dial[AUTO].ob_flags= NONE;
dial[REEL].ob_flags= NONE;
break;
case NOLATEX : *latex = FAUX;
objc_change(dial,TMAXTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,TREELTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PERSOTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,COPIE,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
if(*centre==2)
{
objc_change(dial,REDUC,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
dial[PLUS].ob_flags= TOUCHEXIT;
dial[MOINS].ob_flags= TOUCHEXIT;
} else
{
objc_change(dial,PORTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
objc_change(dial,PAYTXT,0,xdial,ydial,wdial,hdial,DISABLED,VRAI);
}
dial[PORTRAIT].ob_flags=TOUCHEXIT | RBUTTON | SELECTABLE;
dial[PAYSAGE].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
dial[CUSTOM].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
dial[COPIE].ob_flags= EDITABLE;
dial[AUTO].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
dial[REEL].ob_flags= TOUCHEXIT | RBUTTON | SELECTABLE;
break;
case PLUS :
if (agrand+0.050<99.9)
{
agrand += 0.050;
largeur = calculpoint((float)swo,agrand);
hauteur = calculpoint((float)sho,agrand);
sprintf(reduc,"%04.0f",agrand*100);
sprintf(larg,"%05.0f",largeur*100);
sprintf(haut,"%05.0f",hauteur*100);
objc_draw(dial,REDUC,0,xdial,ydial,wdial,hdial);
objc_draw(dial,HAUTEUR,0,xdial,ydial,wdial,hdial);
objc_draw(dial,LARGEUR,0,xdial,ydial,wdial,hdial);
}
objc_change(dial,PLUS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
break;
case MOINS :
if (agrand-0.050>0.99)
{
agrand -= 0.050;
largeur = calculpoint((float)swo,agrand);
hauteur = calculpoint((float)sho,agrand);
sprintf(reduc,"%04.0f",agrand*100);
sprintf(larg,"%05.0f",largeur*100);
sprintf(haut,"%05.0f",hauteur*100);
objc_draw(dial,REDUC,0,xdial,ydial,wdial,hdial);
objc_draw(dial,HAUTEUR,0,xdial,ydial,wdial,hdial);
objc_draw(dial,LARGEUR,0,xdial,ydial,wdial,hdial);
}
objc_change(dial,MOINS,0,xdial,ydial,wdial,hdial,NORMAL,VRAI);
break;
}
}
while ((sortie != PRINT) && (sortie != ANN2));
if (*centre == 0) strcpy(reduc,"400");
*copie = atoi(cop);
*reduction=agrand;
Cache_Souris;
effaceboite();
Montre_Souris;
if (sortie == PRINT)
return(VRAI);
else
return(FAUX);
}
/**************************************************************************/
/* calcul des coordonnées d'un bloc pour l'envoi vers la laser */
void calcul(masqueg,masqued,masquageg,masquaged)
int *masqueg,*masqued,*masquageg,*masquaged;
{
register int x,y,h,w,bitdroite,bitgauche;
x = xso;y = yso;h = sho;w = swo;
*masquageg = FAUX;
*masquaged = FAUX;
if (x % 8)
{
*masquageg = VRAI;
bitgauche = (x % 8);
*masqueg = 0xff >> bitgauche;
x -= bitgauche;
}
if ((w % 8) != 7)
{
*masquaged = VRAI;
bitdroite = 7 - (w % 8);
*masqued = (0x00ff << bitdroite) & 0x00ff;
w += bitdroite;
}
debut = (int)(x / 8) + y*80;
lon = (int)(w / 8);
if (w % 8) lon ++;
nombre = h * lon;
}
/**************************************************************************/
void impression()
/* impression de l'image avec toutes les options */
{
register FILE *fd;
register int i,j,k;
register long inc;
unsigned int date,time;
int hauteur,largeur,x,bouton,compteur,dep,masqueg,masqued;
int masquaged,masquageg,page,centre,copie,latex;
int llx,lly,urx,ury;
float reduction,unite;
date=Tgetdate(); time=Tgettime();
if (choixformat(&page,¢re,&copie,&latex,&reduction))
{
if (sortieimprimante())
{
if ((fd = fopen(mode,"w")) == NULL)
{
form_alert(1,MESS2);
}
else
{
printf("ouverture fichier: %s ... OK\n",mode);getchar();
Cache_Souris;
calcul(&masqueg,&masqued,&masquageg,&masquaged);
rsrc_gaddr(R_TREE,ANNONCE,&dial);
if (deja)
{
hauteur = sho;
largeur = lon * 8;
}
else
{
hauteur = 400;
largeur = 640;
}
dial[CADRE].ob_width = (dial[CADRE].ob_width/dial[BOITE].ob_width)*dial[BOITE].ob_width;
objc_change(dial,CADRE,0,xdial,ydial,wdial,hdial,NORMAL,1);
dial[BOITE].ob_x = 0;
objc_change(dial,BOITE,0,xdial,ydial,wdial,hdial,NORMAL,1);
afficheboite();
resetboite();
/* début du code PostScript */
if (periph!=2) fprintf(fd,"\004"); /* initialisation de l'imprimante */
if (copie == 0) copie = 1;
llx=72; lly=72; unite=(72.0*4.0)/300.0;
urx=llx+(((float)largeur)*unite); ury=lly+(((float)hauteur)*unite);
if (latex)
{ fprintf(fd,"%%!PS-Adobe-2.0 EPSF-2.0");
fprintf(fd,"%%%%BoundingBox: %d %d %d %d\n",llx,lly,urx,ury);
fprintf(fd,"%%%%Creator: DEGAS2PS on Atari ST\n");
fprintf(fd,"%%%%Title: %s\n",rindex(source,'\\')+1);
fprintf(fd,"%%%%CreationDate: %02d/%02d/%4d %02d:%02d\n",
date&0x1f,(date>>5)&0x0f,((date>>9)&0x7f)+1980,
(time>>11)&0x1f,(time>>5)&0x3f);
fprintf(fd,"%%%%EndComments\n");
fprintf(fd,"%%%%Pages 1\n%%%%EndComments\n%%%%Page: 1 1\n");
fprintf(fd,"gsave 72 72 translate /height %d def /width %d def\n",hauteur, largeur);
fprintf(fd,"/dot {%1.2f mul}def width dot height dot scale\n",unite);
} else{
fprintf(fd,"%%!\ngsave initmatrix /#copies %d def\n",copie);
fprintf(fd,"/reduc %2.2f def /page %d def /centre %d def\n",reduction,page,centre);
fprintf(fd,"/height %d def /width %d def\n",hauteur,largeur);
fprintf(fd,"/devit { dtransform 2 copy dup mul exch dup mul exch add sqrt\n");
fprintf(fd," dup 3 1 roll div 3 1 roll div exch idtransform } def\n");
fprintf(fd,"/xdev 1 0 devit pop def /ydev 0 1 devit exch pop def\n");
fprintf(fd,"xdev reduc mul ydev reduc mul scale\n/reduc2 1 def\n");
fprintf(fd,"clippath pathbbox\n"); /* On récupère les valeurs */
fprintf(fd,"/yhaut exch def /xhaut exch def\n"); /* exactes des coordonnées */
fprintf(fd,"/ybas exch def /xbas exch def\n"); /* de l'imprimante */
fprintf(fd,"/yutil yhaut ybas sub def /xutil xhaut xbas sub def\n");
fprintf(fd,"centre 1 le\n");
fprintf(fd," { height width gt\n");
fprintf(fd," { /page 0 def } { /page 1 def } ifelse } if\n");
fprintf(fd,"centre 1 eq\n");
fprintf(fd," { /reduc2 0.05 def\n");
fprintf(fd," { /h reduc2 height mul def\n");
fprintf(fd," /l reduc2 width mul def\n");
fprintf(fd," h xutil le l yutil le and\n");
fprintf(fd," { /reduc2 reduc2 0.05 add def } {exit} ifelse");
fprintf(fd," } loop\n");
fprintf(fd," /reduc2 reduc2 0.05 sub def }if \n");
fprintf(fd,"1 page eq { /topoffset { yutil width dot sub 2 div cvi } def\n");
fprintf(fd," /leftoffset { xutil height dot sub 2 div cvi } def }\n");
fprintf(fd," { /leftoffset { xutil width dot sub 2 div cvi } def\n");
fprintf(fd," /topoffset { yutil height dot sub 2 div cvi } def } ifelse\n");
fprintf(fd,"/dot { reduc2 mul } def xbas ybas translate\n");
fprintf(fd,"1 page eq\n");
fprintf(fd,"{ xutil 0 translate 90 rotate topoffset leftoffset translate }\n");
fprintf(fd,"{ leftoffset topoffset translate } ifelse\n");
fprintf(fd,"width dot height dot scale\n");
}
fprintf(fd,"/imagedegas { width height 1 [width 0 0 height neg 0 height]\n");
fprintf(fd,"{ currentfile picstr readhexstring pop } image } def\n");
fprintf(fd,"/picstr width 8 idiv string def\n");
fprintf(fd,"{ 1 exch sub } settransfer\n");
fprintf(fd,"imagedegas\n");
printf("fin prologue...\n");getchar();
compteur = 0;
dep = (int)(dial[CADRE].ob_width/dial[BOITE].ob_width);
/* envoi d'une partie d'image */
if (deja)
{
inc = debut + 34;
dep = (int)(nombre/dep);
for (j=1; j<=sho; j++)
{
if (testarret() == 2) { if (periph == 2) fclose(fd); Montre_Souris;return;}
compteur++;
if (masquageg) fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++) & masqueg);
else fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++));
for (i=2; i<lon; i++)
{
if (periph == 1) gestionerreur();
fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++));
if (compteur++ >= dep)
{
compteur = 0;
dial[BOITE].ob_x += dial[BOITE].ob_width;
objc_draw(dial,CADRE,xdial,ydial,wdial,hdial);
objc_draw(dial,BOITE,xdial,ydial,wdial,hdial);
}
}
if (masquaged) fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++) & masqued);
else fprintf(fd,"%02x",*(unsigned char *)(ecran+inc++));
if(fprintf(fd,"\n")<0) {
form_alert(1,MESS4);
if (periph == 2) fclose(fd); Montre_Souris;
return;
}
inc += (80 - lon);
compteur++;
}
}
else
/* envoi de l'image entière */
{
dep = (int)(32000/dep);
for (j=i=0; i<=32000;i++)
{
if (testarret() == 2) {if (periph == 2) fclose(fd); Montre_Souris;return;}
if (periph == 1) gestionerreur();
fprintf(fd,"%02x",*(unsigned char *)((ecran+34)+i));
if (j++==40) {
if(fprintf(fd,"\n")<0) {
form_alert(1,MESS4);
if (periph == 2) fclose(fd); Montre_Souris;
return;
}
j=0;
}
if (compteur++ == dep){
compteur = 0;
dial[BOITE].ob_x += dial[BOITE].ob_width;
objc_draw(dial,CADRE,xdial,ydial,wdial,hdial);
objc_draw(dial,BOITE,xdial,ydial,wdial,hdial);
}
}
fprintf(fd,"\n");
}
if (fprintf(fd,"grestore showpage\n%%%%Trailer\n")<0){
form_alert(1,MESS4);
};
if (periph == 2) fclose(fd); else fflush(fd); /* on ne ferme pas si AUX ou PRN */
Cconout(0x07);
/* attend les messages de la laser */
if (periph != 2)
{
Bconout(periph,0x04);
k = 0;
if (periph == 1)
do
{
evnt_mouse(0,0,0,RESW,RESH,&x,&x,&bouton,&x);
if (k++ == 1000)
{
Bconout(periph,0x14);
k = 0;
}
gestionerreur();
}
while (!(bouton & 0x0002));
}
effaceboite();
Montre_Souris;
}
}
}
}
/**************************************************************************/
/* test si on appuie sur le bouton de droite pour l'arret de */
/* l'impression */
int testarret()
{
int status,x;
vq_mouse(handle,&status,&x,&x);
if (status & 0x0002)
return(form_alert(1,MESS3));
else return(0);
}
/**************************************************************************/
/* initialise la boite de dialogue */
void resetboite()
{
register int i;
char mess[80];
strcpy(mess,"");
for (i=PHRASE1; i<=PHRASE4; i++)
{
((TEDINFO *)dial[i].ob_spec)->te_ptext = mess;
((TEDINFO *)dial[i].ob_spec)->te_txtlen = 40;
objc_draw(dial,i,0,xdial,ydial,wdial,hdial);
}
for (i=0; i<=3; i++) strcpy(tex[i],"");
}
/**************************************************************************/
/* test si l'imprimante envoie des messages pour signaler des */
/* anomalies lors de l'impression */
void gestionerreur()
{
register int i,j,l;
char texte[20],mess[80];
while (Bconstat(periph))
{
while (((l = (int)Bconin(periph)) != 13) && ( l <= 122) && (l >= 32))
{
strcpy(texte,"");
if ((l != 37) && (l != 91) && (l != 93))
{
sprintf(texte,"%c",l);
strcat(mess,texte);
}
}
if (l == 13)
{
l = (int)Bconin(periph);
for (i = 0; i <= 2; i++) strcpy(tex[i],tex[i+1]);
strcpy(tex[3],mess);
j = 0;
for (i=PHRASE1; i<=PHRASE4; i++)
{
((TEDINFO *)dial[i].ob_spec)->te_ptext = tex[j++];
((TEDINFO *)dial[i].ob_spec)->te_txtlen = 40;
objc_draw(dial,i,0,xdial,ydial,wdial,hdial);
}
strcpy(mess,"");
}
}
}
/**************************************************************************/
/* réserve la place pour l'affichage d'une boite de dialogue */
void afficheboite()
{
form_center(dial,&xdial,&ydial,&wdial,&hdial);
form_dial(FMD_START,1,1,10,10,xdial,ydial,wdial,hdial);
form_dial(FMD_GROW,1,1,10,10,xdial,ydial,wdial,hdial);
objc_draw(dial,ROOT,MAX_DEPTH,xdial,ydial,wdial,hdial);
}
/**************************************************************************/
/* libère la place occupée par la boite et l'efface */
void effaceboite()
{
form_dial(FMD_SHRINK,1,1,10,10,xdial,ydial,wdial,hdial);
form_dial(FMD_FINISH,1,1,10,10,xdial,ydial,wdial,hdial);
objc_change(dial,sortie,0,xdial,ydial,wdial,hdial,NORMAL,FAUX);
}
/**************************************************************************/
/* affiche une fenetre d'aide */
void aide()
{
rsrc_gaddr(R_TREE,HELP,&dial);
Cache_Souris;
afficheboite();
Montre_Souris;
sortie = form_do(dial,FAUX);
Cache_Souris;
effaceboite();
Montre_Souris;
}
/**************************************************************************/
/* affiche le copyright */
void apropos()
{
rsrc_gaddr(R_TREE,COPYRIG,&dial);
((TEDINFO *)dial[NUMVER].ob_spec)->te_ptext=version;
((TEDINFO *)dial[NUMVER].ob_spec)->te_txtlen=strlen(version);
Cache_Souris;
afficheboite();
Montre_Souris;
sortie = form_do(dial,FAUX);
Cache_Souris;
effaceboite();
Montre_Souris;
}
/**************************************************************************/
/* sélection d'un fichier à partir d'un disque */
int dialogue(source,type,suffixe)
char *source;
int type;
char *suffixe;
{
int fichier,drive;
char nomfich[80];
char inpath[80]; /* chemin d'acces */
char insel[80]; /* selection document */
int bouton,res;
long longueur = 32034; /* longueur d'un fichier DEGAS */
disk_info diskinfo;
long space;
/* Obtention du nom du fichier source */
/* On affiche les fichiers dans le repertoire */
/* courant, sur le drive actif */
drive=Dgetdrv();
inpath[0]=drive+0x41;
inpath[1]=NULL;
strcat(inpath,":");
Dgetpath(&inpath[2],drive+1);
strcat(inpath,"\\*.");
strcat(inpath,suffixe);
insel[0]='\0';
if (lecture && (!type))
{
strcpy(inpath,cheminlecture);
strcpy(rindex(inpath,'.')+1,suffixe);
}
if (ecriture && (type))
{
strcpy(inpath,cheminecriture);
strcpy(rindex(inpath,'.')+1,suffixe);
}
if (type)
{
strcpy(insel,nomsortie);
strcpy(rindex(insel,'.')+1,suffixe);
}
if (!fsel_input(inpath,insel,&bouton)) return(FAUX);
if (((bouton) && (insel[0] == '\0')) || (!bouton)) return(FAUX);
else
{
/* sauve le chemin pour le lecture des fichiers PI3 */
if (type)
{
strcpy(cheminecriture,inpath);
ecriture = VRAI;
}
else
{
/* sauve le chemin pour l'écriture des fichiers PS */
strcpy(cheminlecture,inpath);
lecture = VRAI;
}
strcpy(nomfich,inpath);
strcpy(rindex(nomfich,'\\')+1,insel);
strcpy(source,nomfich);
if (type)
{
/*
Dfree(&diskinfo,(source[0]-'A')+1);
space = diskinfo.b_free * diskinfo.b_clsiz * diskinfo.b_secsiz;
if (space < 70000)
{
form_alert(1,MESS4);
return(FAUX);
}
else
*/
return(VRAI);
}
else
{
if ((fichier = Fopen(nomfich,0)) < 0)
{
form_alert(1,MESS5);
return(FAUX);
}
else
{
Fread(fichier,longueur,ecran);
Fclose(fichier);
return(VRAI);
}
}
}
/**********************************/
/* fin du programme ST_PostScript */
/***********************************************************************/
}