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 >
C/C++ Source or Header  |  1993-10-08  |  3KB  |  153 lines

  1. /*********************************************************************
  2. **** VDI-Treiber, gibt Seite über GDOS aus, sicher die langsamste ****
  3. **** Art, dafür gehts es mit jedem GDOS-Drucker, der Bitimages    ****
  4. **** ausgeben kann.                                                                                                ****
  5. *********************************************************************/
  6.  
  7.  
  8. #include <portab.h>
  9. #include <atarierr.h>
  10.  
  11. #include <vdi.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "mintbind.h"
  16. #include "treiber.h"
  17.  
  18.  
  19. /* Versucht Zeile zu Komprimieren */
  20. WORD    compress_img_run( UBYTE *ziel, UBYTE *p, WORD *limit )
  21. {
  22.     UBYTE    i;
  23.  
  24.         /* Sonst getrennt */
  25.     if(  p[0]==0xFF  ||  p[0]==0  )
  26.     {
  27.         for(  i=1;  p[i]==p[0]  &&  i<*limit  &&  i<0x7F;  i++  )
  28.             ;
  29.         ziel[0] = (0x80 & p[0]) | i;
  30.         (*limit) -= i;
  31.         return 1;
  32.     }
  33.     else
  34.     {
  35.         /* Abstand zum nächsten Ungleichen... */
  36.         for(  i=0;  p[i]!=0  &&  p[i]!=0xFF  &&  i<127  &&  i<*limit;  i++  )
  37.             ziel[i+2] = p[i];
  38.         ziel[0] = 0x80;
  39.         ziel[1] = i;
  40.         (*limit) -= i;
  41.         return i+2;
  42.     }
  43. }
  44. /* 17.1.93 */
  45.  
  46.  
  47. typedef struct {
  48.     unsigned version;
  49.     unsigned headlen;
  50.     unsigned nplanes;
  51.     unsigned patlen;
  52.     unsigned pixelw;
  53.     unsigned pixelh;
  54.     unsigned linew;
  55.     unsigned lines;
  56. /*    unsigned palette[16]; Sind eh monochrom */
  57. } IMGHEADER;
  58.  
  59.  
  60. UBYTE            line[8192];
  61.  
  62. /* Schreibe in DVI-Datei */
  63. WORD    drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi )
  64. {
  65.     extern char    tmp_file[256];
  66.     IMGHEADER    hdr;
  67.     WORD            max_spalte, zeile, lz;
  68.     WORD            rep, th, i, work_in[12], work[56];
  69.     UBYTE            l;
  70.  
  71.     if(  vq_gdos()==0  )
  72.     {
  73.         Cconout( 7 );
  74.         return -1;
  75.     }
  76.     th = (WORD)get_tempfile( "img" );
  77.     if(  th<0  )
  78.         return -1;
  79.  
  80.         /* Header */
  81.     hdr.version = 1;
  82.     hdr.headlen = (WORD)sizeof(IMGHEADER)/2;
  83.     hdr.nplanes = 1;
  84.     hdr.patlen = 2;
  85.         /* Grafikauflösung festlegen */
  86.     hdr.pixelw = (WORD)((25400L+h_dpi/2)/h_dpi);
  87.     hdr.pixelh = (WORD)((25400L+v_dpi/2)/v_dpi);
  88.         /* Grafikweite festlegen */
  89.     hdr.linew = (WORD)weite;
  90.     hdr.lines = (WORD)max_zeile;
  91.     Fwrite( th, sizeof(IMGHEADER), &hdr );
  92.  
  93.     max_spalte = (WORD)((weite+7)/8);
  94.     zeile = 0;
  95.     weite = (weite+15)/16;
  96.     weite *= 2;
  97.  
  98.     while(  zeile<max_zeile  )
  99.      {
  100.              /* Zeilenkopf */
  101.              /* gleiche Zeilen komprimieren */
  102.          for(  l=1;  0==memcmp( p, p+weite, max_spalte )  &&  zeile<max_zeile  &&  l<255;  l++, zeile++  )
  103.              p += weite;
  104.          Fwrite( th, 3L, "\0\0\xFF" );
  105.         Fwrite( th, 1L, &l );
  106.  
  107.             /* Eine Zeile in die Datei! */
  108.         rep = lz = max_spalte;
  109.         i = 0;
  110.             /* Wir komprimieren (es bleibt auch nichts übrig) */
  111.         while(  lz>0  )
  112.             i += compress_img_run( line+i, p+rep-lz, &lz );
  113.         Fwrite( th, (LONG)i, line );
  114.  
  115.         p += weite;
  116.         zeile++;
  117.     }
  118.     Fclose( th );
  119.  
  120.     /* Und nun die Ausgabe auf Gerät 21 */
  121.   for(  i=1;  i<10;  i++  )
  122.     work_in[i] = 1;
  123.   work_in[10] = 2; /* Raster-Koordinaten! */
  124.   work_in[0] = i = 21;
  125.     v_opnwk( work_in, &i, work );
  126.     if(  i>0  )
  127.     {
  128.         Cconws( "\033H*" );
  129.         work_in[0] = work_in[1] = 0;
  130.         work_in[2] = work[0];
  131.         work_in[3] = work[1];
  132.         Cconws( "\033H+" );
  133.         v_bit_image(    i, tmp_file, 0,
  134.                                     1, 1, /* Ganzahlig xy */
  135.                                     0, 0, /* Links oben */
  136.                                     work_in );
  137.         Cconws( "\033H*" );
  138.         v_updwk( i );
  139.         Cconws( "\033H+" );
  140.         v_clswk( i );
  141.         Cconws( "\033H*" );
  142.         Fdelete( tmp_file );
  143.     }
  144.     else
  145.         Cconout( 7 );
  146.  
  147.     /* Sollte immer gut gehen! (d.h. kein File zum Drucken!) */
  148.     return 0;
  149. }
  150. /* 22.1.93 */
  151.  
  152.  
  153.