summaryrefslogtreecommitdiff
path: root/gs/contrib/eplaser/gdevescv.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/contrib/eplaser/gdevescv.c')
-rw-r--r--gs/contrib/eplaser/gdevescv.c3044
1 files changed, 0 insertions, 3044 deletions
diff --git a/gs/contrib/eplaser/gdevescv.c b/gs/contrib/eplaser/gdevescv.c
deleted file mode 100644
index 150a28c62..000000000
--- a/gs/contrib/eplaser/gdevescv.c
+++ /dev/null
@@ -1,3044 +0,0 @@
-/* Copyright (C) EPSON SOFTWARE DEVELOPMENT LABORATORY, INC. 1999,2000.
- Copyright (C) SEIKO EPSON CORPORATION 2000-2006.
-
- Ghostscript printer driver for EPSON ESC/Page and ESC/Page-Color.
-
- This software 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 GNU General Public License for full details.
-
- Everyone is granted permission to copy, modify and redistribute
- this software, but only under the conditions described in the GNU
- General Public License. A copy of this license is supposed to have been
- given to you along with this software 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.
-
-
- SPECIAL THANKS:
-
- 本ドライバの作成にあたり、大森紀人さんの gdevlips, gdevl4v.c を参考に
- させて頂きました。
-
-
- NOTES:
-
- - About Ghostscript 5.10/5.50 BUGS
- Ghostscript 5.10/5.50 の Vector driver の setlinewidth 関数には
- バグがあります。本来スケールが変更されるにしたがって線の太さも変更され
- なければなりませんが、Ghostscript 5.10/5.50 ではスケールを考慮するのを
- 忘れています。
- このドライバはそのバグを回避するためにスケールを自分で処理しています。
-
- */
-
-#if ( 6 > GS_VERSION_MAJOR )
-
-#include <string.h>
-#include <sys/utsname.h> /* for uname(2) */
-#include <ctype.h> /* for toupper(3) */
-
-#include "math_.h"
-#include "gx.h"
-#include "gserrors.h"
-#include "gsmatrix.h"
-#include "gsparam.h"
-#include "gxdevice.h"
-#include "gscspace.h"
-#include "gsutil.h"
-#include "gdevvec.h"
-#include "gdevpstr.h"
-#include "ghost.h"
-#include "gzstate.h"
-#include "imemory.h"
-#include "igstate.h"
-#include "gdevescv.h"
-#include "gspath.h"
-#include "gzpath.h"
-
-#else /* 6 <= GS_VERSION_MAJOR */
-
-#include "math_.h"
-#include <stdlib.h> /* for abs() */
-#include <sys/utsname.h> /* for uname(2) */
-#include <ctype.h> /* for toupper(3) */
-
-#include "time_.h"
-#include "memory_.h"
-#include "gx.h"
-#include "gserrors.h"
-#include "gzpath.h"
-#include "gxdevice.h"
-#include "gdevvec.h"
-
-#if ( 7 >= GS_VERSION_MAJOR )
-#include "gscspace.h"
-#endif
-
-#include "gdevescv.h"
-
-#endif /* GS_VERSION_MAJOR */
-
-
-#define ESCV_FORCEDRAWPATH 0 /* 0: correct LP-9200C path trouble. */
-
-
-/* ---------------- Device definition ---------------- */
-
-/* Device procedures */
-private dev_proc_open_device(escv_open);
-private dev_proc_output_page(escv_output_page);
-private dev_proc_close_device(escv_close);
-private dev_proc_copy_mono(escv_copy_mono);
-private dev_proc_copy_color(escv_copy_color);
-private dev_proc_put_params(escv_put_params);
-private dev_proc_get_params(escv_get_params);
-private dev_proc_fill_mask(escv_fill_mask);
-private dev_proc_begin_image(escv_begin_image);
-
-
-gs_public_st_suffix_add0_final(st_device_escv, gx_device_escv,
- "gx_device_escv", device_escv_enum_ptrs, device_escv_reloc_ptrs,
- gx_device_finalize, st_device_vector);
-
-
-/* for ESC/Page-Color
-** 原点の値を 0 とした場合,計算誤差?の問題から描画エリアが狂うため
-** 原点を 0.001 としておく。
-*/
-#define escv_device_full_body(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, \
- ncomp, depth, mg, mc, dg, dc, lm, bm, rm, tm)\
- std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
- dci_values(ncomp, depth, mg, mc, dg, dc),\
- std_device_part2_(w, h, xdpi, ydpi),\
- offset_margin_values(0.001, 0.001, lm, 0, 0, tm),\
- std_device_part3_()
-
-
-/* for ESC/Page (Monochrome) */
-#define esmv_device_full_body(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, \
- ncomp, depth, mg, mc, dg, dc, lm, bm, rm, tm)\
- std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
- dci_values(ncomp, depth, mg, mc, dg, dc),\
- std_device_part2_(w, h, xdpi, ydpi),\
- offset_margin_values(-lm * xdpi / 72.0, -tm * ydpi / 72.0, 5.0 / (MMETER_PER_INCH / POINT),\
- 0, 0, 5.0 / (MMETER_PER_INCH / POINT)), /* LPD.2. 041203 saito */\
- std_device_part3_()
-
-
-/* for ESC/Page-Color */
-#define escv_device_body(name) \
- escv_device_full_body(gx_device_escv, 0, name, \
- &st_device_escv,\
-/* width & height */ ESCPAGE_DEFAULT_WIDTH, ESCPAGE_DEFAULT_HEIGHT,\
-/* default resolution */ X_DPI, Y_DPI,\
-/* color info */ 3, 24, 255, 255, 256, 256,\
- ESCPAGE_LEFT_MARGIN_DEFAULT,\
- ESCPAGE_BOTTOM_MARGIN_DEFAULT,\
- ESCPAGE_RIGHT_MARGIN_DEFAULT,\
- ESCPAGE_TOP_MARGIN_DEFAULT)
-
-
-/* for ESC/Page (Monochrome) */
-#define esmv_device_body(name) \
- esmv_device_full_body(gx_device_escv, 0, name, \
- &st_device_escv,\
-/* width & height */ ESCPAGE_DEFAULT_WIDTH, ESCPAGE_DEFAULT_HEIGHT,\
-/* default resolution */ X_DPI, Y_DPI,\
-/* color info */ 1, 8, 255, 255, 256, 256,\
- ESCPAGE_LEFT_MARGIN_DEFAULT,\
- ESCPAGE_BOTTOM_MARGIN_DEFAULT,\
- ESCPAGE_RIGHT_MARGIN_DEFAULT,\
- ESCPAGE_TOP_MARGIN_DEFAULT)
-
-
-
-#define escv_procs_part1 \
- escv_open, /* open_device */\
- gx_default_get_initial_matrix, /* get_initial_matrix */\
- NULL, /* sync_output */\
- escv_output_page, /* output_page */\
- escv_close /* close_device */
-
-#define escv_procs_part2 \
- gdev_vector_fill_rectangle, /* fill_rectangle */\
- NULL, /* tile_rectangle */\
- escv_copy_mono, /* dev_t_proc_copy_mono */\
- escv_copy_color, /* dev_t_proc_copy_color */\
- NULL, /* draw_line */\
- NULL, /* get_bits */\
- escv_get_params, /* dev_t_proc_get_params */\
- escv_put_params, /* dev_t_proc_put_params */\
- NULL, /* map_cmyk_color */\
- NULL, /* get_xfont_procs */\
- NULL, /* get_xfont_device */\
- NULL, /* map_rgb_alpha_color */\
- gx_page_device_get_page_device, /* dev_t_proc_get_page_device */\
- NULL, /* get_alpha_bits */\
- NULL, /* copy_alpha */\
- NULL, /* get_band */\
- NULL, /* copy_rop */\
- gdev_vector_fill_path, /* fill_path */\
- gdev_vector_stroke_path, /* stroke_path */\
- escv_fill_mask, /* fill_mask */\
- gdev_vector_fill_trapezoid, /* fill_trapezoid */\
- gdev_vector_fill_parallelogram, /* fill_parallelogram */\
- gdev_vector_fill_triangle, /* fill_triangle */\
- NULL, /****** WRONG ******/ /* draw_thin_line */\
- escv_begin_image, /* begin_image */\
- NULL, /* image_data */\
- NULL, /* end_image */\
- NULL, /* strip_tile_rectangle */\
- NULL /******strip_copy_rop******/
-
-
-
-/* for ESC/Page-Color */
-#define escv_procs \
-{\
- escv_procs_part1,\
- gx_default_rgb_map_rgb_color, /* map_rgb_color */\
- gx_default_rgb_map_color_rgb, /* map_color_rgb */\
- escv_procs_part2\
-}
-
-
-/* for ESC/Page (Monochrome) */
-#define esmv_procs \
-{\
- escv_procs_part1,\
- gx_default_gray_map_rgb_color, /* map_rgb_color */\
- gx_default_gray_map_color_rgb, /* map_color_rgb */\
- escv_procs_part2\
-}
-
-
-#define escv_init_code_common \
- ESCPAGE_MANUALFEED_DEFAULT, /* bool manualFeed; * Use manual feed * */\
- ESCPAGE_CASSETFEED_DEFAULT, /* int cassetFeed; * Input Casset * */\
- ESCPAGE_RIT_DEFAULT, /* bool RITOff; * RIT Control * */\
- FALSE, /* bool Collate; */\
- 0, /* int toner_density; */\
- FALSE, /* bool toner_saving; */\
- 0, /* int prev_paper_size; */\
- 0, /* int prev_paper_width; */\
- 0, /* int prev_paper_height; */\
- 0, /* int prev_num_copies; */\
- -1, /* int prev_feed_mode; */\
- 0, /* int orientation; */\
- ESCPAGE_FACEUP_DEFAULT, /* bool faceup; */\
- ESCPAGE_MEDIATYPE_DEFAULT, /* int MediaType; */\
- 0, /* bool first_page; */\
- 0, /* bool Duplex; */\
- ESCPAGE_TUMBLE_DEFAULT, /* bool Tumble; */\
- 0, /* int ncomp; */\
- 0, /* int MaskReverse; */\
- 0, /* int MaskState; */\
- TRUE, /* bool c4map; * 4bit ColorMap * */\
- TRUE, /* bool c8map; * 8bit ColorMap * */\
- 0, /* int prev_x; */\
- 0, /* int prev_y; */\
- 0, /* gx_color_index prev_color; */\
- 0, /* gx_color_index current_color; */\
- 3, /* floatp lwidth; */\
- 0, /* long cap; */\
- 3, /* long join; */\
- 0, /* long reverse_x; */\
- 0, /* long reverse_y; */\
- {0,}, /* gs_matrix xmat; * matrix * */\
- 0, /* int bx; */\
- 0, /* int by; */\
- 0, /* int w; * width * */\
- 0, /* int h; * height * */\
- 0, /* int roll; */\
- 0, /* float sx; * scale x * */\
- 0, /* float sy; * scale y * */\
- 0, /* long dd; */\
- 0, /* int ispath */\
- {0,}, /* gx_bitmap_id id_cache[VCACHE + 1]; * for Font Downloading * */\
- {0,}, /* char JobID[ESCPAGE_JOBID_MAX + 1]; */\
- {0,}, /* char UserName[ESCPAGE_USERNAME_MAX + 1]; */\
- {0,}, /* char HostName[ESCPAGE_HOSTNAME_MAX + 1]; */\
- {0,}, /* char Document[ESCPAGE_DOCUMENT_MAX + 1]; */\
- {0,}, /* char Comment[ESCPAGE_COMMENT_MAX + 1]; */\
- {0,0,0}, /* gs_param_string gpsJobID; */\
- {0,0,0}, /* gs_param_string gpsUserName; */\
- {0,0,0}, /* gs_param_string gpsHostName; */\
- {0,0,0}, /* gs_param_string gpsDocument; */\
- {0,0,0} /* gs_param_string gpsComment; */
-
-
-/* for ESC/Page-Color */
-#define escv_init_code \
- vector_initial_values,\
- 1, /* int colormode; 1=ESC/Page-Color */\
- escv_init_code_common
-
-
-/* for ESC/Page (Monochrome) */
-#define esmv_init_code \
- vector_initial_values,\
- 0, /* int colormode; 0=ESC/Page(Monochrome) */\
- escv_init_code_common
-
-
-/* for ESC/Page (Monochrome) */
-gx_device_escv far_data gs_epl2050_device ={esmv_device_body("epl2050"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl2050p_device={esmv_device_body("epl2050p"),esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl2120_device ={esmv_device_body("epl2120"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl2500_device ={esmv_device_body("epl2500"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl2750_device ={esmv_device_body("epl2750"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl5800_device ={esmv_device_body("epl5800"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl5900_device ={esmv_device_body("epl5900"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl6100_device ={esmv_device_body("epl6100"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_epl6200_device ={esmv_device_body("epl6200"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp1800_device ={esmv_device_body("lp1800"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp1900_device ={esmv_device_body("lp1900"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp2200_device ={esmv_device_body("lp2200"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp2400_device ={esmv_device_body("lp2400"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp2500_device ={esmv_device_body("lp2500"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp7500_device ={esmv_device_body("lp7500"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp7700_device ={esmv_device_body("lp7700"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp7900_device ={esmv_device_body("lp7900"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8100_device ={esmv_device_body("lp8100"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8300f_device ={esmv_device_body("lp8300f"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8400f_device ={esmv_device_body("lp8400f"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8600_device ={esmv_device_body("lp8600"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8600f_device ={esmv_device_body("lp8600f"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8700_device ={esmv_device_body("lp8700"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp8900_device ={esmv_device_body("lp8900"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9000b_device ={esmv_device_body("lp9000b"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9100_device ={esmv_device_body("lp9100"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9200b_device ={esmv_device_body("lp9200b"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9300_device ={esmv_device_body("lp9300"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9400_device ={esmv_device_body("lp9400"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9600_device ={esmv_device_body("lp9600"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lp9600s_device ={esmv_device_body("lp9600s"), esmv_procs, esmv_init_code};
-gx_device_escv far_data gs_lps4500_device ={esmv_device_body("lps4500"), esmv_procs, esmv_init_code};
-
-/* for ESC/Page-Color */
-gx_device_escv far_data gs_alc1900_device ={escv_device_body("alc1900"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_alc2000_device ={escv_device_body("alc2000"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_alc4000_device ={escv_device_body("alc4000"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_alc4100_device ={escv_device_body("alc4100"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_alc8500_device ={escv_device_body("alc8500"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_alc8600_device ={escv_device_body("alc8600"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_alc9100_device ={escv_device_body("alc9100"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp3000c_device ={escv_device_body("lp3000c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp8000c_device ={escv_device_body("lp8000c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp8200c_device ={escv_device_body("lp8200c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp8300c_device ={escv_device_body("lp8300c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp8500c_device ={escv_device_body("lp8500c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp8800c_device ={escv_device_body("lp8800c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp9000c_device ={escv_device_body("lp9000c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp9200c_device ={escv_device_body("lp9200c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp9500c_device ={escv_device_body("lp9500c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lp9800c_device ={escv_device_body("lp9800c"), escv_procs, escv_init_code};
-gx_device_escv far_data gs_lps6500_device ={escv_device_body("lps6500"), escv_procs, escv_init_code};
-
-
-/* Vector device implementation */
-#if ( 6 > GS_VERSION_MAJOR )
-private int escv_beginpage(P1(gx_device_vector * vdev));
-private int escv_setfillcolor(P2(gx_device_vector * vdev, const gx_drawing_color * pdc));
-private int escv_setstrokecolor(P2(gx_device_vector * vdev, const gx_drawing_color * pdc));
-private int escv_setdash(P4(gx_device_vector * vdev, const float *pattern,
- uint count, floatp offset));
-private int escv_setflat(P2(gx_device_vector * vdev, floatp flatness));
-private int escv_setlogop(P3(gx_device_vector * vdev, gs_logical_operation_t lop,
- gs_logical_operation_t diff));
-private int escv_vector_dorect(gx_device_vector * vdev, fixed x0, fixed y0, fixed x1,
- fixed y1, gx_path_type_t type);
-private int escv_vector_dopath(gx_device_vector * vdev, const gx_path * ppath,
- gx_path_type_t type);
-private int escv_beginpath(P2(gx_device_vector * vdev, gx_path_type_t type));
-private int escv_moveto(P6(gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x, floatp y, gx_path_type_t type));
-private int escv_lineto(P6(gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x, floatp y, gx_path_type_t type));
-private int escv_curveto(P10(gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x1, floatp y1, floatp x2, floatp y2,
- floatp x3, floatp y3, gx_path_type_t type));
-private int escv_closepath(P6(gx_device_vector * vdev, floatp x, floatp y,
- floatp x_start, floatp y_start, gx_path_type_t type));
-
-private int escv_endpath(P2(gx_device_vector * vdev, gx_path_type_t type));
-private int escv_setlinewidth(gx_device_vector * vdev, floatp width);
-private int escv_setlinecap(gx_device_vector * vdev, gs_line_cap cap);
-private int escv_setlinejoin(gx_device_vector * vdev, gs_line_join join);
-private int escv_setmiterlimit(gx_device_vector * vdev, floatp limit);
-
-#else /* 6 <= GS_VERSION_MAJOR */
-
-/* Page management */
-private int escv_beginpage (gx_device_vector * vdev);
-/* Imager state */
-private int escv_setlinewidth (gx_device_vector * vdev, floatp width);
-private int escv_setlinecap (gx_device_vector * vdev, gs_line_cap cap);
-private int escv_setlinejoin (gx_device_vector * vdev, gs_line_join join);
-private int escv_setmiterlimit (gx_device_vector * vdev, floatp limit);
-private int escv_setdash (gx_device_vector * vdev, const float *pattern,
- uint count, floatp offset);
-private int escv_setflat (gx_device_vector * vdev, floatp flatness);
-private int escv_setlogop (gx_device_vector * vdev, gs_logical_operation_t lop,
- gs_logical_operation_t diff);
-/* Other state */
-#if ( 8 <= GS_VERSION_MAJOR )
-private bool escv_can_handle_hl_color (gx_device_vector * vdev, const gs_imager_state * pis,
- const gx_drawing_color * pdc);
-private int escv_setfillcolor (gx_device_vector * vdev, const gs_imager_state * pis,
- const gx_drawing_color * pdc);
-private int escv_setstrokecolor (gx_device_vector * vdev, const gs_imager_state * pis,
- const gx_drawing_color * pdc);
-#else
-private int escv_setfillcolor (gx_device_vector * vdev, const gx_drawing_color * pdc);
-private int escv_setstrokecolor (gx_device_vector * vdev, const gx_drawing_color * pdc);
-#endif
-/* Paths */
-/* dopath and dorect are normally defaulted */
-private int escv_vector_dopath (gx_device_vector * vdev, const gx_path * ppath,
- gx_path_type_t type, const gs_matrix *pmat);
-private int escv_vector_dorect (gx_device_vector * vdev, fixed x0, fixed y0, fixed x1,
- fixed y1, gx_path_type_t type);
-private int escv_beginpath (gx_device_vector * vdev, gx_path_type_t type);
-private int escv_moveto (gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x, floatp y, gx_path_type_t type);
-private int escv_lineto (gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x, floatp y, gx_path_type_t type);
-private int escv_curveto (gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x1, floatp y1, floatp x2, floatp y2,
- floatp x3, floatp y3, gx_path_type_t type);
-private int escv_closepath (gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x_start, floatp y_start, gx_path_type_t type);
-private int escv_endpath (gx_device_vector * vdev, gx_path_type_t type);
-
-#endif /* GS_VERSION_MAJOR */
-
-private const gx_device_vector_procs escv_vector_procs =
- {
- /* Page management */
- escv_beginpage,
- /* Imager state */
- escv_setlinewidth,
- escv_setlinecap,
- escv_setlinejoin,
- escv_setmiterlimit,
- escv_setdash,
- escv_setflat,
- escv_setlogop,
- /* Other state */
-#if ( 8 <= GS_VERSION_MAJOR )
- escv_can_handle_hl_color, /* add gs815 */
-#endif
- escv_setfillcolor, /* fill & stroke colors are the same */
- escv_setstrokecolor,
- /* Paths */
- escv_vector_dopath,
- escv_vector_dorect,
- escv_beginpath,
- escv_moveto,
- escv_lineto,
- escv_curveto,
- escv_closepath,
- escv_endpath
- };
-
-private void escv_write_begin(gx_device *dev, int bits, int x, int y, int sw, int sh, int dw, int dh, int roll);
-private void escv_write_data(gx_device *dev, int bits, char *buf, int bsize, int w, int ras);
-private void escv_write_end(gx_device *dev, int bits);
-
-
-/* ---------------- Utilities ---------------- */
-
-/* Put a string on a stream.
- This function is copy of `pputs' in gdevpstr.c */
-private int
-lputs(stream * s, const char *str)
-{
- uint len = strlen(str);
- uint used;
- int status;
-
- status = sputs(s, (const byte *)str, len, &used);
-
- return (status >= 0 && used == len ? 0 : EOF);
-}
-
-/* Write a string on a stream. */
-private void
-put_bytes(stream * s, const byte * data, uint count)
-{
- uint used;
-
- sputs(s, data, count, &used);
-}
-
-
-private int
-escv_range_check(gx_device * dev)
-{
- int width = dev->MediaSize[0];
- int height = dev->MediaSize[1];
- int xdpi = dev->x_pixels_per_inch;
- int ydpi = dev->y_pixels_per_inch;
-
- /* Paper Size Check */
- if (width <= height) { /* portrait */
- if ((width < ESCPAGE_WIDTH_MIN ||
- width > ESCPAGE_WIDTH_MAX ||
- height < ESCPAGE_HEIGHT_MIN ||
- height > ESCPAGE_HEIGHT_MAX)) {
- return_error(gs_error_rangecheck);
- }
- } else { /* landscape */
- if ((width < ESCPAGE_HEIGHT_MIN ||
- width > ESCPAGE_HEIGHT_MAX ||
- height < ESCPAGE_WIDTH_MIN ||
- height > ESCPAGE_WIDTH_MAX )) {
- return_error(gs_error_rangecheck);
- }
- }
-
- /* Resolution Check */
- if (xdpi != ydpi) {
- return_error(gs_error_rangecheck);
- }
-
- if ((xdpi < ESCPAGE_DPI_MIN ||
- xdpi > ESCPAGE_DPI_MAX)) {
- return_error(gs_error_rangecheck);
- }
-
- return 0; /* pass */
-}
-
-
-/* ---------------- Vector device implementation ---------------- */
-
-private int
-escv_vector_dopath(gx_device_vector * vdev, const gx_path * ppath,
- gx_path_type_t type
-#if ( 6 <= GS_VERSION_MAJOR )
- , const gs_matrix *pmat
-#endif
- )
-{
- gx_device_escv *pdev = (gx_device_escv *) vdev;
- bool do_close = (type & gx_path_type_stroke) != 0;
- gs_fixed_rect rect;
- gs_point scale;
- double x_start = 0, y_start = 0, x_prev = 0, y_prev = 0;
- bool first = true;
- gs_path_enum cenum;
- int code;
-
- stream *s = gdev_vector_stream(vdev);
- char obuf[128];
-
- if (gx_path_is_rectangle(ppath, &rect))
- return (*vdev_proc(vdev, dorect)) (vdev, rect.p.x, rect.p.y, rect.q.x, rect.q.y, type);
- scale = vdev->scale;
- code = (*vdev_proc(vdev, beginpath)) (vdev, type);
- gx_path_enum_init(&cenum, ppath);
-
- for (;;) {
- double x, y;
- fixed vs[6];
- int pe_op, cnt;
- const segment *pseg;
-
-
- pe_op = gx_path_enum_next(&cenum, (gs_fixed_point *) vs);
-
- sw:switch (pe_op) {
- case 0: /* done */
- return (*vdev_proc(vdev, endpath)) (vdev, type);
-
- case gs_pe_moveto:
- x = fixed2float(vs[0]) / scale.x;
- y = fixed2float(vs[1]) / scale.y;
-
- /* サブパス開始命令 p1 */
- (void)sprintf(obuf, ESC_GS "0;%d;%dmvpG", (int)x, (int)y);
- lputs(s, obuf);
-
- if (first)
- x_start = x, y_start = y, first = false;
- break;
-
- case gs_pe_lineto:
- cnt = 1;
- for (pseg = cenum.pseg; pseg != 0 && pseg->type == s_line; cnt++, pseg = pseg->next);
-
- (void)sprintf(obuf, ESC_GS "0;%d", cnt);
- lputs(s, obuf);
-
- do {
- (void)sprintf(obuf, ";%d;%d",
- (int)(fixed2float(vs[0]) / scale.x),
- (int)(fixed2float(vs[1]) / scale.y));
- lputs(s, obuf);
-
- pe_op = gx_path_enum_next(&cenum, (gs_fixed_point *) vs);
- } while (pe_op == gs_pe_lineto);
-
- /* パス・ポリライン命令 */
- lputs(s, "lnpG");
- pdev->ispath = 1;
-
- goto sw;
-
- case gs_pe_curveto:
- cnt = 1;
- for (pseg = cenum.pseg; pseg != 0 && pseg->type == s_curve; cnt++, pseg = pseg->next);
- (void)sprintf(obuf, ESC_GS "0;%d", cnt * 3);
- lputs(s, obuf);
-
- do {
- (void)sprintf(obuf, ";%d;%d;%d;%d;%d;%d",
- (int)(fixed2float(vs[0]) / scale.x), (int)(fixed2float(vs[1]) / scale.y),
- (int)(fixed2float(vs[2]) / scale.x), (int)(fixed2float(vs[3]) / scale.y),
- (int)(fixed2float(vs[4]) / scale.x), (int)(fixed2float(vs[5]) / scale.y));
- lputs(s, obuf);
-
- pe_op = gx_path_enum_next(&cenum, (gs_fixed_point *) vs);
- } while (pe_op == gs_pe_curveto);
-
- /* ベジェ曲線 */
- lputs(s, "bzpG");
- pdev->ispath = 1;
-
- goto sw;
-
- case gs_pe_closepath:
- x = x_start, y = y_start;
- if (do_close) {
- lputs(s, ESC_GS "clpG");
- break;
- }
-
- pe_op = gx_path_enum_next(&cenum, (gs_fixed_point *) vs);
- if (pe_op != 0) {
- lputs(s, ESC_GS "clpG");
-
- if (code < 0)
- return code;
- goto sw;
- }
- return (*vdev_proc(vdev, endpath)) (vdev, type);
- default: /* can't happen */
- return_error(gs_error_unknownerror);
- }
- if (code < 0)
- return code;
- x_prev = x, y_prev = y;
- }
-}
-
-
-private int
-escv_vector_dorect(gx_device_vector * vdev, fixed x0, fixed y0, fixed x1,
- fixed y1, gx_path_type_t type)
-{
- gx_device_escv *pdev = (gx_device_escv *) vdev;
- int code;
- char obuf[128];
- gs_point scale;
- stream *s = gdev_vector_stream(vdev);
-
- code = (*vdev_proc(vdev, beginpath))(vdev, type);
- if (code < 0)
- return code;
-
- scale = vdev->scale;
-
- (void)sprintf(obuf, ESC_GS "0;%d;%d;%d;%d;0;0rrpG",
- (int)(fixed2float(x0) / scale.x),
- (int)(fixed2float(y0) / scale.y),
- (int)(fixed2float(x1) / scale.x),
- (int)(fixed2float(y1) / scale.y));
- lputs(s, obuf);
- pdev->ispath = 1;
-
-#if 0
- /* Ghostscript 側のバグで closepath を呼んでいないので処理を会わせる。 */
-
- /* 本来は (*vdev_proc(vdev, closepath))() を呼ぶべき */
- lputs(s, ESC_GS "clpG");
-#endif
-
- return (*vdev_proc(vdev, endpath))(vdev, type);
-}
-
-
-/* ---------- */
-
-private const EPaperTable ePaperTable[NUM_OF_PAPER_TABLES] =
- {
- {933, 1369, 72, "A3PLUS"}, /* A3 NOBI */
- {842, 1191, 13, "A3"}, /* A3 */
- {792, 1224, 36, "B"}, /* Ledger */
- {729, 1032, 24, "B4"}, /* B4 JIS */
- {709, 1001, 24, "B4"}, /* B4 */
- {612, 1008, 32, "LGL"}, /* Legal */
- {612, 936, 34, "GLG"}, /* Government Letter */ /* LPD.1. */
- {612, 792, 30, "LT"}, /* Letter */
- {595, 935, 37, "F4"}, /* F4 */
- {595, 842, 14, "A4"}, /* A4 */
- {576, 756, 35, "GLT"}, /* Government Legal */ /* LPD.1. */
- {522, 756, 33, "EXE"}, /* Executive */
- {516, 729, 25, "B5"}, /* B5 JIS */
- {499, 709, 99, "IB5"}, /* Envelope ISO B5 */
- {459, 649, 91, "C5"}, /* Envelope C5 */
- {420, 595, 15, "A5"}, /* A5 */
- {396, 612, 31, "HLT"}, /* Half Letter */
- {312, 624, 90, "DL"}, /* DL */
- {298, 666, 64, "YOU4"}, /* Japanese Envelope You4 */
- {297, 684, 81, "C10"}, /* Commercial 10 */
- {283, 420, 38, "POSTCARD"},/* PostCard */
- {279, 540, 80, "MON"}, /* Monarch */
- { 0, 0, -1, ""} /* Undefined */
- };
-
-private const EPaperTable *
-escv_checkpapersize(gx_device_vector * vdev)
-{
- gx_device_escv *const pdev = (gx_device_escv *)vdev;
- int devw, devh;
- paper_candidate candidate[NUM_OF_PAPER_TABLES];
- int num_candidate;
-
-
- if (pdev->MediaSize[0] < pdev->MediaSize[1]) {
- /* portrait */
- devw = pdev->MediaSize[0];
- devh = pdev->MediaSize[1];
- } else {
- /* landscape */
- devw = pdev->MediaSize[1];
- devh = pdev->MediaSize[0];
- }
-
- /* pick up papersize candidate */
- {
- const EPaperTable *pt;
- int delta;
-
- num_candidate = 0;
-
- for (delta = 0; delta <= MAX_PAPER_SIZE_DELTA; delta++) {
- for (pt = ePaperTable; 0 <= pt->escpage; pt++) {
- if ( (pt->width + delta) >= devw &&
- (pt->width - delta) <= devw &&
- (pt->height + delta) >= devh &&
- (pt->height - delta) <= devh) {
-
- candidate[num_candidate].paper = pt;
- candidate[num_candidate].absw = abs(pt->width - devw);
- candidate[num_candidate].absh = abs(pt->height - devh);
- candidate[num_candidate].score = 0;
- candidate[num_candidate].isfillw = false;
- candidate[num_candidate].isfillh = false;
- candidate[num_candidate].isminw = false;
- candidate[num_candidate].isminh = false;
-
- if( 0 <= (pt->width - devw) ){
- candidate[num_candidate].isfillw = true;
- }
- if( 0 <= (pt->height - devh) ){
- candidate[num_candidate].isfillh = true;
- }
- num_candidate++;
- }
- }
- if ( 0 < num_candidate ) {
- break;
- }
- }
- }
-
- /* no papersize match, so use default paper size */
- if ( 0 == num_candidate ) {
- return (const EPaperTable *)0; /* not found */
- }
-
- if ( 1 == num_candidate ) {
- return candidate[0].paper; /* find */
- }
-
- /* search abstruct minw & minh */
- {
- int absminw;
- int absminh;
- int i;
-
- absminw = candidate[0].absw;
- absminh = candidate[0].absh;
- for (i = 1; i < num_candidate; i++) {
- if (absminw > candidate[i].absw) {
- absminw = candidate[i].absw;
- }
- if (absminh > candidate[i].absh) {
- absminh = candidate[i].absh;
- }
- }
-
- /* check isminw & isminh flag */
- for (i = 0; i < num_candidate; i++) {
- if (absminw == candidate[i].absw) {
- candidate[i].isminw = true;
- }
- if (absminh == candidate[i].absh) {
- candidate[i].isminh = true;
- }
- }
-
- /* add score */
- for (i = 0; i < num_candidate; i++) {
- if (candidate[i].isminw == true) {
- candidate[i].score += 100;
- }
- if (candidate[i].isminh == true) {
- candidate[i].score += 100;
- }
- if (candidate[i].isfillw == true) {
- candidate[i].score += 10;
- }
- if (candidate[i].isfillh == true) {
- candidate[i].score += 10;
- }
- if (absminw < absminh) {
- if (candidate[i].isminw == true) {
- candidate[i].score += 1;
- }
- } else {
- if (candidate[i].isminh == true) {
- candidate[i].score += 1;
- }
- }
- }
- }
-
- /* select highest score papersize */
- {
- int best_candidate;
- int i;
-
- best_candidate = 0;
- for (i = 1; i < num_candidate; i++) {
- if ( candidate[best_candidate].score <= candidate[i].score ) {
- best_candidate = i;
- }
- }
- return candidate[best_candidate].paper;
- }
-}
-
-private char *
-get_sysname ( void )
-{
- char *result = NULL;
- struct utsname utsn;
-
- if (0 == uname (&utsn))
- {
- result = strdup (utsn.sysname);
- }
- return result;
-}
-
-/* EPSON printer model name translation.
- return: 0 unknown model, not translated.
- 1 completed.
- -1 error. ... This value not return now.
- */
-private int
-trans_modelname ( char *dest, const char * src, size_t dest_len )
-{
- const char *cp = src;
-
- dest[0] = '\0';
-
- if ( 0 == strncmp( cp, "epl", 3 ) ) {
- strcat( dest, "EPSON EPL-" );
- cp = &cp[3];
- } else if ( 0 == strncmp( cp, "al", 2 ) ) {
- strcat( dest, "EPSON AL-" );
- cp = &cp[2];
- } else if ( 0 == strncmp( cp, "lp", 2 ) ) {
- strcat( dest, "EPSON LP-" );
- cp = &cp[2];
- } else {
- strncpy( dest, src, dest_len );
- dest[dest_len] = '\0';
- return 0;
- }
-
- {
- char * pdest = strchr( dest, '\0' );
- size_t len = strlen( dest );
-
- while ( ( len < (dest_len -1) ) && *cp && ( '_' != *cp) ) {
- *pdest = toupper( *cp );
- pdest++;
- cp++;
- }
- *pdest = '\0';
- }
-
- return 1;
-}
-
-
-private int
-escv_beginpage(gx_device_vector * vdev)
-{
- gx_device_escv *const pdev = (gx_device_escv *)vdev;
-
- if (pdev -> first_page) {
-
- /* not use gdev_vector_stream */
- stream *s = vdev->strm;
- char ebuf[1024];
- int MaxRes;
- int Local;
- int Duplex;
- int FaceUp;
-
- const struct {
- const char *name;
- const int resolution;
- const int locale;
- const int duplex;
- const int faceup;
- } model_resource[] = {
- /* model, resolution, loca,deplex,faceup */
- { "alc1900", RES600, ENG, TRUE, FALSE },
- { "alc2000", RES600, ENG, TRUE, FALSE },
- { "alc4000", RES1200, ENG, TRUE, FALSE },
- { "alc4100", RES600, ENG, TRUE, FALSE },
- { "alc8500", RES600, ENG, TRUE, TRUE },
- { "alc8600", RES600, ENG, TRUE, TRUE },
- { "alc9100", RES600, ENG, TRUE, TRUE },
- { "epl2050", RES1200, ENG, TRUE, FALSE },
- { "epl2050p",RES1200, ENG, TRUE, FALSE },
- { "epl2120", RES1200, ENG, TRUE, FALSE },
- { "epl2500", RES600, ENG, TRUE, FALSE },
- { "epl2750", RES600, ENG, TRUE, FALSE },
- { "epl5800", RES1200, ENG, FALSE, FALSE },
- { "epl5900", RES1200, ENG, FALSE, FALSE },
- { "epl6100", RES1200, ENG, FALSE, FALSE },
- { "epl6200", RES1200, ENG, FALSE, FALSE },
- { "lp1800", RES600, JPN, FALSE, FALSE },
- { "lp1900", RES1200, JPN, FALSE, FALSE },
- { "lp2200", RES1200, JPN, FALSE, FALSE },
- { "lp2400", RES1200, JPN, FALSE, FALSE },
- { "lp2500", RES1200, JPN, FALSE, FALSE },
- { "lp3000c", RES600, JPN, TRUE, FALSE },
- { "lp7500", RES600, JPN, TRUE, FALSE },
- { "lp7700", RES600, JPN, TRUE, FALSE },
- { "lp7900", RES600, JPN, TRUE, FALSE },
- { "lp8000c", RES600, JPN, FALSE, TRUE },
- { "lp8100", RES600, JPN, TRUE, FALSE },
- { "lp8200c", RES600, JPN, FALSE, TRUE },
- { "lp8300c", RES600, JPN, TRUE, TRUE },
- { "lp8300f", RES600, JPN, TRUE, FALSE },
- { "lp8400f", RES600, JPN, TRUE, FALSE },
- { "lp8500c", RES600, JPN, TRUE, TRUE },
- { "lp8600", RES600, JPN, TRUE, FALSE },
- { "lp8600f", RES600, JPN, TRUE, FALSE },
- { "lp8700", RES1200, JPN, TRUE, FALSE },
- { "lp8800c", RES600, JPN, TRUE, TRUE },
- { "lp8900", RES600, JPN, TRUE, FALSE },
- { "lp9000b", RES600, JPN, TRUE, FALSE },
- { "lp9000c", RES600, JPN, TRUE, FALSE },
- { "lp9100", RES600, JPN, TRUE, FALSE },
- { "lp9200b", RES600, JPN, TRUE, FALSE },
- { "lp9200c", RES600, JPN, TRUE, FALSE },
- { "lp9300", RES600, JPN, TRUE, FALSE },
- { "lp9400", RES600, JPN, TRUE, FALSE },
- { "lp9500c", RES600, JPN, TRUE, TRUE },
- { "lp9600", RES600, JPN, TRUE, FALSE },
- { "lp9600s", RES600, JPN, TRUE, FALSE },
- { "lp9800c", RES600, JPN, TRUE, TRUE },
- { "lps4500", RES600, JPN, TRUE, FALSE },
- { "lps6500", RES600, JPN, TRUE, FALSE },
- { "", -1, -1, FALSE, FALSE }
- };
-
- /* set default */
- MaxRes = RES600;
- Local = JPN;
- Duplex = FALSE;
- FaceUp = FALSE;
-
- if ( !*pdev->JobID )
- strcpy(pdev->JobID, "0");
-
-
- lputs(s, "\033\001@EJL \012");
-
- lputs(s, "@EJL SJ ID=\"");
- lputs(s, pdev->JobID);
- lputs(s, "\"\012");
-
- lputs(s, "@EJL JI ID=\"");
- lputs(s, pdev->JobID);
- lputs(s, "\"");
-
- {
- time_t t;
-
- time(&t);
-
- lputs(s, " DATE=\"");
- {
- struct tm *tm;
- char str[32];
- size_t i;
-
- tm = localtime( &t );
- i = strftime(str, 30, "%Y/%m/%d %H:%M:%S", tm);
- if ( 30 >= i )
- str[i] = '\0';
-
- lputs(s, str);
- }
- lputs(s, "\"");
-
- lputs(s, "\012");
- }
-
- lputs(s, "@EJL JI");
- {
- lputs(s, " USER=\"");
- if ( *pdev->UserName )
- lputs(s, pdev->UserName);
- lputs(s, "\"");
-
- lputs(s, " MACHINE=\"");
- if ( *pdev->HostName )
- lputs(s, pdev->HostName);
- lputs(s, "\"");
-
- lputs(s, " DOCUMENT=\"");
- if ( *pdev->Document )
- lputs(s, pdev->Document);
- lputs(s, "\"");
- }
- lputs(s, "\012");
-
- lputs(s, "@EJL JI OS=\"");
- {
- char *sysname = get_sysname ();
- if (sysname)
- {
- lputs(s, sysname );
- free (sysname);
- sysname = NULL;
- }
- }
- lputs(s, "\"\012");
-
- lputs(s, "@EJL JI DRIVER=\"");
- {
- char _modelname[ ESCPAGE_MODELNAME_MAX + 1 ] = {0,};
- const char *modelname;
- int i;
-
- modelname = pdev->dname;
-
- for ( i = 0; (-1) != model_resource[i].resolution; i++ ) {
- if ( 0 == strcmp( pdev->dname, model_resource[i].name ) )
- break;
- }
-
- if ( (-1) != model_resource[i].resolution ) {
- MaxRes = model_resource[i].resolution;
- Local = model_resource[i].locale;
- Duplex = model_resource[i].duplex;
- FaceUp = model_resource[i].faceup;
-
- if ( 0 <= trans_modelname( _modelname, model_resource[i].name, ESCPAGE_MODELNAME_MAX ) )
- modelname = _modelname;
-
- lputs(s, modelname);
- } else {
- lputs(s, "Ghostscript");
- }
- lputs(s, "\"\012");
-
- lputs(s, "@EJL JI PRINTER=\"");
- lputs(s, modelname);
- lputs(s, "\"\012");
- }
-
- if ( *pdev->Comment ) {
- lputs(s, "@EJL CO ");
- lputs(s, pdev->Comment );
- lputs(s, "\012");
- }
-
- lputs(s, "@EJL SE LA=ESC/PAGE\012");
-
- lputs(s, "@EJL SET");
-
- /* Resolusion */
- if (vdev->x_pixels_per_inch == 1200){
- if (MaxRes == 1200){
- lputs(s, " RS=1200");
- } else {
- lputs(s, " RS=FN");
- }
- } else if (vdev->x_pixels_per_inch == 600) {
- lputs(s, " RS=FN");
- } else {
- lputs(s, " RS=QK");
- }
-
- /* Output Unit */
- if ((pdev->faceup && FaceUp) || (pdev->MediaType && FaceUp)) {
- lputs(s, " OU=FU");
- } else {
- lputs(s, " OU=FD");
- }
-
- /* Paper unit */
- if (pdev->MediaType){
- if (Local == ENG){
- lputs(s, " PU=1");
- } else {
- lputs(s, " PU=15");
- }
- }else{
- if (pdev->manualFeed) {
- if (Local == ENG){
- lputs(s, " PU=1");
- } else {
- lputs(s, " PU=15");
- }
- } else if (pdev->cassetFeed) {
- (void)sprintf(ebuf, " PU=%d", pdev->cassetFeed);
- lputs(s, ebuf);
- } else {
- lputs(s, " PU=AU");
- }
- }
-
- if (Duplex && pdev->Duplex) {
- /* Duplex ON */
- lputs(s, " DX=ON");
-
- /* binding type */
- if (pdev->Tumble) {
- lputs(s, " BD=SE");
- } else {
- lputs(s, " BD=LE");
- }
- } else {
- /* Duplex off */
- lputs(s, " DX=OFF");
- }
-
- /* Number of copies */
- if (pdev->NumCopies) {
- if (pdev->NumCopies >= 1000) {
- pdev->NumCopies = 999;
- }
-
- /* lp8000c not have QT */
- if (strcmp(pdev->dname, "lp8000c") == 0) {
- (void)sprintf(ebuf, " QT=1 CO=%d", pdev->NumCopies);
- } else {
- if (pdev->Collate) {
- /* CO is 1, when set QT */
- (void)sprintf(ebuf, " QT=%d CO=1", pdev->NumCopies);
- } else {
- /* QT is 1, when not specified QT */
- (void)sprintf(ebuf, " QT=1 CO=%d", pdev->NumCopies);
- }
- }
- lputs(s, ebuf);
- } else {
- lputs(s, " QT=1 CO=1");
- }
-
- if (pdev->toner_density) {
- (void)sprintf(ebuf, " DL=%d", pdev->toner_density);
- lputs(s, ebuf);
- }
-
- if (pdev->orientation) {
- lputs(s, " OR=LA");
- }
-
- if (pdev->toner_saving) {
- lputs(s, " SN=ON");
- }
-
- if (pdev->RITOff) {
- lputs(s, " RI=OFF");
- } else {
- lputs(s, " RI=ON");
- }
-
- if (pdev->MediaType == 1) {
- lputs(s, " PK=TH");
- } else if (pdev->MediaType == 2) {
- lputs(s, " PK=TR");
- } else {
- lputs(s, " PK=NM");
- }
-
- lputs(s, " PS=");
- {
- const EPaperTable *pt;
-
- pt = escv_checkpapersize(vdev);
- if ( 0 == pt ) {
- lputs(s, "A4");
- } else {
- lputs(s, pt->name);
- }
- }
-
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
-#define START_CODE1 ESC_GS "1tsE" ESC_GS "1owE" ESC_GS "0alfP" ESC_GS "0affP" ESC_GS "0;0;0clfP" ESC_GS "0pmP" ESC_GS "1024ibI" ESC_GS "2cmE" ESC_GS "0bcI" ESC_GS "1;10mlG"
-
-#define STRAT_CODE ESC_GS "1mmE" ESC_GS "1csE"
-
- lputs(s, " ZO=OFF EC=ON SZ=OFF SL=YES TO=0.0MM LO=0.0MM\012");
- lputs(s, "@EJL EN LA=ESC/PAGE\012");
-
- lputs(s, ESC_GS "rhE");
-
- lputs(s, STRAT_CODE);
-
- if (vdev->x_pixels_per_inch == 1200) {
- /* 1200 dpi */
- lputs(s, ESC_GS "0;0.06muE");
- lputs(s, ESC_GS "1;45;156htmE");
- lputs(s, ESC_GS "9;1200;1200drE" ESC_GS "2;1200;1200drE" ESC_GS "1;1200;1200drE" ESC_GS "0;1200;1200drE");
- lputs(s, ESC_GS "1;1;raE");
- } else if (vdev->x_pixels_per_inch == 600) {
- /* 600 dpi */
- lputs(s, ESC_GS "0;0.12muE");
- lputs(s, ESC_GS "1;45;106htmE");
- lputs(s, ESC_GS "9;600;600drE" ESC_GS "2;600;600drE" ESC_GS "1;600;600drE" ESC_GS "0;600;600drE");
- } else {
- /* 300 dpi */
- lputs(s, ESC_GS "0;0.24muE");
- lputs(s, ESC_GS "1;45;71htmE");
- lputs(s, ESC_GS "9;300;300drE" ESC_GS "2;300;300drE" ESC_GS "1;300;300drE" ESC_GS "0;300;300drE");
- }
-
- lputs(s, START_CODE1);
-
- lputs(s, ESC_GS "0sarG"); /* 絶対座標指定 */
- /* lputs(s, ESC_GS "1owE");*/
-
- } else { /* ESC/Page-Color */
-
-#define COLOR_START_CODE1 ESC_GS "1tsE" ESC_GS "0alfP" ESC_GS "0affP" ESC_GS "0;0;0clfP" ESC_GS "0pmP" ESC_GS "1024ibI" ESC_GS "2cmE" ESC_GS "0bcI" ESC_GS "1;10mlG"
-
-#define LP8000_CODE ESC_GS "0pddO" ESC_GS "0;0mmE" ESC_GS "2csE" ESC_GS "0;1;3cmmE" ESC_GS "0;1raE" ESC_GS "0;2;4ccmE"
-
-#define LP8200_CODE ESC_GS "0pddO" ESC_GS "0;0cmmE" ESC_GS "1;2;3ccmE" ESC_GS "2;2;3ccmE" ESC_GS "3;2;4ccmE" ESC_GS "1;1raE" ESC_GS "2;1raE" ESC_GS "3;1raE"
-
-
- lputs(s, " ZO=OFF EC=ON SZ=OFF SL=YES TO=0 LO=0\012");
- lputs(s, "@EJL EN LA=ESC/PAGE-COLOR\012");
-
- lputs(s, ESC_GS "rhE");
-
- if (strcmp(vdev -> dname, "lp8000c") == 0) {
- lputs(s, LP8000_CODE);
- } else {
- lputs(s, LP8200_CODE);
- }
-
- put_bytes(s, ESC_GS "7;0;2;0cam{E\012\000\000\000\000\000\000", 20);
- lputs(s, ESC_GS "0;0cmmE");
-
- if (vdev->x_pixels_per_inch == 1200) {
- /* 1200 dpi */
- lputs(s, ESC_GS "0;0.06muE");
- lputs(s, ESC_GS "3;1200;1200drE" ESC_GS "2;1200;1200drE" ESC_GS "1;1200;1200drE" ESC_GS "0;1200;1200drE");
- } else if (vdev->x_pixels_per_inch == 600) {
- /* 600 dpi */
- lputs(s, ESC_GS "0;0.12muE");
- lputs(s, ESC_GS "3;600;600drE" ESC_GS "2;600;600drE" ESC_GS "1;600;600drE" ESC_GS "0;600;600drE");
- } else {
- /* 300 dpi */
- lputs(s, ESC_GS "0;0.24muE");
- lputs(s, ESC_GS "3;300;300drE" ESC_GS "2;300;300drE" ESC_GS "1;300;300drE" ESC_GS "0;300;300drE");
- }
- lputs(s, ESC_GS "0;0loE");
-
-/* lputs(s, ESC_GS "0poE"); *//* for TEST */
-
- lputs(s, COLOR_START_CODE1);
- lputs(s, ESC_GS "8;1;2;2;2plr{E");
- put_bytes(s, "\377\377\377\377\000\000\000\000", 8);
-
- lputs(s, ESC_GS "0sarG"); /* 絶対座標指定 */
- lputs(s, ESC_GS "2;204wfE"); /* rop 指定 */
-
- } /* ESC/Page-Color */
-
- }
-
- return 0;
-}
-
-
-private int
-escv_setlinewidth(gx_device_vector * vdev, floatp width)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *const pdev = (gx_device_escv *) vdev;
- char obuf[64];
-
-#if GS_VERSION_MAJOR == 5
- /* Scale を掛けているのは, Ghostscript 5.10/5.50 のバグのため */
- floatp xscale, yscale;
-
- xscale = fabs(igs->ctm.xx);
- yscale = fabs(igs->ctm.xy);
-
- if (xscale == 0 || yscale > xscale) /* if portrait */
- width = ceil(width * yscale);
- else
- width = ceil(width * xscale);
-#endif
-
- if (width < 1) width = 1;
-
- /* ESC/Page では線幅/終端/接合部の設定は1つのコマンドになっているため保持しておく。 */
- pdev -> lwidth = width;
-
- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG",
- (int)(pdev -> lwidth),
- (int)(pdev -> cap),
- (int)(pdev -> join));
- lputs(s, obuf);
-
- return 0;
-}
-
-
-private int
-escv_setlinecap(gx_device_vector * vdev, gs_line_cap cap)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *const pdev = (gx_device_escv *) vdev;
- char obuf[64];
-
- /* ESC/Page では線幅/終端/接合部の設定は1つのコマンドになっているため保持しておく。 */
- pdev -> cap = cap;
-
- if (pdev -> cap >= 3) return -1;
-
- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG",
- (int)(pdev -> lwidth),
- (int)(pdev -> cap),
- (int)(pdev -> join));
- lputs(s, obuf);
-
- return 0;
-}
-
-
-private int
-escv_setlinejoin(gx_device_vector * vdev, gs_line_join join)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *const pdev = (gx_device_escv *) vdev;
- char obuf[64];
-
- /* ESC/Page では線幅/終端/接合部の設定は1つのコマンドになっているため保持しておく。 */
- switch (join) {
- case 0:
- pdev -> join = 3; /* miter */
- break;
- case 1:
- pdev -> join = 1; /* round */
- break;
- case 2:
- pdev -> join = 2; /* bevel */
- break;
- default:
- return -1;
- }
-
- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG",
- (int)(pdev -> lwidth),
- (int)(pdev -> cap),
- (int)(pdev -> join));
- lputs(s, obuf);
-
- return 0;
-}
-
-
-private int
-escv_setmiterlimit(gx_device_vector * vdev, floatp limit)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *const pdev = (gx_device_escv *) vdev;
- char obuf[128];
-
- /* マイターリミット値を設定するには lwG にて 接合部指定(n3) が 3 になっている
- ** 必要がある。
- */
- if (pdev -> join != 3) {
- /* 強制的に接合部指定を行う */
- pdev -> join = 3;
- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG",
- (int)(pdev -> lwidth),
- (int)(pdev -> cap),
- (int)(pdev -> join));
- lputs(s, obuf);
- }
-
- (void)sprintf(obuf, ESC_GS "1;%dmlG", (int)limit);
- lputs(s, obuf);
-
- return 0;
-}
-
-
-#if ( 8 <= GS_VERSION_MAJOR )
-private bool
-escv_can_handle_hl_color(gx_device_vector * vdev, const gs_imager_state * pis,
- const gx_drawing_color * pdc)
-{
- return false;
-}
-#endif
-
-
-private int
-escv_setfillcolor(gx_device_vector * vdev,
-#if ( 8 <= GS_VERSION_MAJOR )
- const gs_imager_state * pis,
-#endif
- const gx_drawing_color * pdc)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *const pdev = (gx_device_escv *) vdev;
- gx_color_index color = gx_dc_pure_color(pdc);
- char obuf[64];
-
- if (!gx_dc_is_pure(pdc)) return_error(gs_error_rangecheck);
- pdev->current_color = color;
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- (void)sprintf(obuf, /*ESC_GS "1owE"*/ ESC_GS "0;0;100spE" ESC_GS "1;0;%ldccE" ,color);
- lputs(s, obuf);
-
- if (vdev->x_pixels_per_inch == 1200) {
- lputs(s, ESC_GS "1;45;156htmE");
- } else if (vdev->x_pixels_per_inch == 600) {
- lputs(s, ESC_GS "1;45;106htmE");
- } else {
- lputs(s, ESC_GS "1;45;71htmE");
- }
-
- } else { /* ESC/Page-Color */
-
-
- /* パターンON指定/ソリッドパターン指定 */
- (void)sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE",
- (unsigned char)(color >> 16 & 0xff),
- (unsigned char)(color >> 8 & 0xff),
- (unsigned char)(color & 0xff));
- lputs(s, obuf);
- lputs(s, ESC_GS "3;2;1;0;0cpE" ESC_GS "1;2;1;0;0cpE" ESC_GS "5;2;1;0;0cpE");
-
- } /* ESC/Page-Color */
-
- return 0;
-}
-
-
-private int
-escv_setstrokecolor(gx_device_vector * vdev,
-#if ( 8 <= GS_VERSION_MAJOR )
- const gs_imager_state * pis,
-#endif
- const gx_drawing_color * pdc)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *const pdev = (gx_device_escv *) vdev;
- gx_color_index color = gx_dc_pure_color(pdc);
- char obuf[64];
-
- if (!gx_dc_is_pure(pdc)) return_error(gs_error_rangecheck);
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- pdev->current_color = color;
-
- (void)sprintf(obuf, /*ESC_GS "1owE"*/ ESC_GS "0;0;100spE" ESC_GS "1;1;%ldccE" , color);
- lputs(s, obuf);
-
- if (vdev->x_pixels_per_inch == 1200) {
- lputs(s, ESC_GS "1;45;156htmE");
- } else if (vdev->x_pixels_per_inch == 600) {
- lputs(s, ESC_GS "1;45;106htmE");
- } else {
- lputs(s, ESC_GS "1;45;71htmE");
- }
-
- } else { /* ESC/Page-Color */
-
- if (vdev->color_info.depth == 24) {
-
- pdev->current_color = color;
- /* パターンON色指定/ソリッドパターン指定 */
- (void)sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE" ESC_GS "2;2;1;0;0cpE",
- (unsigned char)(color >> 16 & 0xff),
- (unsigned char)(color >> 8 & 0xff),
- (unsigned char)(color & 0xff));
- lputs(s, obuf);
-
- }
- } /* ESC/Page-Color */
-
- return 0;
-}
-
-
-/* 線種指定命令 */
-private int
-escv_setdash(gx_device_vector * vdev, const float *pattern, uint count, floatp offset)
-{
- stream *s = gdev_vector_stream(vdev);
- int i;
- char obuf[64];
-
-#if GS_VERSION_MAJOR == 5
- float scale, xscale, yscale;
- /* Scale を掛けているのは, Ghostscript 5.10/5.50 のバグのため */
- xscale = fabs(igs->ctm.xx);
- yscale = fabs(igs->ctm.xy);
-
- if (xscale == 0) /* if portrait */
- scale = yscale;
- else
- scale = xscale;
-#endif
-
- if (count == 0){
- /* 実線 */
- lputs(s, ESC_GS "0;0lpG");
- return 0;
- }
-
- /* offset が0以外の場合は描画不可として返却 */
- if (offset != 0) return -1;
-
- if (count) {
- if (count == 1) {
-#if GS_VERSION_MAJOR == 5
- (void)sprintf(obuf, ESC_GS "1;%d;%ddlG",
- (int)(pattern[0] * scale / vdev->x_pixels_per_inch + 0.5),
- (int)(pattern[0] * scale / vdev->x_pixels_per_inch + 0.5));
-#else
- (void)sprintf(obuf, ESC_GS "1;%d;%ddlG", pattern[0], pattern[0]);
-#endif
- lputs(s, obuf);
- } else {
- /* pattern に0があった場合は描画不可として返却 */
- for (i = 0; i < count; ++i) {
- if (pattern[i] == 0) return -1;
- }
-
- lputs(s, ESC_GS "1");
- for (i = 0; i < count; ++i) {
-#if GS_VERSION_MAJOR == 5
- (void)sprintf(obuf, ";%d", (int)(pattern[i] * scale / vdev->x_pixels_per_inch + 0.5));
-
-#else
- (void)sprintf(obuf, ";%d", pattern[i]);
-#endif
- lputs(s, obuf);
- }
- lputs(s, "dlG");
- }
- lputs(s, ESC_GS "1;1lpG");
- }
- return 0;
-}
-
-
-/* パス平滑度指定 */
-private int
-escv_setflat(gx_device_vector * vdev, floatp flatness)
-{
- return 0;
-}
-
-
-private int
-escv_setlogop(gx_device_vector * vdev, gs_logical_operation_t lop,
- gs_logical_operation_t diff)
-{
- /****** SHOULD AT LEAST DETECT SET-0 & SET-1 ******/
- return 0;
-}
-
-
-private int
-escv_beginpath(gx_device_vector * vdev, gx_path_type_t type)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *pdev = (gx_device_escv *) vdev;
-
- /* パス構築開始命令 */
- if (type & gx_path_type_clip) {
- lputs(s, ESC_GS "1bgpG"); /* クリップ登録 */
- } else {
- lputs(s, ESC_GS "0bgpG"); /* 描画登録 */
- }
- pdev->ispath = 0;
-
- return 0;
-}
-
-
-private int
-escv_moveto(gx_device_vector * vdev,
- floatp x0, floatp y0, floatp x1, floatp y1, gx_path_type_t type)
-{
- stream *s = gdev_vector_stream(vdev);
- char obuf[64];
-
- /* サブパス開始命令 */
- (void)sprintf(obuf, ESC_GS "0;%d;%dmvpG", (int)x1, (int)y1);
- lputs(s, obuf);
-
- return 0;
-}
-
-
-private int
-escv_lineto(gx_device_vector * vdev,
- floatp x0, floatp y0, floatp x1, floatp y1, gx_path_type_t type)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *pdev = (gx_device_escv *) vdev;
- char obuf[64];
-
- (void)sprintf(obuf, ESC_GS "0;1;%d;%dlnpG", (int)x1, (int)y1);
- lputs(s, obuf);
- pdev->ispath = 1;
-
- return 0;
-}
-
-
-private int
-escv_curveto(gx_device_vector * vdev, floatp x0, floatp y0,
- floatp x1, floatp y1, floatp x2, floatp y2, floatp x3, floatp y3,
- gx_path_type_t type)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *pdev = (gx_device_escv *) vdev;
- char obuf[128];
-
- /* ベジェ曲線 */
- (void)sprintf(obuf, ESC_GS "0;3;%d;%d;%d;%d;%d;%dbzpG",
- (int)x1, (int)y1, (int)x2, (int)y2, (int)x3, (int)y3);
- lputs(s, obuf);
- pdev->ispath = 1;
-
- return 0;
-}
-
-
-private int
-escv_closepath(gx_device_vector * vdev, floatp x, floatp y,
- floatp x_start, floatp y_start, gx_path_type_t type)
-{
- stream *s = gdev_vector_stream(vdev);
-
- lputs(s, ESC_GS "clpG");
- return 0;
-}
-
-
-private int
-escv_endpath(gx_device_vector * vdev, gx_path_type_t type)
-{
- stream *s = gdev_vector_stream(vdev);
- gx_device_escv *pdev = (gx_device_escv *) vdev;
-
- if (type & gx_path_type_fill || type & gx_path_type_clip) {
- /* default で処理されるが出力しておく */
- lputs(s, ESC_GS "clpG");
- }
-
- /* パスクローズ */
- lputs(s, ESC_GS "enpG");
-
- /* パス描画 */
- if (type & gx_path_type_clip) {
-
- if ( ( 0 != ESCV_FORCEDRAWPATH ) || ( 0 != pdev->ispath ) ) {
- /* クリップ指定
- ** クリップにも gx_path_type_winding_number, gx_path_type_even_odd の判断が
- ** 必要だと思うが gs 側が付加してこない。
- ** とりあえず gx_path_type_even_odd をデフォルトにする。
- */
- lputs(s, ESC_GS "1;2capG");
- }
- } else if (type & gx_path_type_fill) {
-
- /* 塗りつぶし規則設定 */
- if (type & gx_path_type_even_odd) {
- lputs(s, ESC_GS "0;2drpG"); /* 塗りつぶし描画 */
- } else {
- lputs(s, ESC_GS "0;1drpG"); /* 塗りつぶし描画 */
- }
- } else {
- lputs(s, ESC_GS "0;0drpG"); /* 輪郭線描画 */
- }
-
- return 0;
-}
-
-/* ---------------- Driver procedures ---------------- */
-
-/* ------ Open/close/page ------ */
-
-/* Open the device. */
-private int
-escv_open(gx_device * dev)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- int code;
- /* char *error, *path;*/
- float width, height;
-
- code = escv_range_check(dev);
- if (code < 0) return code;
-
- vdev->v_memory = dev->memory;
- /****** VERY WRONG ******/
- vdev->vec_procs = &escv_vector_procs;
-
- code = gdev_vector_open_file_bbox(vdev, 512, true);
- if (code < 0) return code;
-
- gdev_vector_init(vdev);
- pdev->first_page = true;
-
- if(pdev->orientation){
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- pdev->Margins[1] = (pdev->width - pdev->height - \
- ESCPAGE_LEFT_MARGIN_DEFAULT * vdev->x_pixels_per_inch / 72.0) * \
- X_DPI / vdev->x_pixels_per_inch;
-
- } else { /* ESC/Page-Color */
-
- /* pdev->Margins[1] = pdev->width - pdev->height + dev->HWMargins[0];
- */
- pdev->Margins[1] = (pdev->width - pdev->height) * \
- X_DPI / vdev->x_pixels_per_inch;
-
- } /* ESC/Page-Color */
-
- width = dev->MediaSize[0];
- height = dev->MediaSize[1];
- dev->MediaSize[0] = height;
- dev->MediaSize[1] = width;
- }
-
- return 0;
-}
-
-
-/* Wrap up ("output") a page. */
-private int
-escv_output_page(gx_device * dev, int num_copies, int flush)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- stream *s = gdev_vector_stream(vdev);
-
- /* 線幅,終端処理,接合部処理を初期化しておく */
- lputs(s, ESC_GS "3;0;0lwG" ESC_GS "1;10mlG" ESC_FF);
-
- sflush(s);
- vdev->in_page = false;
- pdev->first_page = false;
-
- gdev_vector_reset(vdev);
-
- return 0;
-}
-
-
-private int
-escv_close(gx_device *dev)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- FILE *f = vdev->file;
-
- /* 終了処理コードは決め打ち */
- (void)fprintf(f, ESC_GS "rhE" "\033\001@EJL \012@EJL EJ \012\033\001@EJL \012");
-
- gdev_vector_close_file(vdev);
-
- return 0;
-}
-
-/* Close the device. */
-/* Note that if this is being called as a result of finalization, */
-/* the stream may no longer exist; but the file will still be open. */
-
-/* ---------------- Get/put parameters ---------------- */
-
-
-private int
-escv_get_str_param( gs_param_list * plist, gs_param_name key, gs_param_string *pgsstr, int code )
-{
- int ncode;
-
- ncode = param_write_string(plist, key, pgsstr);
-
- if ( ncode < 0)
- code = ncode;
-
- return code;
-}
-
-/* Get parameters. */
-private int
-escv_get_params(gx_device * dev, gs_param_list * plist)
-{
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- int code;
- int ncode;
-
- code = gdev_vector_get_params(dev, plist);
- if (code < 0) return code;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_MANUALFEED, &pdev->manualFeed)) < 0)
- code = ncode;
-
- if ((ncode = param_write_int(plist, ESCPAGE_OPTION_CASSETFEED, &pdev->cassetFeed)) < 0)
- code = ncode;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_RIT, &pdev->RITOff)) < 0)
- code = ncode;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_COLLATE, &pdev->Collate)) < 0)
- code = ncode;
-
- if ((ncode = param_write_int(plist, ESCPAGE_OPTION_TONERDENSITY, &pdev->toner_density)) < 0)
- code = ncode;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_LANDSCAPE, &pdev->orientation)) < 0)
- code = ncode;
-
- if ( param_write_bool(plist, ESCPAGE_OPTION_TONERSAVING, &pdev->toner_saving)< 0)
- code = ncode;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_DUPLEX, &pdev->Duplex)) < 0)
- code = ncode;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_DUPLEX_TUMBLE, &pdev->Tumble)) < 0)
- code = ncode;
-
- if ((ncode = param_write_bool(plist, ESCPAGE_OPTION_FACEUP, &pdev->faceup)) < 0)
- code = ncode;
-
- if ((ncode = param_write_int(plist, ESCPAGE_OPTION_MEDIATYPE, &pdev->MediaType)) < 0)
- code = ncode;
-
- code = escv_get_str_param( plist, ESCPAGE_OPTION_JOBID, &pdev->gpsJobID, code );
- code = escv_get_str_param( plist, ESCPAGE_OPTION_USERNAME, &pdev->gpsUserName, code );
- code = escv_get_str_param( plist, ESCPAGE_OPTION_HOSTNAME, &pdev->gpsHostName, code );
- code = escv_get_str_param( plist, ESCPAGE_OPTION_DOCUMENT, &pdev->gpsDocument, code );
- code = escv_get_str_param( plist, ESCPAGE_OPTION_COMMENT, &pdev->gpsComment, code );
-
- return code;
-}
-
-
-private int
-escv_set_str_param( gs_param_list * plist, const char * key, char *strvalue, int bufmax, int ecode )
-{
- gs_param_name param_name;
- gs_param_string gsstr;
- int code;
- int writesize = bufmax;
-
- switch (code = param_read_string(plist, (param_name = key), &gsstr)) {
- case 0:
- writesize = ( bufmax < gsstr.size )? bufmax : gsstr.size ;
- strncpy( strvalue, gsstr.data, writesize );
- strvalue[ writesize ] = '\0';
- break;
- default:
- ecode = code;
- param_signal_error(plist, param_name, ecode);
- case 1:
- break;
- }
- return ecode;
-}
-
-/* Put parameters. */
-private int
-escv_put_params(gx_device * dev, gs_param_list * plist)
-{
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- int ecode = 0;
- int code;
- gs_param_name param_name;
- gs_param_string pmedia;
- bool mf = pdev->manualFeed;
- int cass = pdev->cassetFeed;
- bool tum = pdev->Tumble;
- bool collate = pdev->Collate;
- int toner_density = pdev->toner_density;
- bool toner_saving = pdev->toner_saving;
- bool landscape = pdev->orientation;
- bool faceup = pdev->faceup;
- bool duplex = pdev->Duplex;
- bool RITOff = pdev->RITOff;
- int old_bpp = dev->color_info.depth;
- int bpp = 0;
-
- ecode = escv_set_str_param( plist, ESCPAGE_OPTION_JOBID, pdev->JobID, ESCPAGE_JOBID_MAX, ecode );
- ecode = escv_set_str_param( plist, ESCPAGE_OPTION_USERNAME, pdev->UserName, ESCPAGE_USERNAME_MAX, ecode );
- ecode = escv_set_str_param( plist, ESCPAGE_OPTION_HOSTNAME, pdev->HostName, ESCPAGE_HOSTNAME_MAX, ecode );
- ecode = escv_set_str_param( plist, ESCPAGE_OPTION_DOCUMENT, pdev->Document, ESCPAGE_DOCUMENT_MAX, ecode );
- ecode = escv_set_str_param( plist, ESCPAGE_OPTION_COMMENT, pdev->Comment, ESCPAGE_COMMENT_MAX, ecode );
-
- if ((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_MANUALFEED), &mf)) < 0) {
- param_signal_error(plist, param_name, ecode = code);
- }
- switch (code = param_read_int(plist, (param_name = ESCPAGE_OPTION_CASSETFEED), &cass)) {
- case 0:
- if (cass < -1 || cass > 15)
- ecode = gs_error_limitcheck;
- else
- break;
- goto casse;
- default:
- ecode = code;
- casse:param_signal_error(plist, param_name, ecode);
- case 1:
- break;
- }
-
- if((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_COLLATE), &collate)) < 0) {
- param_signal_error(plist, param_name, ecode = code);
- }
-
- if ((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_RIT), &RITOff)) < 0) {
- param_signal_error(plist, param_name, ecode = code);
- }
-
- switch (code = param_read_string(plist, (param_name = ESCPAGE_OPTION_MEDIATYPE), &pmedia)) {
- case 0:
- if (pmedia.size > ESCPAGE_MEDIACHAR_MAX)
- ecode = gs_error_limitcheck;
- else { /* Check the validity of ``MediaType'' characters */
-
- if (strcmp(pmedia.data, "TRANS") == 0) {
- pdev->MediaType = 2;
- } else if (strcmp(pmedia.data, "THICK") == 0) {
- pdev->MediaType = 1;
- } else {
- ecode = gs_error_rangecheck;
- goto pmediae;
- }
- }
- break;
- goto pmediae;
- default:
- ecode = code;
- pmediae:param_signal_error(plist, param_name, ecode);
- case 1:
- if(!pdev->MediaType){
- pdev->MediaType = 0;
- pmedia.data = 0;
- }
- break;
- }
-
- switch (code = param_read_int(plist,
- (param_name = ESCPAGE_OPTION_TONERDENSITY), &toner_density)) {
- case 0:
- if (toner_density < 0 || toner_density > 5)
- ecode = gs_error_rangecheck;
- else
- break;
- goto tden;
- default:
- ecode = code;
- tden:
- param_signal_error(plist, param_name, ecode);
- case 1:
- break;
- }
-
- switch (code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_TONERSAVING), &toner_saving)) {
- case 0:
- break;
- default:
- if ((code = param_read_null(plist, param_name)) == 0) {
- break;
- }
- ecode = code;
- param_signal_error(plist, param_name, ecode);
- case 1:
- break;
- }
-
- if ((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_DUPLEX), &duplex)) < 0)
- param_signal_error(plist, param_name, ecode = code);
-
- if ((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_DUPLEX_TUMBLE), &tum)) < 0)
- param_signal_error(plist, param_name, ecode = code);
-
- if ((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_LANDSCAPE), &landscape)) < 0)
- param_signal_error(plist, param_name, ecode = code);
-
- if ((code = param_read_bool(plist, (param_name = ESCPAGE_OPTION_FACEUP), &faceup)) < 0) {
- param_signal_error(plist, param_name, ecode = code);
- }
-
-
- switch (code = param_read_int(plist, (param_name = "BitsPerPixel"), &bpp)) {
- case 0:
- if (bpp != 8 && bpp != 24)
- ecode = gs_error_rangecheck;
- else
- break;
- goto bppe;
- default:
- ecode = code;
- bppe:param_signal_error(plist, param_name, ecode);
- case 1:
- break;
- }
-
- if (bpp != 0) {
- dev->color_info.depth = bpp;
- dev->color_info.num_components = ((bpp == 8) ? 1 : 3);
- dev->color_info.max_gray = (bpp > 8 ? 255 : 1000);
- dev->color_info.max_color = (bpp > 8 ? 255 : 1000);
- dev->color_info.dither_grays = (bpp > 8 ? 256 : 5);
- dev->color_info.dither_colors = (bpp > 8 ? 256 : 2);
- dev_proc(pdev, map_rgb_color) = ((bpp == 8) ? gx_default_gray_map_rgb_color : gx_default_rgb_map_rgb_color);
- dev_proc(pdev, map_color_rgb) = ((bpp == 8) ? gx_default_gray_map_color_rgb : gx_default_rgb_map_color_rgb);
- }
-
- if (ecode < 0) return ecode;
- code = gdev_vector_put_params(dev, plist);
- if (code < 0) return code;
-
- pdev->manualFeed = mf;
- pdev->cassetFeed = cass;
- pdev->faceup = faceup;
- pdev->RITOff = RITOff;
- pdev->orientation = landscape;
- pdev->toner_density = toner_density;
- pdev->toner_saving = toner_saving;
- pdev->Collate = collate;
- pdev->Duplex = duplex;
- pdev->Tumble = tum;
-
- if (bpp != 0 && bpp != old_bpp && pdev->is_open)
- return gs_closedevice(dev);
-
- return 0;
-}
-
-/* ---------------- Images ---------------- */
-
-
-private int
-escv_copy_mono(gx_device * dev, const byte * data,
- int data_x, int raster, gx_bitmap_id id, int x, int y, int w, int h,
- gx_color_index zero, gx_color_index one)
-{
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- stream *s = gdev_vector_stream(vdev);
- gx_drawing_color color;
- int code = 0;
- gx_color_index c_color = 0;
- char obuf[128];
- int depth = 1;
-#if ( 8 <= GS_VERSION_MAJOR )
- /* FIXME! add for gs815 */
- const gs_imager_state * pis = (const gs_imager_state *)0;
-#endif
-
- if (id != gs_no_id && zero == gx_no_color_index && one != gx_no_color_index && data_x == 0) {
- gx_drawing_color dcolor;
-
- color_set_pure(&dcolor, one);
- escv_setfillcolor(vdev,
-#if ( 8 <= GS_VERSION_MAJOR )
- pis,
-#endif
- &dcolor); /* FIXME! gs815 */
- }
-
- if (zero == gx_no_color_index) {
-
- if (one == gx_no_color_index) return 0;
- if (pdev->MaskState != 1) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- /* lputs(s, ESC_GS "1owE");*/
- (void)sprintf(obuf, ESC_GS "1;1;%ldccE", c_color);
- lputs(s, obuf);
-
- if (vdev->x_pixels_per_inch == 1200) {
- lputs(s, ESC_GS "1;45;156htmE");
- } else if (vdev->x_pixels_per_inch == 600) {
- lputs(s, ESC_GS "1;45;106htmE");
- } else {
- lputs(s, ESC_GS "1;45;71htmE");
- }
-
- } else { /* ESC/Page-Color */
-
- lputs(s, ESC_GS "2;184wfE" ESC_GS "3;184wfE" ESC_GS "5;184wfE");
-
- } /* ESC/Page-Color */
-
- pdev->MaskState = 1;
- }
- c_color = one;
-
- } else if (one == gx_no_color_index)
- /* 1bit は透明 ビット反転・zero 色に染める */
- {
- if (pdev->MaskState != 1) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- /* lputs(s, ESC_GS "1owE");*/
-
- } else { /* ESC/Page-Color */
-
- lputs(s, ESC_GS "3;184wfE" ESC_GS "5;184wfE");
-
- } /* ESC/Page-Color */
-
- pdev->MaskState = 1;
- }
- c_color = zero;
- } else if (one == vdev->white) {
-
- if (pdev->MaskState != 0) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- /* lputs(s, ESC_GS "1owE");*/
-
- } else { /* ESC/Page-Color */
-
- lputs(s, ESC_GS "3;204wfE" ESC_GS "5;204wfE");
-
- } /* ESC/Page-Color */
-
- pdev->MaskState = 0;
- }
- c_color = zero;
- } else {
-
- if (pdev->MaskState != 1) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- /* lputs(s, ESC_GS "1owE");*/
-
- } else { /* ESC/Page-Color */
-
- lputs(s, ESC_GS "3;184wfE" ESC_GS "5;184wfE");
-
- } /* ESC/Page-Color */
-
- pdev->MaskState = 1;
- }
- color_set_pure(&color, one);
- code = gdev_vector_update_fill_color((gx_device_vector *) pdev,
-#if ( 8 <= GS_VERSION_MAJOR )
- pis,
-#endif
- &color);
-
- /* ここを通過したら以下の色設定は無意味? */
- }
- if (code < 0) return 0;
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
- } else { /* ESC/Page-Color */
-
- /* パターンON指定/ソリッドパターン指定 */
- (void)sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE",
- (unsigned char)(c_color >> 16 & 0xff),
- (unsigned char)(c_color >> 8 & 0xff),
- (unsigned char)(c_color & 0xff));
- lputs(s, obuf);
-
- lputs(s, ESC_GS "5;2;1;0;0cpE");
-
- } /* ESC/Page-Color */
-
- escv_write_begin(dev, depth, (int)x, (int)y, w, h, w, h, 0);
- {
- int i, j;
- uint width_bytes = (w + 7) >> 3;
- uint num_bytes = width_bytes * h;
-
- byte *buf = gs_alloc_bytes(vdev->memory, num_bytes, "escv_copy_mono(buf)");
-
- if (data_x % 8 == 0) {
- for (i = 0; i < h; ++i) {
- memcpy(buf + i * width_bytes, data + (data_x >> 3) + i * raster, width_bytes);
- }
- } else {
- for (i = 0; i < h; ++i) {
- for (j = 0; j < width_bytes; j++) {
- *(buf + i * width_bytes + j) =
- *(data + (data_x >> 3) + i * raster + j) << (data_x % 8) |
- *(data + (data_x >> 3) + i * raster + j + 1) >> (8 - data_x % 8);
- }
- }
- }
-
- escv_write_data(dev, depth, buf, num_bytes, w, h);
- gs_free_object(vdev->memory, buf, "escv_copy_mono(buf)");
- }
- escv_write_end(dev, depth);
- return 0;
-}
-
-
-/* Copy a color bitmap. */
-private int
-escv_copy_color(gx_device * dev,
- const byte * data, int data_x, int raster, gx_bitmap_id id,
- int x, int y, int w, int h)
-{
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- gx_device_vector *const vdev = (gx_device_vector *) dev;
-
- int depth = dev->color_info.depth;
- int num_components = (depth < 24 ? 1 : 3);
- uint width_bytes = w * num_components;
-
- if (pdev->MaskState != 0) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- /* lputs(s, ESC_GS "1owE");*/
-
- } else { /* ESC/Page-Color */
- stream *s = gdev_vector_stream(vdev);
-
- lputs(s, ESC_GS "3;204wfE" ESC_GS "5;204wfE");
-
- } /* ESC/Page-Color */
- pdev->MaskState = 0;
- }
-
- escv_write_begin(dev, depth, (int)x, (int)y, w, h, w, h, 0);
-
- {
- int i;
- uint num_bytes = width_bytes * h;
- byte *buf = gs_alloc_bytes(vdev->memory, num_bytes, "escv_copy_color(buf)");
-
- for (i = 0; i < h; ++i) {
- memcpy(buf + i * width_bytes, data + ((data_x * depth) >> 3) + i * raster, width_bytes);
- }
-
- escv_write_data(dev, depth, buf, num_bytes, w, h);
- gs_free_object(vdev->memory, buf, "escv_copy_color(buf)");
- }
-
- escv_write_end(dev, depth);
- return 0;
-}
-
-
-/* Fill a mask. */
-private int
-escv_fill_mask(gx_device * dev,
- const byte * data, int data_x, int raster, gx_bitmap_id id,
- int x, int y, int w, int h,
- const gx_drawing_color * pdcolor, int depth,
- gs_logical_operation_t lop, const gx_clip_path * pcpath)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- stream *s = gdev_vector_stream(vdev);
-
- gx_color_index color = gx_dc_pure_color(pdcolor);
- char obuf[64];
-
-#if ( 8 <= GS_VERSION_MAJOR )
- /* FIXME! add for gs815 */
- const gs_imager_state * pis = (const gs_imager_state *)0;
-#endif
-
- if (w <= 0 || h <= 0) return 0;
-
- if (depth > 1 ||
- gdev_vector_update_fill_color(vdev,
-#if ( 8 <= GS_VERSION_MAJOR )
- pis,
-#endif
- pdcolor) < 0 ||
- gdev_vector_update_clip_path(vdev, pcpath) < 0 ||
- gdev_vector_update_log_op(vdev, lop) < 0
- )
- return gx_default_fill_mask(dev, data, data_x, raster, id,
- x, y, w, h, pdcolor, depth, lop, pcpath);
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- if (!gx_dc_is_pure(pdcolor)) return_error(gs_error_rangecheck);
- pdev->current_color = color;
-
- (void)sprintf(obuf, ESC_GS "0;0;100spE" ESC_GS "1;1;%ldccE" ,color);
- lputs(s, obuf);
-
-
- if (vdev->x_pixels_per_inch == 1200) {
- lputs(s, ESC_GS "1;45;156htmE");
- } else if (vdev->x_pixels_per_inch == 600) {
- lputs(s, ESC_GS "1;45;106htmE");
- } else {
- lputs(s, ESC_GS "1;45;71htmE");
- }
-
- if(pdev->MaskState != 1) {
- /* lputs(s, ESC_GS "1owE");*/
- pdev->MaskState = 1;
- }
-
- } else { /* ESC/Page-Color */
-
- if (pdev->MaskState != 1) {
-
- lputs(s, ESC_GS "3;184wfE" ESC_GS "5;184wfE");
- pdev->MaskState = 1;
- }
-
- if (id != gs_no_id && data_x == 0 && depth == 1) {
- char obuf[128];
- int i;
- uint width_bytes = (w + 7) >> 3;
- uint num_bytes = width_bytes * h;
- byte *buf;
-
- if (pdev -> id_cache[id & VCACHE] != id) {
-
- buf = gs_alloc_bytes(vdev->memory, num_bytes, "escv_fill_mask(buf)");
-
- /* cache entry */
- for (i = 0; i < h; ++i) {
- memcpy(buf + i * width_bytes, data + (data_x >> 3) + i * raster, width_bytes);
- }
-
- (void)sprintf(obuf, ESC_GS "%d;%d;%d;%d;0db{F", num_bytes, (int)(id & VCACHE), w, h);
- lputs(s, obuf);
- put_bytes(s, buf, num_bytes);
-
- gs_free_object(vdev->memory, buf, "escv_fill_mask(buf)");
- pdev -> id_cache[id & VCACHE] = id;
- }
-
- (void)sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y);
- lputs(s, obuf);
- (void)sprintf(obuf, ESC_GS "%lddbF", id & VCACHE);
- lputs(s, obuf);
-
- return 0;
- }
- } /* ESC/Page-Color */
-
- escv_write_begin(dev, depth, (int)x, (int)y, w, h, w, h, 0);
- {
- int i;
- uint width_bytes = (w + 7) >> 3;
- uint num_bytes = width_bytes * h;
- byte *buf = gs_alloc_bytes(vdev->memory, num_bytes, "escv_fill_mask(buf)");
-
- for (i = 0; i < h; ++i) {
- memcpy(buf + i * width_bytes, data + (data_x >> 3) + i * raster, width_bytes);
- }
-
- escv_write_data(dev, depth, buf, num_bytes, w, h);
- escv_write_end(dev, depth);
- gs_free_object(vdev->memory, buf, "escv_fill_mask(buf)");
- }
-
- return 0;
-}
-
-/* ---------------- High-level images ---------------- */
-
-private image_enum_proc_plane_data(escv_image_plane_data);
-private image_enum_proc_end_image(escv_image_end_image);
-private const gx_image_enum_procs_t escv_image_enum_procs =
- {
- escv_image_plane_data, escv_image_end_image
- };
-
-
-/* Start processing an image. */
-private int
-escv_begin_image(gx_device * dev,
- const gs_imager_state * pis, const gs_image_t * pim,
- gs_image_format_t format, const gs_int_rect * prect,
- const gx_drawing_color * pdcolor, const gx_clip_path * pcpath,
- gs_memory_t * mem, gx_image_enum_common_t **pinfo)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- stream *s = gdev_vector_stream((gx_device_vector *) pdev);
- gdev_vector_image_enum_t *pie =
- gs_alloc_struct(mem, gdev_vector_image_enum_t, &st_vector_image_enum, "escv_begin_image");
- const gs_color_space *pcs = pim->ColorSpace;
- gs_color_space_index index;
- int num_components = 1;
- bool can_do = prect == 0 &&
- (pim->format == gs_image_format_chunky ||
- pim->format == gs_image_format_component_planar);
-
- gs_matrix imat;
- int code;
- int ty, bx, by, cx, cy, dx, dy, sx, sy;
-
- gx_color_index color = gx_dc_pure_color(pdcolor);
- char obuf[128];
-
- if (pie == 0) return_error(gs_error_VMerror);
- pie->memory = mem;
- code = gdev_vector_begin_image(vdev, pis, pim, format, prect,
- pdcolor, pcpath, mem, &escv_image_enum_procs, pie);
- if (code < 0) return code;
-
- *pinfo = (gx_image_enum_common_t *) pie;
-
- if (!pim->ImageMask) {
- index = gs_color_space_get_index(pcs);
- num_components = gs_color_space_num_components(pcs);
-
- if (pim->CombineWithColor) {
- can_do = false;
- } else {
- switch (index) {
- case gs_color_space_index_DeviceGray:
- if ((pim->Decode[0] != 0 || pim->Decode[1] != 1)
- && (pim->Decode[0] != 1 || pim->Decode[1] != 0))
- can_do = false;
- break;
- case gs_color_space_index_DeviceRGB:
- if (pim->Decode[0] != 0 || pim->Decode[1] != 1 ||
- pim->Decode[2] != 0 || pim->Decode[3] != 1 ||
- pim->Decode[4] != 0)
- can_do = false;
- break;
- default:
- can_do = false;
- }
- }
- }
- if (!can_do) {
- return gx_default_begin_image(dev, pis, pim, format, prect,
- pdcolor, pcpath, mem, &pie->default_info);
- }
-
- if (pim->ImageMask || (pim->BitsPerComponent == 1 && num_components == 1)) {
- if (pim->Decode[0] > pim->Decode[1]) {
- pdev->MaskReverse = 1;
- } else {
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
- } else { /* ESC/Page-Color */
- lputs(s, ESC_GS "8;1;2;2;2plr{E");
- put_bytes(s, "\000\000\000\000\377\377\377\377", 8);
- } /* ESC/Page-Color */
- pdev->MaskReverse = 0;
- }
- }
-
- /* Write the image/colorimage/imagemask preamble. */
- gs_matrix_invert(&pim->ImageMatrix, &imat);
- gs_matrix_multiply(&imat, &ctm_only(pis), &imat);
-
- ty = imat.ty;
- bx = imat.xx * pim->Width + imat.yx * pim->Height + imat.tx;
- by = imat.xy * pim->Width + imat.yy * pim->Height + imat.ty;
- cx = imat.yx * pim->Height + imat.tx;
- cy = imat.yy * pim->Height + imat.ty;
- dx = imat.xx * pim->Width + imat.tx;
- dy = imat.xy * pim->Width + imat.ty;
-
- sx = bx - (int)imat.tx;
- sy = by - (int)imat.ty;
-
- /* とりあえず絵の位置に収まるように強制的に座標を変更する。 */
- pdev -> roll = 0;
- pdev -> reverse_x = pdev -> reverse_y = 0;
- if (imat.tx > bx) {
- pdev -> reverse_x = 1;
- sx = -sx;
- imat.tx = bx;
- }
-
- if (imat.ty > by) {
- pdev -> reverse_y = 1;
- sy = -sy;
- imat.ty = by;
- }
-
- (void)memcpy(&pdev -> xmat, &imat, sizeof(gs_matrix));
- pdev -> sx = sx;
- pdev -> sy = sy;
- pdev -> h = pim->Height;
- pdev -> w = pim->Width;
- pdev -> dd = 0;
- pdev -> bx = 0;
- pdev -> by = 0;
-
- if (ty == cy) {
- /* 回転時の描画については現在未実装。GS 側の機能を使用する */
- return -1;
- }
-
- if (pim->ImageMask) {
- pdev->ncomp = 1;
-
- /* 描画論理設定命令 - 透過 */
- if (pdev->MaskState != 1) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- /* lputs(s, ESC_GS "1owE");*/
- (void)sprintf(obuf, ESC_GS "1;1;%ldccE", color);
- lputs(s, obuf);
-
- if (vdev->x_pixels_per_inch == 1200) {
- lputs(s, ESC_GS "1;45;156htmE");
- } else if (vdev->x_pixels_per_inch == 600) {
- lputs(s, ESC_GS "1;45;106htmE");
- } else {
- lputs(s, ESC_GS "1;45;71htmE");
- }
-
- } else { /* ESC/Page-Color */
-
- lputs(s, ESC_GS "3;184wfE" ESC_GS "5;184wfE");
- pdev->MaskState = 1;
-
- } /* ESC/Page-Color */
-
- }
-
- } else {
-
- /* 描画論理設定命令 - 白塗り */
- if (pdev->MaskState != 0) {
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
- /* lputs(s, ESC_GS "1owE");*/ /* 184->204 */
- } else { /* ESC/Page-Color */
- lputs(s, ESC_GS "3;204wfE" ESC_GS "5;204wfE");
- } /* ESC/Page-Color */
-
- pdev->MaskState = 0;
- }
- pdev->ncomp = num_components;
- }
-
- if (pdev -> reverse_y) return 0;
-
- escv_write_begin(dev, pie->bits_per_pixel, (int)imat.tx, (int)imat.ty, pie->width, pie->height, sx, sy, pdev -> roll);
-
- return 0;
-}
-
-
-/* Process the next piece of an image. */
-private int
-#if GS_VERSION_MAJOR >= 6
-escv_image_plane_data(gx_image_enum_common_t *info, const gx_image_plane_t *planes, int height, int *rows_used)
-#else
- escv_image_plane_data(gx_device *dev, gx_image_enum_common_t *info, const gx_image_plane_t *planes, int height)
-#endif
-{
-#if GS_VERSION_MAJOR >= 6
- gx_device *dev = info->dev;
-#endif
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- gdev_vector_image_enum_t *pie = (gdev_vector_image_enum_t *) info;
-
- int y;
- int plane;
- int width_bytes, tbyte;
- byte *buf;
-
- if (pie->default_info) return gx_image_plane_data(pie->default_info, planes, height);
-
- gx_image_plane_data(pie->bbox_info, planes, height);
-
- {
-
-#if GS_VERSION_MAJOR >= 6
- if (height == 260)
- height = 1;
-#endif
- width_bytes = (pie->width * pie->bits_per_pixel / pdev->ncomp + 7) / 8 * pdev->ncomp;
- tbyte = width_bytes * height;
- buf = gs_alloc_bytes(vdev->memory, tbyte, "escv_image_data(buf)");
-
- if (pdev -> reverse_y) {
-
- if (pdev -> h == height) {
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- if(tbyte == 1){
- if(strcmp(pdev->dname, "lp1800") != 0 &&
- strcmp(pdev->dname, "lp9600") != 0) {
- pdev->w += pdev->sx / 2048;
- height += pdev->sy / 2048;
- }
- }
-
- } else { /* ESC/Page-Color */
-
- if(tbyte == 1){
- pdev->w += pdev->sx / 2048;
- height += pdev->sy / 2048;
- }
-
- } /* ESC/Page-Color */
-
-
- escv_write_begin(dev, pie->bits_per_pixel, (int)pdev -> xmat.tx, (int)pdev -> xmat.ty, pdev -> w, height, (int)pdev -> sx, (int)pdev -> sy, pdev -> roll);
-
- } else {
- float yy, sy;
-
- yy = (pdev -> h * pdev->xmat.yy) - (pdev -> dd * pdev -> xmat.yy) - (height * pdev -> xmat.yy);
- if (yy == 0) {
- yy = (pdev -> h * pdev->xmat.yx) - (pdev -> dd * pdev -> xmat.yx) - (height * pdev -> xmat.yx);
- }
-
- if (pdev -> by) {
- sy = (int)pdev -> xmat.ty - (int)yy;
- sy = pdev -> by - (int)sy;
- } else {
- sy = height * pdev -> xmat.yy + 0.5;
- }
- if (sy < 0) {
- sy = -sy;
- }
-
- escv_write_begin(dev, pie->bits_per_pixel, (int)pdev -> xmat.tx, (int)pdev -> xmat.ty - (int)yy, pdev -> w, height, (int)pdev -> sx, (int)sy, pdev -> roll);
-
- pdev -> by = (int)pdev -> xmat.ty - (int)yy;
- }
- }
- pdev -> dd += height;
-
- for (plane = 0; plane < pie->num_planes; ++plane) {
-
- for (y = 0; y < height; ++y) {
-
- int bit, w;
- const byte *p;
- byte *d;
- byte c;
-
- p = planes[plane].data + ((planes[plane].data_x * pie->bits_per_pixel) >> 3) + y * planes[plane].raster;
- if (pdev -> reverse_y) {
-
- d = buf + (height - y) * width_bytes;
-
- if (!pdev -> reverse_x) {
- (void)memcpy(buf + (height - y - 1) * width_bytes,
- planes[plane].data + ((planes[plane].data_x * pie->bits_per_pixel) >> 3)
- + y * planes[plane].raster, width_bytes);
-
- }
-
- } else {
-
- d = buf + (y + 1) * width_bytes;
-
- if (!pdev -> reverse_x) {
-
- (void)memcpy(buf + y * width_bytes,
- planes[plane].data + ((planes[plane].data_x * pie->bits_per_pixel) >> 3)
- + y * planes[plane].raster, width_bytes);
-
- }
- }
- if (pdev -> reverse_x) {
- if (pie->bits_per_pixel == 1) {
- for (w = 0; w < width_bytes; w++) {
- c = 0;
- for (bit = 0; bit < 8; bit++) {
- if (*p & 1 << (7 - bit)) {
- c |= 1 << bit;
- }
- }
- p++;
- *--d = c;
- }
- } else if (pie->bits_per_pixel == 8){
- for (w = 0; w < width_bytes; w++) {
- *--d = *p++;
- }
- } else {
- for (w = 0; w < width_bytes / 3; w++) {
- *--d = *(p + 2);
- *--d = *(p + 1);
- *--d = *p;
- p += 3;
- }
- }
- }
- }
- }
-
- if(tbyte == 1){
- int t;
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- gs_free_object(vdev->memory, buf, "escv_image_data(buf)");
- if(strcmp(pdev->dname, "lp1800") == 0 ||
- strcmp(pdev->dname, "lp9600") == 0) {
- if(pdev->sx > pdev->sy){
- height = pdev->sy;
- pdev->w = pdev->sx;
- tbyte = ((pdev->sx + 7) / 8) * pdev->sy;
- } else {
- if(pdev->sx < pdev->sy){
- height = pdev->sy;
- pdev->w = pdev->sx;
- tbyte = ((pdev->sx + 7) / 8) * pdev->sy;
- } else {
- tbyte = 1;
- }
- }
-
- } else {
- if(pdev->sx > pdev->sy){
- tbyte = 1;
- } else {
- if(pdev->sx < pdev->sy){
- tbyte = tbyte * height;
- } else {
- tbyte = 1;
- }
- }
- }
- buf = gs_alloc_bytes(vdev->memory, tbyte, "escv_image_data(buf)");
- for(t = 0; t < tbyte; t++){
- buf[t] = 0xff;
- }
-
- } else { /* ESC/Page-Color */
-
- gs_free_object(vdev->memory, buf, "escv_image_data(buf)");
- if(pdev->sx > pdev->sy){
- tbyte = 1;
- } else {
- if(pdev->sx < pdev->sy){
- tbyte = tbyte * height;
- } else {
- tbyte = 1;
- }
- }
-
- buf = gs_alloc_bytes(vdev->memory, tbyte, "escv_image_data(buf)");
- for(t = 0; t < tbyte; t++){
- buf[t] = 0x00;
- }
-
- } /* ESC/Page-Color */
-
- }
-
- escv_write_data(dev, pie->bits_per_pixel, buf, tbyte, pdev -> w, height);
-
- if (pdev -> reverse_y) {
- escv_write_end(dev, pie->bits_per_pixel);
- }
-
- gs_free_object(vdev->memory, buf, "escv_image_data(buf)");
- }
- return (pie->y += height) >= pie->height;
-}
-
-
-private int
-#if GS_VERSION_MAJOR >= 6
-escv_image_end_image(gx_image_enum_common_t * info, bool draw_last)
-#else
- escv_image_end_image(gx_device *dev, gx_image_enum_common_t * info, bool draw_last)
-#endif
-{
-#if GS_VERSION_MAJOR >= 6
- gx_device *dev = info->dev;
-#endif
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- gdev_vector_image_enum_t *pie = (gdev_vector_image_enum_t *) info;
- int code;
-
- if (!(pdev -> reverse_y)) {
- escv_write_end(dev, pie->bits_per_pixel);
- }
-
- pdev->reverse_x = pdev->reverse_y = 0;
- if (pdev->MaskReverse == 0) {
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
- ;
- } else { /* ESC/Page-Color */
-
- stream *s = gdev_vector_stream((gx_device_vector *)pdev);
-
- lputs(s, ESC_GS "8;1;2;2;2plr{E");
- put_bytes(s, "\377\377\377\377\000\000\000\000", 8);
- } /* ESC/Page-Color */
- }
- pdev->MaskReverse = -1;
-
- code = gdev_vector_end_image(vdev, (gdev_vector_image_enum_t *) pie, draw_last, pdev->white);
- return code;
-}
-
-
-private void escv_write_begin(gx_device *dev, int bits, int x, int y, int sw, int sh, int dw, int dh, int roll)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *)dev;
- stream *s = gdev_vector_stream((gx_device_vector *)dev);
- char obuf[128], *tmp, *p;
- int i, comp;
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- (void)sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y);
- lputs(s, obuf);
-
- comp = 10;
-
- if (bits == 1) {
- if (strcmp(pdev->dname, "lp1800") == 0 ||
- strcmp(pdev->dname, "lp9600") == 0) {
- (void)sprintf(obuf, ESC_GS "0bcI");
- }else{
- (void)sprintf(obuf, ESC_GS "5;%d;%d;%d;%d;%dsrI", sw, sh, dw, dh, roll);
- }
- } else if (bits == 4) {
- if (pdev -> c4map) {
- pdev -> c4map = FALSE;
- }
- (void)sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- } else if (bits == 8) {
- if (pdev -> c8map) {
- pdev -> c8map = FALSE;
- }
- (void)sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- } else {
- /* 24 bit */
- (void)sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- }
-
- } else { /* ESC/Page-Color */
-
- (void)sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y);
- lputs(s, obuf);
-
- comp = 0;
-
- if (bits == 1) {
- (void)sprintf(obuf, ESC_GS "2;201;1;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- } else if (bits == 4) {
- if (pdev -> c4map) {
- /* カラーマップ登録 */
- lputs(s, ESC_GS "64;2;2;16;16plr{E");
- p = tmp = gs_alloc_bytes(vdev->memory, 64, "escv_write_begin(tmp4)");
- for (i = 0; i < 16; i++) {
- *p++ = i << 4;
- *p++ = i << 4;
- *p++ = i << 4;
- *p++ = i << 4;
- }
- put_bytes(s, tmp, 64);
- gs_free_object(vdev->memory, tmp, "escv_write_begin(tmp4)");
- pdev -> c4map = FALSE;
- }
- (void)sprintf(obuf, ESC_GS "2;203;2;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- } else if (bits == 8) {
- if (pdev -> c8map) {
- /* カラーマップ登録 */
- lputs(s, ESC_GS "1024;4;2;256;256plr{E");
- p = tmp = gs_alloc_bytes(vdev->memory, 1024, "escv_write_begin(tmp)");
- for (i = 0; i < 256; i++) {
- *p++ = i;
- *p++ = i;
- *p++ = i;
- *p++ = i;
- }
- put_bytes(s, tmp, 1024);
- gs_free_object(vdev->memory, tmp, "escv_write_begin(tmp)");
- pdev -> c8map = FALSE;
- }
- (void)sprintf(obuf, ESC_GS "2;204;4;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- } else {
- /* 24 bit */
- (void)sprintf(obuf, ESC_GS "2;102;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll);
- }
-
- } /* ESC/Page-Color */
-
- lputs(s, obuf);
-
- return;
-}
-
-
-private void escv_write_data(gx_device *dev, int bits, char *buf, int bsize, int w, int ras)
-{
- gx_device_vector *const vdev = (gx_device_vector *) dev;
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- stream *s = gdev_vector_stream((gx_device_vector *)pdev);
- char obuf[128];
- int size;
- char *tmps, *p;
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- tmps = 0;
-
- if (bits == 12) {
- p = tmps = gs_alloc_bytes(vdev->memory, bsize * 2, "escv_write_data(tmp)");
- for (size = 0; size < bsize; size++) {
- *p++ = buf[size] & 0xF0;
- *p++ = buf[size] << 4;
- }
- bsize = bsize * 2;
- buf = tmps;
- }
-
- if(bits == 4) {
- p = tmps = gs_alloc_bytes(vdev->memory, bsize * 2, "escv_write_data(tmp)");
- for (size = 0; size < bsize; size++) {
- *p++ = ((buf[size] & 0xF0) * 0xFF / 0xF0);
- *p++ = ((buf[size] << 4 & 0xF0) * 0xFF / 0xF0);
- }
- bsize = bsize * 2;
- buf = tmps;
- }
-
-
- if(bits == 1){
- if (strcmp(pdev->dname, "lp1800") == 0 || \
- strcmp(pdev->dname, "lp9600") == 0) {
- (void)sprintf(obuf, ESC_GS "%d;1;%d;%d;0db{I", bsize, w, ras);
- }else{
- (void)sprintf(obuf, ESC_GS "%d;%du{I", bsize, ras);
- }
- }else{
- (void)sprintf(obuf, ESC_GS "%d;%dcu{I", bsize, ras);
- }
- lputs(s, obuf);
-
- put_bytes(s, buf, bsize);
-
- if (bits == 12 || bits == 4) {
- gs_free_object(vdev->memory, tmps, "escv_write_data(tmp)");
- }
-
- } else { /* ESC/Page-Color */
-
- char tmp;
-
- tmps = 0;
- if (bits == 12) {
- p = tmps = gs_alloc_bytes(vdev->memory, bsize * 2, "escv_write_data(tmp)");
- for (size = 0; size < bsize; size++) {
- tmp = buf[size] & 0xF0;
- *p++ = (tmp + (tmp >> 4 & 0x0F));
- tmp = buf[size] << 4;
- *p++ = (tmp + (tmp >> 4 & 0x0F));
- }
- bsize = bsize * 2;
- buf = tmps;
- }
-
- (void)sprintf(obuf, ESC_GS "%d;%dcu{I", bsize, ras);
- lputs(s, obuf);
- put_bytes(s, buf, bsize);
-
- if (bits == 12) {
- gs_free_object(vdev->memory, tmps, "escv_write_data(tmp)");
- }
- } /* ESC/Page-Color */
-
- return;
-}
-
-
-private void escv_write_end(gx_device *dev, int bits)
-{
- gx_device_escv *const pdev = (gx_device_escv *) dev;
- stream *s = gdev_vector_stream((gx_device_vector *)pdev);
-
- if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */
-
- if(bits == 1){
- if (strcmp(pdev->dname, "lp1800") == 0 || \
- strcmp(pdev->dname, "lp9600") == 0) {
- lputs(s, ESC_GS "1dbI");
- } else {
- lputs(s, ESC_GS "erI");
- }
- }else{
- lputs(s, ESC_GS "ecrI");
- }
-
- } else { /* ESC/Page-Color */
-
- lputs(s, ESC_GS "ecrI");
-
- } /* ESC/Page-Color */
-
- return;
-}
-
-/* end of file */