*** /dev/null Sun Aug 18 13:11:02 1996 --- gdevep82/gdevep82.c Sun Aug 18 18:24:05 1996 *************** *** 0 **** --- 1,266 ---- + /* Copyright (C) 1991 Aladdin Enterprises. All rights reserved. + Distributed by Free Software Foundation, Inc. + + This file is part of Ghostscript. + + Ghostscript is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY. No author or distributor accepts responsibility + to anyone for the consequences of using it or for whether it serves any + particular purpose or works at all, unless he says so in writing. Refer + to the Ghostscript General Public License for full details. + + Everyone is granted permission to copy, modify and redistribute + Ghostscript, but only under the conditions described in the Ghostscript + General Public License. A copy of this license is supposed to have been + given to you along with Ghostscript so you can know your rights and + responsibilities. It should be in a file named COPYING. Among other + things, the copyright notice and this notice must be preserved on all + copies. */ + + /* gdevepag.c */ + /* ESC/Page driver for Ghostscript */ + #include "gdevprn.h" + + #define EPAG300 1 + #define EPAG600 2 + + /* cut from gdevpcl.h gdevmjc.c */ + #define PAPER_SIZE_LETTER 2 + #define PAPER_SIZE_LEGAL 3 + #define PAPER_SIZE_A4 26 + #define PAPER_SIZE_A3 27 + #define PAPER_SIZE_A3_NOBI 28 + #define PAPER_SIZE_A2 29 + #define PAPER_SIZE_B4 30 + #define PAPER_SIZE_B5 31 + + #define LINE_SIZE ((7016+7) / 8) /* bytes per line */ + + /* The device descriptors */ + private dev_proc_print_page(epag300_print_page); + private dev_proc_print_page(epag600_print_page); + + gx_device_printer gs_epag300_device = + prn_device(prn_std_procs, "epag300", + 83, /* width_10ths, 8.3" */ + 117, /* height_10ths, 11.7" */ + 300, 300, + 0.0, 0.0, 0.0, 0.0, /* margins, lbrt */ + 1, epag300_print_page); + + gx_device_printer gs_epag600_device = + prn_device(prn_std_procs, "epag600", + 83, /* width_10ths, 8.3" */ + 117, /* height_10ths, 11.7" */ + 600, 600, + 0.0, 0.0, 0.0, 0.0, /* margins, lbrt */ + 1, epag600_print_page); + + /* ------ Internal routines ------ */ + + #define ESC 0x1b + #define GS 0x1d + #define FS 0x1c + #define CSI 0233 + + static char can_inits300[] ={ + GS, 'r', 'h', 'E', /* hard reset */ + GS, '0', ';', '0', '.', '2', '4', 'm', 'u', 'E', /* 最小単位設定 1/600' */ + GS, '0', 'p', 'o', 'E', /* landscape */ + GS, '1', 'm', 'm', 'E', /* ページメモリモード */ + GS, '0', ';', '3', '0', '0', ';', '3', '0', '0', 'd', 'r', 'E', /*ドットパターン解像度 */ + GS, '3', 'b', 'c', 'I', /* 圧縮形式 */ + GS, '0', ';', '0', 'l', 'o', 'E' /* 論理原点設定 */ + }; + + static char can_inits600[] ={ + GS, 'r', 'h', 'E', /* hard reset */ + GS, '0', ';', '0', '.', '1', '2', 'm', 'u', 'E', /* 最小単位設定 1/600' */ + GS, '0', 'p', 'o', 'E', /* landscape */ + GS, '1', 'm', 'm', 'E', /* ページメモリモード */ + GS, '0', ';', '6', '0', '0', ';', '6', '0', '0', 'd', 'r', 'E', /*ドットパターン解像度 */ + GS, '3', 'b', 'c', 'I', /* 圧縮形式 */ + GS, '0', ';', '0', 'l', 'o', 'E' /* 論理原点設定 */ + }; + + + private int + gdev_epag_paper_size(gx_device_printer *dev) + { return + (dev->height / dev->y_pixels_per_inch >= 22.2 ? PAPER_SIZE_A2 : + dev->height / dev->y_pixels_per_inch >= 18.0 ? PAPER_SIZE_A3_NOBI : + dev->height / dev->y_pixels_per_inch >= 16.0 ? PAPER_SIZE_A3 : + dev->height / dev->y_pixels_per_inch >= 13.6 ? PAPER_SIZE_B4 : + dev->height / dev->y_pixels_per_inch >= 11.8 ? PAPER_SIZE_LEGAL : + dev->height / dev->y_pixels_per_inch >= 11.1 ? PAPER_SIZE_A4 : + dev->height / dev->y_pixels_per_inch >= 10.4 ? PAPER_SIZE_LETTER : + PAPER_SIZE_LETTER); + } + + /* Send the page to the printer. */ + private int + epag_print_page(gx_device_printer *pdev, FILE *prn_stream, int ptype) + { + char data[LINE_SIZE*2]; + char buf[LINE_SIZE*2]; + char *out_data; + int out_count; + int c_size; + int paper_size; + char *ps, *pse; + + #define GS_print(str) fprintf(prn_stream, str, GS) + #define GS_print_1(str,arg) fprintf(prn_stream, str, GS, arg) + + /* initialize */ + paper_size=gdev_epag_paper_size(pdev); + switch(paper_size){ + case PAPER_SIZE_LETTER: + ps="";pse="14psE";break; + case PAPER_SIZE_LEGAL: + ps="";pse="14psE";break; + case PAPER_SIZE_A4: + ps="A4";pse="14psE";break; + case PAPER_SIZE_A3: + ps="A3";pse="13psE";break; + case PAPER_SIZE_A3_NOBI: + ps="A3";pse="13psE";break; + case PAPER_SIZE_A2: + ps="A2";pse="12psE";break; + case PAPER_SIZE_B4: + ps="B4";pse="24psE";break; + case PAPER_SIZE_B5: + ps="B5";pse="25psE";break; + } + sprintf(buf, "%cS%c%cS%c", ESC, ESC, ESC, FS); /* ESC/PS -> ESC/P */ + sprintf(buf, "%cz%c%c", ESC, NULL, NULL); /* ESC/P -> ESC/Page */ + sprintf(buf,"\033\001@EJL \012@EJL SE LA=ESC/PAGE\012@EJL SET EC=ON RS=%s PU=%s PS=%s ZO=OFF FO=OFF\012@EJL EN LA=ESC/PAGE\012", + (ptype==EPAG300)?"QK":"FN", + "AU", /* "AU"..auto "2"..tray(maybe) "1"..casette1*/ + ps + ); + fwrite(buf, strlen(buf), 1, prn_stream); + switch(ptype) { + case EPAG300: + fwrite(can_inits300, sizeof(can_inits300), 1, prn_stream); + break; + case EPAG600: + fwrite(can_inits600, sizeof(can_inits300), 1, prn_stream); + break; + } + buf[0]=GS; + strcpy(buf+1,pse); + fwrite(buf, strlen(buf), 1, prn_stream); + + /* Send each scan line in turn */ + { int lnum; + int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev); + byte rmask = (byte)(0xff << (-pdev->width & 7)); + + for ( lnum = 0; lnum < pdev->height; lnum++ ) + { char *end_data = data + line_size; + int s; + + s = gdev_prn_copy_scan_lines(pdev, lnum, + (byte *)data, line_size); + /* Mask off 1-bits beyond the line width. */ + end_data[-1] &= rmask; + /* Remove trailing 0s. */ + while ( end_data > data && end_data[-1] == 0 ) + end_data--; + if ( end_data != data ) { + int num_cols = 0; + + out_data = data; + while(out_data < end_data && *out_data == 0) { + num_cols += 8; + out_data++; + } + out_count = end_data - out_data; + + /* move down */ + GS_print_1("%c%dY", lnum); + /* move across */ + GS_print_1("%c%dX", num_cols); + + /* 圧縮 */ + + c_size = data_compress_82(out_data, end_data, buf); + + /* transfer raster graphics */ + fprintf(prn_stream, "%c%d;%d;1;0bi{I", + GS, c_size, out_count * 8 ); + + /* send the row */ + fwrite(buf, sizeof(char), c_size, prn_stream); + } + } + } + /* eject page */ + fprintf(prn_stream, "\014"); + fprintf(prn_stream, "%c1;0pmE", GS); /* ESC/Page -> ESC/P */ + fprintf(prn_stream, "%cS%c%cSK", ESC, ESC, ESC); /* ESC/P -> ESC/PS */ + return 0; + } + + private int + epag300_print_page(gx_device_printer *pdev, FILE *prn_stream) + { + return epag_print_page(pdev, prn_stream, EPAG300); + } + + private int + epag600_print_page(gx_device_printer *pdev, FILE *prn_stream) + { + return epag_print_page(pdev, prn_stream, EPAG600); + } + + + + /*@fn data_compress_82(out_data, end_data, buf) + *@f1 データを圧縮しbufに書き込む + *@fr 圧縮後のバイト数を返す + */ + data_compress_82(out_data, end_data, buf) + char *out_data; /* 元データの先頭番地 */ + char *end_data; /* 元データの最後+1 */ + char *buf; /* 圧縮後のデータを書き込む場所 */ + { + char *p; /* 読み出しポインタ */ + char *q; /* 書き込みポインタ */ + int pdata; /* 最後に書き込んだデータ */ + int cdata; /* 着目データ */ + int count; /* データリピート数 −1 */ + + p = out_data; + q = buf; + pdata = 9999; /* 決して一致しない前データ */ + count = 0; + + while(p < end_data){ + cdata = *p++; + if(cdata == pdata){ /* 圧縮中 */ + count++; + if(count == 256){ /* データ溢れ、 フラッシュ */ + *q++ = pdata; + *q++ = count - 1; + count = 0; + pdata = 9999; /* 決して一致しない前データ */ + } + } + else{ /* 前のデータと違う */ + if(count > 0){ /* フラッシュ */ + *q++ = pdata; + *q++ = count-1; + count = 0; + } + *q++ = pdata = cdata; + } + } + if(count >0){ /* 圧縮途中のデータが残っていれば */ + *q++ = pdata; /* フラッシュ */ + *q++ = count - 1; + } + return(q-buf); + } + *** /dev/null Sun Aug 18 13:11:02 1996 --- gdevep82/gdevep82.jis Sun Aug 18 18:07:08 1996 *************** *** 0 **** --- 1,40 ---- + + gdevep82.c - Epson LP-1700, LP-8200 (ESC/PS 300,600dpi)用デバイスドライバ + + ○インストール方法 + + 1. gdevep60.c を gs261 のソースプログラムがあるディレクトリにコピーし + て下さい。 + + 2. Makefile に gdevep60.mak を追加して下さい。 + + 3. Makefile の DEVICE_DEVS に epag300.dev(300dpi) epag600.dpi(600dpi) + を加えて下さい。 + + 例) DEVICE_DEVS=x11.dev epag300.dev epag600.dev + ^^^^^^^^^^^^^^^^^^^^^^^ + 4. make コマンドで gs をコンパイルし、インストールして下さい。 + + + ○使い方 + + *デバイスの選択は -sDEVICE オプションによって行ないます。 + + 例) 300dpiの場合、 gs -sDEVICE=epag300 + 600dpiの場合 gs -sDEVICE=epag600 + + *ポストスクリプトコード中にページ選択機能が入っている場合は自動的に、 + 無い場合はこのようにして用紙サイズを決定できます。 + + 例) A3,300dpiの場合、 gs -sDEVICE=epag300 -SPAPERSIZE=a3 + B4,600dpiの場合、 gs -sDEVICE=epag600 -SPAPERSIZE=B4 + + 三田吉郎 (mita@hoh.t.u-tokyo.ac.jp) + + ○ このESC/PSドライバーは Tom Quinn氏(trq@prg.oxford.ac.uk)作成の + lbp8用ドライバーを成松 宏氏(nari@lsi.tmg.nec.co.jp)がESC/Page用に + 改造した物を、入田 隆宏氏(irita@hoh.t.u-tokyo.ac.jp)と三田とが + ESC/PSモードの解像度選択、ページ選択機能を付加した物です。 + 用紙選択の改造に当たっては、久保 博さんの、gdevmjcを参考にさせて + いただきました。 + *** /dev/null Sun Aug 18 13:11:02 1996 --- gdevep82/gdevep82.mak Sun Aug 18 18:07:08 1996 *************** *** 0 **** --- 1,11 ---- + ### ------ The Epson LP-8200 (ESC/PS 300/600dpi) printer device ------- ### + + epag82_=gdevep82.$(OBJ) gdevprn.$(OBJ) + epag300.dev: $(epag82_) page.dev + $(SETPDEV) epag300 $(epag82_) + + epag600.dev: $(epag82_) page.dev + $(SETPDEV) epag600 $(epag82_) + + gdevep82.$(OBJ): gdevep82.c $(PDEVH) +