📄 gdevijs-krgb-1.0.patch
字号:
diff -uNr old/gdevijs.c new/gdevijs.c--- old/gdevijs.c 2004-01-22 11:45:52.000000000 -0800+++ new/gdevijs.c 2004-02-10 11:33:16.000000000 -0800@@ -29,15 +29,25 @@ * 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+ * (c) 2003-2004 Copyright Hewlett-Packard Development Company, LP+ *+ * 1. Removed hpijs 1.0-1.0.2 workarounds, use hpijs 1.0.3 or higher.+ * 2. Added krgb support.+ * */ #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,@@ -53,6 +63,14 @@ private dev_proc_get_params(gsijs_get_params); private dev_proc_put_params(gsijs_put_params); +/* 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 = prn_color_params_procs(gsijs_open, gsijs_output_page, gsijs_close, gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb,@@ -85,6 +103,14 @@ IjsClientCtx *ctx; int ijs_version;++ /* Additional parameters for krgb support. */+ int krgb_mode; /* 0=false, 1=true */+ 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. */@@ -112,7 +138,12 @@ FALSE, /* Tumble_set */ NULL, /* IjsClient *ctx */- 0 /* ijs_version */+ 0, /* ijs_version */+ 0, /* krgb_mode */+ 0, /* k_path */+ 0, /* k_width */+ 0, /* k_band_size */+ NULL /* k_band buffer */ }; @@ -128,12 +159,234 @@ /**************************************************************************/ -/* ------ Private definitions ------ */+/* ---------------- 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=ijsdev->k_band+(raster*y)+(x >> 3);+ int dest_start_bit = x & 7;+ int i,j,w1;++ if (h <= 0 || w <= 0)+ return 0;++ if ((x+w) > ijsdev->k_width)+ w1 = ijsdev->k_width - x; + else+ w1 = w;++ /* 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<w1; i++)+ dest[(dest_start_bit+i)>>3] |= 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<w1; i++)+ dest[(dest_start_bit+i)>>3] &= ~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 h, 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) + {+ /* 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=ijsdev->k_band+(raster*y)+(x >> 3);+ register const unsigned char *scan=data+(dx >> 3);+ int dest_start_bit = x & 7;+ int scan_start_bit = dx & 7;+ int i;+ + if (h <= 0 || w <= 0)+ return 0;++ while (h-- > 0)+ {+ for (i=0; i<w; i++)+ {+ if (scan[(scan_start_bit+i)>>3] & xmask[(scan_start_bit+i)&7])+ dest[(dest_start_bit+i)>>3] |= xmask[(dest_start_bit+i)&7];+ }+ scan+=draster;+ dest+=raster;+ }+ return 0; + }++ return (*ijsdev->prn_procs.copy_mono)(dev, data, dx, draster, id, x, y, w, h, 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; -/* 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+ 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 code = gx_default_create_buf_device(pbdev, target, render_plane, mem, for_band);+ if (code < 0)+ 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. Return value: 0=false, 1=true. */+private int+gsijs_set_krgb_mode(gx_device_ijs *ijsdev)+{+ char buf[256];+ int n_chan = ijsdev->color_info.num_components;+ int code;++ 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)+ return 0; /* no krgb support */++ return 1; /* krgb is supported */+}++/* ------ Private definitions ------ */ private int gsijs_parse_wxh (const char *val, int size, double *pw, double *ph)@@ -171,34 +424,6 @@ } /**- * gsijs_set_generic_params_hpijs: Set generic IJS parameters.- *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -