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

  1. /***************************************************************************/
  2. /*  Querdruck für SLM-Laser; Braucht mindesten 1MB FREIEN Speicher         */
  3. /***************************************************************************/
  4.  
  5.  
  6. #include <portab.h>
  7. #include <string.h>
  8. #include <mintbind.h>
  9.  
  10. #include <stdio.h>
  11. #include "treiber.h"
  12.  
  13. /**** Aus ASSLASER.S ****/
  14. extern void print_laser(int *); /* Druckt die Bitmap des Lasers */
  15. extern int check_laser(void);   /* True, wenn Laser an */
  16.  
  17. /**** Assembler zur Vergrößerung ****/
  18. extern void kop2_1( void *quell, long quellweite, void *ziel );
  19. extern char    tmp_file[256]; /* In Datei drucken? */
  20.  
  21. #define LINKS    59L
  22. #define OBEN    89L
  23. #define HOEHE    3386L
  24. #define WEITE    2336L
  25. #define WWEITE 146L
  26. #define MAX_DPI    300L
  27.  
  28. #define RECHTS    (2480-(WEITE+LINKS))
  29.  
  30.  
  31.  
  32.     /* Diese wird an den Drucker geschickt */
  33. WORD    bitmap[494794L];
  34. char    tmp_zeile[WWEITE*2];    /* Gedrehte Zeilen + Sicherheit */
  35. char    display_status[4]="\033H*";
  36.  
  37.  
  38. /* Datei ausdrucken */
  39. WORD    drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi )
  40. {
  41.     LONG        i, j, max_spalte;
  42.     LONG        x, drehe_off, drehe_copy;
  43.  
  44.     /* Nicht angeschaltet? => kein Druck! */
  45.     if(  !check_laser()  )
  46.     {
  47.         Cconws( "Laser nicht angeschlossen!\xD" );
  48.         return 0;
  49.     }
  50.  
  51.     /* Kann logischerweise nicht in Datei drucken */
  52.     if(  tmp_file[0]>0  )
  53.     {
  54.         Cconws( "SLM kann nicht in eine Datei drucken!\xD" );
  55.         return 0;
  56.     }
  57.  
  58.     Cconws( display_status );
  59.     display_status[2] ^= 1;
  60.  
  61.         /* Horizontale und vertikale Auflösung natürlich vertauschen */
  62.     j = v_dpi;
  63.     v_dpi = h_dpi;
  64.     h_dpi = j;
  65.  
  66.         /* Horizontale Auflösung: 75,150,300 DpI */
  67.     if(  h_dpi>175  )
  68.         h_dpi = 300;
  69.     else
  70.         h_dpi = 150;
  71.  
  72.         /* Vertikale Auflösung: 75,100,150,300 DpI */
  73.     if(  v_dpi>175  )
  74.         v_dpi = 300;
  75.     else if(  v_dpi>110  )
  76.         v_dpi = 150;
  77.     else if(  v_dpi>80  )
  78.         v_dpi = 100;
  79.     else
  80.         v_dpi = 75;
  81.  
  82.         /* Unsinnige Werte werden als Maximum angenommen */
  83.     if(  h_dpi<=0  ||  h_dpi>MAX_DPI  )
  84.         h_dpi = MAX_DPI;
  85.     if(  v_dpi<=0  ||  v_dpi>MAX_DPI  )
  86.         v_dpi = MAX_DPI;
  87.  
  88.         /* Bitmapanfang entsprechend verschieben */
  89.     max_spalte = (weite+15)/16;
  90.     max_spalte *= 2;
  91.     p += max_spalte*RECHTS;    /* Nicht druckbare Ränder*/
  92.     max_zeile -= RECHTS;
  93.     x = OBEN;
  94.     if(  max_zeile>(WEITE*h_dpi)/MAX_DPI  )
  95.     {
  96.         max_zeile = WEITE;
  97.         drehe_copy = (2*WWEITE*h_dpi)/MAX_DPI;
  98.         drehe_off = 0;;
  99.     }
  100.     else
  101.     {
  102.         drehe_off = ((max_zeile*h_dpi)/MAX_DPI+7)/8;
  103.         drehe_copy = (2*WWEITE*h_dpi)/MAX_DPI - drehe_off;
  104.     }
  105. /*        drehe_off = ((max_zeile*h_dpi)/MAX_DPI+7)/8-2*WWEITE;*/
  106.  
  107.     for(  i=0;  i<HOEHE  &&  x<weite;  x++  )
  108.     {
  109.         if(  (x%128)==0  )
  110.         {
  111.             Cconws( display_status );
  112.             display_status[2] ^= 1;
  113.         }
  114.  
  115.         drehe_90( p, tmp_zeile+drehe_off, max_spalte, drehe_copy, x );
  116.         switch( (WORD)h_dpi )
  117.         {
  118.             case 300:    memcpy( bitmap+i*WWEITE, tmp_zeile, 2*WWEITE );
  119.                             break;
  120.             case 150:    kop2_1( tmp_zeile, WWEITE, bitmap+i*WWEITE );
  121.                             break;
  122.         }
  123.         switch( (WORD)v_dpi )
  124.         {
  125.             case 300:    /* Nix */
  126.                                 i++;
  127.                             break;
  128.                                 /* Letzte Zeile kopieren */
  129.             case 150:    memcpy( bitmap+(i+1L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  130.                                 i += 2;
  131.                             break;
  132.                                 /* Letzten beiden Zeile kopieren */
  133.             case 100: memcpy( bitmap+(i+1L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  134.                                 memcpy( bitmap+(i+2L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  135.                                 i += 3;
  136.                             break;
  137.                                 /* Letzten drei Zeile kopieren */
  138.             case 75:     memcpy( bitmap+(i+1L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  139.                                 memcpy( bitmap+(i+2L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  140.                                 memcpy( bitmap+(i+3L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  141.                                 i += 4;
  142.                             break;
  143.         }
  144.     }
  145.   print_laser(bitmap);    /* Bitmap 2336x3386 drucken (in Assembler) */
  146.     return 0;
  147. }
  148.  
  149.  
  150.