/* HPGL command PS (Plot Size) */ int hpgs_reader_do_PS (hpgs_reader *reader) { double x_size=reader->x_size/HP_TO_PT; double y_size=reader->y_size/HP_TO_PT; if (reader->eoc) { // Well it seems, that some oldstyle HPGL files use // PS w/o arguments in order to enforce a coordinate setup // as if a portrait paper size has been selected. // (resulting in a prerotation of 90 degrees). x_size = 33600.0; y_size = 47520.0; } else { if (hpgs_reader_read_double(reader,&x_size)) return -1; // set y-size to sqrt(0.5) * x_size in order to prevent // the picture from rotation. This is better then setting // the y-size to the (fictional) hard-clip limit, because // without rotation we definitely can calculate our own plotsize // using -i. if (reader->eoc) y_size = sqrt(0.5) * x_size; } if (!reader->eoc && hpgs_reader_read_double(reader,&y_size)) return -1; return hpgs_reader_set_plotsize (reader,x_size,y_size); }
/* HPGL command CR (Color Range) */ int hpgs_reader_do_CR (hpgs_reader *reader) { reader->min_color.r = 0.0; reader->min_color.g = 0.0; reader->min_color.b = 0.0; reader->max_color.r = 255.0; reader->max_color.g = 255.0; reader->max_color.b = 255.0; if (!reader->eoc) { if (hpgs_reader_read_double(reader,&reader->min_color.r)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&reader->max_color.r)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&reader->min_color.g)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&reader->max_color.g)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&reader->min_color.b)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&reader->max_color.b)) return -1; } return 0; }
/* HPGL command LA (Line Attributes) */ int hpgs_reader_do_LA(hpgs_reader *reader) { int kind; int ivalue; double rvalue; static hpgs_line_cap caps[5] = { hpgs_cap_butt, hpgs_cap_butt, hpgs_cap_square, hpgs_cap_round, hpgs_cap_round }; static hpgs_line_join joins[7] = { hpgs_join_miter, hpgs_join_miter, hpgs_join_miter, hpgs_join_miter, hpgs_join_round, hpgs_join_bevel, hpgs_join_miter }; while (!reader->eoc) { if (hpgs_reader_read_int(reader,&kind)) return -1; if (reader->eoc) return -1; switch (kind) { case 3: if (hpgs_reader_read_double(reader,&rvalue)) return -1; if (hpgs_setmiterlimit(reader->device,rvalue)) return -1; break; case 1: if (hpgs_reader_read_int(reader,&ivalue)) return -1; if (ivalue >= 0 && ivalue < 5 && hpgs_setlinecap(reader->device,caps[ivalue])) return -1; break; case 2: if (hpgs_reader_read_int(reader,&ivalue)) return -1; if (ivalue >= 0 && ivalue < 7 && hpgs_setlinejoin(reader->device,joins[ivalue])) return -1; break; default: return -1; } } return 0; }
/* 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); }
/* HPGL command SC (SCale) */ int hpgs_reader_do_SC (hpgs_reader *reader) { double xmin,xmax,ymin,ymax,left=50.0,bottom=50.0; int type=0; if (reader->eoc) { reader->sc_type = -1; hpgs_reader_set_default_transformation(reader); return 0; } if (hpgs_reader_read_double(reader,&xmin)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&xmax)) return -1; if (reader->eoc) return -1; if (xmin == xmax) return hpgs_set_error(hpgs_i18n("Empty x range.")); if (hpgs_reader_read_double(reader,&ymin)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&ymax)) return -1; if (ymin == ymax) return hpgs_set_error(hpgs_i18n("Empty y range.")); if (!reader->eoc && hpgs_reader_read_int(reader,&type)) return -1; if (type == 1 && !reader->eoc) { if (hpgs_reader_read_double(reader,&left)) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,&bottom)) return -1; } reader->sc_type = type; reader->sc_xmin = xmin; reader->sc_xmax = xmax; reader->sc_ymin = ymin; reader->sc_ymax = ymax; reader->sc_bottom = bottom; reader->sc_left = left; hpgs_reader_set_default_transformation(reader); return 0; }
/* HPGL command IR (Input point Relative) */ int hpgs_reader_do_IR (hpgs_reader *reader) { // get default input point. double p1x=0.0,p1y=0.0,p2x,p2y; int angle = reader->y_size >= reader->x_size ? 90 : 0; angle += reader->rotation; switch (angle % 360) { case 90: p1x = reader->x_size; p1y = 0.0; p2x = 0.0; p2y = reader->y_size; break; case 180: break; p1x = reader->x_size; p1y = reader->y_size; p2x = 0.0; p2y = 0.0; break; case 270: p1x = 0.0; p1y = reader->y_size; p2x = reader->x_size; p2y = 0.0; break; default: p1x = 0.0; p1y = 0.0; p2x = reader->x_size; p2y = reader->y_size; } // read input point if (!reader->eoc) { double x,y; if (hpgs_reader_read_double(reader,&x)) return -1; if (hpgs_reader_read_double(reader,&y)) return -1; p1x = reader->x_size * x * 0.01; p2x = p1x + reader->delta_P.x; p1y = reader->y_size * y * 0.01; p2y = p1y + reader->delta_P.y; } if (!reader->eoc) { if (hpgs_reader_read_double(reader,&p2x)) return -1; if (hpgs_reader_read_double(reader,&p2y)) return -1; p2x = reader->x_size * p2x * 0.01; p2y = reader->y_size * p2y * 0.01; reader->delta_P.x = p2x - p1x; reader->delta_P.y = p2y - p1y; } reader->P1.x = p1x; reader->P1.y = p1y; reader->P2.x = p2x; reader->P2.y = p2y; #ifdef HPGS_DEBUG_XFORM hpgs_log("IR: P1 = %g,%g.\n",reader->P1.x,reader->P1.y); hpgs_log("IR: P2 = %g,%g.\n",reader->P2.x,reader->P2.y); #endif hpgs_reader_set_default_transformation(reader); return 0; }
/* HPGL command IP (Input Point) */ int hpgs_reader_do_IP (hpgs_reader *reader) { // get default input point. int angle = reader->y_size >= reader->x_size ? 90 : 0; angle += reader->rotation; switch (angle % 360) { case 90: reader->P1.x = reader->x_size; reader->P1.y = 0.0; reader->P2.x = 0.0; reader->P2.y = reader->y_size; break; case 180: break; reader->P1.x = reader->x_size; reader->P1.y = reader->y_size; reader->P2.x = 0.0; reader->P2.y = 0.0; break; case 270: reader->P1.x = 0.0; reader->P1.y = reader->y_size; reader->P2.x = reader->x_size; reader->P2.y = 0.0; break; default: /* 0 */ reader->P1.x = 0.0; reader->P1.y = 0.0; reader->P2.x = reader->x_size; reader->P2.y = reader->y_size; } // read input point if (!reader->eoc) { if (hpgs_reader_read_double(reader, angle%180 ? &reader->P1.y : &reader->P1.x )) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader,angle%180 ? &reader->P2.x : &reader->P1.y )) return -1; } if (!reader->eoc) { if (hpgs_reader_read_double(reader, angle%180 ? &reader->P2.y : &reader->P2.x )) return -1; if (reader->eoc) return -1; if (hpgs_reader_read_double(reader, angle%180 ? &reader->P1.x : &reader->P2.y )) return -1; } reader->delta_P.x = reader->P2.x - reader->P1.x; reader->delta_P.y = reader->P2.y - reader->P1.y; #ifdef HPGS_DEBUG_XFORM hpgs_log("IP: angle = %d.\n",angle); hpgs_log("IP: P1 = %g,%g.\n",reader->P1.x,reader->P1.y); hpgs_log("IP: P2 = %g,%g.\n",reader->P2.x,reader->P2.y); #endif reader->sc_type = -1; hpgs_reader_set_default_transformation(reader); return 0; }
/* 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; }
/* HPGL command PC (Pen Color) */ int hpgs_reader_do_PC (hpgs_reader *reader) { int pen=-1; double r=-1.0e20,g=-1.0e20,b=-1.0e20; if (!reader->eoc && hpgs_reader_read_int(reader,&pen)) return -1; if (!reader->eoc && hpgs_reader_read_double(reader,&r)) return -1; if (!reader->eoc && hpgs_reader_read_double(reader,&g)) return -1; if (!reader->eoc && hpgs_reader_read_double(reader,&b)) return -1; 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("PC: Illegal pen number %d.\n"),pen); return 0; } } if (pen < 0) { hpgs_reader_set_std_pen_colors(reader,0,reader->npens); pen = reader->current_pen; } else { if (r==-1.0e20 || g==-1.0e20 || b==-1.0e20) { hpgs_reader_set_std_pen_colors(reader,pen,1); } else { reader->pen_colors[pen].r = (r - reader->min_color.r) / (reader->max_color.r - reader->min_color.r); if (reader->pen_colors[pen].r < 0.0) reader->pen_colors[pen].r = 0.0; if (reader->pen_colors[pen].r > 1.0) reader->pen_colors[pen].r = 1.0; reader->pen_colors[pen].g = (g - reader->min_color.g) / (reader->max_color.g - reader->min_color.g); if (reader->pen_colors[pen].g < 0.0) reader->pen_colors[pen].g = 0.0; if (reader->pen_colors[pen].g > 1.0) reader->pen_colors[pen].g = 1.0; reader->pen_colors[pen].b = (b - reader->min_color.b) / (reader->max_color.b - reader->min_color.b); if (reader->pen_colors[pen].b < 0.0) reader->pen_colors[pen].b = 0.0; if (reader->pen_colors[pen].b > 1.0) reader->pen_colors[pen].b = 1.0; } } if (pen == reader->current_pen) if (hpgs_setrgbcolor(reader->device, &reader->pen_colors[pen])) return -1; return 0; }