summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRalph Giles <ralph.giles@artifex.com>2007-05-09 03:21:39 +0000
committerRalph Giles <ralph.giles@artifex.com>2007-05-09 03:21:39 +0000
commitb82990a55f2a745a47cb65916d597e6f527f9e84 (patch)
tree6058f0e6a4bba36f66605c6ce1282cf9d1e4e55c
parent034d7fdc2e9de3cc96c3298b481924c0eae61b48 (diff)
downloadghostpdl-b82990a55f2a745a47cb65916d597e6f527f9e84.tar.gz
Temporarily revert the KRGB support patch for the IJS device. There
were some build problems, and also there's a known segfault in some situations. This will be worked on after the 8.57 release. git-svn-id: http://svn.ghostscript.com/ghostscript/trunk@7931 a1074d23-0009-0410-80fe-cf8c14f379e6
-rw-r--r--gs/src/gdevijs.c571
1 files changed, 143 insertions, 428 deletions
diff --git a/gs/src/gdevijs.c b/gs/src/gdevijs.c
index 51b09709b..cad14bd32 100644
--- a/gs/src/gdevijs.c
+++ b/gs/src/gdevijs.c
@@ -23,52 +23,15 @@
* which is a security risk, since any program can be run.
* You should use -dSAFER which sets .LockSafetyParams to true
* before opening this device.
- *
- * 11/26/03 David Suffield (gdevijs-krgb-1.0.patch)
- *
- * 1. Removed hpijs 1.0-1.0.2 workarounds, use hpijs 1.0.3 or higher.
- * 2. Added krgb support.
- *
- * 02/21/05 David Suffield (gdevijs-krgb-1.1.patch)
- * 1. Fixed segfault issue with 1-bit color space.
- * 2. Fixed z-order issue with colored text on black rectangle.
- *
- * 02/22/06 David Suffield (gdevijs-krgb-1.2.patch)
- * 1. Fixed krgb buffer overflow issue with out-of-band data in fill_rectangle and copy_mono.
- * This buffer overflow condition occurred with fullbleed print jobs that had k-band images.
- * 2. Added Dan Coby (artifex) fix for gsijs_read_string_malloc gs_free *str memory leak.
- *
- * 06/02/06 David Suffield (gdevijs-krgb-1.3.patch)
- * 1. Revisited the krgb buffer overflow issue with out-of-band data in fill_rectangle and
- * copy_mono. Changed the fill_rectangle and copy_mono to an inner loop buffer check
- * instead of a outer loop x/y extent check.
- * 2. As requested by Ralph Giles, added K 1-bit and 8-bit support for krgb, but only 1-bit is
- * implemented for now.
- *
- * KRGB definition:
- * 1. K=1-bit or 8-bit black plane, RGB=24 bit color raster.
- * 2. K-plane will only contain objects that are black text and black line drawings.
- * 3. RGB raster will not contain K-plane objects.
- * 4. K resolution and RGB resolution will be equal.
- * 5. K-plane will be byte aligned.
- * 6. K-plane 1-bit definition; 1=black, 0=nothing (KRGB).
- * 7. K-plane 8-bit definition; 255=black, 0=nothing (KxRGB).
- *
- * 06/06/06 David Suffield (gdevijs-krgb-1.4.patch)
- * 1. Removed Hewlett-Packard Copyright as per Ghostscript request.
- *
*/
#include "unistd_.h" /* for dup() */
#include <stdlib.h>
-#include <fcntl.h>
#include "gdevprn.h"
#include "gp.h"
#include "ijs.h"
#include "ijs_client.h"
-//#define KRGB_DEBUG
-
/* This should go into gdevprn.h, or, better yet, gdevprn should
acquire an API for changing resolution. */
int gdev_prn_maybe_realloc_memory(gx_device_printer *pdev,
@@ -86,14 +49,6 @@ private dev_proc_get_params(gsijs_get_params);
private dev_proc_put_params(gsijs_put_params);
private dev_proc_finish_copydevice(gsijs_finish_copydevice);
-/* Following definitions are for krgb support. */
-private dev_proc_create_buf_device(gsijs_create_buf_device);
-private dev_proc_fill_rectangle(gsijs_fill_rectangle);
-private dev_proc_copy_mono(gsijs_copy_mono);
-private dev_proc_fill_mask(gsijs_fill_mask);
-private dev_proc_fill_path(gsijs_fill_path);
-private dev_proc_stroke_path(gsijs_stroke_path);
-
private const gx_device_procs gsijs_procs = {
gsijs_open,
NULL, /* get_initial_matrix */
@@ -168,15 +123,6 @@ struct gx_device_ijs_s {
IjsClientCtx *ctx;
int ijs_version;
-
- /* Additional parameters for krgb support. */
- int krgb_mode; /* 0=false, 1=true */
- int k_bits; /* number of bits in k plane, 1 or 8 */
- int k_path; /* k plane path, 0=false, 1=true */
- int k_width; /* k plane width in pixels */
- int k_band_size; /* k plane buffer size in bytes, byte aligned */
- unsigned char *k_band; /* k plane buffer */
- gx_device_procs prn_procs; /* banding playback procedures */
};
#define DEFAULT_DPI 74 /* See gsijs_set_resolution() below. */
@@ -204,13 +150,7 @@ gx_device_ijs gs_ijs_device =
FALSE, /* Tumble_set */
NULL, /* IjsClient *ctx */
- 0, /* ijs_version */
- 0, /* krgb_mode */
- 0, /* k_bits */
- 0, /* k_path */
- 0, /* k_width */
- 0, /* k_band_size */
- NULL /* k_band buffer */
+ 0 /* ijs_version */
};
@@ -226,300 +166,13 @@ private int gsijs_read_string(gs_param_list * plist, gs_param_name pname,
/**************************************************************************/
-/* ---------------- Low-level graphic procedures ---------------- */
-
-static unsigned char xmask[] =
-{
- 0x80, /* x=0 */
- 0x40, /* 1 */
- 0x20, /* 2 */
- 0x10, /* 3 */
- 0x08, /* 4 */
- 0x04, /* 5 */
- 0x02, /* 6 */
- 0x01 /* 7 */
-};
-
-private int gsijs_fill_rectangle(gx_device * dev, int x, int y, int w, int h,
- gx_color_index color)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
-
- if (ijsdev->krgb_mode && ijsdev->k_path && y >= 0 && x >= 0)
- {
- int raster = (ijsdev->k_width+7) >> 3;
- register unsigned char *dest;
- int dest_start_bit;
- int band_height = ijsdev->k_band_size/raster;
- int i,j;
- unsigned char *beg = ijsdev->k_band;
- unsigned char *end = ijsdev->k_band+ijsdev->k_band_size;
- unsigned char *p;
-
- if (h <= 0 || w <= 0)
- return 0;
-
- /* Check for out-of-band graphic. */
- if (x >= ijsdev->k_width || y >= band_height)
- return 0; /* out-of-band */
-
- dest_start_bit = x & 7;
- dest=ijsdev->k_band+(raster*y)+(x >> 3);
-
- /* Note x,y orgin 0,0 is stored first byte 0 left to right. */
-
- if (color==0x0)
- {
- /* Color is black, store in k plane band instead of regular band. */
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- p = &dest[(dest_start_bit+i)>>3];
- if (p >= beg && p <= end)
- *p |= xmask[(dest_start_bit+i)&7];
- }
- dest+=raster;
- }
- return 0;
- }
- else
- {
- /* Color is not black, remove any k plane bits for z-order dependencies, store in regular band. */
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- p = &dest[(dest_start_bit+i)>>3];
- if (p >= beg && p <= end)
- *p &= ~xmask[(dest_start_bit+i)&7];
- }
- dest+=raster;
- }
- }
- }
-
- return (*ijsdev->prn_procs.fill_rectangle)(dev, x, y, w, h, color);
-}
-
-private int gsijs_copy_mono(gx_device * dev, const byte * data,
- int dx, int draster, gx_bitmap_id id,
- int x, int y, int w, int height, gx_color_index zero, gx_color_index one)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
-
- // if (ijsdev->krgb_mode && ijsdev->k_path && one==0x0)
- if (ijsdev->krgb_mode && ijsdev->k_path)
- {
- /* Store in k plane band instead of regular band. */
- int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */
- register unsigned char *dest;
- register const unsigned char *scan;
- int dest_start_bit;
- int scan_start_bit;
- int band_height = ijsdev->k_band_size/raster;
- int i,h=height;
- unsigned char *beg = ijsdev->k_band;
- unsigned char *end = ijsdev->k_band+ijsdev->k_band_size;
- unsigned char *p;
-
- if (h <= 0 || w <= 0)
- return 0;
-
- /* Check for out-of-band graphic. */
- if (x >= ijsdev->k_width || y >= band_height)
- return 0; /* out-of-band */
-
- scan=data+(dx >> 3);
- dest_start_bit = x & 7;
- scan_start_bit = dx & 7;
- dest=ijsdev->k_band+(raster*y)+(x >> 3);
-
- if (one==0x0)
- {
- /* Color is black, store in k plane band instead of regular band. */
- while (h-- > 0)
- {
- for (i=0; i<w; i++)
- {
- if (scan[(scan_start_bit+i)>>3] & xmask[(scan_start_bit+i)&7])
- {
- p = &dest[(dest_start_bit+i)>>3];
- if (p >= beg && p <= end)
- *p |= xmask[(dest_start_bit+i)&7];
- }
- }
- scan+=draster;
- dest+=raster;
- }
- return 0;
- }
- else
- {
- /* Color is not black, remove any k plane bits for z-order dependencies, store in regular band. */
- while (h-- > 0)
- {
- for (i=0; i<w; i++)
- {
- if (scan[(scan_start_bit+i)>>3] & xmask[(scan_start_bit+i)&7])
- {
- p = &dest[(dest_start_bit+i)>>3];
- if (p >= beg && p <= end)
- *p &= ~xmask[(dest_start_bit+i)&7];
- }
- }
- scan+=draster;
- dest+=raster;
- }
- }
- }
-
- return (*ijsdev->prn_procs.copy_mono)(dev, data, dx, draster, id, x, y, w, height, zero, one);
-}
-
-/* ---------------- High-level graphic procedures ---------------- */
-
-private int gsijs_fill_mask(gx_device * dev,
- const byte * data, int dx, 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_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
- int code;
-
- ijsdev->k_path = 1;
-
- code = (*ijsdev->prn_procs.fill_mask)(dev, data, dx, raster, id, x, y, w, h, pdcolor, depth, lop, pcpath);
-
- ijsdev->k_path = 0;
-
- return code;
-}
-
-private int gsijs_fill_path(gx_device * dev, const gs_imager_state * pis,
- gx_path * ppath, const gx_fill_params * params,
- const gx_drawing_color * pdcolor,
- const gx_clip_path * pcpath)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
- int code;
-
- ijsdev->k_path = 1;
-
- code = (*ijsdev->prn_procs.fill_path)(dev, pis, ppath, params, pdcolor, pcpath);
-
- ijsdev->k_path = 0;
-
- return 0;
-}
-
-private int gsijs_stroke_path(gx_device * dev, const gs_imager_state * pis,
- gx_path * ppath, const gx_stroke_params * params,
- const gx_drawing_color * pdcolor,
- const gx_clip_path * pcpath)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)((gx_device_forward *)dev)->target;
- int code;
-
- ijsdev->k_path = 1;
-
- code = (*ijsdev->prn_procs.stroke_path)(dev, pis, ppath, params, pdcolor, pcpath);
-
- ijsdev->k_path = 0;
-
- return code;
-}
-
-/* ---------------- krgb banding playback procedures ---------------- */
-
-private int gsijs_get_bits(gx_device_printer * pdev, int y, byte * str, byte ** actual_data)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)pdev;
- gx_device_clist_common *cdev = (gx_device_clist_common *)pdev;
- int band_height = cdev->page_info.band_params.BandHeight;
- int band_number = y/band_height;
- int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */
- int y1=raster*(y-(band_height*band_number));
-
- if (y1 == 0)
- {
- /* First raster for band, clear k_band. Banding playback occurs on first raster. */
- memset(ijsdev->k_band, 0, ijsdev->k_band_size);
- }
-
- return gdev_prn_get_bits(pdev, y, str, actual_data); /* get raster from regular band */
-}
-
-private int gsijs_k_get_bits(gx_device_printer * pdev, int y, byte ** actual_data)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)pdev;
- gx_device_clist_common *cdev = (gx_device_clist_common *)pdev;
- int band_height = cdev->page_info.band_params.BandHeight;
- int band_number = y/band_height;
- int raster = (ijsdev->k_width+7) >> 3; /* raster width in bytes, byte aligned */
- int y1=raster*(y-(band_height*band_number));
-
- *actual_data = ijsdev->k_band+y1;
-
- return 0;
-}
-
-private int gsijs_create_buf_device(gx_device **pbdev, gx_device *target,
- const gx_render_plane_t *render_plane, gs_memory_t *mem, bool for_band)
-{
- gx_device_ijs *ijsdev = (gx_device_ijs *)target;
- int n_chan = ijsdev->color_info.num_components;
- int code = gx_default_create_buf_device(pbdev, target, render_plane, mem, for_band);
- if (code < 0 || n_chan != 3)
- return code;
-
- /* Save buffer (vector) procedures so that we can hook them during banding playback. */
- ijsdev->prn_procs = (*pbdev)->procs;
-
- /* Replace buffer procedures with krgb procedures. */
- set_dev_proc(*pbdev, fill_rectangle, gsijs_fill_rectangle);
- set_dev_proc(*pbdev, copy_mono, gsijs_copy_mono);
- set_dev_proc(*pbdev, fill_mask, gsijs_fill_mask);
- set_dev_proc(*pbdev, fill_path, gsijs_fill_path);
- set_dev_proc(*pbdev, stroke_path, gsijs_stroke_path);
-
- return code;
-}
-
-/* See if IJS server supports krgb. */
-private int
-gsijs_set_krgb_mode(gx_device_ijs *ijsdev)
-{
- char buf[256];
- int n_chan = ijsdev->color_info.num_components;
- int code;
-
- ijsdev->krgb_mode = 0; /* default is no krgb */
-
- if (n_chan != 3)
- return 0; /* no krgb support, not RGB colorspace */
-
- buf[0] = 0;
- code = ijs_client_enum_param(ijsdev->ctx, 0, "ColorSpace", buf, sizeof(buf)-1);
- if (code >= 0)
- buf[code] = 0;
- if (strstr(buf, "KRGB") != NULL)
- {
- ijsdev->krgb_mode = 1; /* yes KRGB is supported */
- ijsdev->k_bits = 1; /* KRGB = 1x8x8x8 */
- }
- else if (strstr(buf, "KxRGB") != NULL)
- {
- ijsdev->krgb_mode = 1; /* yes KRGB is supported */
- ijsdev->k_bits = 8; /* KRGB = 8x8x8x8 */
- }
-
- return 0;
-}
-
/* ------ Private definitions ------ */
+/* Versions 1.0 through 1.0.2 of hpijs report IJS version 0.29, and
+ require some workarounds. When more up-to-date hpijs versions
+ become ubiquitous, all these workarounds should be removed. */
+#define HPIJS_1_0_VERSION 29
+
private int
gsijs_parse_wxh (const char *val, int size, double *pw, double *ph)
{
@@ -556,6 +209,34 @@ gsijs_parse_wxh (const char *val, int size, double *pw, double *ph)
}
/**
+ * gsijs_set_generic_params_hpijs: Set generic IJS parameters.
+ *
+ * This version is specialized for hpijs 1.0 through 1.0.2, and
+ * accommodates a number of quirks.
+ **/
+private int
+gsijs_set_generic_params_hpijs(gx_device_ijs *ijsdev)
+{
+ char buf[256];
+ int code = 0;
+
+ /* IjsParams, Duplex, and Tumble get set at this point because
+ they may affect margins. */
+ if (ijsdev->IjsParams) {
+ code = gsijs_client_set_param(ijsdev, "IjsParams", ijsdev->IjsParams);
+ }
+
+ if (code == 0 && ijsdev->Duplex_set) {
+ int duplex_val;
+
+ duplex_val = ijsdev->Duplex ? (ijsdev->IjsTumble ? 1 : 2) : 0;
+ sprintf (buf, "%d", duplex_val);
+ code = gsijs_client_set_param(ijsdev, "Duplex", buf);
+ }
+ return code;
+}
+
+/**
* gsijs_set_generic_params: Set generic IJS parameters.
**/
private int
@@ -566,6 +247,9 @@ gsijs_set_generic_params(gx_device_ijs *ijsdev)
int i, j;
char *value;
+ if (ijsdev->ijs_version == HPIJS_1_0_VERSION)
+ return gsijs_set_generic_params_hpijs(ijsdev);
+
/* Split IjsParams into separate parameters and send to ijs server */
value = NULL;
for (i=0, j=0; (j < ijsdev->IjsParams_size) && (i < sizeof(buf)-1); j++) {
@@ -606,6 +290,68 @@ gsijs_set_generic_params(gx_device_ijs *ijsdev)
}
/**
+ * gsijs_set_margin_params_hpijs: Do margin negotiation with IJS server.
+ *
+ * This version is specialized for hpijs 1.0 through 1.0.2, and
+ * accommodates a number of quirks.
+ **/
+private int
+gsijs_set_margin_params_hpijs(gx_device_ijs *ijsdev)
+{
+ char buf[256];
+ int code = 0;
+
+ if (code == 0) {
+ sprintf(buf, "%d", ijsdev->width);
+ code = gsijs_client_set_param(ijsdev, "Width", buf);
+ }
+ if (code == 0) {
+ sprintf(buf, "%d", ijsdev->height);
+ code = gsijs_client_set_param(ijsdev, "Height", buf);
+ }
+
+ if (code == 0) {
+ double printable_width, printable_height;
+ double printable_left, printable_top;
+ float m[4];
+
+ code = ijs_client_get_param(ijsdev->ctx, 0, "PrintableArea",
+ buf, sizeof(buf));
+ if (code == IJS_EUNKPARAM)
+ /* IJS server doesn't support margin negotiations.
+ That's ok. */
+ return 0;
+ else if (code >= 0) {
+ code = gsijs_parse_wxh(buf, code,
+ &printable_width, &printable_height);
+ }
+
+ if (code == 0) {
+ code = ijs_client_get_param(ijsdev->ctx, 0, "PrintableTopLeft",
+ buf, sizeof(buf));
+ if (code == IJS_EUNKPARAM)
+ return 0;
+ else if (code >= 0) {
+ code = gsijs_parse_wxh(buf, code,
+ &printable_left, &printable_top);
+ }
+ }
+
+ if (code == 0) {
+ m[0] = printable_left;
+ m[1] = ijsdev->MediaSize[1] * (1.0 / 72) -
+ printable_top - printable_height;
+ m[2] = ijsdev->MediaSize[0] * (1.0 / 72) -
+ printable_left - printable_width;
+ m[3] = printable_top;
+ gx_device_set_margins((gx_device *)ijsdev, m, true);
+ }
+ }
+
+ return code;
+}
+
+/**
* gsijs_set_margin_params: Do margin negotiation with IJS server.
**/
private int
@@ -616,6 +362,9 @@ gsijs_set_margin_params(gx_device_ijs *ijsdev)
int i, j;
char *value;
+ if (ijsdev->ijs_version == HPIJS_1_0_VERSION)
+ return gsijs_set_margin_params_hpijs(ijsdev);
+
/* Split IjsParams into separate parameters and send to ijs server */
value = NULL;
for (i=0, j=0; (j < ijsdev->IjsParams_size) && (i < sizeof(buf)-1); j++) {
@@ -782,18 +531,12 @@ gsijs_open(gx_device *dev)
char buf[256];
bool use_outputfd;
int fd = -1;
- long max_bitmap = ijsdev->space_params.MaxBitmap;
if (strlen(ijsdev->IjsServer) == 0) {
eprintf("ijs server not specified\n");
return gs_note_error(gs_error_ioerror);
}
- ijsdev->space_params.MaxBitmap = 0; /* force banding */
-
- /* Set create_buf_device in printer device, so that we can hook the banding playback procedures. */
- ijsdev->printer_procs.buf_procs.create_buf_device = gsijs_create_buf_device;
-
/* Decide whether to use OutputFile or OutputFD. Note: how to
determine this is a tricky question, so we just allow the
user to set it.
@@ -808,8 +551,6 @@ gsijs_open(gx_device *dev)
if (code < 0)
return code;
- ijsdev->space_params.MaxBitmap = max_bitmap;
-
if (use_outputfd) {
/* Note: dup() may not be portable to all interesting IJS
platforms. In that case, this branch should be #ifdef'ed out.
@@ -869,9 +610,6 @@ gsijs_open(gx_device *dev)
if (code >= 0)
code = gsijs_set_margin_params(ijsdev);
- if (code >= 0)
- code = gsijs_set_krgb_mode(ijsdev);
-
return code;
}
@@ -952,6 +690,21 @@ gsijs_raster_width(gx_device *pdev)
return min(width, end);
}
+private int ijs_all_white(unsigned char *data, int size)
+{
+ int clean = 1;
+ int i;
+ for (i = 0; i < size; i++)
+ {
+ if (data[i] != 0xFF)
+ {
+ clean = 0;
+ break;
+ }
+ }
+ return clean;
+}
+
/* Print a page. Don't use normal printer gdev_prn_output_page
* because it opens the output file.
*/
@@ -962,10 +715,8 @@ gsijs_output_page(gx_device *dev, int num_copies, int flush)
gx_device_printer *pdev = (gx_device_printer *)dev;
int raster = gdev_prn_raster(pdev);
int ijs_width, ijs_height;
- int row_bytes, k_row_bytes=0;
+ int row_bytes;
int n_chan = pdev->color_info.num_components;
- int krgb_mode = ijsdev->krgb_mode;
- int k_bits = ijsdev->k_bits;
unsigned char *data;
char buf[256];
double xres = pdev->HWResolution[0];
@@ -981,22 +732,12 @@ gsijs_output_page(gx_device *dev, int num_copies, int flush)
/* Determine bitmap width and height */
ijs_height = gdev_prn_print_scan_lines(dev);
+ if (ijsdev->ijs_version == HPIJS_1_0_VERSION) {
+ ijs_width = pdev->width;
+ } else {
ijs_width = gsijs_raster_width(dev);
-
- row_bytes = (ijs_width * pdev->color_info.depth + 7) >> 3;
-
- if (krgb_mode)
- {
- gx_device_clist_common *cdev = (gx_device_clist_common *)dev;
- int band_height = cdev->page_info.band_params.BandHeight;
- k_row_bytes = (ijs_width + 7) >> 3;
-
- /* Create banding buffer for k plane. */
- ijsdev->k_width = ijs_width;
- ijsdev->k_band_size = band_height * k_row_bytes;
- if ((ijsdev->k_band = gs_malloc(pdev->memory, ijsdev->k_band_size, 1, "gsijs_output_page")) == (unsigned char *)NULL)
- return gs_note_error(gs_error_VMerror);
}
+ row_bytes = (ijs_width * pdev->color_info.depth + 7) >> 3;
/* Required page parameters */
sprintf(buf, "%d", n_chan);
@@ -1006,71 +747,44 @@ gsijs_output_page(gx_device *dev, int num_copies, int flush)
/* This needs to become more sophisticated for DeviceN. */
strcpy(buf, (n_chan == 4) ? "DeviceCMYK" :
- ((n_chan == 3) ? (krgb_mode ? ((k_bits == 1) ? "KRGB" : "KxRGB") : "DeviceRGB") : "DeviceGray"));
+ ((n_chan == 3) ? "DeviceRGB" : "DeviceGray"));
gsijs_client_set_param(ijsdev, "ColorSpace", buf);
- sprintf(buf, "%d", ijs_width);
- gsijs_client_set_param(ijsdev, "Width", buf);
- sprintf(buf, "%d", ijs_height);
- gsijs_client_set_param(ijsdev, "Height", buf);
+ /* If hpijs 1.0, don't set width and height here, because it
+ expects them to be the paper size. */
+ if (ijsdev->ijs_version != HPIJS_1_0_VERSION) {
+ sprintf(buf, "%d", ijs_width);
+ gsijs_client_set_param(ijsdev, "Width", buf);
+ sprintf(buf, "%d", ijs_height);
+ gsijs_client_set_param(ijsdev, "Height", buf);
+ }
sprintf(buf, "%gx%g", xres, yres);
gsijs_client_set_param(ijsdev, "Dpi", buf);
-#ifdef KRGB_DEBUG
- int kfd, rgbfd;
- char sz[128];
- kfd = open("/tmp/k.pbm", O_CREAT | O_TRUNC | O_RDWR, 0644);
- rgbfd = open("/tmp/rgb.ppm", O_CREAT | O_TRUNC | O_RDWR, 0644);
- snprintf(sz, sizeof(sz), "P4\n#gdevijs test\n%d\n%d\n", ijs_width, ijs_height);
- write(kfd, sz, strlen(sz));
- snprintf(sz, sizeof(sz), "P6\n#gdevijs test\n%d\n%d\n255\n", ijs_width, ijs_height);
- write(rgbfd, sz, strlen(sz));
-#endif
-
for (i=0; i<num_copies; i++) {
unsigned char *actual_data;
ijs_client_begin_cmd (ijsdev->ctx, IJS_CMD_BEGIN_PAGE);
status = ijs_client_send_cmd_wait(ijsdev->ctx);
for (y = 0; y < ijs_height; y++) {
- if (krgb_mode)
- code = gsijs_get_bits(pdev, y, data, &actual_data);
- else
- code = gdev_prn_get_bits(pdev, y, data, &actual_data);
- if (code < 0)
- break;
-#ifdef KRGB_DEBUG
- write(rgbfd, actual_data, row_bytes);
-#endif
- status = ijs_client_send_data_wait(ijsdev->ctx, 0, (char *)actual_data, row_bytes);
- if (status)
- break;
+ code = gdev_prn_get_bits(pdev, y, data, &actual_data);
+ if (code < 0)
+ break;
- if (krgb_mode) {
- code = gsijs_k_get_bits(pdev, y, &actual_data);
- if (code < 0)
- break;
-#ifdef KRGB_DEBUG
- write(kfd, actual_data, k_row_bytes);
-#endif
- status = ijs_client_send_data_wait(ijsdev->ctx, 0, (char *)actual_data, k_row_bytes);
- if (status)
- break;
- }
+ if (ijsdev->ijs_version == HPIJS_1_0_VERSION &&
+ ijs_all_white(actual_data, row_bytes))
+ status = ijs_client_send_data_wait(ijsdev->ctx, 0, NULL, 0);
+ else
+ status = ijs_client_send_data_wait(ijsdev->ctx, 0,
+ (char *)actual_data, row_bytes);
+ if (status)
+ break;
}
ijs_client_begin_cmd(ijsdev->ctx, IJS_CMD_END_PAGE);
status = ijs_client_send_cmd_wait(ijsdev->ctx);
}
-#ifdef KRGB_DEBUG
- close(kfd);
- close(rgbfd);
-#endif
-
- if(krgb_mode)
- gs_free(pdev->memory, ijsdev->k_band, ijsdev->k_band_size, 1, "gsijs_output_page");
-
gs_free_object(pdev->memory, data, "gsijs_output_page");
endcode = (pdev->buffer_space && !pdev->is_async_renderer ?
@@ -1376,6 +1090,7 @@ gsijs_client_set_param(gx_device_ijs *ijsdev, const char *key,
dprintf2("ijs: Can't set parameter %s=%s\n", key, value);
return code;
}
+
private int
gsijs_set_color_format(gx_device_ijs *ijsdev)