📄 gdevijs-krgb-1.0.patch
字号:
- * 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 + -