/************************************************************************* **** Kern des universellen 24-Nadeltreibers **** **** Sollte von Headerdatei aufgerufen werden **** *************************************************************************/ #include #include #include #include #include "treiber.h" #ifndef STEP_360 #error "Bitte diese Datei nur per #include lesen!" #endif UBYTE *INIT = "\033@\033x\1"; UBYTE *GRAFIK_180 = "\033*\047\0"; UBYTE *GRAFIK_360 = "\033*\050\0"; UBYTE *STEP_180 = "\033\063"; VOID block_out( UBYTE *dest, UBYTE *src, WORD ende, LONG offset, WORD hoehe ) { WORD i, j, k; #if 0 if( hoehe != 0 && hoehe < 8) { /* Nur wenn es wirklich n”tig ist die langsame Bitpfriemelei */ for( i=0; i<=ende; i++ ) { /* Byte-Pfriemeln */ for( j=7; j>=0; j-- ) { *dest = 0; for( k=0; k>j)&1)<<(7-k); } dest++; src++; } return; } #endif /* So ist wesentlich schneller */ for( i=0; i<=ende; i++ ) { /* Byte-Pfriemeln */ for( j=7; j>=0; j-- ) { *dest = 0; *dest |= ((src[0]>>j)&1)<<7; *dest |= ((src[offset]>>j)&1)<<6; *dest |= ((src[offset*2]>>j)&1)<<5; *dest |= ((src[offset*3]>>j)&1)<<4; *dest |= ((src[offset*4]>>j)&1)<<3; *dest |= ((src[offset*5]>>j)&1)<<2; *dest |= ((src[offset*6]>>j)&1)<<1; *dest |= (src[offset*7]>>j)&1; dest++; *dest |= ((src[offset*8]>>j)&1)<<7; *dest |= ((src[offset*9]>>j)&1)<<6; *dest |= ((src[offset*10]>>j)&1)<<5; *dest |= ((src[offset*11]>>j)&1)<<4; *dest |= ((src[offset*12]>>j)&1)<<3; *dest |= ((src[offset*13]>>j)&1)<<2; *dest |= ((src[offset*14]>>j)&1)<<1; *dest |= (src[offset*15]>>j)&1; dest++; *dest |= ((src[offset*16]>>j)&1)<<7; *dest |= ((src[offset*17]>>j)&1)<<6; *dest |= ((src[offset*18]>>j)&1)<<5; *dest |= ((src[offset*19]>>j)&1)<<4; *dest |= ((src[offset*20]>>j)&1)<<3; *dest |= ((src[offset*21]>>j)&1)<<2; *dest |= ((src[offset*22]>>j)&1)<<1; *dest |= (src[offset*23]>>j)&1; dest++; } src++; } } /* 20.1.93 */ /* Zur Zeit wird fast nicht optimiert; Zum einen sollte jetzt fast jeder * Drucker arbeiten; Zum anderen habe ich keinen 24-Nadeldrucker zum Testen * Bastler sind hier zur Arbeit aufgefordert! */ static UBYTE tmp[8192]; WORD drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi ) { UBYTE v_modus, *v_step, *grafik; LONG max_spalte, zeile, lz, links, linker_rand, rechts; LONG h_len, len, i; WORD th; th = (WORD)get_tempfile( "n24" ); if( th<0 ) return -1; grafik = GRAFIK_360; v_step = STEP_360; if( h_dpi<200 ) { grafik = GRAFIK_180; h_dpi = 180; } else h_dpi = 360; if( v_dpi<200 ) { v_step = STEP_180; v_dpi = 180; } else v_dpi = 360; /* Ab hier wird es ernst */ if( weite0 && max_zeile>HOEHE ) max_zeile = HOEHE; lz = 0; v_modus = v_dpi/180; linker_rand = 0; Fwrite( th, strlen(INIT), INIT ); /* Reset + LQ-Mode */ /* Endlich drucken */ max_zeile--; while( zeile0 ) { Fwrite( th, 2L, v_step ); if( lz>255 ) Fwrite( th, 1L, "\xFF" ); else Fwrite( th, 1L, (&lz)+3 ); /* Long = 4 Bytes! */ Fwrite( th, 1L, "\xA" ); lz -= 255; } if( zeile==max_zeile ) break; /* R„nder feststellen */ for( rechts=max_spalte-1; ist_next_leer( p+rechts, weite, v_modus*24 ) && rechts>linker_rand; rechts-- ) ; rechts++; links = 0; len = rechts; h_len = 5; strcpy( tmp, grafik ); tmp[3] = (UBYTE)(8*(rechts-links) % 256); tmp[4] = (UBYTE)(8*(rechts-links) / 256); if( len>0 ) memset( tmp+h_len, 0, 24*len ); /* Oder auch weniger bei geringerer Aufl”sung */ for( lz=0; lz