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

📄 gdevijs-krgb-1.0.patch

📁 HP喷墨打印机驱动代码 HP内部资料! 珍贵 珍贵 珍贵
💻 PATCH
📖 第 1 页 / 共 2 页
字号:
- * 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@@ -209,9 +434,6 @@     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++) {@@ -252,68 +474,6 @@ }  /**- * 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@@ -324,9 +484,6 @@     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++) {@@ -493,12 +650,18 @@     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.@@ -513,6 +676,8 @@     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.@@ -572,6 +737,9 @@     if (code >= 0) 	code = gsijs_set_margin_params(ijsdev); +    if (code >= 0)+        ijsdev->krgb_mode = gsijs_set_krgb_mode(ijsdev);+     return code; }; @@ -631,21 +799,6 @@     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.  */@@ -656,8 +809,9 @@     gx_device_printer *pdev = (gx_device_printer *)dev;     int raster = gdev_prn_raster(pdev);     int ijs_width, ijs_height;-    int row_bytes;+    int row_bytes, k_row_bytes=0;     int n_chan = pdev->color_info.num_components;+    int krgb_mode = ijsdev->krgb_mode;     unsigned char *data;     char buf[256];     double xres = pdev->HWResolution[0];@@ -673,13 +827,23 @@      /* 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(ijsdev->k_band_size, 1, "gsijs_output_page")) == (unsigned char *)NULL)+           return gs_note_error(gs_error_VMerror);+    }+     /* Required page parameters */     sprintf(buf, "%d", n_chan);     gsijs_client_set_param(ijsdev, "NumChan", buf);@@ -688,44 +852,71 @@      /* This needs to become more sophisticated for DeviceN. */     strcpy(buf, (n_chan == 4) ? "DeviceCMYK" : -	((n_chan == 3) ? "DeviceRGB" : "DeviceGray"));+	((n_chan == 3) ? (krgb_mode ? "KRGB" : "DeviceRGB") : "DeviceGray"));     gsijs_client_set_param(ijsdev, "ColorSpace", 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, "%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++) {-	    code = gdev_prn_get_bits(pdev, y, data, &actual_data);-	    if (code < 0)-		break;+            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; -	    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;+            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;+	    } 	} 	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(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 ?@@ -1029,7 +1220,6 @@ 	dprintf2("ijs: Can't set parameter %s=%s\n", key, value);     return code; }-   private int gsijs_set_color_format(gx_device_ijs *ijsdev)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -