/* * Write one label, with all the trimmings. * This routine is used for both 2D and 3D plots. */ void write_label(unsigned int x, unsigned int y, struct text_label *this_label) { int htic, vtic; int justify = JUST_TOP; /* This was the 2D default; 3D had CENTRE */ apply_pm3dcolor(&(this_label->textcolor),term); ignore_enhanced(this_label->noenhanced); get_offsets(this_label, term, &htic, &vtic); if (this_label->rotate && (*term->text_angle) (this_label->rotate)) { write_multiline(x + htic, y + vtic, this_label->text, this_label->pos, justify, this_label->rotate, this_label->font); (*term->text_angle) (0); } else { write_multiline(x + htic, y + vtic, this_label->text, this_label->pos, justify, 0, this_label->font); } /* write_multiline() clips text to on_page; do the same for any point */ if (this_label->lp_properties.pointflag && on_page(x,y)) { term_apply_lp_properties(&this_label->lp_properties); (*term->point) (x, y, this_label->lp_properties.p_type); /* the default label color is that of border */ term_apply_lp_properties(&border_lp); } ignore_enhanced(FALSE); }
/* HBB 20021128: removed GP_INLINE qualifier to avoid MSVC++ silliness */ void draw3d_line_unconditional( p_vertex v1, p_vertex v2, struct lp_style_type *lp, int linetype) { unsigned int x1, y1, x2, y2; struct lp_style_type ls = *lp; /* HBB 20020312: v2 can be NULL, if this call is coming from draw_line_hidden. --> redirect to point drawing routine */ if (! v2) { draw3d_point_unconditional(v1, lp); return; } TERMCOORD(v1, x1, y1); TERMCOORD(v2, x2, y2); /* User-specified line styles */ if (prefer_line_styles && linetype >= 0) lp_use_properties(&ls, linetype+1); /* The usual case of auto-generated line types */ else ls.l_type = linetype; /* Color by Z value */ if (ls.pm3d_color.type == TC_Z) ls.pm3d_color.value = (v1->real_z + v2->real_z) * 0.5; term_apply_lp_properties(&ls); draw_clip_line(x1,y1,x2,y2); }
/* HBB 20020313: New routine, broken out of draw3d_point, to be used * to output a single point without any checks for hidden3d */ static GP_INLINE void draw3d_point_unconditional(p_vertex v, struct lp_style_type *lp) { unsigned int x, y; TERMCOORD(v, x, y); term_apply_lp_properties(lp); /* HBB 20010822: implemented "linetype palette" for points, too */ if (lp->use_palette) { set_color(cb2gray( z2cb(v->real_z) )); } if (!clip_point(x, y)) (term->point) (x, y, lp->p_type); }
void ifilled_quadrangle(gpiPoint* icorners) { if (default_fillstyle.fillstyle == FS_EMPTY) icorners->style = FS_OPAQUE; else icorners->style = style_from_fill(&default_fillstyle); term->filled_polygon(4, icorners); if (pm3d.border.l_type != LT_NODRAW) { int i; /* It should be sufficient to set only the color, but for some */ /* reason this causes the svg terminal to lose the fill type. */ term_apply_lp_properties(&pm3d_border_lp); term->move(icorners[0].x, icorners[0].y); for (i = 3; i >= 0; i--) { term->vector(icorners[i].x, icorners[i].y); } } }
/* * Write one label, with all the trimmings. * This routine is used for both 2D and 3D plots. */ void write_label(unsigned int x, unsigned int y, struct text_label *this_label) { int htic, vtic; int justify = JUST_TOP; /* This was the 2D default; 3D had CENTRE */ apply_pm3dcolor(&(this_label->textcolor),term); ignore_enhanced(this_label->noenhanced); /* The text itself */ if (this_label->hypertext) { /* Treat text as hypertext */ char *font = this_label->font; if (font) term->set_font(font); if (term->hypertext) term->hypertext(TERM_HYPERTEXT_TOOLTIP, this_label->text); if (font) term->set_font(""); } else { /* A normal label (always print text) */ get_offsets(this_label, term, &htic, &vtic); #ifdef EAM_BOXED_TEXT /* Initialize the bounding box accounting */ if (this_label->boxed && term->boxed_text) (*term->boxed_text)(x + htic, y + vtic, TEXTBOX_INIT); #endif if (this_label->rotate && (*term->text_angle) (this_label->rotate)) { write_multiline(x + htic, y + vtic, this_label->text, this_label->pos, justify, this_label->rotate, this_label->font); (*term->text_angle) (0); } else { write_multiline(x + htic, y + vtic, this_label->text, this_label->pos, justify, 0, this_label->font); } } #ifdef EAM_BOXED_TEXT /* Adjust the bounding box margins */ if (this_label->boxed && term->boxed_text) (*term->boxed_text)((int)(textbox_opts.xmargin * 100.), (int)(textbox_opts.ymargin * 100.), TEXTBOX_MARGINS); if (this_label->boxed && term->boxed_text && textbox_opts.opaque) { /* Blank out the box and reprint the label */ (*term->boxed_text)(0,0, TEXTBOX_BACKGROUNDFILL); if (this_label->rotate && (*term->text_angle) (this_label->rotate)) { write_multiline(x + htic, y + vtic, this_label->text, this_label->pos, justify, this_label->rotate, this_label->font); (*term->text_angle) (0); } else { write_multiline(x + htic, y + vtic, this_label->text, this_label->pos, justify, 0, this_label->font); } } /* Draw the bounding box - FIXME should set line properties first */ if (this_label->boxed && term->boxed_text) { if (!textbox_opts.noborder) (*term->boxed_text)(0,0, TEXTBOX_OUTLINE); else (*term->boxed_text)(0,0, TEXTBOX_FINISH); } #endif /* The associated point, if any */ /* write_multiline() clips text to on_page; do the same for any point */ if ((this_label->lp_properties.flags & LP_SHOW_POINTS) && on_page(x,y)) { term_apply_lp_properties(&this_label->lp_properties); (*term->point) (x, y, this_label->lp_properties.p_type); /* the default label color is that of border */ term_apply_lp_properties(&border_lp); } ignore_enhanced(FALSE); }
/* Finally the main colour smooth box drawing routine */ void draw_color_smooth_box(int plot_mode) { double tmp; FILE *out = gppsfile; /* either gpoutfile or PSLATEX_auxfile */ if (color_box.where == SMCOLOR_BOX_NO) return; if (!term->filled_polygon) return; /* firstly, choose some good position of the color box user's position like that (?): else { x_from = color_box.xlow; x_to = color_box.xhigh; } */ if (color_box.where == SMCOLOR_BOX_USER) { if (!is_3d_plot) { double xtemp, ytemp; map_position(&color_box.origin, &color_box.bounds.xleft, &color_box.bounds.ybot, "cbox"); map_position_r(&color_box.size, &xtemp, &ytemp, "cbox"); color_box.bounds.xright = xtemp; color_box.bounds.ytop = ytemp; } else if (splot_map && is_3d_plot) { /* In map view mode we allow any coordinate system for placement */ double xtemp, ytemp; map3d_position_double(&color_box.origin, &xtemp, &ytemp, "cbox"); color_box.bounds.xleft = xtemp; color_box.bounds.ybot = ytemp; map3d_position_r(&color_box.size, &color_box.bounds.xright, &color_box.bounds.ytop, "cbox"); } else { /* But in full 3D mode we only allow screen coordinates */ color_box.bounds.xleft = color_box.origin.x * (term->xmax) + 0.5; color_box.bounds.ybot = color_box.origin.y * (term->ymax) + 0.5; color_box.bounds.xright = color_box.size.x * (term->xmax-1) + 0.5; color_box.bounds.ytop = color_box.size.y * (term->ymax-1) + 0.5; } color_box.bounds.xright += color_box.bounds.xleft; color_box.bounds.ytop += color_box.bounds.ybot; } else { /* color_box.where == SMCOLOR_BOX_DEFAULT */ if (plot_mode == MODE_SPLOT && !splot_map) { /* HBB 20031215: new code. Constants fixed to what the result * of the old code in default view (set view 60,30,1,1) * happened to be. Somebody fix them if they're not right! */ color_box.bounds.xleft = xmiddle + 0.709 * xscaler; color_box.bounds.xright = xmiddle + 0.778 * xscaler; color_box.bounds.ybot = ymiddle - 0.147 * yscaler; color_box.bounds.ytop = ymiddle + 0.497 * yscaler; } else if (is_3d_plot) { /* MWS 09-Dec-05, make color box full size for splot maps. */ double dx = (X_AXIS.max - X_AXIS.min); map3d_xy(X_AXIS.max + dx * 0.025, Y_AXIS.min, base_z, &color_box.bounds.xleft, &color_box.bounds.ybot); map3d_xy(X_AXIS.max + dx * 0.075, Y_AXIS.max, ceiling_z, &color_box.bounds.xright, &color_box.bounds.ytop); } else { /* 2D plot */ struct position default_origin = {graph,graph,graph, 1.025, 0, 0}; struct position default_size = {graph,graph,graph, 0.05, 1.0, 0}; double xtemp, ytemp; map_position(&default_origin, &color_box.bounds.xleft, &color_box.bounds.ybot, "cbox"); color_box.bounds.xleft += color_box.xoffset; map_position_r(&default_size, &xtemp, &ytemp, "cbox"); color_box.bounds.xright = xtemp + color_box.bounds.xleft; color_box.bounds.ytop = ytemp + color_box.bounds.ybot; } /* now corrections for outer tics */ if (color_box.rotation == 'v') { int cblen = (CB_AXIS.tic_in ? -1 : 1) * CB_AXIS.ticscale * (term->h_tic); /* positive for outer tics */ int ylen = (Y_AXIS.tic_in ? -1 : 1) * Y_AXIS.ticscale * (term->h_tic); /* positive for outer tics */ if ((cblen > 0) && (CB_AXIS.ticmode & TICS_MIRROR)) { color_box.bounds.xleft += cblen; color_box.bounds.xright += cblen; } if ((ylen > 0) && (axis_array[FIRST_Y_AXIS].ticmode & TICS_MIRROR)) { color_box.bounds.xleft += ylen; color_box.bounds.xright += ylen; } } } if (color_box.bounds.ybot > color_box.bounds.ytop) { /* switch them */ tmp = color_box.bounds.ytop; color_box.bounds.ytop = color_box.bounds.ybot; color_box.bounds.ybot = tmp; } /* Optimized version of the smooth colour box in postscript. Advantage: only few lines of code is written into the output file. */ if (gppsfile) draw_inside_color_smooth_box_postscript(out); else draw_inside_color_smooth_box_bitmap(out); if (color_box.border) { /* now make boundary around the colour box */ if (color_box.border_lt_tag >= 0) { /* user specified line type */ struct lp_style_type lp = border_lp; lp_use_properties(&lp, color_box.border_lt_tag); term_apply_lp_properties(&lp); } else { /* black solid colour should be chosen, so it's border linetype */ term_apply_lp_properties(&border_lp); } newpath(); (term->move) (color_box.bounds.xleft, color_box.bounds.ybot); (term->vector) (color_box.bounds.xright, color_box.bounds.ybot); (term->vector) (color_box.bounds.xright, color_box.bounds.ytop); (term->vector) (color_box.bounds.xleft, color_box.bounds.ytop); (term->vector) (color_box.bounds.xleft, color_box.bounds.ybot); closepath(); /* Set line properties to some value, this also draws lines in postscript terminals. */ term_apply_lp_properties(&border_lp); } /* draw tics */ if (axis_array[COLOR_AXIS].ticmode) { term_apply_lp_properties(&border_lp); /* border linetype */ gen_tics(COLOR_AXIS, cbtick_callback ); } /* write the colour box label */ if (CB_AXIS.label.text) { int x, y; apply_pm3dcolor(&(CB_AXIS.label.textcolor),term); if (color_box.rotation == 'h') { int len = CB_AXIS.ticscale * (CB_AXIS.tic_in ? 1 : -1) * (term->v_tic); map3d_position_r(&(CB_AXIS.label.offset), &x, &y, "smooth_box"); x += (color_box.bounds.xleft + color_box.bounds.xright) / 2; #define DEFAULT_Y_DISTANCE 1.0 y += color_box.bounds.ybot + (- DEFAULT_Y_DISTANCE - 1.7) * term->v_char; #undef DEFAULT_Y_DISTANCE if (len < 0) y += len; if (x<0) x = 0; if (y<0) y = 0; write_multiline(x, y, CB_AXIS.label.text, CENTRE, JUST_CENTRE, 0, CB_AXIS.label.font); } else { int len = CB_AXIS.ticscale * (CB_AXIS.tic_in ? -1 : 1) * (term->h_tic); /* calculate max length of cb-tics labels */ widest_tic_strlen = 0; if (CB_AXIS.ticmode & TICS_ON_BORDER) { widest_tic_strlen = 0; /* reset the global variable */ gen_tics(COLOR_AXIS, /* 0, */ widest_tic_callback); } map3d_position_r(&(CB_AXIS.label.offset), &x, &y, "smooth_box"); #define DEFAULT_X_DISTANCE 0.0 x += color_box.bounds.xright + (widest_tic_strlen + DEFAULT_X_DISTANCE + 1.5) * term->h_char; #undef DEFAULT_X_DISTANCE if (len > 0) x += len; y += (color_box.bounds.ybot + color_box.bounds.ytop) / 2; if (x<0) x = 0; if (y<0) y = 0; if ((*term->text_angle)(CB_AXIS.label.rotate)) { write_multiline(x, y, CB_AXIS.label.text, CENTRE, JUST_TOP, CB_AXIS.label.rotate, CB_AXIS.label.font); (*term->text_angle)(0); } else { write_multiline(x, y, CB_AXIS.label.text, LEFT, JUST_TOP, 0, CB_AXIS.label.font); } } reset_textcolor(&(CB_AXIS.label.textcolor),term); } }
/* Notice HBB 20010720: would be static, but HP-UX gcc bug forbids * this, for now */ void cbtick_callback( AXIS_INDEX axis, double place, char *text, struct lp_style_type grid, /* linetype or -2 for no grid */ struct ticmark *userlabels) { int len = (text ? CB_AXIS.ticscale : CB_AXIS.miniticscale) * (CB_AXIS.tic_in ? -1 : 1) * (term->h_tic); double cb_place = (place - CB_AXIS.min) / (CB_AXIS.max - CB_AXIS.min); /* relative z position along the colorbox axis */ unsigned int x1, y1, x2, y2; /* calculate tic position */ if (color_box.rotation == 'h') { x1 = x2 = color_box.bounds.xleft + cb_place * (color_box.bounds.xright - color_box.bounds.xleft); y1 = color_box.bounds.ybot; y2 = color_box.bounds.ybot - len; } else { x1 = color_box.bounds.xright; x2 = color_box.bounds.xright + len; y1 = y2 = color_box.bounds.ybot + cb_place * (color_box.bounds.ytop - color_box.bounds.ybot); } /* draw grid line */ if (grid.l_type > LT_NODRAW) { term_apply_lp_properties(&grid); /* grid linetype */ if (color_box.rotation == 'h') { (*term->move) (x1, color_box.bounds.ybot); (*term->vector) (x1, color_box.bounds.ytop); } else { (*term->move) (color_box.bounds.xleft, y1); (*term->vector) (color_box.bounds.xright, y1); } term_apply_lp_properties(&border_lp); /* border linetype */ } /* draw tic */ (*term->move) (x1, y1); (*term->vector) (x2, y2); /* draw label */ if (text) { /* get offset */ int offsetx, offsety; map3d_position_r(&(axis_array[axis].ticdef.offset), &offsetx, &offsety, "cbtics"); /* User-specified different color for the tics text */ if (axis_array[axis].ticdef.textcolor.type != TC_DEFAULT) apply_pm3dcolor(&(axis_array[axis].ticdef.textcolor), term); if (color_box.rotation == 'h') { int y3 = color_box.bounds.ybot - (term->v_char); int hrotate = 0; if (axis_array[axis].tic_rotate && (*term->text_angle)(axis_array[axis].tic_rotate)) hrotate = axis_array[axis].tic_rotate; if (len > 0) y3 -= len; /* add outer tics len */ if (y3<0) y3 = 0; write_multiline(x2+offsetx, y3+offsety, text, (hrotate ? LEFT : CENTRE), CENTRE, hrotate, axis_array[axis].ticdef.font); if (hrotate) (*term->text_angle)(0); } else { unsigned int x3 = color_box.bounds.xright + (term->h_char); if (len > 0) x3 += len; /* add outer tics len */ write_multiline(x3+offsetx, y2+offsety, text, LEFT, CENTRE, 0.0, axis_array[axis].ticdef.font); } term_apply_lp_properties(&border_lp); /* border linetype */ } /* draw tic on the mirror side */ if (CB_AXIS.ticmode & TICS_MIRROR) { if (color_box.rotation == 'h') { y1 = color_box.bounds.ytop; y2 = color_box.bounds.ytop + len; } else { x1 = color_box.bounds.xleft; x2 = color_box.bounds.xleft - len; } (*term->move) (x1, y1); (*term->vector) (x2, y2); } }
/* Notice HBB 20010720: would be static, but HP-UX gcc bug forbids * this, for now */ void cbtick_callback( AXIS_INDEX axis, double place, char *text, int ticlevel, struct lp_style_type grid, /* linetype or -2 for no grid */ struct ticmark *userlabels) { int len = TIC_SCALE(ticlevel, COLOR_AXIS) * (CB_AXIS.tic_in ? -1 : 1) * (term->h_tic); double cb_place = (place - CB_AXIS.min) / (CB_AXIS.max - CB_AXIS.min); /* relative z position along the colorbox axis */ unsigned int x1, y1, x2, y2; /* calculate tic position */ if (color_box.rotation == 'h') { x1 = x2 = color_box.bounds.xleft + cb_place * (color_box.bounds.xright - color_box.bounds.xleft); y1 = color_box.bounds.ybot; y2 = color_box.bounds.ybot - len; } else { x1 = color_box.bounds.xright; x2 = color_box.bounds.xright + len; y1 = y2 = color_box.bounds.ybot + cb_place * (color_box.bounds.ytop - color_box.bounds.ybot); } /* draw grid line */ if (grid.l_type > LT_NODRAW) { term_apply_lp_properties(&grid); /* grid linetype */ if (color_box.rotation == 'h') { (*term->move) (x1, color_box.bounds.ybot); (*term->vector) (x1, color_box.bounds.ytop); } else { (*term->move) (color_box.bounds.xleft, y1); (*term->vector) (color_box.bounds.xright, y1); } term_apply_lp_properties(&border_lp); /* border linetype */ } /* draw tic */ (*term->move) (x1, y1); (*term->vector) (x2, y2); /* draw label */ if (text) { int just; int offsetx, offsety; /* Skip label if we've already written a user-specified one here */ # define MINIMUM_SEPARATION 0.001 while (userlabels) { if (fabs((place - userlabels->position) / (CB_AXIS.max - CB_AXIS.min)) <= MINIMUM_SEPARATION) { text = NULL; break; } userlabels = userlabels->next; } # undef MINIMUM_SEPARATION /* get offset */ map3d_position_r(&(axis_array[axis].ticdef.offset), &offsetx, &offsety, "cbtics"); /* User-specified different color for the tics text */ if (axis_array[axis].ticdef.textcolor.type != TC_DEFAULT) apply_pm3dcolor(&(axis_array[axis].ticdef.textcolor), term); if (color_box.rotation == 'h') { int y3 = color_box.bounds.ybot - (term->v_char); int hrotate = 0; if (axis_array[axis].tic_rotate && (*term->text_angle)(axis_array[axis].tic_rotate)) hrotate = axis_array[axis].tic_rotate; if (len > 0) y3 -= len; /* add outer tics len */ if (y3<0) y3 = 0; just = hrotate ? LEFT : CENTRE; if (axis_array[axis].manual_justify) just = axis_array[axis].label.pos; write_multiline(x2+offsetx, y3+offsety, text, just, JUST_CENTRE, hrotate, axis_array[axis].ticdef.font); if (hrotate) (*term->text_angle)(0); } else { unsigned int x3 = color_box.bounds.xright + (term->h_char); if (len > 0) x3 += len; /* add outer tics len */ just = LEFT; if (axis_array[axis].manual_justify) just = axis_array[axis].label.pos; write_multiline(x3+offsetx, y2+offsety, text, just, JUST_CENTRE, 0.0, axis_array[axis].ticdef.font); } term_apply_lp_properties(&border_lp); /* border linetype */ } /* draw tic on the mirror side */ if (CB_AXIS.ticmode & TICS_MIRROR) { if (color_box.rotation == 'h') { y1 = color_box.bounds.ytop; y2 = color_box.bounds.ytop + len; } else { x1 = color_box.bounds.xleft; x2 = color_box.bounds.xleft - len; } (*term->move) (x1, y1); (*term->vector) (x2, y2); } }