home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / printer / graphpaper / src / src.lha / printer.c < prev    next >
C/C++ Source or Header  |  1993-04-06  |  7KB  |  247 lines

  1. #include "graph.h"
  2. #include <devices/prtbase.h>
  3.  
  4. #define WWW (xoffset+maxx+FUDGE)
  5. #define HHH (yoffset+maxy+FUDGE)
  6.  
  7. extern void *pd_ior0;
  8.  
  9. static int success;
  10.  
  11. union printerIO *CreatePrtReq(void);
  12. void DeletePrtReq(union printerIO *);
  13. int OpenPrinter (union printerIO *);
  14. void ClosePrinter(union printerIO *);
  15. void DumpRPort(union printerIO *request, struct RastPort *rastPort, struct ColorMap *colorMap,
  16.           ULONG modes, UWORD sx, WORD sy, WORD sw, WORD sh,
  17.           LONG dc, LONG dr, UWORD s);
  18.  
  19. void cleanexit(char *);
  20.  
  21. union printerIO {
  22.     struct IOStdReq    ios;
  23.     struct IODRPReq    iodrp;
  24.     struct IOPrtCmdReq iopc;
  25. };
  26.  
  27. static char *prtErrorText[] = {" EVERYTHING'S FINE", 
  28.                                " USER CANCELED DUMP", 
  29.                                " NOT A GRAPHICS PRINTER",
  30.                                " SHOULDN'T GET THIS ONE",
  31.                                " ILLEGAL DIMENSIONS", 
  32.                                " SHOULDN'T GET THIS ONE", 
  33.                                " NO MEMORY FOR VARIABLES", 
  34.                                " NO MEMORY FOR BUFFER"};
  35.  
  36. union printerIO *printerReq;
  37. BOOL PDOPEN = FALSE;
  38.  
  39.  
  40. int PrintGraph(int extraflags)
  41. {
  42.     struct IntuiMessage *msg;
  43.     struct MsgPort *port;
  44.  
  45.     ULONG usersig, printersig, signal;
  46.     BOOL P_ABORT = FALSE;
  47.     BOOL U_ABORT = FALSE;
  48.     int Modes = 0; /* ???? */
  49.     struct ColorMap *colormap;
  50.  
  51.     int destwidth, destheight;
  52.  
  53.     success = 1;
  54.  
  55.     if (!(printerReq = CreatePrtReq())) {
  56.         cleanexit("Can't create printer request");
  57.         return success;
  58.     }
  59.  
  60.     if (OpenPrinter(printerReq)) {
  61.         cleanexit("Can't open printer device\n");
  62.         return success;
  63.     }
  64.  
  65.     PDOPEN = TRUE;
  66.  
  67.     port = printerReq->ios.io_Message.mn_ReplyPort;
  68.  
  69.     usersig    = 1 << wG->UserPort->mp_SigBit;
  70.     printersig = 1 << port        ->mp_SigBit;
  71.  
  72.     colormap = GetColorMap(1<<DEPTH);
  73.  
  74.     SetRGB4CM(colormap, 0, 0xFF,0xFF,0xFF); /* 0 is white */
  75.     SetRGB4CM(colormap, 1, 0   ,0   ,0   ); /* 1 is black */
  76.  
  77.     destwidth  = WWW;
  78.     destheight = HHH;
  79.  
  80.     DumpRPort(printerReq, rast, colormap, Modes,
  81.               0, 0,
  82.               WWW, HHH,
  83.               destwidth, destheight,
  84.                 extraflags
  85.            /* | SPECIAL_TRUSTME */
  86.               | SPECIAL_CENTER       /* only centers in narrow direction */
  87.               );
  88.  
  89.     FOREVER {
  90.         signal = Wait(usersig | printersig);
  91.         if (signal & usersig){ 
  92.             while(msg = (struct IntuiMessage *)GetMsg(wG->UserPort)) {
  93.                 if (   (msg->Class == GADGETUP)
  94.                     || (msg->Class == GADGETDOWN)) {
  95.                     if (msg->IAddress == (APTR)&go) {
  96.                         U_ABORT = TRUE;
  97.                     }
  98.                 }
  99.                 ReplyMsg((struct Message *)msg);
  100.             }
  101.         }
  102.         if (signal & printersig) {
  103.             if (printerReq->iodrp.io_Error != 0) {
  104.                 P_ABORT = TRUE;
  105.                 while(msg = (struct IntuiMessage *)GetMsg(port)) {
  106.                     /* ReplyMsg((struct Message *)msg); /* ??? */
  107.                 }
  108.             } else {
  109.                 /* printer done */
  110.                 while(msg = (struct IntuiMessage *)GetMsg(port)) {
  111.                     /* ReplyMsg((struct Message *)msg); /* ??? */
  112.                 }
  113.                 cleanexit("");
  114.                 return success;
  115.             }
  116.         }
  117.         if (P_ABORT) {
  118.             quit(NULL);
  119.             cleanexit("Printer problem");
  120.             return 0;
  121.         }
  122.         if (U_ABORT) {
  123.             AbortIO((struct IORequest *)printerReq);
  124.             WaitIO((struct IORequest *)printerReq);
  125.             cleanexit("User aborted.  Your printer's probably hosed.");
  126.             return 0;
  127.         }
  128.     }
  129. }
  130.  
  131. void cleanexit(char *s)
  132. {
  133.     static int orig_cols,  orig_rows;
  134.     static int final_cols, final_rows;
  135.  
  136. #if 0
  137. /* try some prefs stuff */
  138.     printf(
  139.       "((struct PrinterData *)(printerReq->iodrp.io_Device))->pd_Preferences->PrintMaxWidth = %d\n",
  140.        ((struct PrinterData *)(printerReq->iodrp.io_Device))->pd_Preferences->PrintMaxWidth);
  141.     printf(
  142.       "(struct PrinterData *)(printerReq->iodrp.io_Device)->pd_Preferences->PrintMaxHeight = %d\n",
  143.        (struct PrinterData *)(printerReq->iodrp.io_Device)->pd_Preferences->PrintMaxHeight);
  144.     printf(
  145.       "(struct PrinterData *)(printerReq->iodrp.io_Device)->pd_Preferences->FontHeight = %d\n",
  146.        (struct PrinterData *)(printerReq->iodrp.io_Device)->pd_Preferences->FontHeight);
  147.     printf(
  148.       "(struct PrinterData *)(printerReq->iodrp.io_Device)->pd_Preferences->PrintDensity = %d\n",
  149.        (struct PrinterData *)(printerReq->iodrp.io_Device)->pd_Preferences->PrintDensity);
  150. #endif
  151.  
  152.     orig_cols  = WWW; /* for debugging */
  153.     orig_rows  = HHH;
  154.     final_cols = printerReq->iodrp.io_DestCols;
  155.     final_rows = printerReq->iodrp.io_DestRows;
  156.  
  157.     if (*s) {
  158.         sprintf(messagebuf, "Aborting: %s", s);
  159.         message(messagebuf);
  160.     }
  161.     if (PDOPEN) {
  162.         CloseDevice((struct IORequest *)printerReq);
  163.     }
  164.     if (printerReq) {
  165.         if (   (printerReq->iodrp.io_DestCols < HHH)
  166.             || (printerReq->iodrp.io_DestRows < WWW) ) {
  167.             success = 0;
  168.         message("Done.");
  169. #if 0
  170.             printf("Original cols, rows: %d, %d (%.2f x %.2f inches)\n",
  171.                    WWW, HHH,
  172.                    WWW/(float)x_dpi_V,
  173.                    HHH/(float)y_dpi_V);
  174.             printf("Final    cols, rows: %d, %d (%.2f x %.2f inches)\n",
  175.                    printerReq->iodrp.io_DestCols,
  176.                    printerReq->iodrp.io_DestRows,
  177.                    printerReq->iodrp.io_DestCols/(float)x_dpi_V,
  178.                    printerReq->iodrp.io_DestRows/(float)y_dpi_V);
  179. #endif
  180.         }
  181.         DeletePrtReq(printerReq);
  182.     }
  183. }
  184.  
  185.  
  186. /* the printer i/o routines we use */
  187.  
  188. union printerIO *CreatePrtReq()
  189. {
  190.     struct MsgPort *prtport;
  191.     union printerIO *request;
  192.  
  193.     if (!(prtport = CreatePort(NULL,0)))
  194.         return(0);
  195.     if (!(request = (union printerIO *)CreateExtIO(prtport, 
  196.                         sizeof(union printerIO)))){
  197.         DeletePort(prtport);
  198.         return(0);
  199.     }
  200.     return(request);
  201. }
  202.  
  203. void DeletePrtReq(request)
  204. union printerIO *request;
  205. {
  206.     struct MsgPort *prtport;
  207.  
  208.     prtport = request->ios.io_Message.mn_ReplyPort;
  209.     DeleteExtIO((struct IORequest *)request);
  210.     DeletePort(prtport);
  211. }
  212.     
  213. int
  214. OpenPrinter(request)
  215. union printerIO *request;
  216. {
  217.         return(
  218.         (int)OpenDevice(
  219.         (UBYTE *)"printer.device",
  220.         0,
  221.         (struct IORequest *)request,
  222.         0));
  223. }
  224.  
  225. void
  226. DumpRPort(union printerIO *request,
  227.           struct RastPort *rastPort,
  228.           struct ColorMap *colorMap,
  229.           ULONG modes,
  230.           UWORD sx, WORD sy, WORD sw, WORD sh,
  231.           LONG dc, LONG dr,
  232.           UWORD s)
  233. {
  234.     request->iodrp.io_Command = PRD_DUMPRPORT;
  235.     request->iodrp.io_RastPort = rastPort;
  236.     request->iodrp.io_ColorMap = colorMap;
  237.     request->iodrp.io_Modes = modes;
  238.     request->iodrp.io_SrcX = sx;
  239.     request->iodrp.io_SrcY = sy;
  240.     request->iodrp.io_SrcWidth = sw;
  241.     request->iodrp.io_SrcHeight = sh;
  242.     request->iodrp.io_DestCols = dc;
  243.     request->iodrp.io_DestRows = dr;
  244.     request->iodrp.io_Special = s;
  245.     SendIO((struct IORequest *)request);
  246. }
  247.