home *** CD-ROM | disk | FTP | other *** search
/ swCHIP 1991 January / swCHIP_95-1.bin / utility / gs333win / gs3.33 / readme.win < prev   
Text File  |  1995-12-09  |  33KB  |  996 lines

  1. To run Aladdin Ghostscript 3.33 you also need gs333ini.zip
  2. obtained from the same place as this zip file
  3.  
  4. This EXE is for Win16.
  5.  
  6. This is Aladdin Ghostscript 3.33 with the following patches.
  7. The patches are:
  8. 1. Add mswinpr2 device for Win16 and Win32.  This is a new driver -
  9.    please report any problems to rjl@aladdin.com.
  10. 2. Turn on optimiser for OS/2
  11. 3. Add PDF support to Win32 and OS/2
  12. 4. Add more device support for Win32 and OS/2
  13. 5. Fix bug in laserjet family devices.
  14. 6. Avoid BC++ 4.5 compiler objection to gdevlbp8.c
  15.  
  16. Compilation has been with BC++ 4.5 for Win16 and Win32,
  17. and with GCC/EMX 0.9a for OS/2.
  18.  
  19. rjl 1995-04-29
  20.  
  21.  
  22. diff -cr ./bcwin.mak ../bcwin.mak
  23. *** ./bcwin.mak    Mon Mar 27 01:44:24 1995
  24. --- ../bcwin.mak    Sat Apr 29 08:41:04 1995
  25. ***************
  26. *** 194,200 ****
  27.   LCT=/v
  28.   !else
  29.   CT=-y
  30. ! LCT=/m /l
  31.   !endif
  32.   
  33.   GENOPT=$(CP) $(CS) $(CD) $(CT)
  34. --- 194,200 ----
  35.   LCT=/v
  36.   !else
  37.   CT=-y
  38. ! LCT=/m /l /s
  39.   !endif
  40.   
  41.   GENOPT=$(CP) $(CS) $(CD) $(CT)
  42. ***************
  43. *** 230,238 ****
  44.   # Choose the device(s) to include.  See devs.mak for details.
  45.   
  46.   !if $(GSDLL)
  47. ! DEVICE_DEVS=mswindll.dev mswin.dev mswinprn.dev
  48.   !else
  49. ! DEVICE_DEVS=mswin.dev mswinprn.dev
  50.   !endif
  51.   DEVICE_DEVS3=deskjet.dev djet500.dev laserjet.dev ljetplus.dev ljet2p.dev ljet3.dev ljet4.dev
  52.   DEVICE_DEVS4=cdeskjet.dev cdjcolor.dev cdjmono.dev cdj550.dev pj.dev pjxl.dev pjxl300.dev
  53. --- 230,238 ----
  54.   # Choose the device(s) to include.  See devs.mak for details.
  55.   
  56.   !if $(GSDLL)
  57. ! DEVICE_DEVS=mswindll.dev mswin.dev mswinprn.dev mswinpr2.dev
  58.   !else
  59. ! DEVICE_DEVS=mswin.dev mswinprn.dev mswinpr2.dev
  60.   !endif
  61.   DEVICE_DEVS3=deskjet.dev djet500.dev laserjet.dev ljetplus.dev ljet2p.dev ljet3.dev ljet4.dev
  62.   DEVICE_DEVS4=cdeskjet.dev cdjcolor.dev cdjmono.dev cdj550.dev pj.dev pjxl.dev pjxl300.dev
  63. diff -cr ./bcwin32.mak ../bcwin32.mak
  64. *** ./bcwin32.mak    Sat Mar 18 16:27:54 1995
  65. --- ../bcwin32.mak    Sat Apr 29 08:40:22 1995
  66. ***************
  67. *** 207,228 ****
  68.   
  69.   # Choose the language feature(s) to include.  See gs.mak for details.
  70.   # Since we only support running in enhanced mode, which provides
  71. ! # virtual memory, we include a fair number of drivers, but we still can't
  72. ! # exceed 64K of static data.
  73.   
  74. ! FEATURE_DEVS=level2.dev
  75.   
  76.   # Choose the device(s) to include.  See devs.mak for details.
  77.   
  78.   !if $(GSDLL)
  79. ! DEVICE_DEVS=mswindll.dev mswin.dev mswinprn.dev
  80.   !else
  81. ! DEVICE_DEVS=mswin.dev mswinprn.dev
  82.   !endif
  83.   DEVICE_DEVS3=deskjet.dev djet500.dev laserjet.dev ljetplus.dev ljet2p.dev ljet3.dev ljet4.dev
  84.   DEVICE_DEVS4=cdeskjet.dev cdjcolor.dev cdjmono.dev cdj550.dev pj.dev pjxl.dev pjxl300.dev
  85. ! DEVICE_DEVS6=epson.dev eps9high.dev ibmpro.dev st800.dev bj10e.dev bj200.dev
  86. ! DEVICE_DEVS8=bmpmono.dev bmp16.dev bmp256.dev bmp16m.dev pcxmono.dev pcx16.dev pcx256.dev
  87.   DEVICE_DEVS9=psmono.dev bit.dev bitrgb.dev bitcmyk.dev
  88.   DEVICE_DEVS10=tiffcrle.dev tiffg3.dev tiffg32d.dev tiffg4.dev tifflzw.dev tiffpack.dev
  89.   !include "gs.mak"
  90. --- 207,230 ----
  91.   
  92.   # Choose the language feature(s) to include.  See gs.mak for details.
  93.   # Since we only support running in enhanced mode, which provides
  94. ! # virtual memory, we include a fair number of drivers, 
  95.   
  96. ! FEATURE_DEVS=level2.dev pdf.dev
  97.   
  98.   # Choose the device(s) to include.  See devs.mak for details.
  99.   
  100.   !if $(GSDLL)
  101. ! DEVICE_DEVS=mswindll.dev mswin.dev mswinprn.dev mswinpr2.dev
  102.   !else
  103. ! DEVICE_DEVS=mswin.dev mswinprn.dev mswinpr2.dev
  104.   !endif
  105. + DEVICE_DEVS2=epson.dev eps9high.dev eps9mid.dev epsonc.dev ibmpro.dev
  106.   DEVICE_DEVS3=deskjet.dev djet500.dev laserjet.dev ljetplus.dev ljet2p.dev ljet3.dev ljet4.dev
  107.   DEVICE_DEVS4=cdeskjet.dev cdjcolor.dev cdjmono.dev cdj550.dev pj.dev pjxl.dev pjxl300.dev
  108. ! DEVICE_DEVS5=djet500c.dev declj250.dev lj250.dev jetp3852.dev r4081.dev lbp8.dev
  109. ! DEVICE_DEVS6=st800.dev stcolor.dev bj10e.dev bj200.dev m8510.dev necp6.dev
  110. ! DEVICE_DEVS7=t4693d2.dev t4693d4.dev t4693d8.dev tek4696.dev
  111. ! DEVICE_DEVS8=bmpmono.dev bmp16.dev bmp256.dev bmp16m.dev pcxmono.dev pcxgray.dev pcx16.dev pcx256.dev pcx24b.dev
  112.   DEVICE_DEVS9=psmono.dev bit.dev bitrgb.dev bitcmyk.dev
  113.   DEVICE_DEVS10=tiffcrle.dev tiffg3.dev tiffg32d.dev tiffg4.dev tifflzw.dev tiffpack.dev
  114.   !include "gs.mak"
  115. diff -cr ./devs.mak ../devs.mak
  116. *** ./devs.mak    Fri Mar 31 15:01:32 1995
  117. --- ../devs.mak    Sat Apr 29 08:35:48 1995
  118. ***************
  119. *** 45,51 ****
  120.   #   MS Windows:
  121.   #    mswin    Microsoft Windows 3.0, 3.1   [MS Windows only]
  122.   #    mswindll  Microsoft Windows 3.1 DLL    [MS Windows only]
  123. ! #    mswinprn  Microsoft Windows 3.0, 3.1 printer   [MS Windows only]
  124.   #   OS/2:
  125.   # *    os2pm    OS/2 Presentation Manager   [OS/2 only]
  126.   # *    os2dll    OS/2 DLL bitmap             [OS/2 only]
  127. --- 45,52 ----
  128.   #   MS Windows:
  129.   #    mswin    Microsoft Windows 3.0, 3.1   [MS Windows only]
  130.   #    mswindll  Microsoft Windows 3.1 DLL    [MS Windows only]
  131. ! #    mswinprn  Microsoft Windows 3.0, 3.1 DDB printer   [MS Windows only]
  132. ! #    mswinpr2  Microsoft Windows 3.0, 3.1 DIB printer [MS Windows only]
  133.   #   OS/2:
  134.   # *    os2pm    OS/2 Presentation Manager   [OS/2 only]
  135.   # *    os2dll    OS/2 DLL bitmap             [OS/2 only]
  136. ***************
  137. *** 399,411 ****
  138.   mswindll.dev: $(mswindll_)
  139.       $(SETDEV) mswindll $(mswindll_)
  140.   
  141. ! ### -------------------- The MS-Windows 3.n printer --------------------- ###
  142.   
  143.   mswinprn_=gdevwprn.$(OBJ) gdevmsxf.$(OBJ)
  144.   mswinprn.dev: $(mswinprn_)
  145.       $(SETDEV) mswinprn $(mswinprn_)
  146.   
  147.   gdevwprn.$(OBJ): gdevwprn.c $(gdevmswn_h) $(gp_h)
  148.   
  149.   ### ------------------ OS/2 Presentation Manager device ----------------- ###
  150.   
  151. --- 400,420 ----
  152.   mswindll.dev: $(mswindll_)
  153.       $(SETDEV) mswindll $(mswindll_)
  154.   
  155. ! ### -------------------- The MS-Windows DDB 3.n printer ----------------- ###
  156.   
  157.   mswinprn_=gdevwprn.$(OBJ) gdevmsxf.$(OBJ)
  158.   mswinprn.dev: $(mswinprn_)
  159.       $(SETDEV) mswinprn $(mswinprn_)
  160.   
  161.   gdevwprn.$(OBJ): gdevwprn.c $(gdevmswn_h) $(gp_h)
  162. + ### -------------------- The MS-Windows DIB 3.n printer ----------------- ###
  163. + mswinpr2_=gdevwpr2.$(OBJ) gdevprn.$(OBJ)
  164. + mswinpr2.dev: $(mswinpr2_)
  165. +     $(SETDEV) mswinpr2 $(mswinpr2_)
  166. + gdevwpr2.$(OBJ): gdevwpr2.c $(gdevmswn_h) $(gp_h)
  167.   
  168.   ### ------------------ OS/2 Presentation Manager device ----------------- ###
  169.   
  170. diff -cr ./gdevdjet.c ../gdevdjet.c
  171. *** ./gdevdjet.c    Thu Feb 09 14:43:42 1995
  172. --- ../gdevdjet.c    Fri Apr 28 07:32:08 1995
  173. ***************
  174. *** 285,296 ****
  175.   /* hpjet_close is only here to eject odd numbered pages in duplex mode. */
  176.   private int
  177.   hpjet_close(gx_device *pdev)
  178. ! {    if ( pdev->Duplex_set >= 0 && pdev->Duplex )
  179. !       {    gdev_prn_open_printer(pdev, 1);
  180. !         fputs("\033&l0H", ppdev->file) ;
  181. !         return gdev_prn_close_printer(pdev);
  182. !       }
  183. !     return 0;
  184.   }
  185.   
  186.   #undef ppdev
  187. --- 285,295 ----
  188.   /* hpjet_close is only here to eject odd numbered pages in duplex mode. */
  189.   private int
  190.   hpjet_close(gx_device *pdev)
  191. ! {       if ( pdev->Duplex_set >= 0 && pdev->Duplex )
  192. !           {     gdev_prn_open_printer(pdev, 1);
  193. !                 fputs("\033&l0H", ppdev->file) ;
  194. !           }
  195. !         return gdev_prn_close(pdev);
  196.   }
  197.   
  198.   #undef ppdev
  199. diff -cr ./gdevlbp8.c ../gdevlbp8.c
  200. *** ./gdevlbp8.c    Thu Apr 27 19:20:48 1995
  201. --- ../gdevlbp8.c    Thu Apr 27 19:25:44 1995
  202. ***************
  203. *** 58,65 ****
  204.     CSI, '7', ' ', 'I',    /* select unit size (300dpi)*/
  205.   };
  206.   
  207. ! static const char lbp8_end[] = {
  208. ! };
  209.   
  210.   static const char lips3_init[] = {
  211.     ESC, '<', /* soft reset */
  212. --- 58,64 ----
  213.     CSI, '7', ' ', 'I',    /* select unit size (300dpi)*/
  214.   };
  215.   
  216. ! static const char *lbp8_end = NULL;
  217.   
  218.   static const char lips3_init[] = {
  219.     ESC, '<', /* soft reset */
  220. ***************
  221. *** 137,143 ****
  222.       fprintf(prn_stream, "%c=", ESC);
  223.   
  224.       /* terminate */
  225. !     fwrite(end, end_size, 1, prn_stream);
  226.   
  227.       return 0;
  228.   }
  229. --- 136,143 ----
  230.       fprintf(prn_stream, "%c=", ESC);
  231.   
  232.       /* terminate */
  233. !     if (end != NULL)
  234. !         fwrite(end, end_size, 1, prn_stream);
  235.   
  236.       return 0;
  237.   }
  238. diff -cr ./gdevwpr2.c ../gdevwpr2.c
  239. *** ./gdevwpr2.c    Sat Apr 29 12:13:46 1995
  240. --- ../gdevwpr2.c    Sat Apr 29 09:07:00 1995
  241. ***************
  242. *** 0 ****
  243. --- 1,439 ----
  244. + /* Copyright (C) 1989, 1995 Aladdin Enterprises.  All rights reserved.
  245. +   
  246. +   This file is part of Aladdin Ghostscript.
  247. +   
  248. +   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  249. +   or distributor accepts any responsibility for the consequences of using it,
  250. +   or for whether it serves any particular purpose or works at all, unless he
  251. +   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  252. +   License (the "License") for full details.
  253. +   
  254. +   Every copy of Aladdin Ghostscript must include a copy of the License,
  255. +   normally in a plain ASCII text file named PUBLIC.  The License grants you
  256. +   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  257. +   under certain conditions described in the License.  Among other things, the
  258. +   License requires that the copyright notice and this notice be preserved on
  259. +   all copies.
  260. + */
  261. + /* gdevwpr2.c */
  262. + /*
  263. +  * Microsoft Windows 3.n printer driver for Ghostscript.
  264. +  * Original version by Russell Lang and
  265. +  * L. Peter Deutsch, Aladdin Enterprises.
  266. +  * Modified by rjl 1995-03-29 to use BMP printer code
  267. +  */
  268. + #include "gdevprn.h"
  269. + #include "gdevpccm.h"
  270. + #include "windows_.h"
  271. + #include <shellapi.h>
  272. + #include "gp_mswin.h"
  273. + #include "gp.h"
  274. + #include "commdlg.h"
  275. + /* Make sure we cast to the correct structure type. */
  276. + typedef struct gx_device_win_pr2_s gx_device_win_pr2;
  277. + #undef wdev
  278. + #define wdev ((gx_device_win_pr2 *)dev)
  279. + /* Device procedures */
  280. + /* See gxdevice.h for the definitions of the procedures. */
  281. + private dev_proc_open_device(win_pr2_open);
  282. + private dev_proc_close_device(win_pr2_close);
  283. + private dev_proc_print_page(win_pr2_print_page);
  284. + private dev_proc_map_rgb_color(win_pr2_map_rgb_color);
  285. + private dev_proc_map_color_rgb(win_pr2_map_color_rgb);
  286. + private dev_proc_put_params(win_pr2_put_params);
  287. + private void win_pr2_set_bpp(gx_device *dev, int depth);
  288. + private gx_device_procs win_pr2_procs =
  289. +   prn_color_params_procs(win_pr2_open, gdev_prn_output_page, win_pr2_close,
  290. +    win_pr2_map_rgb_color, win_pr2_map_color_rgb, 
  291. +    gdev_prn_get_params, win_pr2_put_params);
  292. + /* The device descriptor */
  293. + typedef struct gx_device_win_pr2_s gx_device_win_pr2;
  294. + struct gx_device_win_pr2_s {
  295. +     gx_device_common;
  296. +     gx_prn_device_common;
  297. +     HDC hdcprn;
  298. +     DLGPROC lpfnAbortProc;
  299. +     DLGPROC lpfnCancelProc;
  300. + };
  301. + gx_device_win_pr2 far_data gs_mswinpr2_device = {
  302. +   prn_device_std_body(gx_device_printer, win_pr2_procs, "mswinpr2",
  303. +   DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, 72, 72,
  304. +   0, 0, 0, 0,
  305. +   0, win_pr2_print_page), /* depth = 0 */
  306. +   0,    /* hdcprn */
  307. +   NULL    /* lpfnAbortProc */
  308. + };
  309. + /* Open the win_pr2 driver */
  310. + private int
  311. + win_pr2_open(gx_device *dev)
  312. + {    int code;
  313. +     int depth;
  314. +     PRINTDLG pd;
  315. +     POINT offset;
  316. +     POINT size;
  317. +     float m[4];
  318. +     FILE *pfile;
  319. +     if (hDlgModeless) {
  320. +         /* device cannot opened twice since only one hDlgModeless */
  321. +         return gs_error_limitcheck;
  322. +     }
  323. +     /* get a HDC for the printer */
  324. +     memset(&pd, 0, sizeof(PRINTDLG));
  325. +     pd.lStructSize = sizeof(PRINTDLG);
  326. +     pd.hwndOwner = hwndtext;
  327. +     pd.Flags = PD_PRINTSETUP | PD_RETURNDC;
  328. +     if (!PrintDlg(&pd)) {
  329. +         /* device not opened - exit ghostscript */
  330. +         return gs_error_limitcheck;
  331. +     }
  332. +     GlobalFree(pd.hDevMode);
  333. +     GlobalFree(pd.hDevNames);
  334. +     pd.hDevMode = pd.hDevNames = NULL;
  335. +     wdev->hdcprn = pd.hDC;
  336. +     if (!(GetDeviceCaps(wdev->hdcprn, RASTERCAPS) != RC_BITBLT)) {
  337. +         DeleteDC(wdev->hdcprn);
  338. +         return gs_error_limitcheck;
  339. +     }
  340. +     /* initialise printer, install abort proc */
  341. + #ifdef __WIN32__
  342. +     wdev->lpfnAbortProc = (DLGPROC)AbortProc;
  343. + #else
  344. + #ifdef __DLL__
  345. +     wdev->lpfnAbortProc = (DLGPROC)GetProcAddress(phInstance, "AbortProc");
  346. + #else
  347. +     wdev->lpfnAbortProc = (DLGPROC)MakeProcInstance((FARPROC)AbortProc,phInstance);
  348. + #endif
  349. + #endif
  350. +     Escape(wdev->hdcprn,SETABORTPROC,0,(LPSTR)wdev->lpfnAbortProc,NULL);  
  351. +     if (Escape(wdev->hdcprn, STARTDOC, lstrlen(szAppName), szAppName, NULL) <= 0) {
  352. +         FreeProcInstance((FARPROC)wdev->lpfnAbortProc);
  353. +         DeleteDC(wdev->hdcprn);
  354. +         return gs_error_limitcheck;
  355. +     }
  356. +     dev->x_pixels_per_inch = GetDeviceCaps(wdev->hdcprn, LOGPIXELSX);
  357. +     dev->y_pixels_per_inch = GetDeviceCaps(wdev->hdcprn, LOGPIXELSY);
  358. +     Escape(wdev->hdcprn, GETPHYSPAGESIZE, NULL, NULL, (LPPOINT)&size);
  359. +     dev->width = size.x;
  360. +     dev->height = size.y;
  361. +     Escape(wdev->hdcprn, GETPRINTINGOFFSET, NULL, NULL, (LPPOINT)&offset);
  362. +     /* m[] gives margins in inches */
  363. +     m[0] /*left*/ = offset.x / dev->x_pixels_per_inch;
  364. +     m[3] /*top*/ = offset.y / dev->y_pixels_per_inch;
  365. +     m[2] /*right*/ =
  366. +         (size.x - offset.x - GetDeviceCaps(wdev->hdcprn, HORZRES))
  367. +          / dev->x_pixels_per_inch;
  368. +     m[1] /*bottom*/ =
  369. +         (size.y - offset.y - GetDeviceCaps(wdev->hdcprn, VERTRES))
  370. +          / dev->y_pixels_per_inch
  371. +         + 0.15;  /* hack to add a bit more margin for deskjet printer */
  372. +     gx_device_set_margins(dev, m, true);
  373. +     depth = dev->color_info.depth;
  374. +     if (depth == 0) {
  375. +         /* Set parameters that were unknown before opening device */
  376. +         /* Find out if the device supports color */
  377. +         /* We recognize 1, 3, 8 and 24 bit color devices */
  378. +         depth = GetDeviceCaps(wdev->hdcprn,PLANES) * GetDeviceCaps(wdev->hdcprn,BITSPIXEL);
  379. +     }
  380. +     win_pr2_set_bpp(dev, depth);
  381. +     /* gdev_prn_open opens a temporary file which we don't want */
  382. +     /* so we specify the name now so we can delete it later */
  383. +     pfile = gp_open_scratch_file(gp_scratch_file_name_prefix, 
  384. +         wdev->fname, "wb");
  385. +     fclose(pfile);
  386. +     code = gdev_prn_open(dev);
  387. +     /* inform user of progress with dialog box and allow cancel */
  388. + #ifdef __WIN32__
  389. +     wdev->lpfnCancelProc = (DLGPROC)CancelDlgProc;
  390. + #else
  391. + #ifdef __DLL__
  392. +     wdev->lpfnCancelProc = (DLGPROC)GetProcAddress(phInstance, "CancelDlgProc");
  393. + #else
  394. +     wdev->lpfnCancelProc = (DLGPROC)MakeProcInstance((FARPROC)CancelDlgProc, phInstance);
  395. + #endif
  396. + #endif
  397. +     hDlgModeless = CreateDialog(phInstance, "CancelDlgBox", hwndtext, wdev->lpfnCancelProc);
  398. +     ShowWindow(hDlgModeless, SW_HIDE);
  399. +     return code;
  400. + };
  401. + /* Close the win_pr2 driver */
  402. + private int
  403. + win_pr2_close(gx_device *dev)
  404. + {    int code;
  405. +     int aborted = FALSE;
  406. +     /* Free resources */
  407. +     if (!hDlgModeless)
  408. +         aborted = TRUE;
  409. +     DestroyWindow(hDlgModeless);
  410. +     hDlgModeless = 0;
  411. + #ifndef __DLL__
  412. +     FreeProcInstance((FARPROC)wdev->lpfnCancelProc);
  413. + #endif
  414. +     if (aborted)
  415. +         Escape(wdev->hdcprn,ABORTDOC,0,NULL,NULL);
  416. +     else
  417. +         Escape(wdev->hdcprn,ENDDOC,0,NULL,NULL);
  418. +     FreeProcInstance((FARPROC)wdev->lpfnAbortProc);
  419. +     DeleteDC(wdev->hdcprn);
  420. +     code = gdev_prn_close(dev);
  421. +     /* delete unwanted temporary file */
  422. +     unlink(wdev->fname);
  423. +     return code;
  424. + }
  425. + /* ------ Internal routines ------ */
  426. + #undef wdev
  427. + #define wdev ((gx_device_win_pr2 *)pdev)
  428. + /************************************************/
  429. + /* ------ Private definitions ------ */
  430. + /* new win_pr2_print_page routine */
  431. + /* Write BMP header to memory, then send bitmap to printer */
  432. + /* one scan line at a time */
  433. + private int
  434. + win_pr2_print_page(gx_device_printer *pdev, FILE *file)
  435. + {    int raster = gdev_prn_raster(pdev);
  436. +     /* BMP scan lines are padded to 32 bits. */
  437. +     ulong bmp_raster = raster + (-raster & 3);
  438. +     int height = pdev->height;
  439. +     int depth = pdev->color_info.depth;
  440. +     byte *row = (byte *)gs_malloc(bmp_raster, 1, "bmp file buffer");
  441. +     int y;
  442. +     int code = 0;            /* return code */
  443. +     MSG msg;
  444. +     char dlgtext[32];
  445. +     struct bmi_s {
  446. +         BITMAPINFOHEADER h;
  447. +         RGBQUAD pal[256];
  448. +     } bmi;
  449. +     if ( row == 0 )            /* can't allocate row buffer */
  450. +         return_error(gs_error_VMerror);
  451. +     /* Write the info header. */
  452. +     bmi.h.biSize = sizeof(bmi.h);
  453. +     bmi.h.biWidth = pdev->width;  /* wdev->mdev.width; */
  454. +     bmi.h.biHeight = height;
  455. +     bmi.h.biPlanes = 1;
  456. +     bmi.h.biBitCount = pdev->color_info.depth;
  457. +     bmi.h.biCompression = 0;
  458. +     bmi.h.biSizeImage = 0;            /* default */
  459. +     bmi.h.biXPelsPerMeter = 0;        /* default */
  460. +     bmi.h.biYPelsPerMeter = 0;        /* default */
  461. +     /* Write the palette. */
  462. +     if ( depth <= 8 )
  463. +     {    int i;
  464. +         gx_color_value rgb[3];
  465. +         LPRGBQUAD pq;
  466. +         bmi.h.biClrUsed = 1 << depth;
  467. +         bmi.h.biClrImportant = 1 << depth;
  468. +         for ( i = 0; i != 1 << depth; i++ )
  469. +         {    (*dev_proc(pdev, map_color_rgb))((gx_device *)pdev,
  470. +                 (gx_color_index)i, rgb);
  471. +             pq = &bmi.pal[i];
  472. +             pq->rgbRed   = gx_color_value_to_byte(rgb[0]);
  473. +             pq->rgbGreen = gx_color_value_to_byte(rgb[1]);
  474. +             pq->rgbBlue  = gx_color_value_to_byte(rgb[2]);
  475. +             pq->rgbReserved = 0;
  476. +         }
  477. +     }
  478. +     else {
  479. +         bmi.h.biClrUsed = 0;
  480. +         bmi.h.biClrImportant = 0;
  481. +     }
  482. +     sprintf(dlgtext, "Printing page %d", (int)(pdev->PageCount)+1);
  483. +     SetWindowText(GetDlgItem(hDlgModeless, CANCEL_PRINTING), dlgtext);
  484. +     ShowWindow(hDlgModeless, SW_SHOW);
  485. +     /* write the bits */
  486. +     for ( y = 0; y < height; y++) {
  487. +         gdev_prn_copy_scan_lines(pdev, y, row, raster);
  488. +         /* write top first, since most printers output this way, and */
  489. +             /* so less buffering is required by printer and printer driver */
  490. +         SetDIBitsToDevice(wdev->hdcprn, 0, y, pdev->width, 1,
  491. +         0, 0, 0, 1,
  492. +         row,
  493. +         (BITMAPINFO FAR *)&bmi, DIB_RGB_COLORS);
  494. +         if ((y & 15) == 0) {
  495. +             /* inform user of progress */
  496. +         sprintf(dlgtext, "%d%% done", (int)(y * 100L / height));
  497. +         SetWindowText(GetDlgItem(hDlgModeless, CANCEL_PCDONE), dlgtext);
  498. +         /* process message loop */
  499. +         while (PeekMessage(&msg, hDlgModeless, 0, 0, PM_REMOVE)) {
  500. +             if ((hDlgModeless == 0) || !IsDialogMessage(hDlgModeless, &msg)) {
  501. +             TranslateMessage(&msg);
  502. +             DispatchMessage(&msg);
  503. +             }
  504. +         }
  505. +         }
  506. +         if (hDlgModeless == 0) {
  507. +             /* user pressed cancel button */
  508. +         break;
  509. +         }
  510. +     }
  511. +     if (hDlgModeless == 0)
  512. +         code = gs_error_unknownerror;
  513. +     else {
  514. +         /* push out the page */
  515. +         SetWindowText(GetDlgItem(hDlgModeless, CANCEL_PCDONE), "Ejecting page...");
  516. +         Escape(wdev->hdcprn,NEWFRAME,0,NULL,NULL);
  517. +         ShowWindow(hDlgModeless, SW_HIDE);
  518. +     }
  519. + bmp_done:
  520. +     gs_free((char *)row, bmp_raster, 1, "bmp file buffer");
  521. +     return code;
  522. + }
  523. + /* combined color mappers */
  524. + /* 24-bit color mappers (taken from gdevmem2.c). */
  525. + /* Note that Windows expects RGB values in the order B,G,R. */
  526. + /* Map a r-g-b color to a color index. */
  527. + private gx_color_index
  528. + win_pr2_map_rgb_color(gx_device *dev, gx_color_value r, gx_color_value g,
  529. +   gx_color_value b)
  530. + {
  531. +     switch(dev->color_info.depth) {
  532. +       case 1:
  533. +     return gdev_prn_map_rgb_color(dev, r, g, b);
  534. +       case 4:
  535. +     /* use only 8 colors */
  536. +     return  (r > (gx_max_color_value / 2 + 1) ? 4 : 0) +
  537. +              (g > (gx_max_color_value / 2 + 1) ? 2 : 0) +
  538. +              (b > (gx_max_color_value / 2 + 1) ? 1 : 0) ;
  539. +       case 8:
  540. +     return pc_8bit_map_rgb_color(dev, r, g, b);
  541. +       case 24:
  542. +     return gx_color_value_to_byte(r) +
  543. +            ((uint)gx_color_value_to_byte(g) << 8) +
  544. +            ((ulong)gx_color_value_to_byte(b) << 16);
  545. +     }
  546. +     return 0; /* error */
  547. + }
  548. + /* Map a color index to a r-g-b color. */
  549. + private int
  550. + win_pr2_map_color_rgb(gx_device *dev, gx_color_index color,
  551. +   gx_color_value prgb[3])
  552. + {
  553. +     switch(dev->color_info.depth) {
  554. +       case 1:
  555. +     gdev_prn_map_color_rgb(dev, color, prgb);
  556. +     break;
  557. +       case 4:
  558. +     /* use only 8 colors */
  559. +     prgb[0] = (color & 4) ? gx_max_color_value : 0;
  560. +     prgb[1] = (color & 2) ? gx_max_color_value : 0;
  561. +     prgb[2] = (color & 1) ? gx_max_color_value : 0;
  562. +     break;
  563. +       case 8:
  564. +     pc_8bit_map_color_rgb(dev, color, prgb);
  565. +     break;
  566. +       case 24:
  567. +     prgb[2] = gx_color_value_from_byte(color >> 16);
  568. +     prgb[1] = gx_color_value_from_byte((color >> 8) & 0xff);
  569. +     prgb[0] = gx_color_value_from_byte(color & 0xff);
  570. +     break;
  571. +     }
  572. +     return 0;
  573. + }
  574. + void
  575. + win_pr2_set_bpp(gx_device *dev, int depth)
  576. + {
  577. +     if (depth > 8) {
  578. +         static const gx_device_color_info win_pr2_24color = dci_std_color(24);
  579. +         dev->color_info = win_pr2_24color;
  580. +     }
  581. +     else if ( depth >= 8 ) {
  582. +         /* 8-bit (SuperVGA-style) color. */
  583. +         /* (Uses a fixed palette of 3,3,2 bits.) */
  584. +         static const gx_device_color_info win_pr2_8color = dci_pc_8bit;
  585. +         dev->color_info = win_pr2_8color;
  586. +     }
  587. +     else if ( depth >= 3) {
  588. +         /* 3 plane printer */
  589. +         /* suitable for impact dot matrix CMYK printers */
  590. +         /* create 4-bit bitmap, but only use 8 colors */
  591. +         static const gx_device_color_info win_pr2_4color = {3, 4, 1, 1, 2, 2};
  592. +         dev->color_info = win_pr2_4color;
  593. +     }
  594. +     else {   /* default is black_and_white */
  595. +         static const gx_device_color_info win_pr2_1color = dci_std_color(1);
  596. +         dev->color_info = win_pr2_1color;
  597. +     }
  598. + }
  599. + /* We implement this ourselves so that we can change BitsPerPixel */
  600. + /* before the device is opened */
  601. + int
  602. + win_pr2_put_params(gx_device *dev, gs_param_list *plist)
  603. + {    int ecode = 0, code;
  604. +     int old_bpp = dev->color_info.depth;
  605. +     int bpp = old_bpp;
  606. +     switch ( code = param_read_int(plist, "BitsPerPixel", &bpp) )
  607. +     {
  608. +     case 0:
  609. +         if ( dev->is_open )
  610. +           ecode = gs_error_rangecheck;
  611. +         else
  612. +           {    /* change dev->color_info is valid before device is opened */
  613. +             win_pr2_set_bpp(dev, bpp);
  614. +             break;
  615. +           }
  616. +         goto bppe;
  617. +     default:
  618. +         ecode = code;
  619. + bppe:        param_signal_error(plist, "BitsPerPixel", ecode);
  620. +     case 1:
  621. +         break;
  622. +     }
  623. +     if ( ecode >= 0 )
  624. +         ecode = gdev_prn_put_params(dev, plist);
  625. +     return ecode;
  626. + }
  627. diff -cr ./gp_mswin.c ../gp_mswin.c
  628. *** ./gp_mswin.c    Sat Feb 04 20:30:28 1995
  629. --- ../gp_mswin.c    Wed Mar 29 07:48:28 1995
  630. ***************
  631. *** 348,375 ****
  632.       unlink(win_prntmp);
  633.   }
  634.   
  635. ! #ifndef __WIN32__
  636. ! /* Windows does not provide API's in the SDK for writing directly to a */
  637. ! /* printer.  Instead you are supposed to use the Windows printer drivers. */
  638. ! /* Ghostscript has its own printer drivers, so we need to use some API's */
  639. ! /* that are documented only in the Device Driver Adaptation Guide */
  640. ! /* that comes with the DDK.  Prototypes taken from DDK <print.h> */
  641. ! DECLARE_HANDLE(HPJOB);
  642. ! HPJOB    WINAPI OpenJob(LPSTR, LPSTR, HPJOB);
  643. ! int    WINAPI StartSpoolPage(HPJOB);
  644. ! int    WINAPI EndSpoolPage(HPJOB);
  645. ! int    WINAPI WriteSpool(HPJOB, LPSTR, int);
  646. ! int    WINAPI CloseJob(HPJOB);
  647. ! int    WINAPI DeleteJob(HPJOB, int);
  648. ! int    WINAPI WriteDialog(HPJOB, LPSTR, int);
  649. ! int    WINAPI DeleteSpoolPage(HPJOB);
  650. ! #endif        /* WIN32 */
  651.   
  652.   HWND hDlgModeless;
  653.   
  654.   /* Modeless dialog box - Cancel printing */
  655.   BOOL CALLBACK _export
  656.   CancelDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  657. --- 348,371 ----
  658.       unlink(win_prntmp);
  659.   }
  660.   
  661. ! /* Printer abort procedure and progress/cancel dialog box */
  662. ! /* Used by Win32 and mswinprn device */
  663.   
  664.   HWND hDlgModeless;
  665.   
  666. + BOOL CALLBACK _export
  667. + PrintAbortProc(HDC hdcPrn, int code)
  668. + {
  669. +     MSG msg;
  670. +     while (hDlgModeless && PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
  671. +     if (hDlgModeless || !IsDialogMessage(hDlgModeless,&msg)) {
  672. +             TranslateMessage(&msg);
  673. +             DispatchMessage(&msg);
  674. +     }
  675. +     }
  676. +     return(hDlgModeless!=0);
  677. + }
  678.   /* Modeless dialog box - Cancel printing */
  679.   BOOL CALLBACK _export
  680.   CancelDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  681. ***************
  682. *** 390,395 ****
  683. --- 386,411 ----
  684.       return FALSE;
  685.   }
  686.   
  687. + #ifndef __WIN32__
  688. + /* Windows does not provide API's in the SDK for writing directly to a */
  689. + /* printer.  Instead you are supposed to use the Windows printer drivers. */
  690. + /* Ghostscript has its own printer drivers, so we need to use some API's */
  691. + /* that are documented only in the Device Driver Adaptation Guide */
  692. + /* that comes with the DDK.  Prototypes taken from DDK <print.h> */
  693. + DECLARE_HANDLE(HPJOB);
  694. + HPJOB    WINAPI OpenJob(LPSTR, LPSTR, HPJOB);
  695. + int    WINAPI StartSpoolPage(HPJOB);
  696. + int    WINAPI EndSpoolPage(HPJOB);
  697. + int    WINAPI WriteSpool(HPJOB, LPSTR, int);
  698. + int    WINAPI CloseJob(HPJOB);
  699. + int    WINAPI DeleteJob(HPJOB, int);
  700. + int    WINAPI WriteDialog(HPJOB, LPSTR, int);
  701. + int    WINAPI DeleteSpoolPage(HPJOB);
  702. + #endif        /* WIN32 */
  703.   /* Dialog box to select printer port */
  704.   BOOL CALLBACK _export
  705.   SpoolDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  706. ***************
  707. *** 431,448 ****
  708.   
  709.   /* Win32s can't get access to OpenJob etc., so we try to sneak the */
  710.   /* data through the Windows printer driver unchanged */
  711. - BOOL CALLBACK _export
  712. - PrintAbortProc(HDC hdcPrn, int code)
  713. - {
  714. -     MSG msg;
  715. -     while (hDlgModeless && PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
  716. -     if (hDlgModeless || !IsDialogMessage(hDlgModeless,&msg)) {
  717. -             TranslateMessage(&msg);
  718. -             DispatchMessage(&msg);
  719. -     }
  720. -     }
  721. -     return(hDlgModeless!=0);
  722. - }
  723.   
  724.   /* Print File */
  725.   private int
  726. --- 447,452 ----
  727. ***************
  728. *** 541,549 ****
  729. --- 545,559 ----
  730.       if ( (strlen(pmport)==0) || (strcmp(pmport, "PRN")==0) ) {
  731.           GetProfileString("ports", NULL, "", buffer, PRINT_BUF_SIZE);
  732.           /* select a port */
  733. + #ifdef __DLL__
  734. +         lpfnSpoolProc = (DLGPROC)GetProcAddress(phInstance, "SpoolDlgProc");
  735. + #else
  736.           lpfnSpoolProc = (DLGPROC)MakeProcInstance((FARPROC)SpoolDlgProc, phInstance);
  737. + #endif
  738.           port = DialogBoxParam(phInstance, "SpoolDlgBox", hwndtext, lpfnSpoolProc, (LPARAM)buffer);
  739. + #ifndef __DLL__
  740.           FreeProcInstance((FARPROC)lpfnSpoolProc);
  741. + #endif
  742.           if (!port) {
  743.               free(buffer);
  744.               return FALSE;
  745. ***************
  746. *** 579,585 ****
  747. --- 589,599 ----
  748.       if (StartSpoolPage(hJob) < 0)
  749.           error = TRUE;
  750.   
  751. + #ifdef __DLL__
  752. +     lpfnCancelProc = (DLGPROC)GetProcAddress(phInstance, "CancelDlgProc");
  753. + #else
  754.       lpfnCancelProc = (DLGPROC)MakeProcInstance((FARPROC)CancelDlgProc, phInstance);
  755. + #endif
  756.       hDlgModeless = CreateDialog(phInstance, "CancelDlgBox", hwndtext, lpfnCancelProc);
  757.       ldone = 0;
  758.   
  759. ***************
  760. *** 604,610 ****
  761. --- 618,626 ----
  762.           error=TRUE;
  763.       DestroyWindow(hDlgModeless);
  764.       hDlgModeless = 0;
  765. + #ifndef __DLL__
  766.       FreeProcInstance((FARPROC)lpfnCancelProc);
  767. + #endif
  768.       EndSpoolPage(hJob);
  769.       if (error)
  770.           DeleteJob(hJob, 0);
  771. diff -cr ./gp_mswin.h ../gp_mswin.h
  772. *** ./gp_mswin.h    Wed Nov 02 14:00:08 1994
  773. --- ../gp_mswin.h    Mon Mar 27 21:59:56 1995
  774. ***************
  775. *** 24,29 ****
  776. --- 24,30 ----
  777.   #define IMAGE_ICON    51
  778.   #define SPOOL_PORT    100
  779.   #define CANCEL_PCDONE    101
  780. + #define CANCEL_PRINTING    102
  781.   
  782.   #ifndef RC_INVOKED        /* NOTA BENE */
  783.   
  784. ***************
  785. *** 40,51 ****
  786. --- 41,54 ----
  787.   #endif
  788.   
  789.   extern HWND hwndtext;
  790. + extern HWND hDlgModeless;
  791.   extern HINSTANCE phInstance;
  792.   extern const LPSTR szAppName;
  793.   extern const LPSTR szImgName;
  794.   extern BOOL is_win31;
  795.   extern BOOL is_winnt;
  796.   extern BOOL CALLBACK _export AbortProc(HDC, int);
  797. + extern BOOL CALLBACK _export CancelDlgProc(HWND, UINT, WPARAM, LPARAM);
  798.   /* imitation pipes */
  799.   extern HGLOBAL pipe_hglobal;
  800.   extern LPBYTE pipe_lpbyte;
  801. diff -cr ./gswin.rc ../gswin.rc
  802. *** ./gswin.rc    Wed Jul 27 15:40:24 1994
  803. --- ../gswin.rc    Mon Mar 27 21:48:04 1995
  804. ***************
  805. *** 16,22 ****
  806.   CancelDlgBox DIALOG 32, 40, 120, 48
  807.   STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
  808.   BEGIN
  809. !     CTEXT "Printing", -1, 8, 4, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  810.       CTEXT "", CANCEL_PCDONE, 8, 16, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  811.       CONTROL "&Cancel", IDCANCEL, "button", BS_PUSHBUTTON | WS_GROUP | WS_TABSTOP | WS_CHILD, 44, 30, 32, 14
  812.   END
  813. --- 16,22 ----
  814.   CancelDlgBox DIALOG 32, 40, 120, 48
  815.   STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
  816.   BEGIN
  817. !     CTEXT "Printing", CANCEL_PRINTING, 8, 4, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  818.       CTEXT "", CANCEL_PCDONE, 8, 16, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  819.       CONTROL "&Cancel", IDCANCEL, "button", BS_PUSHBUTTON | WS_GROUP | WS_TABSTOP | WS_CHILD, 44, 30, 32, 14
  820.   END
  821. diff -cr ./gswin32.rc ../gswin32.rc
  822. *** ./gswin32.rc    Wed Jul 27 15:40:24 1994
  823. --- ../gswin32.rc    Mon Mar 27 21:48:04 1995
  824. ***************
  825. *** 16,22 ****
  826.   CancelDlgBox DIALOG 32, 40, 120, 48
  827.   STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
  828.   BEGIN
  829. !     CTEXT "Printing", -1, 8, 4, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  830.       CTEXT "", CANCEL_PCDONE, 8, 16, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  831.       CONTROL "&Cancel", IDCANCEL, "button", BS_PUSHBUTTON | WS_GROUP | WS_TABSTOP | WS_CHILD, 44, 30, 32, 14
  832.   END
  833. --- 16,22 ----
  834.   CancelDlgBox DIALOG 32, 40, 120, 48
  835.   STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
  836.   BEGIN
  837. !     CTEXT "Printing", CANCEL_PRINTING, 8, 4, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  838.       CTEXT "", CANCEL_PCDONE, 8, 16, 104, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
  839.       CONTROL "&Cancel", IDCANCEL, "button", BS_PUSHBUTTON | WS_GROUP | WS_TABSTOP | WS_CHILD, 44, 30, 32, 14
  840.   END
  841. diff -cr ./os2.mak ../os2.mak
  842. *** ./os2.mak    Sat Mar 18 16:29:40 1995
  843. --- ../os2.mak    Sat Apr 29 12:17:30 1995
  844. ***************
  845. *** 280,286 ****
  846.   CDLL=
  847.   !endif
  848.   
  849. ! GENOPT=$(CP) $(CD) $(CGDB) $(CDLL)
  850.   
  851.   CCFLAGS0=$(GENOPT) $(PLATOPT)
  852.   CCFLAGS=$(CCFLAGS0) 
  853. --- 280,286 ----
  854.   CDLL=
  855.   !endif
  856.   
  857. ! GENOPT=$(CP) $(CD) $(CGDB) $(CDLL) $(CO)
  858.   
  859.   CCFLAGS0=$(GENOPT) $(PLATOPT)
  860.   CCFLAGS=$(CCFLAGS0) 
  861. ***************
  862. *** 299,305 ****
  863.   # Choose the language feature(s) to include.  See gs.mak for details.
  864.   # Since we have a large address space, we include some optional features.
  865.   
  866. ! FEATURE_DEVS=level2.dev dps.dev
  867.   
  868.   # Choose the device(s) to include.  See devs.mak for details.
  869.   
  870. --- 299,305 ----
  871.   # Choose the language feature(s) to include.  See gs.mak for details.
  872.   # Since we have a large address space, we include some optional features.
  873.   
  874. ! FEATURE_DEVS=level2.dev dps.dev pdf.dev
  875.   
  876.   # Choose the device(s) to include.  See devs.mak for details.
  877.   
  878. ***************
  879. *** 308,317 ****
  880.   !else
  881.   DEVICE_DEVS=os2pm.dev
  882.   !endif
  883.   DEVICE_DEVS3=deskjet.dev djet500.dev laserjet.dev ljetplus.dev ljet2p.dev ljet3.dev ljet4.dev
  884.   DEVICE_DEVS4=cdeskjet.dev cdjcolor.dev cdjmono.dev cdj550.dev pj.dev pjxl.dev pjxl300.dev
  885.   DEVICE_DEVS5=djet500c.dev declj250.dev lj250.dev jetp3852.dev r4081.dev t4693d2.dev t4693d4.dev t4693d8.dev tek4696.dev lbp8.dev
  886. ! DEVICE_DEVS6=epson.dev eps9high.dev eps9mid.dev epsonc.dev ibmpro.dev st800.dev bj10e.dev bj200.dev m8510.dev necp6.dev
  887.   DEVICE_DEVS7=dfaxhigh.dev dfaxlow.dev
  888.   DEVICE_DEVS8=bmpmono.dev bmp16.dev bmp256.dev bmp16m.dev pcxmono.dev pcxgray.dev pcx16.dev pcx256.dev pcx24b.dev
  889.   DEVICE_DEVS9=psmono.dev bit.dev bitrgb.dev bitcmyk.dev
  890. --- 308,318 ----
  891.   !else
  892.   DEVICE_DEVS=os2pm.dev
  893.   !endif
  894. + DEVICE_DEVS2=epson.dev eps9high.dev eps9mid.dev epsonc.dev ibmpro.dev
  895.   DEVICE_DEVS3=deskjet.dev djet500.dev laserjet.dev ljetplus.dev ljet2p.dev ljet3.dev ljet4.dev
  896.   DEVICE_DEVS4=cdeskjet.dev cdjcolor.dev cdjmono.dev cdj550.dev pj.dev pjxl.dev pjxl300.dev
  897.   DEVICE_DEVS5=djet500c.dev declj250.dev lj250.dev jetp3852.dev r4081.dev t4693d2.dev t4693d4.dev t4693d8.dev tek4696.dev lbp8.dev
  898. ! DEVICE_DEVS6=st800.dev stcolor.dev bj10e.dev bj200.dev m8510.dev necp6.dev
  899.   DEVICE_DEVS7=dfaxhigh.dev dfaxlow.dev
  900.   DEVICE_DEVS8=bmpmono.dev bmp16.dev bmp256.dev bmp16m.dev pcxmono.dev pcxgray.dev pcx16.dev pcx256.dev pcx24b.dev
  901.   DEVICE_DEVS9=psmono.dev bit.dev bitrgb.dev bitcmyk.dev
  902. ***************
  903. *** 388,399 ****
  904.   # PM driver program
  905.   
  906.   gspmdrv.o: gspmdrv.c gspmdrv.h
  907. !     $(COMPDIR)\gcc $(CGDB) -c $*.c
  908.   
  909.   gspmdrv.res: gspmdrv.rc gspmdrv.h gspmdrv.ico
  910.       rc -i $(COMPBASE)\include -r $*.rc
  911.   
  912.   gspmdrv.exe: gspmdrv.o gspmdrv.res gspmdrv.def
  913. !     $(COMPDIR)\gcc $(CGDB) -o $* $*.o
  914.       $(COMPDIR)\emxbind -p -r$*.res -d$*.def $(COMPDIR)\emxl.exe $* $*.exe
  915.       del $*
  916. --- 389,400 ----
  917.   # PM driver program
  918.   
  919.   gspmdrv.o: gspmdrv.c gspmdrv.h
  920. !     $(COMPDIR)\gcc $(CGDB) $(CO) -c $*.c
  921.   
  922.   gspmdrv.res: gspmdrv.rc gspmdrv.h gspmdrv.ico
  923.       rc -i $(COMPBASE)\include -r $*.rc
  924.   
  925.   gspmdrv.exe: gspmdrv.o gspmdrv.res gspmdrv.def
  926. !     $(COMPDIR)\gcc $(CGDB) $(CO) -o $* $*.o
  927.       $(COMPDIR)\emxbind -p -r$*.res -d$*.def $(COMPDIR)\emxl.exe $* $*.exe
  928.       del $*
  929.