/* * ESC & l <psize_enum> A * * Select paper size */ static int set_page_size(pcl_args_t * pargs, pcl_state_t * pcs) { /* Note: not all values are implemented on all printers. If -g has been given on the command line we use the "Custom" page tag, the height and width are set to the device media values which were filled in when the -g option was processed. */ uint tag = (pcs->page_set_on_command_line ? 101 : uint_arg(pargs)); int i; int code = 0; const pcl_paper_size_t *psize = 0; /* oddly the command goes to the next page irrespective of arguments */ code = pcl_end_page_if_marked(pcs); if (code < 0) return code; pcl_home_cursor(pcs); for (i = 0; i < pcl_paper_type_count; i++) { if (tag == PAPER_SIZES[i].tag) { psize = &(PAPER_SIZES[i].psize); break; } } if ((psize != 0) && ((code = pcl_end_page_if_marked(pcs)) >= 0)) { pcs->xfm_state.print_dir = 0; new_page_size(pcs, psize, false, false); } return code; }
/* * ESC & l <orient> O * * Set logical page orientation. */ static int set_logical_page_orientation(pcl_args_t * pargs, pcl_state_t * pcs) { uint i = uint_arg(pargs); int code; /* the command is ignored if it is value is out of range */ if (i > 3) return 0; /* this command is ignored in pcl xl snippet mode. NB we need a better flag for snippet mode. */ if (pcs->end_page != pcl_end_page_top) { return 0; } /* If orientation is same as before ignore the command */ if (i == pcs->xfm_state.lp_orient) { return 0; } /* ok to execute - clear the page, set up the transformations and set the flag disabling the orientation command for this page. */ code = pcl_end_page_if_marked(pcs); if (code >= 0) { new_logical_page(pcs, i, pcs->xfm_state.paper_size, false, false); pcs->hmi_cp = HMI_DEFAULT; pcs->vmi_cp = VMI_DEFAULT; } return code; }
/* * ESC & l <feed_enum> H * * Set paper source */ static int set_paper_source(pcl_args_t * pargs, pcl_state_t * pcs) { uint i = uint_arg(pargs); /* oddly the command goes to the next page irrespective of arguments */ int code = pcl_end_page_if_marked(pcs); if (code < 0) return code; pcl_home_cursor(pcs); /* Do not change the page side if the wanted paper source is the same as the actual one */ if (pcs->paper_source != i) { pcs->back_side = false; put_param1_bool(pcs, "FirstSide", !pcs->back_side); } pcs->paper_source = i; /* Note: not all printers support all possible values. */ if (i <= 6) { code = 0; if (i > 0) code = put_param1_int(pcs, "%MediaSource", i); return (code < 0 ? code : 0); } else return e_Range; }
static int /* ESC & l <sd_enum> S */ pcl_simplex_duplex_print(pcl_args_t *pargs, pcl_state_t *pcs) { int code; bool reopen = false; /* oddly the command goes to the next page irrespective of arguments */ code = pcl_end_page_if_marked(pcs); if ( code < 0 ) return code; pcl_home_cursor(pcs); switch ( int_arg(pargs) ) { case 0: pcs->duplex = false; break; case 1: pcs->duplex = true; pcs->bind_short_edge = false; break; case 2: pcs->duplex = true; pcs->bind_short_edge = true; break; default: return 0; } code = put_param1_bool(pcs, "Duplex", pcs->duplex); switch ( code ) { case 1: /* reopen device */ reopen = true; case 0: break; case gs_error_undefined: return 0; default: /* error */ if ( code < 0 ) return code; } code = put_param1_bool(pcs, "BindShortEdge", pcs->bind_short_edge); switch ( code ) { case 1: /* reopen device */ reopen = true; case 0: case gs_error_undefined: break; default: /* error */ if ( code < 0 ) return code; } return (reopen ? gs_setdevice_no_erase(pcs->pgs, gs_currentdevice(pcs->pgs)) : 0); }
/* * (From PCL5 Comparison Guide, p. 1-98) * * ESC & l <type> M * * Set media type. */ static int pcl_media_type(pcl_args_t * pargs, pcl_state_t * pcs) { int type = uint_arg(pargs); if (type <= 4) { int code = pcl_end_page_if_marked(pcs); if (code >= 0) pcl_home_cursor(pcs); return (code < 0 ? code : e_Unimplemented); } else return e_Range; }
/* * (From PCL5 Comparison Guide, p. 1-99) * * ESC * o <quality> Q * * Set print quality. */ static int pcl_print_quality(pcl_args_t * pargs, pcl_state_t * pcs) { int quality = int_arg(pargs); if ((quality >= -1) && (quality <= 1)) { int code = pcl_end_page_if_marked(pcs); if (code >= 0) pcl_home_cursor(pcs); return (code < 0 ? code : 0); } else return e_Range; }
/* * ESC & l <psize_enum> A * * Select paper size */ static int set_page_size( pcl_args_t * pargs, pcl_state_t * pcs ) { /* Note: not all values are implemented on all printers. */ uint tag = uint_arg(pargs); int i; int code = 0; const pcl_paper_size_t * psize = 0; /* oddly the command goes to the next page irrespective of arguments */ code = pcl_end_page_if_marked(pcs); if ( code < 0 ) return code; pcl_home_cursor(pcs); for (i = 0; i < countof(paper_sizes); i++) { if (tag == paper_sizes[i].tag) { psize = &(paper_sizes[i].psize); break; } } if ((psize != 0) && ((code = pcl_end_page_if_marked(pcs)) >= 0)) { /* if the orientation flag is not set for this page we select a portrait page using the set paper size. Otherwise select the paper using the current orientation. */ if ( pcs->orientation_set == false ) new_logical_page(pcs, 0, psize, false, false); else new_page_size(pcs, psize, false, false); } return code; }
static int /* ESC & a <side_enum> G */ pcl_duplex_page_side_select(pcl_args_t *pargs, pcl_state_t *pcs) { uint i = uint_arg(pargs); int code; /* oddly the command goes to the next page irrespective of arguments */ code = pcl_end_page_if_marked(pcs); if ( code < 0 ) return code; pcl_home_cursor(pcs); if ( i > 2 ) return 0; if ( i > 0 && pcs->duplex ) put_param1_bool(pcs, "FirstSide", i == 1); 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); }
/* * ESC & l <feed_enum> H * * Set paper source */ static int set_paper_source( pcl_args_t * pargs, pcl_state_t * pcs ) { uint i = uint_arg(pargs); /* oddly the command goes to the next page irrespective of arguments */ int code = pcl_end_page_if_marked(pcs); if ( code < 0 ) return code; pcl_home_cursor(pcs); /* Note: not all printers support all possible values. */ if (i <= 6) { code = 0; if (i > 0) code = put_param1_int(pcs, "%MediaSource", i); return (code < 0 ? code : 0); } else return e_Range; }