⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdevijs-krgb-1.0.patch

📁 HP喷墨打印机驱动代码 HP内部资料! 珍贵 珍贵 珍贵
💻 PATCH
📖 第 1 页 / 共 2 页
字号:
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 + -