/********************************************************************* **** Universaltreiber fr HP-kompatible Drucker **** *********************************************************************/ /* Siehe auch Datei JP350WS.C */ #include #include #include #include #include "mintbind.h" /* Geht seltsamerweise nur mit der eigenen Version */ #include "treiber.h" /********************************************************************/ /* Setzt die freien Werte auf Standartwerte */ #ifndef OBEN /* Wenn noch kein oberer Rand definiert */ #define OBEN 0L #endif #ifndef LINKS /* Wenn noch kein linker Rand definiert */ #define LINKS 0L #endif #ifndef MAX_DPI /* Wenn keine maximale Aufl”sung definiert */ #define MAX_DPI 1200L #endif #ifndef WEITE /* druckbare Breite (in Pixel) */ #define WEITE ((2336L*MAX_DPI)/300L) #endif #ifndef HOEHE /* druckbare H”he (in Pixel) */ #define HOEHE ((3386L*MAX_DPI)/300L) #endif /********************************************************************/ /* Findet entweder Wiederholung (TRUE) oder nichts */ WORD find_next_same( WORD *rep, UBYTE *p, LONG limit ) { WORD i; /* Spezialf„lle */ if( limit<1 ) { *rep = 1; return FALSE; } if( limit<2 && p[0]==p[1] ) { *rep = 2; return TRUE; } /* Sonst getrennt */ if( p[0]==p[1] && p[1]==p[2] ) { /* Abstand zum n„chsten Ungleichen... */ i = 3; while( i<128 && i1 ) max_spalte--; if( (th=(WORD)get_tempfile( "hp" ))<0 ) return -1; if( max_spalte<=1 ) { /* Seite leer */ Fwrite( th, 5L, " \33*rB\14" ); /*FF*/ return Fclose( th ); } /* In die obere Ecke */ Fwrite( th, 27, " \33*p0Y\33*p-300Y\33*p0X\33*p-300X" ); /* Grafikdruck Anfang */ strcpy( tmp1, "\33*rB\33*t" ); /* Grafikaufl”sung festlegen */ ltoa( h_dpi, tmp1+7, 10 ); strcat( tmp1, "R\33*r" ); Fwrite( th, strlen(tmp1), tmp1 ); /* Grafikweite festlegen */ ltoa( max_spalte*8, tmp1, 10 ); strcat( tmp1, "s0A" ); Fwrite( th, strlen(tmp1), tmp1 ); while( zeile0 ) { strcpy( tmp1, "\33*b" ); ltoa( lz, tmp1+3, 10 ); strcat( tmp1, "Y" ); Fwrite( th, strlen(tmp1), tmp1 ); } /* eine oder Druckzeilen an den Drucker! */ for( lz=max_zeile; zeile0 ) druckzeile[j++] = p[i++]; } } /* Und nun den interessanten Rest */ if( j700 ) h_dpi = 1200; else if( h_dpi>350 ) h_dpi = 600; else if( h_dpi>175 ) h_dpi = 300; else if( h_dpi>110 ) h_dpi = 150; else if( h_dpi>80 ) h_dpi = 100; else h_dpi = 75; /* Unsinnige Werte werden als Maximum angenommen */ if( h_dpi<=0 || h_dpi>MAX_DPI ) h_dpi = MAX_DPI; i = (OBEN*h_dpi)/MAX_DPI; j = (LINKS*h_dpi)/MAX_DPI; max_spalte = (weite+15)/16; max_spalte *= 2; p += (max_spalte*i) + j; /* Nicht druckbare R„nder*/ max_spalte -= j; if( weite>(WEITE+LINKS*8)*h_dpi/MAX_DPI /* LINKS*8 nicht druckbar!*/ ) max_spalte = (WEITE*h_dpi)/(8*MAX_DPI); max_zeile -= i+1; if( max_zeile>(HOEHE*h_dpi)/MAX_DPI ) max_zeile = (HOEHE*h_dpi)/MAX_DPI; zeile = 0; weite = (weite+15)/16; weite *= 2; /* R„nder feststellen */ while( max_spalte>0 && ist_next_leer( p+max_spalte-1, weite, max_zeile ) ) max_spalte--; if( tmp_file[0]>0 ) return drucke_datei( p, weite, max_zeile, h_dpi, max_spalte, zeile ); if( open_printer()<0 ) return -1; if( max_spalte<=1 ) { /* Seite leer */ print_block( 5L, " \33*rB\14" ); /*FF*/ return 0; } /* In die obere Ecke */ print_block( 27L, " \33*p0Y\33*p-300Y\33*p0X\33*p-300X" ); /* Grafikdruck Anfang */ strcpy( tmp1, "\33*rB\33*t" ); /* Grafikaufl”sung festlegen */ ltoa( h_dpi, tmp1+7, 10 ); strcat( tmp1, "R\33*r" ); print_block( strlen(tmp1), tmp1 ); /* Grafikweite festlegen */ ltoa( max_spalte*8, tmp1, 10 ); strcat( tmp1, "s0A" ); print_block( strlen(tmp1), tmp1 ); while( zeile0 ) { strcpy( tmp1, "\33*b" ); ltoa( lz, tmp1+3, 10 ); strcat( tmp1, "Y" ); print_block( strlen(tmp1), tmp1 ); } /* eine oder Druckzeilen an den Drucker! */ for( lz=max_zeile; zeile0 ) druckzeile[j++] = p[i++]; } } /* Und nun den interessanten Rest */ if( j0 ) { strcpy( tmp1, "\33*b" ); ltoa( lz, tmp1+3, 10 ); strcat( tmp1, "Y" ); print_block( strlen(tmp1), tmp1 ); } /* 50 Zeilen (eine Druckkopfh”he an den Drucker! */ for( ; zeile0 ) druckzeile[j++] = p[i++]; } } /* Und nun den interessanten Rest */ if( j