/* HPGL command IW (Input Window) */ int hpgs_reader_do_IW (hpgs_reader *reader) { // get default input point. hpgs_point ll; hpgs_point ur; hpgs_point p; if (hpgs_reader_checkpath(reader)) return -1; while (reader->clipsave_depth > 0) { hpgs_cliprestore(reader->device); --reader->clipsave_depth; } if (reader->eoc) return 0; // read input point if (hpgs_reader_read_point(reader,&ll,0)) return -1; if (hpgs_reader_read_point(reader,&ur,0)) return -1; if (hpgs_clipsave(reader->device)) return -1; ++reader->clipsave_depth; if (hpgs_newpath(reader->device)) return -1; hpgs_matrix_xform (&p,&reader->total_matrix,&ll); if (hpgs_moveto(reader->device,&p)) return -1; p.x = ll.x; p.y = ur.y; hpgs_matrix_xform (&p,&reader->total_matrix,&p); if (hpgs_lineto(reader->device,&p)) return -1; hpgs_matrix_xform (&p,&reader->total_matrix,&ur); if (hpgs_lineto(reader->device,&p)) return -1; p.x = ur.x; p.y = ll.y; hpgs_matrix_xform (&p,&reader->total_matrix,&p); if (hpgs_lineto(reader->device,&p)) return -1; if (hpgs_closepath(reader->device)) return -1; if (hpgs_clip(reader->device,HPGS_TRUE)) return -1; reader->have_current_point = 0; return hpgs_newpath(reader->device); }
/* HPGL command FR (advance FRame) */ int hpgs_reader_do_FR (hpgs_reader *reader) { double advance = reader->x_size; if (!reader->eoc) { if (hpgs_reader_read_double(reader,&advance)) return -1; } if (hpgs_reader_checkpath(reader)) return -1; while (reader->clipsave_depth > 0) { hpgs_cliprestore(reader->device); --reader->clipsave_depth; } if (reader->frame_asset_func) { hpgs_bbox frame_bbox; frame_bbox.llx = reader->frame_x == 0.0 ? reader->content_bbox.llx : reader->frame_x; frame_bbox.lly = reader->content_bbox.lly; frame_bbox.urx = reader->frame_x + advance * HP_TO_PT; frame_bbox.ury = reader->content_bbox.ury; if (frame_bbox.urx > frame_bbox.llx) { int ipage = reader->current_page; if (reader->frame_asset_func(reader->frame_asset_ctxt, reader->device, &reader->page_matrix, &reader->total_matrix, &frame_bbox,ipage <= 1 ? 0 : ipage-1) ) return -1; } } reader->frame_x += advance * HP_TO_PT; reader->P1.x -= advance; reader->P2.x -= advance; return 0; }
/* HPGL command LT (Line Type) */ int hpgs_reader_do_LT(hpgs_reader *reader) { float dashes[20]; int i,ndash; int linetype=0; double patlen = 4.0; int mode = 0; if (hpgs_reader_checkpath(reader)) return -1; if (!reader->eoc && hpgs_reader_read_int(reader,&linetype)) return -1; if (!reader->eoc && hpgs_reader_read_double(reader,&patlen)) return -1; if (!reader->eoc && hpgs_reader_read_int(reader,&mode)) return -1; if (linetype < -8 || linetype > 8) { if (reader->verbosity) hpgs_log(hpgs_i18n("LT: Illegal linetype %d.\n"),linetype); return 0; } // line type are store as percentages. patlen *= 0.01; if (mode) patlen *= MM_TO_PT; else patlen *= hypot(reader->P2.x-reader->P1.x, reader->P2.y-reader->P1.y ) * 0.01 * HP_TO_PT; ndash = reader->linetype_nsegs[linetype+8]; if (ndash > 20) ndash = 20; for (i=0;i<ndash;++i) dashes[i] = reader->linetype_segs[linetype+8][i] * patlen; return hpgs_setdash(reader->device, dashes,ndash,0.0); }
/* Do the pen select. */ int hpgs_reader_do_setpen(hpgs_reader *reader, int pen) { double width; if (hpgs_reader_checkpath(reader)) return -1; if (pen < 0) return hpgs_set_error(hpgs_i18n("Illegal pen numer %d."),pen); if (pen >= reader->npens) { if (pen < 256) { if (hpgs_reader_set_number_of_pens(reader,pen+1)) return -1; } else { if (reader->verbosity) hpgs_log(hpgs_i18n("Illegal pen number %d replaced by %d.\n"), pen, pen % reader->npens); pen = pen % reader->npens; } } reader->current_pen = pen; width = reader->pen_widths[pen]; if (reader->pen_width_relative) width *= hypot(reader->P2.x-reader->P1.x, reader->P2.y-reader->P1.y ) * 0.001 * HP_TO_PT; else width *= HP_TO_PT / reader->world_scale; width *= reader->page_scale; if (hpgs_setlinewidth(reader->device,width*reader->lw_factor)) return -1; return hpgs_setrgbcolor(reader->device, &reader->pen_colors[pen]); }
/* HPGL command PW (Pen Width) */ int hpgs_reader_do_PW (hpgs_reader *reader) { int pen=-1; double width=1.0; if (!reader->eoc) if (hpgs_reader_read_double(reader,&width)) return -1; if (!reader->eoc) { if (hpgs_reader_read_int(reader,&pen)) return -1; if (pen < 0 || pen >= reader->npens) { if (pen >= reader->npens && pen < 256) { if (hpgs_reader_set_number_of_pens(reader,pen+1)) return -1; } else { if (reader->verbosity) hpgs_log(hpgs_i18n("PW: Illegal pen number %d.\n"),pen); return 0; } } } if (reader->verbosity >= 2) hpgs_log("PW: pen,width,rel = %d,%g,%d.\n",pen,width,reader->pen_width_relative); if (reader->pen_width_relative) width *= 10.0; else width *= MM_TO_PT; if (pen < 0) { int i; for (i=0;i<reader->npens;++i) reader->pen_widths[i] = width; } else reader->pen_widths[pen] = width; if (pen < 0 || pen == reader->current_pen) { if (hpgs_reader_checkpath(reader)) return -1; if (reader->pen_width_relative) width *= hypot(reader->P2.x-reader->P1.x, reader->P2.y-reader->P1.y ) * 0.001 * HP_TO_PT; else width *= HP_TO_PT / reader->world_scale; width *= reader->page_scale; if (hpgs_setlinewidth(reader->device,width*reader->lw_factor)) return -1; } return 0; }