home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 328_02 / whplj.c < prev    next >
C/C++ Source or Header  |  1991-06-06  |  5KB  |  160 lines

  1. /* WHPLJ2.C
  2.  * screen dump routine for laserjet II and other HP PCL-III printers.
  3.  *    NOTES: 
  4.  *        1) routine reads one byte (=8pixels) directly at a time from the screen
  5.  *            (most commercial drivers seem to read 1 pixel at a time)
  6.  *        2) writes to printer using compaction mode 0
  7.  *            NOTE: version 2 coming - uses compaction mode 2 for speed
  8.  *                    currently in debug status
  9.  *        3) senses TEXT or GRAPHICS mode, prints accordingly
  10.  *        4) on color monitors in GRAPHICS modes dithering is same as for hercules:
  11.  *                any pixel with either GREEN or BLUE is printed
  12.  *                    ie: GREEN, CYAN, YELLOW, PURPLE are;   RED is not.
  13.  *        5) routine can handle SVGA up to 800*600 16 color.
  14.  *                (larger screens require more programming logic
  15.  *                 because compaction counts are stored in signed char)
  16.  *        6) VGA 50 line text mode: entire screen is printed
  17.  *        7) multiple page programs: printing is the active page
  18.  *            (not necessarily the display page)
  19.  *            NOTE: limitation of DOS PrtScrn always prints page 0.
  20.  *        8) when compiling, define DOUBLE_ROWS to print each row twice.
  21.  *
  22.  *    usage: pass routine a FILE pointer. Use stdprn to get DOS printer
  23.  *            Use a pointer to an open BINARY mode output file 
  24.  *                to save a set of HPLJ commands to a disk file
  25.  *            then execute dos command:  TYPE  FILENAME > LPT1:
  26.  */
  27. #include "wscreen.h"
  28. #include "wsys.h"
  29.  
  30. /* HP PCL-III command codes        ( LaserJet II, DeskJet, compatibles ) 
  31.  * notes:     1) resolution is set to 100 DPI
  32.  *                which fills an 8" width in SVGA mode
  33.  *            2) maxline memory toggle is setup to accomodate SVGA mode
  34.  *                    (maxline is not a PCL-III code 
  35.  *                     but is supported on L-J II, III, and D-J )
  36.  */
  37. #define GR_END            "\x1B" "*rB"
  38. #define GR_RESOLUTION      "\x1B" "*t100R"
  39. #define GR_MAXLINE        "\x1B" "*r800S"  
  40. #define GR_MODE            "\x1B" "*b0M" 
  41. #define GR_START        "\x1B" "*r0A"
  42. #define GR_TRANSFER        "\x1B" "*b%iW"        /* %i = number of bytes */
  43. #define GR_RESET        "\x1B" "E"
  44. #define GR_PAGE            "\x0C"
  45.  
  46. #define  MAX_NB      256        /* max number of row bytes, way more than SVGA */
  47.  
  48. #ifndef TEXTONLY
  49.     /* graphics row print routine */
  50.     static void    rowprint ( FILE *f, int nb, signed char *rowdata );
  51.     static void    rowprint ( FILE *f, int nb, signed char *rowdata )
  52.         {
  53.         fprintf ( f, GR_TRANSFER, nb );    
  54.         fwrite  ( rowdata, nb, 1, f );                
  55.         return;
  56.         }        /* rowprint () */
  57.     
  58. #endif    /* ! TEXTONLY */
  59.  
  60.  
  61.  
  62.      
  63. void whplj_dump ( FILE *f )
  64.     {
  65.     int row, col;                /* MUST NOT be unsigned */
  66.     unsigned char far *screen;
  67.     
  68. #ifndef TEXTONLY
  69.     unsigned char far *screenrow;
  70.  
  71.     unsigned int bank;                /* for HERCULES graphics bank register */
  72.  
  73.     signed char image_byte;
  74.  
  75.     /*  rowdata holds the row image.
  76.      */
  77.     signed char rowdata[MAX_NB];    /* more than enough for 800 px SVGA */ 
  78.  
  79. #endif        /* ! TEXTONLY graphics definitions */
  80.     
  81.     
  82.     
  83.     if ( wmode == 'T' )        /* TEXT MODE SCREEN DUMP */
  84.         {
  85.         screen     = wpage_ram;        /* current text video page address */
  86.         row     = wyabsmax;            /* =24,42, or 49 if 25,43, or 50 line mode*/
  87.         do  {
  88.             col = 79;
  89.             do  {
  90.                 fputc ( *screen, f );
  91.                 screen +=2;                    /* skip attribute byte */
  92.                 }    while ( --col >= 0 );
  93.             
  94.             fputs ( "\r\n", f );        /* new line */
  95.             }    while ( --row >= 0 );
  96.         }
  97.  
  98.  
  99. #ifndef TEXTONLY
  100.     else
  101.         {
  102.         maxcol = (wpxabsmax+1)/8;    /* #pixels per row / by pixels per byte */
  103.  
  104.         fputs ( GR_END GR_RESOLUTION GR_MAXLINE GR_MODE GR_START, f );
  105.             
  106.         screenrow = wpage_ram;        /* note: hercules row 0 is bank 0 */
  107.         bank =0;    
  108.     
  109.         for ( row=0; row <=wpyabsmax; ++row )    /* note <= comparison */
  110.             {
  111.             for ( col=0; col<maxcol; ++col )
  112.                 {
  113.                 screen = screenrow + col;
  114.                 
  115.                 /* READ SCREEN BYTE at row, col. */
  116.                 if ( wmonitor == 'H' )            /* read screen for Herc. */
  117.                     {
  118.                     image_byte =  screen [bank];
  119.                     }
  120.                 else                            /* read screen for VGA */
  121.                     {
  122.                     EGA_OUT (4, 0);        /* read color BLUE */
  123.                     image_byte = *screen;    
  124.                     EGA_OUT (4, 1 );    /* read color GREEN */
  125.                     image_byte |= *screen;
  126.                     }                            /* end read screen portion */    
  127.                 rowdata [col] = image_byte;
  128.                 }
  129.             rowprint ( f, col, rowdata );    /* col contains actual num bytes */    
  130.                 #ifdef DOUBLE_ROWS
  131.                   rowprint ( f, col, rowdata );  
  132.                 #endif
  133.             
  134.             /* advance to next row on screen */
  135.             if ( wmonitor == 'H' )
  136.                 {
  137.                 bank += 0x2000;
  138.                 if ( bank==0x8000 )
  139.                     {
  140.                     bank = 0;
  141.                     screenrow += 90;
  142.                     }
  143.                 }
  144.             else
  145.                 {
  146.                 /* EGA/VGA */
  147.                 screenrow += wegarowsize;    /* 80 for EGA/VGA, 100 for SVGA */
  148.                 }
  149.     
  150.             }                    /* end for ( row... ) */
  151.         fputs ( GR_END, f );
  152.         }                        /* end ...else graphics mode... */
  153. #endif    /* graphics mode */
  154.     
  155.     fputs ( GR_PAGE GR_RESET, f );
  156.     
  157.     return;        /* whplj_dump() */
  158.     }
  159.     
  160. /*------------------- end WHPLJ.C ------------------------------*/