home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computer Club Elmshorn Atari PD
/
CCE_PD.iso
/
pc
/
0600
/
CCE_0657.ZIP
/
CCE_0657.PD
/
VDI.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-08
|
3KB
|
153 lines
/*********************************************************************
**** VDI-Treiber, gibt Seite über GDOS aus, sicher die langsamste ****
**** Art, dafür gehts es mit jedem GDOS-Drucker, der Bitimages ****
**** ausgeben kann. ****
*********************************************************************/
#include <portab.h>
#include <atarierr.h>
#include <vdi.h>
#include <stdlib.h>
#include <string.h>
#include "mintbind.h"
#include "treiber.h"
/* Versucht Zeile zu Komprimieren */
WORD compress_img_run( UBYTE *ziel, UBYTE *p, WORD *limit )
{
UBYTE i;
/* Sonst getrennt */
if( p[0]==0xFF || p[0]==0 )
{
for( i=1; p[i]==p[0] && i<*limit && i<0x7F; i++ )
;
ziel[0] = (0x80 & p[0]) | i;
(*limit) -= i;
return 1;
}
else
{
/* Abstand zum nächsten Ungleichen... */
for( i=0; p[i]!=0 && p[i]!=0xFF && i<127 && i<*limit; i++ )
ziel[i+2] = p[i];
ziel[0] = 0x80;
ziel[1] = i;
(*limit) -= i;
return i+2;
}
}
/* 17.1.93 */
typedef struct {
unsigned version;
unsigned headlen;
unsigned nplanes;
unsigned patlen;
unsigned pixelw;
unsigned pixelh;
unsigned linew;
unsigned lines;
/* unsigned palette[16]; Sind eh monochrom */
} IMGHEADER;
UBYTE line[8192];
/* Schreibe in DVI-Datei */
WORD drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi )
{
extern char tmp_file[256];
IMGHEADER hdr;
WORD max_spalte, zeile, lz;
WORD rep, th, i, work_in[12], work[56];
UBYTE l;
if( vq_gdos()==0 )
{
Cconout( 7 );
return -1;
}
th = (WORD)get_tempfile( "img" );
if( th<0 )
return -1;
/* Header */
hdr.version = 1;
hdr.headlen = (WORD)sizeof(IMGHEADER)/2;
hdr.nplanes = 1;
hdr.patlen = 2;
/* Grafikauflösung festlegen */
hdr.pixelw = (WORD)((25400L+h_dpi/2)/h_dpi);
hdr.pixelh = (WORD)((25400L+v_dpi/2)/v_dpi);
/* Grafikweite festlegen */
hdr.linew = (WORD)weite;
hdr.lines = (WORD)max_zeile;
Fwrite( th, sizeof(IMGHEADER), &hdr );
max_spalte = (WORD)((weite+7)/8);
zeile = 0;
weite = (weite+15)/16;
weite *= 2;
while( zeile<max_zeile )
{
/* Zeilenkopf */
/* gleiche Zeilen komprimieren */
for( l=1; 0==memcmp( p, p+weite, max_spalte ) && zeile<max_zeile && l<255; l++, zeile++ )
p += weite;
Fwrite( th, 3L, "\0\0\xFF" );
Fwrite( th, 1L, &l );
/* Eine Zeile in die Datei! */
rep = lz = max_spalte;
i = 0;
/* Wir komprimieren (es bleibt auch nichts übrig) */
while( lz>0 )
i += compress_img_run( line+i, p+rep-lz, &lz );
Fwrite( th, (LONG)i, line );
p += weite;
zeile++;
}
Fclose( th );
/* Und nun die Ausgabe auf Gerät 21 */
for( i=1; i<10; i++ )
work_in[i] = 1;
work_in[10] = 2; /* Raster-Koordinaten! */
work_in[0] = i = 21;
v_opnwk( work_in, &i, work );
if( i>0 )
{
Cconws( "\033H*" );
work_in[0] = work_in[1] = 0;
work_in[2] = work[0];
work_in[3] = work[1];
Cconws( "\033H+" );
v_bit_image( i, tmp_file, 0,
1, 1, /* Ganzahlig xy */
0, 0, /* Links oben */
work_in );
Cconws( "\033H*" );
v_updwk( i );
Cconws( "\033H+" );
v_clswk( i );
Cconws( "\033H*" );
Fdelete( tmp_file );
}
else
Cconout( 7 );
/* Sollte immer gut gehen! (d.h. kein File zum Drucken!) */
return 0;
}
/* 22.1.93 */