home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0657.ZIP / CCE_0657.PD / VDI_90.C < prev    next >
C/C++ Source or Header  |  1993-09-01  |  3KB  |  146 lines

  1. /***************************************************************************/
  2. /*  Querdruck für GDOS-Drucker                                             */
  3. /***************************************************************************/
  4.  
  5.  
  6. #include <portab.h>
  7. #include <vdi.h>
  8. #include <string.h>
  9. #include <mintbind.h>
  10.  
  11. #include <stdio.h>
  12. #include "treiber.h"
  13.  
  14.  
  15.  
  16. /* Versucht Zeile zu Komprimieren */
  17. LONG    compress_img_run( UBYTE *ziel, UBYTE *p, LONG *limit )
  18. {
  19.     UBYTE    i;
  20.  
  21.         /* Sonst getrennt */
  22.     if(  p[0]==0xFF  ||  p[0]==0  )
  23.     {
  24.         for(  i=1;  p[i]==p[0]  &&  i<*limit  &&  i<0x7F;  i++  )
  25.             ;
  26.         ziel[0] = (0x80 & p[0]) | i;
  27.         (*limit) -= i;
  28.         return 1;
  29.     }
  30.     else
  31.     {
  32.         /* Abstand zum nächsten Ungleichen... */
  33.         for(  i=0;  p[i]!=0  &&  p[i]!=0xFF  &&  i<127  &&  i<*limit;  i++  )
  34.             ziel[i+2] = p[i];
  35.         ziel[0] = 0x80;
  36.         ziel[1] = i;
  37.         (*limit) -= i;
  38.         return i+2;
  39.     }
  40. }
  41. /* 17.1.93 */
  42.  
  43.  
  44.  
  45. typedef struct {
  46.     unsigned version;
  47.     unsigned headlen;
  48.     unsigned nplanes;
  49.     unsigned patlen;
  50.     unsigned pixelw;
  51.     unsigned pixelh;
  52.     unsigned linew;
  53.     unsigned lines;
  54. /*    unsigned palette[16]; Sind eh monochrom */
  55. } IMGHEADER;
  56.  
  57.  
  58. char    tmp_zeile[8192];    /* Gedrehte Zeilen + Sicherheit */
  59. char    line[8192];    /* Gedrehte Zeilen + Sicherheit */
  60. char    display_status[4]="\033H*";
  61. extern char    tmp_file[256]; /* In Datei drucken? */
  62.  
  63.  
  64. /* Datei ausdrucken */
  65. WORD    drucke( UBYTE *p, LONG weite, LONG hoehe, LONG h_dpi, LONG v_dpi )
  66. {
  67.     IMGHEADER    hdr;
  68.     LONG            max_spalte, wweite, lz;
  69.     WORD            th, work_in[12], work[56];
  70.     LONG            rep, x, i;
  71.  
  72.     if(  vq_gdos()==0  )
  73.     {
  74.         Cconout( 7 );
  75.         return -1;
  76.     }
  77.     th = (WORD)get_tempfile( "img" );
  78.     if(  th<0  )
  79.         return -1;
  80.  
  81.         /* Header */
  82.     hdr.version = 1;
  83.     hdr.headlen = (WORD)sizeof(IMGHEADER)/2;
  84.     hdr.nplanes = 1;
  85.     hdr.patlen = 2;
  86.         /* Grafikauflösung festlegen */
  87.     hdr.pixelw = (WORD)((25400L+v_dpi/2)/v_dpi);
  88.     hdr.pixelh = (WORD)((25400L+h_dpi/2)/h_dpi);
  89.         /* Grafikweite festlegen */
  90.     hdr.linew = (WORD)hoehe;
  91.     hdr.lines = (WORD)weite;
  92.     Fwrite( th, sizeof(IMGHEADER), &hdr );
  93.  
  94.     max_spalte = (hoehe+7)/8;
  95.     x = 0;
  96.     wweite = (weite+15)/16;
  97.     wweite *= 2;
  98.     Cconws( display_status );
  99.  
  100.     for(  i=0;  x<weite;  x++  )
  101.     {
  102.         if(  (x%128)==0  )
  103.         {
  104.             Cconws( display_status );
  105.             display_status[2] ^= 1;
  106.         }
  107.         drehe_90( p, tmp_zeile, wweite, max_spalte, x );
  108.          Fwrite( th, 4L, "\000\000\377\001" );
  109.  
  110.             /* Eine Zeile in die Datei! */
  111.         rep = lz = max_spalte;
  112.         i = 0;
  113.         while(  lz>0  )
  114.             i += compress_img_run( line+i, tmp_zeile+rep-lz, &lz );
  115.         Fwrite( th, (LONG)i, line );
  116.      }
  117.      Fclose( th );
  118.  
  119.     /* Und nun die Ausgabe auf Gerät 21 */
  120.   for(  i=1;  i<10;  i++  )
  121.     work_in[i] = 1;
  122.   work_in[10] = 2; /* Raster-Koordinaten! */
  123.   work_in[0] = th = 21;
  124.     v_opnwk( work_in, &th, work );
  125.     if(  th>0  )
  126.     {
  127.         Cconws( "\033Hp" );
  128.         work_in[0] = work_in[1] = 0;
  129.         work_in[2] = work[0];
  130.         work_in[3] = work[1];
  131.         v_bit_image(    th, tmp_file, 0,
  132.                                     1, 1, /* Ganzahlig xy */
  133.                                     0, 0, /* Links oben */
  134.                                     work_in );
  135.         v_updwk( th );
  136.         v_clswk( th );
  137.         Fdelete( tmp_file );
  138.     }
  139.     else
  140.         Cconout( 7 );
  141.  
  142.     return 0;
  143. }
  144.  
  145.  
  146.