/* * ESC % <enum> B */ static int rtl_enter_hpgl_mode( pcl_args_t * pargs, pcl_state_t * pcs ) { int i = int_arg(pargs); /* Note: -1..3 for PCL5c, 0..1 for PCL5 */ if (i < 0) i = -1; else if (i > 3) return 0; hpgl_call_mem(pcs->memory, hpgl_clear_current_path(pcs)); pcs->parse_other = ( int (*)( void *, pcl_state_t *, stream_cursor_read * ) ) hpgl_process; /* add the pcl cap to hpgl/2's path */ if (i == 1) { gs_point pcl_pt; pcl_pt.x = (hpgl_real_t)pcs->cap.x; pcl_pt.y = (hpgl_real_t)pcs->cap.y; hpgl_add_pcl_point_to_path(pcs, &pcl_pt); hpgl_update_carriage_return_pos(pcs); } hpgl_call_mem(pcs->memory, hpgl_set_ctm(pcs)); return 0; }
/* RO; */ int hpgl_RO(hpgl_args_t *pargs, hpgl_state_t *pgls) { int angle=0; gs_point point, dev_pt; /* this business is used by both SC and RO -- perhaps it needs a new home */ hpgl_call(hpgl_set_ctm(pgls)); hpgl_call(hpgl_get_current_position(pgls, &point)); hpgl_call(gs_transform(pgls->pgs, point.x, point.y, &dev_pt)); if ( hpgl_arg_c_int(pgls->memory, pargs, &angle) ) switch ( angle ) { case 0: case 90: case 180: case 270: break; default: return e_Range; } if ( angle != pgls->g.rotation ) { hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector)); pgls->g.rotation = angle; hpgl_call(hpgl_set_ctm(pgls)); hpgl_call(gs_itransform(pgls->pgs, dev_pt.x, dev_pt.y, &point)); hpgl_call(hpgl_set_current_position(pgls, &point)); hpgl_call(hpgl_update_carriage_return_pos(pgls)); } return 0; }
/* LO [origin]; */ int hpgl_LO(hpgl_args_t * pargs, hpgl_state_t * pgls) { int origin = 1; hpgl_arg_c_int(pgls->memory, pargs, &origin); if (origin < 1 || origin == 10 || origin == 20 || origin > 21) return e_Range; pgls->g.label.origin = origin; hpgl_call(hpgl_update_carriage_return_pos(pgls)); return 0; }
/* DV [path[,line]]; */ int hpgl_DV(hpgl_args_t * pargs, hpgl_state_t * pgls) { int path = 0, line = 0; hpgl_arg_c_int(pgls->memory, pargs, &path); hpgl_arg_c_int(pgls->memory, pargs, &line); if ((path & ~3) | (line & ~1)) return e_Range; pgls->g.character.text_path = path; pgls->g.character.line_feed_direction = (line ? -1 : 1); hpgl_call(hpgl_update_carriage_return_pos(pgls)); return 0; }
/* Define label drawing direction (DI, DR). */ static int hpgl_label_direction(hpgl_args_t * pargs, hpgl_state_t * pgls, bool relative) { hpgl_real_t run = 1, rise = 0; if (hpgl_arg_c_real(pgls->memory, pargs, &run)) { if (!hpgl_arg_c_real(pgls->memory, pargs, &rise) || (run == 0 && rise == 0)) return e_Range; { double hyp = hypot(run, rise); run /= hyp; rise /= hyp; } } pgls->g.character.direction.x = run; pgls->g.character.direction.y = rise; pgls->g.character.direction_relative = relative; hpgl_call(hpgl_update_carriage_return_pos(pgls)); return 0; }
/* SC; */ int hpgl_SC(hpgl_args_t *pargs, hpgl_state_t *pgls) { hpgl_real_t xy[4]; int i; int type; hpgl_scaling_params_t scale_params; gs_point point, dev_pt, dev_anchor; scale_params = pgls->g.scaling_params; hpgl_call(hpgl_get_current_position(pgls, &point)); hpgl_call(gs_transform(pgls->pgs, point.x, point.y, &dev_pt)); hpgl_call(gs_transform(pgls->pgs, pgls->g.anchor_corner.x, pgls->g.anchor_corner.y, &dev_anchor)); for ( i = 0; i < 4 && hpgl_arg_real(pgls->memory, pargs, &xy[i]); ++i ) ; switch ( i ) { case 0: /* set defaults */ { /* a naked SC implies the soft clip window is bound to plotter units. */ gs_matrix umat; type = hpgl_scaling_none; hpgl_compute_user_units_to_plu_ctm(pgls, &umat); /* in-place */ hpgl_call(gs_bbox_transform(&pgls->g.soft_clip_window.rect, &umat, &pgls->g.soft_clip_window.rect)); pgls->g.soft_clip_window.isbound = true; break; } default: return e_Range; case 4: type = hpgl_scaling_anisotropic; hpgl_arg_c_int(pgls->memory, pargs, &type); switch ( type ) { case hpgl_scaling_anisotropic: /* 0 */ if ( xy[0] == xy[1] || xy[2] == xy[3] ) return e_Range; pxy: scale_params.pmin.x = xy[0]; scale_params.pmax.x = xy[1]; scale_params.pmin.y = xy[2]; scale_params.pmax.y = xy[3]; break; case hpgl_scaling_isotropic: /* 1 */ if ( xy[0] == xy[1] || xy[2] == xy[3] ) return e_Range; { hpgl_real_t left = 50, bottom = 50; if ( (hpgl_arg_c_real(pgls->memory, pargs, &left) && (left < 0 || left > 100 || !hpgl_arg_c_real(pgls->memory, pargs, &bottom) || bottom < 0 || bottom > 100)) ) return e_Range; scale_params.left = left; scale_params.bottom = bottom; } goto pxy; case hpgl_scaling_point_factor: /* 2 */ if ( xy[1] == 0 || xy[3] == 0 ) return e_Range; scale_params.pmin.x = xy[0]; scale_params.factor.x = xy[1]; scale_params.pmin.y = xy[2]; scale_params.factor.y = xy[3]; break; default: return e_Range; } } hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector)); pgls->g.scaling_params = scale_params; pgls->g.scaling_type = type; hpgl_call(hpgl_set_ctm(pgls)); hpgl_call(gs_itransform(pgls->pgs, dev_pt.x, dev_pt.y, &point)); hpgl_call(hpgl_set_current_position(pgls, &point)); hpgl_call(gs_itransform(pgls->pgs, dev_anchor.x, dev_anchor.y, &pgls->g.anchor_corner)); /* PCLTRM 23-7 (commands the update cr position) does not list SC but PCL updates the position */ hpgl_call(hpgl_update_carriage_return_pos(pgls)); return 0; }