/*******************************************************************
 *******************************************************************
 ** Routinen aus Treiber.c (c)'93 m.pristovsek                    **
 ** Diese Routinen sind in TREIBER.C und FAST_DVI.S definiert     **
 *******************************************************************
 *******************************************************************/


/*******************************************************************
 * DIE Arbeitsroutine im eigentlichen Modul (als Parametercheck!)  *
 * Diese Routine ist druckerspezifisch                             *
 *******************************************************************
 * Die Kurzbeschreibung der Parameter:                             *
 *  bitmap  - Zeiger auf die Bitmap                                *
 *  offset  - Offset vom Rand (links bei quer, sonst von oben)     *
 *  weite   - Breite der Bitmap in Pixel                           *
 *            Die Breite einer Bitmap in Bytes erhlt man durch:   *
 *              ((weite+15)/8)&0xFFFFFFFFFEL                        *
 *            Die Breite ist immer eine gerade Anzahl von Bytes    *
 *  hoehe   - Hhe der Bitmap in Pixel (=Zeilen)                   *
 *  h_dpi   - Horizontale Auflsung in Dpi                         *
 *  v_dpi   - vertikale Auflsung in Dpi                           *
 *  datei   - Handle der Zieldatei (-3<= heit keine angegeben)    *
 *  flag    - Bitflag:                                             *
 *            flag&1 (Initialisierung ntig)                       *
 *            flag&2 (Daten auch Drucken)                          *
 *            flag&4 (Seite beenden + Seitenvorschub)              *
 *            flag==7 heit, Seite komplett drucken                *
 *            Unfertig kme dann: 3, 2, ..., 2, 4 (oder 3, 2, 6)   *
 *  quer    - Datei als Landscape ausdrucken                       *
 *  option  - Ein maximal 16 Byte langer String mit zustzlichen   *
 *            Optionen in beliegigem Format                        *
 *******************************************************************
 * Eine Rckgabe <0 wird als Fehler interpretiert und an DVI zu-   *
 * rckgegeben                                                     *
 *******************************************************************
 * GROSSE VARIABLEN AUSSERHALB ALLER FUNKTIONEN UND STATISCH       *
 * DEKLARIEREN, SONST GIBT ES U.U. STACKBERLAUF!                  *
 *******************************************************************/
short drucke( char *bitmap, long offset, long weite, long hoehe, 
            long h_dpi, long v_dpi, short datei, short flag, 
            short quer, char *option );


/*==================================================================*
 " Folgende Routinen sind allgemein zur Eingrenzung des Bereiches,  "
 " der gedruckt werden soll, interessant                            "
 *==================================================================*/

/*******************************************************************
 * Ist diese Zeile Leerzeile? (d.h. sind "offset" Bytes==0?)       *
 *******************************************************************
 * "ptr": Zeiger auf Bitmap            "offset":  Breite in Bytes  *
 *******************************************************************/
int ist_leerzeile( char *ptr, long offset );
/* 16.1.93 */


/*******************************************************************
 * Sind in den nchsten #next-Zeilen keine Zeichen? D.h. damit kann*
 * man z.B den linken Rand bestimmen.                              *
 *******************************************************************
 * "ptr":  Zeiger auf Bitmap           "offset":  Breite in Bytes  *
 * "next":  Anzahl zu testender Zeilen                             *
 *******************************************************************/
int ist_next_leer( char *ptr, long offset, long next );
/* 16.1.93 */


/*******************************************************************
 * Bitmap zeilenweise um 90 Grad drehen (in DREHE_90)              *
 *******************************************************************
 * Dabei ist "qweite" die Breite der Bitmap                        *
 * und "zweite" die Hhe der (Bitmap+7)/8                          *
 * ==> "ziel" mu mindestens "zweite"-Bytes gro sein!             *
 *******************************************************************/
void drehe_90( char *quelle, char *ziel, long qweite, long zweite, long x );


/*******************************************************************
 * Bitmap fr Nadeln drehen (in BLOCK_BY)                          *
 *******************************************************************
 * ende:   Breite des Bereiches IN BYTES                           *
 * offset: Weite einer Bitmapzeile                                 *
 * modus:  Wieviel Bytes pro Zeile (9:1, 24:3, Jet:1-6)            *
 *******************************************************************/
void block_it( char *dest, char *src, short ende, long offset, short mode );
/* 10.8.93 */


/*******************************************************************
 * Versucht Drucker zu ffnen und die Semaphore 'PRN:' zu bekommen *
 * Leider kann man die Datei "U:\dev\prn" nicht verriegeln; deshalb*
 * wurde die Semaphore eingefhrt.                                 *
 *******************************************************************
 * Der Rckgabewert ist 1 (Ok) oder 0 (Zu wenig Speicher)          *
 *******************************************************************/
int open_printer( int handle );
/* 6.2.93 */


/*******************************************************************
 * Gibt die "len" Daten ab "blk" an Spooler weiter (umgeht GEMDOS) *
 * Gleichzeitig sorgt diese Funktion fr das Blinken /-\| ...      *
 *******************************************************************/
long  print_block( long len, char *blk, int fh );
/* 22.1.93 */


/*******************************************************************
 * Gibt den String "str" an Spooler weiter (s.o.)                  *
 *******************************************************************/
long  print_str( char *str, int fh );
/* 3.9.94 */


/*******************************************************************
 * Leert Spoolerspeicher, MUSS vor dem Druckende aufgerufen werden!*
 *******************************************************************/
void  flush_block( int fh );
/* 23.1.93 */

