home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0657.ZIP / CCE_0657.PD / SLM.C < prev    next >
C/C++ Source or Header  |  1993-07-17  |  5KB  |  166 lines

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /* Hardwareabhängiger Teil des DVI-Druckertreibers von Stefan Lindner      */
  4. /* Anpassung für Atari Laserdrucker SLM804 von Lutz Birkhahn               */
  5. /* Optimierter Atari Lasertreiber von Σ-soft, Markus Fritze                */
  6. /* Anpassung für DVI-100 von Markus Pristovsek                             */
  7. /*                                                                         */
  8. /*    0.90 (07.09.1988): Diablo 630 - Funktionen implementiert             */
  9. /*    1.0  (10.12.1988): Anpassungen an neue Treiberkern-Version           */
  10. /*    1.1  (13.01.1989): - " -: top_offset und left_offset eingeführt      */
  11. /*    1.2  (23.04.1989): left_skip und Top_skip entfernt.                  */
  12. /*    1.3  (20.05.1989): MRF: Eigenen Lasertreiber implementiert (V1.0)    */
  13. /*    1.4  (15.07.1993): MP: Angepaß für meinen Treiber, noch ungetestet,  */
  14. /*                       aber die Bitmap sieht richtig aus.                */
  15. /*                                                                         */
  16. /***************************************************************************/
  17.  
  18.  
  19. #include <portab.h>
  20. #include <string.h>
  21. #include <mintbind.h>
  22.  
  23. #include <stdio.h>
  24. #include "treiber.h"
  25.  
  26. /**** Aus ASSLASER.S ****/
  27. extern void print_laser(int *); /* Druckt die Bitmap des Lasers */
  28. extern int check_laser(void);   /* True, wenn Laser an */
  29.  
  30. /**** Assembler zur Vergrößerung ****/
  31. extern void kop2_1( void *quell, long quellweite, void *ziel );
  32. extern char    tmp_file[256]; /* In Datei drucken? */
  33.  
  34. #define LINKS    59L
  35. #define OBEN    89L
  36. #define HOEHE    3386L
  37. #define WEITE    2336L
  38. #define WWEITE 146L
  39. #define MAX_DPI    300L
  40.  
  41.     /* Diese wird an den Drucker geschickt */
  42. WORD    bitmap[494794L];
  43. WORD    tmp_zeile[WWEITE];
  44. char    display_status[4]="\033H*";
  45.  
  46.  
  47. /* Datei ausdrucken */
  48. WORD    drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi )
  49. {
  50.     LONG        i, j, max_spalte;
  51.  
  52.     /* Kann logischerweise nicht in Datei drucken */
  53.     if(  tmp_file[0]>0  )
  54.     {
  55.         Cconws( "SLM kann nicht in eine Datei drucken!\xD" );
  56.         return 0;
  57.     }
  58.  
  59.     /* Nicht angeschaltet? => kein Druck! */
  60.     if(  !check_laser()  )
  61.     {
  62.         Cconws( "Laser nicht angeschlossen!\xD" );
  63.         return 0;
  64.     }
  65.     Cconws( display_status );
  66.     display_status[2] ^= 1;
  67.  
  68.         /* Horizontale Auflösung: 75,150,300 DpI */
  69.     if(  h_dpi>175  )
  70.         h_dpi = 300;
  71.     else if(  h_dpi>100  )
  72.         h_dpi = 150;
  73.     else 
  74.         h_dpi = 75;
  75.  
  76.         /* Vertikale Auflösung: 75,100,150,300 DpI */
  77.     if(  v_dpi>175  )
  78.         v_dpi = 300;
  79.     else if(  v_dpi>110  )
  80.         v_dpi = 150;
  81.     else if(  v_dpi>80  )
  82.         v_dpi = 100;
  83.     else
  84.         v_dpi = 75;
  85.  
  86.         /* Unsinnige Werte werden als Maximum angenommen */
  87.     if(  h_dpi<=0  ||  h_dpi>MAX_DPI  )
  88.         h_dpi = MAX_DPI;
  89.     if(  v_dpi<=0  ||  v_dpi>MAX_DPI  )
  90.         v_dpi = MAX_DPI;
  91.  
  92.         /* Bitmapanfang entsprechend verschieben */
  93.     weite = (weite+15)/16;
  94.     weite *= 2;
  95.     p += (weite*OBEN) + (LINKS/8);    /* Nicht druckbare Ränder*/
  96.     max_spalte = weite-(LINKS/8);
  97.     max_zeile -= OBEN+1;
  98.  
  99.     memset( bitmap, 0, 3386L*WWEITE*2 );
  100.         /* Anfang feststellen */
  101.     for(  j=0;  j<max_zeile  &&  ist_leerzeile( p, max_spalte );  j++  )
  102.         p += weite;
  103.     i = (j*MAX_DPI)/v_dpi;
  104.  
  105.     while(  i<HOEHE  &&  j<max_zeile  )
  106.     {
  107.         if(  (i%500)==0  )
  108.         {
  109.             Cconws( display_status );
  110.             display_status[2] ^= 1;
  111.         }
  112.  
  113.         switch( (WORD)h_dpi )
  114.         {
  115.             case 300:    if(  max_spalte>WWEITE*2  )
  116.                                     memcpy( bitmap+i*WWEITE, p, WWEITE*2 );
  117.                                 else
  118.                                     memcpy( bitmap+i*WWEITE, p, max_spalte );
  119.                             break;
  120.             case 150:    memset( tmp_zeile, 0, WWEITE*2 );
  121.                                 if(  max_spalte>WWEITE  )
  122.                                     kop2_1( p, WWEITE, tmp_zeile );
  123.                                 else
  124.                                     kop2_1( p, max_spalte, tmp_zeile );
  125.                                 memcpy( bitmap+i*WWEITE, tmp_zeile, WWEITE*2 );
  126.                             break;
  127.             case 75:    memset( tmp_zeile, 0, WWEITE );
  128.                                 if(  max_spalte>WWEITE/2  )
  129.                                     kop2_1( p, WWEITE/2, tmp_zeile );
  130.                                 else
  131.                                     kop2_1( p, max_spalte, tmp_zeile );
  132.                                 kop2_1( bitmap+i*WWEITE, WWEITE, tmp_zeile );
  133.                             break;
  134.         }
  135.         switch( (WORD)v_dpi )
  136.         {
  137.             case 300:    /* Nix */
  138.                                 i++;
  139.                             break;
  140.                                 /* Letzte Zeile kopieren */
  141.             case 150:    memcpy( bitmap+(i+1L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  142.                                 i += 2;
  143.                             break;
  144.                                 /* Letzten beiden Zeile kopieren */
  145.             case 100: memcpy( bitmap+(i+1L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  146.                                 memcpy( bitmap+(i+2L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  147.                                 i += 3;
  148.                             break;
  149.                                 /* Letzten drei Zeile kopieren */
  150.             case 75:     memcpy( bitmap+(i+1L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  151.                                 memcpy( bitmap+(i+2L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  152.                                 memcpy( bitmap+(i+3L)*WWEITE, bitmap+i*WWEITE, 2*WWEITE );
  153.                                 i += 4;
  154.                             break;
  155.         }
  156.         p += weite;
  157.         j++;
  158.     }
  159.  
  160.     Cconws( display_status );
  161.   print_laser(bitmap);    /* Bitmap 2336x3386 drucken (in Assembler) */
  162.     return 0;
  163. }
  164.  
  165.  
  166.