void get_offsets( struct text_label *this_label, struct termentry *t, int *htic, int *vtic) { if ((this_label->lp_properties.flags & LP_SHOW_POINTS)) { *htic = (pointsize * t->h_tic * 0.5); *vtic = (pointsize * t->v_tic * 0.5); } else { *htic = 0; *vtic = 0; } if (is_3d_plot) { int htic2, vtic2; map3d_position_r(&(this_label->offset), &htic2, &vtic2, "get_offsets"); *htic += htic2; *vtic += vtic2; } else { double htic2, vtic2; map_position_r(&(this_label->offset), &htic2, &vtic2, "get_offsets"); *htic += (int)htic2; *vtic += (int)vtic2; } }
/* 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); } }
/* 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, 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); } }