/* retrieve the current pcl state and initialize pcl */ static int pxPassthrough_init(px_state_t * pxs) { int code; if (gs_debug_c('i')) dmprintf(pxs->memory, "passthrough: initializing global pcl state\n"); global_pcs = pcl_get_gstate(pxs->pcls); /* default to pcl5c */ global_pcs->personality = 0; /* for now we do not support intepolation in XL passthrough mode. */ global_pcs->interpolate = false; /* we don't see a nice way to support the following options with passthrough at this time (NB) */ global_pcs->page_set_on_command_line = false; global_pcs->res_set_on_command_line = false; global_pcs->high_level_device = false; { char buf[100]; int ret; stream_cursor_read r; ret = gs_sprintf(buf, "@PJL SET PAPERLENGTH = %d\n@PJL SET PAPERWIDTH = %d\n", (int)(pxs->media_dims.y * 10 + .5), (int)(pxs->media_dims.x * 10 + .5)); r.ptr = (byte *) buf - 1; r.limit = (byte *) buf + ret - 1; pjl_proc_process(pxs->pjls, &r); } /* do an initial reset to set up a permanent reset. The motivation here is to avoid tracking down a slew of memory leaks */ global_pcs->xfm_state.paper_size = pcl_get_default_paper(global_pcs); pcl_do_resets(global_pcs, pcl_reset_initial); pcl_do_resets(global_pcs, pcl_reset_permanent); /* initialize pcl and install xl's page device in pcl's state */ pcl_init_state(global_pcs, pxs->memory); code = gs_setdevice_no_erase(global_pcs->pgs, gs_currentdevice(pxs->pgs)); if (code < 0) return code; /* yet another reset with the new page device */ global_pcs->xfm_state.paper_size = pcl_get_default_paper(global_pcs); pcl_do_resets(global_pcs, pcl_reset_initial); /* set the parser state and initialize the pcl parser */ global_pcl_parser_state.definitions = global_pcs->pcl_commands; global_pcl_parser_state.hpgl_parser_state = &global_gl_parser_state; pcl_process_init(&global_pcl_parser_state); /* default 600 to match XL allow PCL to override */ global_pcs->uom_cp = 7200L / 600L; gs_setgray(global_pcs->pgs, 0); return 0; }
int pcl_do_printer_reset(pcl_state_t *pcs) { if ( pcs->macro_level ) return e_Range; /* not allowed inside macro */ /* reset the other parser in case we have gotten the pcl_printer_reset while in gl/2 mode. */ pcl_implicit_gl2_finish(pcs); /* Print any partial page if not pclxl snippet mode. */ if (pcs->end_page == pcl_end_page_top) { int code = pcl_end_page_if_marked(pcs); if ( code < 0 ) return code; /* if duplex start on the front side of the paper */ if ( pcs->duplex ) put_param1_bool(pcs, "FirstSide", true); } /* unload fonts */ /* Reset to user default state. */ return pcl_do_resets(pcs, pcl_reset_printer); }
void pxpcl_release(void) { if (global_pcs) { if (gs_debug_c('i')) dmprintf(global_pcs->memory, "passthrough: releasing global pcl state\n"); pcl_grestore(global_pcs); gs_grestore_only(global_pcs->pgs); gs_nulldevice(global_pcs->pgs); pcl_do_resets(global_pcs, pcl_reset_permanent); global_pcs->end_page = pcl_end_page_top; /* pcl_end_page handling */ pxpcl_pagestatereset(); global_pcs = NULL; global_this_pass_contiguous = false; global_pass_first = true; global_char_angle = 0; global_char_shear.x = 0; global_char_shear.y = 0; global_char_scale.x = 1.0; global_char_scale.y = 1.0; global_char_bold_value = 0.0; } }