home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0657.ZIP / CCE_0657.PD / STYLUS.C < prev    next >
C/C++ Source or Header  |  1993-10-08  |  4KB  |  9 lines

  1. /*****************************************************************************  Hier der speziell an den Stylus 800-Drucker von Epson angepaßte ********  24-Nadeltreiber. (Wie schön wäre es, wenn alle neuen Drucker    ********  HPCL könnten...)                                                *****************************************************************************/#include <portab.h>
  2. #include "mintbind.h"#include "treiber.h"/** Vorläufige Parameter */#define MAX_DPI    360L#define    WEITE    2880L#define HOEHE    -1L#define OBEN    0L#define LINKS    0L#ifdef FAST_PRN#define WRITE(i,j) ((th>0)?(Fwrite(th,i,j)):(print_block(i,j)))#endif/* Reset + NLQ + Einheit 1/MAX_DPI" + Zeilenabstand 48/MAX_DPI" */UBYTE    *INIT     = "  \033@\033x\001\033(U\001\000\012\033$\000\000\033(V\002\000\000\000";UBYTE    *H_STEP    =    "\033$xx";UBYTE    *V_STEP    =    "\033(v\002\000xx";UBYTE    *GRAFIK    = "\033*";struct{    UBYTE    modus;    WORD    h_dpi;    WORD    v_dpi;    WORD    t;} modus[13]={    { 0, 60, 60, 1 },    { 4, 80, 60, 1 },    { 6, 90, 60, 1 },    { 1, 120, 60, 1 },    /*+*/    { 3, 240, 60, 1 },    /*+*/    { 32, 60, 180, 3 },    { 38, 90, 180, 3 },    { 33, 220, 180, 3 },    { 39, 180, 180, 3 },    { 40, 360, 180, 3 },    /*+*/    { 71, 180, 360, 6 },    { 73, 360, 360, 6 }};/*+* heißt: Kann keine nebeneinanderliegenden Punkte drucken! *//* Zwischenspeicher für eine Zeile */static UBYTE    tmp[WEITE*6L+5L];WORD    drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi ){    extern char    tmp_file[256]; /* In Datei drucken? */    extern long    max_puffer_laenge;    LONG    max_spalte, zeile, lz, links, linker_rand, rechts;    LONG    len, i, d_modus, bits_per_row;    WORD    th=0;#ifdef FAST_PRN    /* Für viel Geschwindigkeit = sinnvoll großer Puffer */    max_puffer_laenge = WEITE*6L+256L;    if(  tmp_file[0]>0  ||  open_printer()<0  )#endif        th = (WORD)get_tempfile( "sls" );    if(  th<0  )        return -1;    if(  v_dpi<200    )    {        if(  v_dpi<80  )            v_dpi = 60;        else            v_dpi = 180;    }    else        v_dpi = MAX_DPI;    for(  d_modus=0;  d_modus<12;  d_modus++  )        if(  (h_dpi*90)/100<modus[d_modus].h_dpi  &&  v_dpi==modus[d_modus].v_dpi  )            break;    h_dpi = modus[d_modus].h_dpi;    bits_per_row = 8*modus[d_modus].t;    d_modus = modus[d_modus].modus;        /* Ab hier wird es ernst */    if(  weite<(WEITE*h_dpi)/360L  )        max_spalte = (weite+7)/8;    else        max_spalte = (WEITE*h_dpi)/(MAX_DPI*8L);        /* Diverse Variablen initialisieren */    zeile = 0;    weite = (weite+15L)/16L;    weite *= 2;    p += weite*OBEN + LINKS;    /* Nicht druckbare Ränder*/    max_zeile -= OBEN;    if(  HOEHE>0    &&    (max_zeile*v_dpi)/MAX_DPI>HOEHE  )        max_zeile = HOEHE;    for(  linker_rand=0;    ist_next_leer( p+linker_rand, weite, max_zeile )  &&  linker_rand<max_spalte;  linker_rand++  )        ;    if(  linker_rand==max_spalte  )    {    /* Leerseite */        WRITE( 1L, "\014" );        return th;    }        /* Reset + LQ-Mode */    WRITE( 24L, INIT );    /* Endlich drucken */    lz = 0;    max_zeile--;    while(    zeile<max_zeile )    {        /* Leerzeilen überspringen */        while(  zeile<max_zeile  &&  ist_leerzeile( p, max_spalte )  )        {            lz++;            zeile++;            p += weite;        }        if(  zeile>=max_zeile  )
  3.         {
  4.             lz = lz+(max_zeile-zeile)-bits_per_row;
  5.             if(  lz>0  )
  6.                 break;
  7.         }
  8.  
  9.         if(     lz!=0  )        {    /* Leerzeilen überspringen */            i = (lz*MAX_DPI)/v_dpi;            V_STEP[5] = (UBYTE)i;            V_STEP[6] = (UBYTE)(i>>8);            WRITE( 7L, V_STEP );        }            /* Ränder feststellen */        for(    rechts=max_spalte-1;    ist_next_leer( p+rechts, weite, bits_per_row )    &&    rechts>linker_rand;  rechts--  )            ;        rechts++;        for(  links=linker_rand;    ist_next_leer( p+links, weite, bits_per_row )    &&    links<rechts;  links++  )            ;        if(    links>0    )        {    /* Linker Rand */            i = (links*8L*MAX_DPI)/h_dpi;            H_STEP[2] = (UBYTE)i;            H_STEP[3] = (UBYTE)(i>>8);            WRITE( 4L, H_STEP );        }        len = rechts-links;        tmp[0] = '\033';        tmp[1] = '*';        tmp[2] = (UBYTE)d_modus;        tmp[3] = (UBYTE)((len%32)*8);        tmp[4] = (UBYTE)(len>>5);        block_it( tmp+5, p+links, len, weite, bits_per_row/8 );        WRITE( 5L+len*bits_per_row, tmp );        p += weite*bits_per_row;        zeile += bits_per_row;        lz = bits_per_row; }        /* Ende Seite */    if(  1!=WRITE( 1L, "\014" )  )    {        /* Platz reichte nicht aus */        if(  th>0  )            Fclose( th );        th = -1;    }    if(  tmp_file[0]==0  )        flush_block();    return th;}/* 17.8.93 */