home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************
- * *
- * Filename : HardCopy.c *
- * *
- *****************************************************************
- * *
- * Comment : Alle Funktionen für die Hardcopyfunktion. *
- * *
- * Rev : V1.2 *
- * *
- * History : V1.0 erstellen dieses Files 24.06.89 *
- * V1.1 erweitern um X/Y-Option 02.09.89 *
- * V1.2 Convert() verbessert 30.09.89 *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 02.09.89 *
- * *
- ****************************************************************/
-
- /****************************************************************
- * *
- * allgemeine Includedateien *
- * *
- ****************************************************************/
-
- #include <exec/types.h>
- #include <exec/exec.h>
- #include <intuition/intuition.h>
- #include <intuition/intuitionbase.h>
- #include <intuition/screens.h>
- #include <devices/printer.h>
- #include <libraries/dos.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <mylib/mylib.h>
-
- /****************************************************************
- * *
- * programmspezifische Includedateien *
- * *
- ****************************************************************/
-
- #include "Hardcopy.h" /* Window und Gadget def. */
-
- /****************************************************************
- * *
- * externe Definitionen *
- * *
- ****************************************************************/
-
- extern struct IntuitionBase *IntuitionBase;
-
- /****************************************************************
- * *
- * globale Definitionen *
- * *
- ****************************************************************/
-
- static struct MsgPort *port = NULL; /* Printer Port Struktur */
- static struct Preferences *prefs = NULL;
- /* Preferences Struktur */
- static struct IODRPReq *dump = NULL;
- /* Dump-Structure */
- static struct Window *Hc = NULL; /* Hardcopy Window */
-
- static struct Prt_Commands init[2] =
- {
- aRIN,0,0,0,
- aVERP0,0,0,0
- };
-
- /****************************************************************
- * *
- * Funktion : Convert() *
- * *
- ****************************************************************
- * *
- * Input : Zahl,Text *
- * Zahl -> zu konvertierende Zahl *
- * Text -> Adresse der Textstruktur *
- * *
- * Output : None *
- * *
- * *
- ****************************************************************
- * *
- * Comment : Konvertiert eine 2 oder 1 stellige Zahl auf *
- * konstante Länge und schreibt sie rechtsbündig *
- * in einen String referenziert in einer Intuitext *
- * Struktur und beginnt ab dieser Struktur eine *
- * Neuzeichnung des Textes. *
- * *
- * Rev : V1.1 *
- * *
- * History : V1.0 erstellen dieser Funktion 19.06.89 *
- * V1.1 allgemeine übergabe einer *
- * Intuitextstruktur 30.09.89 *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 30.09.89 *
- * *
- ****************************************************************/
-
- void convert(rp,zahl,text)
- struct RastPort *rp;
- int zahl; /* Integer Zahl */
- struct IntuiText *text; /* IntuiText Struktur */
- {
- sprintf(text->IText,"%2d",zahl); /* konver. und schreibe */
- PrintIText(rp,text,0,0); /* nun ab Dichte schreiben */
- }
-
- /****************************************************************
- * *
- * Funktion : PrtCommand() *
- * *
- ****************************************************************
- * *
- * Input : Port,Commands,Nbr *
- * Port -> Portadresse *
- * Commands -> Adresse des Commandarrays *
- * Nbr -> Anzahl Commands *
- * *
- * Output : Boolean *
- * TRUE -> erfolgreiches senden der Commands *
- * FALSE -> Fehler beim Senden *
- * *
- * *
- ****************************************************************
- * *
- * Comment : Sendet einen beliebigen Command an das *
- * Printerdevice. *
- * *
- * *
- * *
- * Rev : V1.0 *
- * *
- * History : V1.0 erstellen dieses Files 01.09.89 *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 01.09.89 *
- * *
- ****************************************************************/
-
- static int prtcommand(port,commands,nbr)
- struct MsgPort *port; /* MsgPort */
- struct Prt_Commands *commands; /* Commandarray */
- short nbr; /* Elementanzahl */
- {
- int fehler, /* Rückgabewert */
- i; /* Schleifenzähler */
- struct IOPrtCmdReq req; /* Commandstruktur */
- fehler = OpenDevice("printer.device",NULL,&req,NULL);
- /* reserviere Device */
- if (!fehler) /* nur wenn bekommen */
- { /* init. der Struktur */
- req.io_Message.mn_ReplyPort = port;
- req.io_Command = PRD_PRTCOMMAND;
- for ( i=0;i<nbr;i++) /* alle Kommandos senden */
- { /* Kommando einsetzten */
- req.io_PrtCommand = commands[i].Command;
- req.io_Parm0 = commands[i].P_0;
- req.io_Parm1 = commands[i].P_1;
- req.io_Parm2 = commands[i].P_2;
- req.io_Parm3 = commands[i].P_3;
- fehler = DoIO(&req); /* und senden */
- if (fehler) break; /* wenn Fehler verlassen */
- }
- CloseDevice(&req); /* Device freigeben */
- }
- return ( fehler ); /* Fehler zurückgeben */
- }
-
- /****************************************************************
- * *
- * Funktion : PrtText() *
- * *
- ****************************************************************
- * *
- * Input : Port,Text *
- * *
- * *
- * Output : None *
- * *
- * *
- ****************************************************************
- * *
- * Comment : Sendet einen Text an die Printer.device *
- * *
- * Rev : V1.0 *
- * *
- * History : V1.0 erstellen dieses Files 01.06.89 *
- * *
- * Doc : *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 01.06.89 *
- * *
- ****************************************************************/
-
- static int prttext(port,text)
- struct MsgPort *port; /* MsgPort */
- char *text; /* Textpointer */
- {
- struct IOStdReq prreq; /* Sendstruktur */
- int fehler; /* Rückgabewert */
- fehler = OpenDevice("printer.device",NULL,&prreq,NULL);
- /* reservieren des Gerätes */
- if ( !fehler ) /* bekommen */
- { /* init. der Struktur */
- prreq.io_Message.mn_ReplyPort = port;
- prreq.io_Command = CMD_WRITE;
- prreq.io_Data = ( APTR )text;
- prreq.io_Length = -1;
- fehler = DoIO(&prreq); /* und senden */
- CloseDevice(&prreq); /* Device freigeben */
- }
- return ( fehler ); /* Fehler zurückgeben */
- }
-
-
- /****************************************************************
- * *
- * Funktion : SetCursor() *
- * *
- ****************************************************************
- * *
- * Input : nbr *
- * Positionierung in cm *
- * *
- * Output : None *
- * *
- * *
- ****************************************************************
- * *
- * Comment : Setzt den Printercursor auf die entsprechende *
- * Position. *
- * ACHTUNG: Diese Funktion ist Geräteabhängig. *
- * *
- * Rev : V1.0 *
- * *
- * History : V1.0 erstellen dieses Files 01.06.90 *
- * *
- * Doc : *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 01.06.90 *
- * *
- ****************************************************************/
-
- static void setcursor(nbr)
- int nbr; /* Position in Zentimeter */
- {
- ULONG datei; /* Dateipointer */
- int i, /* Schleifenzähler */
- error; /* Rückgabewert */
- char text[] = "\x1b*p+118Y"; /* Kommando für 1 cm */
- datei = Open("PAR:",MODE_NEWFILE);
- /* Öffnen der Schnittstelle */
- for ( i=0;i<nbr;i++) /* alle senden */
- {
- error = Write(datei,&text[0],sizeof(text));
- }
- Close(datei); /* Schnittstelle schliessen */
- }
-
- /****************************************************************
- * *
- * Funktion : CloseHc() *
- * *
- *****************************************************************
- * *
- * Input : None *
- * *
- * Output : None *
- * *
- *****************************************************************
- * *
- * Comment : Schliesst alles offene und kehrt danach ins *
- * aufrufende Programm zurück. *
- * *
- * Rev : V1.0 *
- * *
- * History : V1.0 erstellen dieses Files 01.06.89 *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 01.06.89 *
- * *
- ****************************************************************/
-
- static void closeHc()
- {
- if ( prefs )
- {
- SetPrefs(prefs,sizeof(struct Preferences),FALSE);
- /* Preferences setzen */
- free(prefs); /* Speicher freigeben */
- }
- if ( Hc ) CloseWindow ( Hc ); /* Hardcopy schliessen */
- if ( dump) free(dump); /* Dumpstruktur freigeben */
- if ( port ) DeletePort(port); /* Port schliessen */
- }
-
- /****************************************************************
- * *
- * Funktion : HardCopy(Sc,Mw) *
- * *
- *****************************************************************
- * *
- * Input : Screenpointer,Windowpointer *
- * *
- * Screen -> Für Workbenchscreen = NULL *
- * -> Für Customscreen = Screenpointer *
- * *
- * Window -> Windowpointer welches ausgedruckt *
- * werden soll. *
- * Window = NULL => Screendump *
- * *
- * Output : Boolean *
- * *
- * TRUE -> Hardcopy erfolgreich *
- * FALSE -> Printerport oder Deviceport konnte *
- * nicht geöffnet werden. *
- * Ev. kein Speicher für Graphik. *
- * *
- *****************************************************************
- * *
- * Comment : Die Hardcopyfunktion nimmt das spez. Window und *
- * druckt es mit den eingestellten Parametern auf *
- * die Printerdevice. *
- * Die Dichte kann man einstellen, ebenso die *
- * Grösse. *
- * Die Koordinaten auf dem Papier können ebenfalls *
- * eingestellt werden. *
- * Reverse bedeutet die umkehrung der Farben *
- * ( weiss = schwarz ... ). *
- * Für die einzelnen Parameter wird die *
- * Preferencesstruktur geholt und entsprechend *
- * geändert. Nach erfolgter Hardcopy wird diese *
- * Struktur wieder zurückgesetzt. *
- * Für die Hardcopy wird die IODRPReq-Struktur ver- *
- * wendet. *
- * *
- * Als externe Referenz ist nur die IntuitionBase *
- * aufgeführt. D.h. die Intuition Library muss *
- * vorher geöffnet werden. *
- * *
- * Rev : V1.1 *
- * *
- * History : V1.0 erstellen dieses Files 01.06.89 *
- * V1.1 erweitern um X/Y-Option 01.09.89 *
- * *
- * Bugs : keine bekannten *
- * *
- * Autor : Oesch Silvano *
- * *
- * Datum : 01.09.89 *
- * *
- ****************************************************************/
-
- int HardCopy(Sc,Mw) /* BOOLEAN als Rückgabewert */
- struct Screen *Sc; /* Screen Pointer */
- struct Window *Mw; /* Window Pointer */
- {
- struct IntuiMessage *message; /* Message Strukutr */
- struct IODRPReq *printmessage; /* Printer Message */
- struct Gadget *gadmess; /* Gadget Message */
- struct ViewPort *Vp; /* ViewPort Pointer */
- struct RastPort *Rp; /* RastPort Pointer */
- struct RastPort *rp; /* Hardcopy Window Rastport */
-
- static int dichte = DICHTE, /* Voreinstellung Dichte */
- breite = BREITE, /* Voreinstellung Breite */
- hoehe = HOEHE, /* Voreinstellung Höhe */
- x = XRAND, /* Voreinstellung X */
- y = YRAND, /* Voreinstellung Y */
- reverse = TRUE; /* Voreinstellung Reverse */
-
- int fehler, /* Printer Rückgabewert */
- error, /* allg. Rückgabewert */
- erfolg,
- loop = TRUE; /* Hauptschle-ife Abbruch */
-
- UBYTE tempd; /* Temp. Datenspeicher */
- USHORT tempi,
- tempx;
-
- if (( Sc == NULL)&&(Mw == NULL)) /* min. 1 Parameter setzen */
- return(FALSE); /* So nicht */
-
- if ( Sc ) /* eigener Screen ? */
- { /* Ja */
- HCW.Screen = Sc; /* Init. Windowstruktur */
- if ( Mw != NULL ) /* wenn Mw und Sc dann */
- HCW.Type = CUSTOMSCREEN; /* natürlich eigener Typ */
- }
- else /* Workbenchscreen */
- Sc = Mw->WScreen; /* Screenpointer */
-
- Vp = &Sc->ViewPort; /* Viewport initialisieren */
- if ( Mw != NULL ) /* Windowdump ? */
- Rp = Mw->RPort; /* Ja, Windowrastport */
- else /* Nein, Screendump */
- Rp = &Sc->RastPort; /* Screenrastport */
-
- Hc = (struct Window *)OpenWindow(&HCW);
- /* Öffne Hardcopywindow */
- if ( Hc == NULL ) /* Fehler ? */
- { /* Hc = NULL */
- closeHc(); /* alles schliessen */
- return ( FALSE ); /* Return mit Fehler */
- }
- rp = Hc->RPort; /* Hardcopy RastPort holen */
- PrintIText(rp,&ITHc1,0,0); /* Text setzen */
- DrawBorder(rp,&BHc7,0,0); /* Rahmen setzen */
-
- while ( loop ) /* Schleife für Einstellung */
- {
- message = ( struct IntuiMessage *)
- GetMsg(Hc->UserPort); /* Message holen */
- if ( message==NULL) /* keine Message */
- { /* dann warten auf Message */
- Wait(1L << Hc->UserPort->mp_SigBit);
- continue; /* Message erhalten, das */
- } /* ganze von vorne */
- gadmess = (struct Gadget *)message->IAddress;
- /* kann nur Gadget sein, */
- /* also Gadgetadresse holen */
- ReplyMsg(message); /* antworten */
-
- switch (gadmess->GadgetID) /* welches Gadget gedrückt */
- {
- case GDU: /* Dichte wurde gedrückt */
- case GDD:
- if (gadmess->GadgetID == GDU)
- /* Dichte auf ? */
- { /* Ja */
- if (dichte < MAXDICHTE) /* noch in Grenzen ? */
- dichte++; /* ja, dann addiere */
- }
- else /* also Dichte ab */
- if (dichte > MINDICHTE) /* noch in Grenzen ? */
- dichte--; /* ja, dann subtrahiere */
- convert(rp,dichte,&ITHc3); /* konvertiere und schreibe */
- break; /* von vorne */
- case GXU: /* X wurde gedrückt */
- case GXD:
- if (gadmess->GadgetID == GXU)
- /* X auf ? */
- { /* Ja */
- if (x < (MAXBREITE-breite))
- /* noch in Grenzen ? */
- x++; /* ja, dann addiere */
- }
- else /* also X ab */
- if (x > MINXRAND) /* noch in Grenzen ? */
- x--; /* ja, dann subtrahiere */
- convert(rp,x,&ITHc4); /* konvertiere und schreibe */
- break; /* von vorne */
- case GYU: /* Y wurde gedrückt */
- case GYD:
- if (gadmess->GadgetID == GYU)
- /* Y auf ? */
- { /* Ja */
- if (y < (MAXHOEHE-hoehe)) /* noch in Grenzen ? */
- y++; /* ja, dann addiere */
- }
- else /* also Y ab */
- if (y > MINYRAND) /* noch in Grenzen ? */
- y--; /* ja, dann subtrahiere */
- convert(rp,y,&ITHc5); /* konvertiere und schreibe */
- break; /* von vorne */
- case GBU:
- case GBD: /* Breite wurde gedrückt */
- if (gadmess->GadgetID == GBU)
- /* Breite auf ? */
- { /* Ja */
- if (breite < (MAXBREITE-x))
- /* noch in Grenzen ? */
- breite++; /* ja, dann addiere */
- }
- else /* also Breite ab */
- if (breite > MINBREITE)
- /* noch in Grenzen ? */
- breite--; /* ja, dann subtrahiere */
- convert(rp,breite,&ITHc6);
- /* konvertiere und schreibe */
- break; /* von vorne */
- case GHU:
- case GHD: /* Höhe wurde gedrückt */
- if (gadmess->GadgetID == GHU)
- /* Höhe auf ? */
- { /* ja */
- if (hoehe < (MAXHOEHE-y))
- /* noch in Grenzen ? */
- hoehe++; /* ja, dann addiere */
- }
- else /* also Höhe ab */
- if (hoehe > MINHOEHE)
- /* noch in Grenzen ? */
- hoehe--; /* ja, dann subtrahiere */
- convert(rp,hoehe,&ITHc7);
- /* konvertiere und schreibe */
- break; /* von vorne */
- case GP: /* Print wurde gedrückt */
- loop=FALSE; /* setze ende loop */
- break; /* von vorne */
- case GC: /* Cancel wurde gedrückt */
- closeHc();
- return(TRUE); /* verlasse Hardcopy ohne */
- break; /* Fehler */
- case GR: /* Reverse wurde gedrückt */
- reverse = reverse^TRUE; /* switch reverse */
- break; /* von vorne */
- } /* ende von switch */
- } /* ende von loop */
-
- CloseWindow(Hc); /* Hardcopy schliessen */
-
- Hc = MakeWindow(HRX,HRY,HRXh,HRYh," Hardcopy ",Sc);
- /* Öffne Requestwindow */
- if (Hc == NULL) /* Fehler ? */
- { /* Hc = NULL */
- closeHc(); /* alles schliessen */
- return(FALSE); /* Return mit Fehler */
- }
- rp = Hc->RPort; /* Hardcopy RastPort holen */
- PrintText(rp,"Bitte warten, Hardcopy in Arbeit",15,20,2);
- PrintText(rp,"Close für Abbruch",15,30,2);
- prefs = (struct Preferences *)
- malloc(sizeof(struct Preferences));
- if ( prefs == NULL) /* Speicher für Preferences */
- { /* kein Speicher bekommen */
- closeHc(); /* alles schliessen */
- return (FALSE); /* Return mit Fehler */
- }
-
- GetPrefs(prefs,sizeof(struct Preferences));
- /* Preferences holen */
- tempd = prefs->PrintDensity;
- tempi = prefs->PrintImage;
- tempx = prefs->PrintXOffset;
-
- prefs->PrintDensity=(UBYTE)dichte;
- /* Dichte setzen */
- prefs->PrintImage=(USHORT)reverse;
- /* Reverse setzen */
- prefs->PrintXOffset=(USHORT)4*x; /* linker Rand in 1/10" */
- SetPrefs(prefs,sizeof(struct Preferences),FALSE);
- /* Preferences setzen */
- prefs->PrintDensity = tempd; /* Dichte rücksetzen */
- prefs->PrintImage = tempi; /* Reverse rücksetzen */
- prefs->PrintXOffset = tempx; /* linker Rand rücksetzen */
- port = (struct MsgPort *)CreatePort("Printer.Port",NULL);
- /* Drucker-Port öffnen */
- if(port == NULL) /* Port bekommen ? */
- { /* Nein */
- closeHc(); /* alles schliessen */
- return(FALSE); /* Return mit Fehler */
- }
- dump = (struct IODRPReq *)
- malloc(sizeof(struct IODRPReq));
- /* Speicher Dumpstruktur */
- if (dump == NULL) /* Speicher bekommen ? */
- { /* Nein */
- closeHc(); /* alles schliessen */
- return (FALSE); /* Return mit Fehler */
- }
-
- error = prtcommand(port,&init[0],2);
- /* Initialisiere Drucker */
- setcursor(y); /* Setzte Cursor */
-
- fehler = OpenDevice("printer.device",NULL,dump,NULL);
- /* Drucker-Device öffnen */
- if( fehler == NULL ) /* Device bekommen */
- { /* Ja */
- dump->io_Message.mn_ReplyPort = port;
- /* Antwort-Port zuweisen */
- dump->io_Command=PRD_DUMPRPORT; /* Dump Command */
- dump->io_RastPort=Rp; /* Dump RastPort */
- dump->io_ColorMap=Vp->ColorMap; /* Dump Farbtabelle */
- dump->io_Modes=Vp->Modes; /* Dump View Mode */
- dump->io_DestCols=breite*394; /* Breite in 1/1000" */
- dump->io_DestRows=hoehe*394; /* Höhe in 1/1000" */
- dump->io_Special=SPECIAL_MILCOLS+SPECIAL_MILROWS;
- /* Angaben von Breite Höhe */
- if ( Mw != NULL ) /* Window Dump ? */
- { /* Ja */
- dump->io_SrcX=Mw->LeftEdge; /* Start Dump X */
- dump->io_SrcY=Mw->TopEdge+WINDOWHEADER;
- /* Start Dump Y */
- dump->io_SrcWidth=Mw->Width; /* Ende Dump X */
- dump->io_SrcHeight=Mw->Height-WINDOWHEADER;
- /* Ende Dump Y */
- }
- else /* also Screen Dump */
- {
- dump->io_SrcX=Sc->LeftEdge; /* Start Dump X */
- dump->io_SrcY=Sc->TopEdge+SCREENHEADER;
- /* Start Dump Y */
- dump->io_SrcWidth=Sc->Width; /* Ende Dump X */
- dump->io_SrcHeight=Sc->Height-SCREENHEADER;
- /* Ende Dump Y */
- }
-
- /****************************************************************
- * *
- * Bei Asynchroner Ausgabe der Hardcopy kann man diesen I/O *
- * zu einem späteren Zeitpunkt abbrechen. Dies wird in der *
- * Folge hier abgearbeitet. Zuerst wird auf beidem Ports *
- * gewartet bis etwas passiert. Wenn eine Message angekommen *
- * ist, wird entsprechend gehandelt. Bei Antwort von der *
- * Printerdevice wird diese beantwortet und die Schleife *
- * wird verlassen. *
- * Bei Abbruch wird zuerst kontrolliert, ob die Hardcopy *
- * noch in arbeit ist. Wenn ja, so wird die Hardcopy *
- * abbgebrochen. *
- * *
- ****************************************************************/
-
- fehler=SendIO(dump); /* Asynchrone Ausgabe */
-
- loop=TRUE; /* Initialisierung */
- while ( loop ) /* Schleife für Hardcopy */
- {
- message=(struct IntuiMessage *)
- GetMsg(Hc->UserPort); /* Abortmessage holen */
- printmessage=(struct IODRPReq *)
- GetMsg(port); /* Printermessage holen */
- if (( message== NULL)&&
- (printmessage==NULL)) /* keine von beiden Message */
- { /* dann warten auf Message */
- Wait((1L << Hc->UserPort->mp_SigBit)|
- (1L << port->mp_SigBit));
- continue; /* Message erhalten, das */
- } /* ganze von vorne */
- if ( message ) /* Abortmessage ? */
- { /* Ja */
- ReplyMsg(message); /* Antworten */
- erfolg=CheckIO(dump); /* Ist Hardcopy noch da ? */
- if ( erfolg == NULL ) /* Ja */
- AbortIO(dump); /* Abbrechen */
- }
- if ( printmessage ) /* Printermessage ? */
- { /* Ja */
- ReplyMsg(printmessage); /* Antworten */
- loop=FALSE; /* Schleifenexit setzen */
- }
- }
- CloseDevice(dump); /* Device freigeben */
- }
- closeHc(); /* alles schliessen */
- if (fehler) /* Fehler von SendIO */
- return ( FALSE ); /* Return mit Fehler */
- else /* kein Fehler */
- return(TRUE); /* alles OK! */
- }
-
-