/* * 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); }
/* * 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); }
void multiplot_start() { TBOOLEAN set_spacing = FALSE; TBOOLEAN set_margins = FALSE; c_token++; /* Only a few options are possible if we are already in multiplot mode */ /* So far we have "next". Maybe also "previous", "clear"? */ if (multiplot) { if (equals(c_token, "next")) { c_token++; if (!mp_layout.auto_layout) int_error(c_token, "only valid inside an auto-layout multiplot"); multiplot_next(); return; } else if (almost_equals(c_token, "prev$ious")) { c_token++; if (!mp_layout.auto_layout) int_error(c_token, "only valid inside an auto-layout multiplot"); multiplot_previous(); return; } else { term_end_multiplot(); } } /* FIXME: more options should be reset/initialized each time */ mp_layout.auto_layout = FALSE; mp_layout.auto_layout_margins = FALSE; mp_layout.current_panel = 0; mp_layout.title.noenhanced = FALSE; free(mp_layout.title.text); mp_layout.title.text = NULL; free(mp_layout.title.font); mp_layout.title.font = NULL; /* Parse options */ while (!END_OF_COMMAND) { if (almost_equals(c_token, "ti$tle")) { c_token++; mp_layout.title.text = try_to_get_string(); continue; } if (equals(c_token, "font")) { c_token++; mp_layout.title.font = try_to_get_string(); continue; } if (almost_equals(c_token,"enh$anced")) { mp_layout.title.noenhanced = FALSE; c_token++; continue; } if (almost_equals(c_token,"noenh$anced")) { mp_layout.title.noenhanced = TRUE; c_token++; continue; } if (almost_equals(c_token, "lay$out")) { if (mp_layout.auto_layout) int_error(c_token, "too many layout commands"); else mp_layout.auto_layout = TRUE; c_token++; if (END_OF_COMMAND) { int_error(c_token,"expecting '<num_cols>,<num_rows>'"); } /* read row,col */ mp_layout.num_rows = int_expression(); if (END_OF_COMMAND || !equals(c_token,",") ) int_error(c_token, "expecting ', <num_cols>'"); c_token++; if (END_OF_COMMAND) int_error(c_token, "expecting <num_cols>"); mp_layout.num_cols = int_expression(); /* remember current values of the plot size and the margins */ mp_layout.prev_xsize = xsize; mp_layout.prev_ysize = ysize; mp_layout.prev_xoffset = xoffset; mp_layout.prev_yoffset = yoffset; mp_layout.prev_lmargin = lmargin; mp_layout.prev_rmargin = rmargin; mp_layout.prev_bmargin = bmargin; mp_layout.prev_tmargin = tmargin; mp_layout.act_row = 0; mp_layout.act_col = 0; continue; } /* The remaining options are only valid for auto-layout mode */ if (!mp_layout.auto_layout) int_error(c_token, "only valid in the context of an auto-layout command"); switch(lookup_table(&set_multiplot_tbl[0],c_token)) { case S_MULTIPLOT_COLUMNSFIRST: mp_layout.row_major = TRUE; c_token++; break; case S_MULTIPLOT_ROWSFIRST: mp_layout.row_major = FALSE; c_token++; break; case S_MULTIPLOT_DOWNWARDS: mp_layout.downwards = TRUE; c_token++; break; case S_MULTIPLOT_UPWARDS: mp_layout.downwards = FALSE; c_token++; break; case S_MULTIPLOT_SCALE: c_token++; mp_layout.xscale = real_expression(); mp_layout.yscale = mp_layout.xscale; if (!END_OF_COMMAND && equals(c_token,",") ) { c_token++; if (END_OF_COMMAND) { int_error(c_token, "expecting <yscale>"); } mp_layout.yscale = real_expression(); } break; case S_MULTIPLOT_OFFSET: c_token++; mp_layout.xoffset = real_expression(); mp_layout.yoffset = mp_layout.xoffset; if (!END_OF_COMMAND && equals(c_token,",") ) { c_token++; if (END_OF_COMMAND) { int_error(c_token, "expecting <yoffset>"); } mp_layout.yoffset = real_expression(); } break; case S_MULTIPLOT_MARGINS: c_token++; if (END_OF_COMMAND) int_error(c_token,"expecting '<left>,<right>,<bottom>,<top>'"); mp_layout.lmargin.scalex = screen; mp_layout_set_margin_or_spacing(&(mp_layout.lmargin)); if (!END_OF_COMMAND && equals(c_token,",") ) { c_token++; if (END_OF_COMMAND) int_error(c_token, "expecting <right>"); mp_layout.rmargin.scalex = mp_layout.lmargin.scalex; mp_layout_set_margin_or_spacing(&(mp_layout.rmargin)); } else { int_error(c_token, "expecting <right>"); } if (!END_OF_COMMAND && equals(c_token,",") ) { c_token++; if (END_OF_COMMAND) int_error(c_token, "expecting <top>"); mp_layout.bmargin.scalex = mp_layout.rmargin.scalex; mp_layout_set_margin_or_spacing(&(mp_layout.bmargin)); } else { int_error(c_token, "expecting <bottom>"); } if (!END_OF_COMMAND && equals(c_token,",") ) { c_token++; if (END_OF_COMMAND) int_error(c_token, "expecting <bottom>"); mp_layout.tmargin.scalex = mp_layout.bmargin.scalex; mp_layout_set_margin_or_spacing(&(mp_layout.tmargin)); } else { int_error(c_token, "expection <top>"); } set_margins = TRUE; break; case S_MULTIPLOT_SPACING: c_token++; if (END_OF_COMMAND) int_error(c_token,"expecting '<xspacing>,<yspacing>'"); mp_layout.xspacing.scalex = screen; mp_layout_set_margin_or_spacing(&(mp_layout.xspacing)); mp_layout.yspacing = mp_layout.xspacing; if (!END_OF_COMMAND && equals(c_token, ",")) { c_token++; if (END_OF_COMMAND) int_error(c_token, "expecting <yspacing>"); mp_layout_set_margin_or_spacing(&(mp_layout.yspacing)); } set_spacing = TRUE; break; default: int_error(c_token,"invalid or duplicate option"); break; } } if (set_spacing || set_margins) { if (set_spacing && set_margins) { if (mp_layout.lmargin.x >= 0 && mp_layout.rmargin.x >= 0 && mp_layout.tmargin.x >= 0 && mp_layout.bmargin.x >= 0 && mp_layout.xspacing.x >= 0 && mp_layout.yspacing.x >= 0) mp_layout.auto_layout_margins = TRUE; else int_error(NO_CARET, "must give positive margin and spacing values"); } else if (set_spacing) { int_warn(NO_CARET, "must give margins and spacing, continue with auto margins."); } else if (set_margins) { mp_layout.auto_layout_margins = TRUE; mp_layout.xspacing.scalex = screen; mp_layout.xspacing.x = 0.05; mp_layout.yspacing.scalex = screen; mp_layout.yspacing.x = 0.05; int_warn(NO_CARET, "must give margins and spacing, continue with spacing of 0.05"); } /* Sanity check that screen tmargin is > screen bmargin */ if (mp_layout.bmargin.scalex == screen && mp_layout.tmargin.scalex == screen) if (mp_layout.bmargin.x > mp_layout.tmargin.x) { double tmp = mp_layout.bmargin.x; mp_layout.bmargin.x = mp_layout.tmargin.x; mp_layout.tmargin.x = tmp; } } /* If we reach here, then the command has been successfully parsed. * Aug 2013: call term_start_plot() before setting multiplot so that * the wxt and qt terminals will reset the plot count to 0 before * ignoring subsequent TERM_LAYER_RESET requests. */ term_start_plot(); multiplot = TRUE; fill_gpval_integer("GPVAL_MULTIPLOT", 1); /* Place overall title before doing anything else */ if (mp_layout.title.text) { double tmpx, tmpy; unsigned int x, y; char *p = mp_layout.title.text; map_position_r(&(mp_layout.title.offset), &tmpx, &tmpy, "mp title"); x = term->xmax / 2 + tmpx; y = term->ymax - term->v_char + tmpy;; ignore_enhanced(mp_layout.title.noenhanced); apply_pm3dcolor(&(mp_layout.title.textcolor)); write_multiline(x, y, mp_layout.title.text, CENTRE, JUST_TOP, 0, mp_layout.title.font); reset_textcolor(&(mp_layout.title.textcolor)); ignore_enhanced(FALSE); /* Calculate fractional height of title compared to entire page */ /* If it would fill the whole page, forget it! */ for (y=1; *p; p++) if (*p == '\n') y++; /* Oct 2012 - v_char depends on the font used */ if (mp_layout.title.font && *mp_layout.title.font) term->set_font(mp_layout.title.font); mp_layout.title_height = (double)(y * term->v_char) / (double)term->ymax; if (mp_layout.title.font && *mp_layout.title.font) term->set_font(""); if (mp_layout.title_height > 0.9) mp_layout.title_height = 0.05; } else { mp_layout.title_height = 0.0; } if (mp_layout.auto_layout_margins) mp_layout_margins_and_spacing(); else mp_layout_size_and_offset(); }