static void gtk_plot_candle_draw_legend(GtkPlotData *data, gint x, gint y) { GtkPlotCandle *box; GtkPlot *plot = NULL; GtkPlotText legend; GdkRectangle area; gint lascent, ldescent, lheight, lwidth; gdouble m; box = GTK_PLOT_CANDLE(data); g_return_if_fail(data->plot != NULL); g_return_if_fail(GTK_IS_PLOT(data->plot)); if(!GTK_WIDGET_REALIZED(data->plot)) return; plot = data->plot; area.x = GTK_WIDGET(plot)->allocation.x; area.y = GTK_WIDGET(plot)->allocation.y; area.width = GTK_WIDGET(plot)->allocation.width; area.height = GTK_WIDGET(plot)->allocation.height; m = plot->magnification; legend = plot->legends_attr; if(data->legend) legend.text = data->legend; else legend.text = ""; gtk_plot_text_get_size(legend.text, legend.angle, legend.font, roundint(legend.height * m), &lwidth, &lheight, &lascent, &ldescent); legend.x = (gdouble)(area.x + x + roundint((plot->legends_line_width + 4) * m)) / (gdouble)area.width; legend.y = (gdouble)(area.y + y + lascent) / (gdouble)area.height; gtk_plot_draw_text(plot, legend); gtk_plot_pc_set_lineattr (plot->pc, data->symbol.border.line_width, 0, 0, 0); gtk_plot_pc_set_dash (plot->pc, 0, 0, 0); gtk_plot_pc_set_color(plot->pc, &data->symbol.color); if(data->symbol.symbol_style == GTK_PLOT_SYMBOL_EMPTY){ gtk_plot_pc_draw_line(plot->pc, x, y + (lascent + ldescent) / 2, x + roundint(plot->legends_line_width * m), y + (lascent + ldescent) / 2); } else { gtk_plot_pc_draw_rectangle(plot->pc, TRUE, x, y, roundint(plot->legends_line_width * m), lascent + ldescent); gtk_plot_pc_set_color(plot->pc, &data->symbol.border.color); gtk_plot_pc_draw_rectangle(plot->pc, FALSE, x, y, roundint(plot->legends_line_width * m), lascent + ldescent); } }
static void gtk_plot_bar_draw_legend(GtkPlotData *data, gint x, gint y) { GtkPlotBar *bar; GtkPlot *plot = NULL; GtkPlotText legend; GdkRectangle area; gint lascent, ldescent, lheight, lwidth; gdouble m; bar = GTK_PLOT_BAR(data); g_return_if_fail(data->plot != NULL); g_return_if_fail(GTK_IS_PLOT(data->plot)); g_return_if_fail(GTK_WIDGET_VISIBLE(data)); g_return_if_fail(GTK_WIDGET_VISIBLE(data->plot)); plot = data->plot; area.x = GTK_WIDGET(plot)->allocation.x; area.y = GTK_WIDGET(plot)->allocation.y; area.width = GTK_WIDGET(plot)->allocation.width; area.height = GTK_WIDGET(plot)->allocation.height; m = plot->magnification; legend = plot->legends_attr; if(data->legend) legend.text = data->legend; else legend.text = ""; gtk_plot_text_get_size(legend.text, legend.angle, legend.font, roundint(legend.height * m), &lwidth, &lheight, &lascent, &ldescent); legend.x = (gdouble)(area.x + x + roundint((plot->legends_line_width + 4) * m)) / (gdouble)area.width; legend.y = (gdouble)(area.y + y + lascent) / (gdouble)area.height; gtk_plot_draw_text(plot, legend); if(data->symbol.symbol_style == GTK_PLOT_SYMBOL_OPAQUE){ gtk_plot_pc_set_color(plot->pc, &plot->background); gtk_plot_pc_draw_rectangle(plot->pc, TRUE, x, y, roundint(plot->legends_line_width * m), lascent + ldescent); } gtk_plot_pc_set_lineattr (plot->pc, data->symbol.border.line_width, 0, 0, 0); gtk_plot_pc_set_dash(plot->pc, 0, 0, 0); if(data->symbol.symbol_style == GTK_PLOT_SYMBOL_FILLED){ gtk_plot_pc_set_color(plot->pc, &data->symbol.color); gtk_plot_pc_draw_rectangle(plot->pc, TRUE, x, y, roundint(plot->legends_line_width * m), lascent + ldescent); } gtk_plot_pc_set_color(plot->pc, &data->symbol.border.color); gtk_plot_pc_draw_rectangle(plot->pc, FALSE, x, y, roundint(plot->legends_line_width * m), lascent + ldescent); }
static void gtk_plot_surface_draw_legend(GtkPlotData *data, gint x, gint y) { GtkPlotSurface *surface; GtkPlot *plot = NULL; GtkPlotText legend; GdkRectangle area; gint lascent, ldescent, lheight, lwidth; gdouble m; surface = GTK_PLOT_SURFACE(data); g_return_if_fail(data->plot != NULL); g_return_if_fail(GTK_IS_PLOT(data->plot)); plot = data->plot; area.x = GTK_WIDGET(plot)->allocation.x; area.y = GTK_WIDGET(plot)->allocation.y; area.width = GTK_WIDGET(plot)->allocation.width; area.height = GTK_WIDGET(plot)->allocation.height; m = plot->magnification; legend = plot->legends_attr; if(data->legend) legend.text = data->legend; else legend.text = ""; gtk_plot_text_get_size(legend.text, legend.angle, legend.font, roundint(legend.height * m), &lwidth, &lheight, &lascent, &ldescent); if(!surface->height_gradient){ gtk_plot_pc_set_color(plot->pc, &surface->color); gtk_plot_pc_draw_rectangle(plot->pc, TRUE, x, y, roundint(plot->legends_line_width * m), lascent + ldescent); }else{ gdouble level, step; gint lx = x, lstep; step = (data->gradient.end - data->gradient.begin) / 10; lstep = roundint(plot->legends_line_width * m / 10.); for(level = data->gradient.begin; level < data->gradient.end; level += step){ GdkColor color; gtk_plot_data_get_gradient_level(data, level, &color); gtk_plot_pc_set_color(plot->pc, &color); gtk_plot_pc_draw_rectangle(plot->pc, TRUE, lx, y, lstep, lascent + ldescent); lx += lstep; } } legend.x = (gdouble)(area.x + x + roundint((plot->legends_line_width + 4) * m)) / (gdouble)area.width; legend.y = (gdouble)(area.y + y + lascent) / (gdouble)area.height; gtk_plot_draw_text(plot, legend); y += 2*lheight; gtk_plot_data_draw_gradient(data, x, y); }
static void gtk_plot_polar_draw_circle(GtkPlotPolar *polar) { GtkWidget *widget; GtkPlot *plot; GtkPlotAxis *axis, perp; GtkPlotText tick; gchar label[100]; gdouble x, y; gint line_width; gdouble xp, yp, width, height, size; gint ntick; gdouble m; gdouble x_tick = 0.; gdouble x1, y1; gdouble ox, oy; gint text_height, text_width, ascent, descent; gdouble rotation; gboolean veto = FALSE; gint sign = 1; GtkAllocation allocation; widget = GTK_WIDGET(polar); plot = GTK_PLOT(polar); m = plot->magnification; rotation = polar->rotation; if(plot->reflect_y) sign = -1; xp = plot->internal_allocation.x; yp = plot->internal_allocation.y; width = plot->internal_allocation.width; height = plot->internal_allocation.height; ox = width / 2.; oy = height / 2.; x = xp + ox; y = yp + oy; axis = plot->bottom; line_width = axis->line.line_width; gtk_plot_pc_set_color(plot->pc, &axis->line.color); gtk_plot_pc_set_lineattr(plot->pc, axis->line.line_width, 0, 3, 0); gtk_plot_get_pixel(plot, plot->ymax, 90.0 - rotation, &x1, &size); size = fabs(size - y); gtk_plot_pc_draw_circle (plot->pc, FALSE, x, y, 2 * size); gtk_plot_pc_set_lineattr(plot->pc, axis->ticks_width, 0, 1, 0); gtk_plot_text_get_size("0", 0, axis->labels_attr.font, roundint(axis->labels_attr.height * m), &text_width, &text_height, &ascent, &descent); for(ntick = 0; ntick < axis->ticks.nticks; ntick++){ x_tick = axis->ticks.values[ntick].value; if(!axis->ticks.values[ntick].minor && x_tick >= axis->ticks.min){ if(!axis->custom_labels){ gtk_plot_axis_parse_label(axis, x_tick, axis->label_precision, axis->label_style, label); } else { g_signal_emit_by_name(GTK_OBJECT(axis), "tick_label", &x_tick, label, &veto); if(!veto) gtk_plot_axis_parse_label(axis, x_tick, axis->label_precision, axis->label_style, label); } gtk_plot_get_pixel(plot, plot->ymax, x_tick, &x1, &y1); x_tick += rotation; if(axis->major_mask & GTK_PLOT_TICKS_IN){ perp.direction.x = cos(x_tick * PI / 180. * sign); perp.direction.y = -sin(x_tick * PI / 180. * sign); gtk_plot_pc_draw_line(plot->pc, x1, y1, x1 + perp.direction.x*m*axis->ticks_length, y1 + perp.direction.y*m*axis->ticks_length); } if(axis->major_mask & GTK_PLOT_TICKS_OUT){ perp.direction.x = -cos(x_tick * PI / 180. * sign); perp.direction.y = sin(x_tick * PI / 180. * sign); gtk_plot_pc_draw_line(plot->pc, x1, y1, x1 - perp.direction.x*m*axis->ticks_length, y1 - perp.direction.y*m*axis->ticks_length); } tick = axis->labels_attr; tick.text = label; if((x_tick >= 0.0 && x_tick < 90.0) || (x_tick > 270.0 && x_tick <= 360.0)) tick.justification = GTK_JUSTIFY_LEFT; if(x_tick > 90.0 && x_tick < 270.0) tick.justification = GTK_JUSTIFY_RIGHT; if(x_tick == 90.0 || x_tick == 270.0) tick.justification = GTK_JUSTIFY_CENTER; y1 += text_height / 2; if((x_tick - rotation) != 360.0 && axis->label_mask != 0){ gtk_widget_get_allocation (widget, &allocation); perp.direction.x = -cos(x_tick * PI / 180. * sign); perp.direction.y = sin(x_tick * PI / 180. * sign); tick.x = x1; tick.y = y1; tick.x -= roundint(perp.direction.x*axis->labels_offset * m); tick.y -= roundint(perp.direction.y*axis->labels_offset * m); tick.x = (gdouble)tick.x / (gdouble)allocation.width; tick.y = (gdouble)tick.y / (gdouble)allocation.height; gtk_plot_draw_text(plot, tick); } } if(axis->ticks.values[ntick].minor && x_tick >= axis->ticks.min){ gtk_plot_get_pixel(plot, plot->ymax, x_tick, &x1, &y1); x_tick += rotation; if(axis->minor_mask & GTK_PLOT_TICKS_IN){ perp.direction.x = cos(x_tick * PI / 180. * sign); perp.direction.y = -sin(x_tick * PI / 180. * sign); gtk_plot_pc_draw_line(plot->pc, x1, y1, x1 + perp.direction.x*m*axis->ticks_length/2., y1 + perp.direction.y*m*axis->ticks_length/2.); } if(axis->minor_mask & GTK_PLOT_TICKS_OUT){ perp.direction.x = -cos(x_tick * PI / 180. * sign); perp.direction.y = sin(x_tick * PI / 180. * sign); gtk_plot_pc_draw_line(plot->pc, x1, y1, x1 - perp.direction.x*m*axis->ticks_length/2., y1 - perp.direction.y*m*axis->ticks_length/2.); } } } }
static void gtk_plot_polar_draw_labels(GtkPlotPolar *polar, GtkPlotAxis *axis, GtkPlotVector tick_direction) { GtkWidget *widget; GtkPlot *plot; GtkPlotText title, tick; gchar label[100]; gdouble x_tick; gint x, y; gdouble xx, yy; gint ox, oy; gint text_height, text_width, ascent, descent; gint xp, yp, width, height; gint ntick; gdouble m; gboolean veto = FALSE; gdouble x0, y0; GtkAllocation allocation; widget = GTK_WIDGET(polar); plot = GTK_PLOT(polar); m = plot->magnification; xp = plot->internal_allocation.x; yp = plot->internal_allocation.y; width = plot->internal_allocation.width; height = plot->internal_allocation.height; ox = width / 2.; oy = height / 2.; x = xp + ox * axis->direction.x + axis->origin.x; y = yp + oy * axis->direction.y + axis->origin.y; gtk_plot_pc_set_color(plot->pc, &axis->labels_attr.fg); gtk_plot_text_get_size("0", 0, axis->labels_attr.font, roundint(axis->labels_attr.height * m), &text_width, &text_height, &ascent, &descent); switch(axis->labels_attr.angle){ case 0: y += text_height / 2.; break; case 90: break; case 180: y -= text_height / 2.; break; case 270: break; } if(axis->direction.x == 0) gtk_plot_get_pixel(plot, 0, -polar->rotation+90, &x0, &y0); else gtk_plot_get_pixel(plot, 0, -polar->rotation, &y0, &x0); tick = axis->labels_attr; for(ntick = 0; ntick < axis->ticks.nticks; ntick++){ if(axis->ticks.values[ntick].minor) continue; x_tick = axis->ticks.values[ntick].value; if(axis->direction.x == 0) gtk_plot_get_pixel(plot, x_tick, -polar->rotation+90, &xx, &yy); else gtk_plot_get_pixel(plot, x_tick, -polar->rotation, &yy, &xx); yy = yy - y0; xx = axis->direction.x * yy; yy = axis->direction.y * yy; if(x_tick >= axis->ticks.min-1.e-9){ if(!axis->custom_labels){ gtk_plot_axis_parse_label(axis, x_tick, axis->label_precision, axis->label_style, label); } else { g_signal_emit_by_name(GTK_OBJECT(axis), "tick_label", &x_tick, label, &veto); if(!veto) gtk_plot_axis_parse_label(axis, x_tick, axis->label_precision, axis->label_style, label); } tick.text = label; gtk_widget_get_allocation (widget, &allocation); if(axis->label_mask & GTK_PLOT_LABEL_IN){ tick.x = x + xx; tick.y = y + yy; tick.x = tick.x + tick_direction.x*roundint(axis->labels_offset * m); tick.y = tick.y + tick_direction.y*roundint(axis->labels_offset * m); tick.x = (gdouble)tick.x / (gdouble)allocation.width; tick.y = (gdouble)tick.y / (gdouble)allocation.height; gtk_plot_draw_text(plot, tick); tick.x = x - xx; tick.y = y - yy; tick.x = tick.x + tick_direction.x*roundint(axis->labels_offset * m); tick.y = tick.y + tick_direction.y*roundint(axis->labels_offset * m); tick.x = (gdouble)tick.x / (gdouble)allocation.width; tick.y = (gdouble)tick.y / (gdouble)allocation.height; gtk_plot_draw_text(plot, tick); } if(axis->label_mask & GTK_PLOT_LABEL_OUT){ tick.x = x + xx; tick.y = y + yy; tick.x = tick.x - tick_direction.x*roundint(axis->labels_offset * m); tick.y = tick.y - tick_direction.y*roundint(axis->labels_offset * m); tick.x = (gdouble)tick.x / (gdouble)allocation.width; tick.y = (gdouble)tick.y / (gdouble)allocation.height; gtk_plot_draw_text(plot, tick); tick.x = x - xx; tick.y = y - yy; tick.x = tick.x - tick_direction.x*roundint(axis->labels_offset * m); tick.y = tick.y - tick_direction.y*roundint(axis->labels_offset * m); tick.x = (gdouble)tick.x / (gdouble)allocation.width; tick.y = (gdouble)tick.y / (gdouble)allocation.height; gtk_plot_draw_text(plot, tick); } } } if(axis->title_visible && axis->title.text) { title = axis->title; gtk_plot_draw_text(plot, title); } }
static void gtk_plot_polar_real_paint (GtkWidget *widget) { GtkPlot *plot; GtkPlotText *child_text; GtkStyle *style; GdkPixmap *pixmap; GList *dataset; GList *text; gint width, height; gint xoffset, yoffset ; gdouble min; if(!gtk_widget_get_visible(widget)) return; plot = GTK_PLOT(widget); xoffset = plot->internal_allocation.x; yoffset = plot->internal_allocation.y; width = plot->internal_allocation.width; height = plot->internal_allocation.height; style = gtk_widget_get_style(widget); pixmap = plot->drawable; gtk_plot_pc_gsave(plot->pc); gtk_plot_pc_set_color(plot->pc, &plot->background); if(!gtk_plot_is_transparent(GTK_PLOT(plot))) gtk_plot_pc_draw_rectangle (plot->pc, TRUE, xoffset, yoffset, width , height); /* draw frame to guide the eyes*/ /* gdk_draw_rectangle (pixmap, gc, FALSE, xoffset, yoffset, width , height); */ /* draw the ticks & grid lines */ min = plot->left->ticks.min; plot->left->ticks.min = 0.0; gtk_plot_axis_ticks_recalc(plot->left); gtk_plot_axis_ticks_recalc(plot->bottom); plot->left->ticks.min = min; if(plot->left->is_visible) { GtkPlotVector tick_direction; tick_direction.x = 1.; tick_direction.y = 0.; plot->left->origin.x = (gfloat)width*plot->left_align; plot->left->origin.y = height; gtk_plot_polar_draw_axis(GTK_PLOT_POLAR(plot), plot->left, tick_direction); gtk_plot_polar_draw_labels(GTK_PLOT_POLAR(plot), plot->left, tick_direction); } if(plot->top->is_visible) { GtkPlotVector tick_direction; tick_direction.x = 0.; tick_direction.y = 1.; plot->left->direction.x = 1; plot->left->direction.y = 0; plot->left->origin.x = 0; plot->left->origin.y = (gfloat)height*plot->left_align; gtk_plot_polar_draw_axis(GTK_PLOT_POLAR(plot), plot->left, tick_direction); gtk_plot_polar_draw_labels(GTK_PLOT_POLAR(plot), plot->left, tick_direction); plot->left->direction.x = 0; plot->left->direction.y = -1; } if(plot->bottom->is_visible) { gtk_plot_polar_draw_circle(GTK_PLOT_POLAR(plot)); } gtk_plot_polar_draw_grids(GTK_PLOT_POLAR(plot)); dataset = plot->data_sets; while(dataset) { GTK_PLOT_DATA_CLASS(GTK_OBJECT_GET_CLASS(GTK_OBJECT(dataset->data)))->draw_data(GTK_PLOT_DATA(dataset->data)); dataset = dataset->next; } text = plot->text; while(text) { child_text = (GtkPlotText *) text->data; gtk_plot_draw_text(plot, *child_text); text = text->next; } GTK_PLOT_CLASS(GTK_OBJECT_GET_CLASS(GTK_OBJECT(plot)))->draw_legends(widget); gtk_plot_pc_grestore(plot->pc); }
static void gtk_plot_flux_draw_legend(GtkPlotData *data, gint x, gint y) { GtkPlotFlux *flux; GtkPlot *plot = NULL; GtkPlotText legend; GdkRectangle area; gint lascent, ldescent, lheight, lwidth; gdouble m; gboolean centered; GtkAllocation allocation; flux = GTK_PLOT_FLUX(data); centered = flux->centered; g_return_if_fail(data->plot != NULL); g_return_if_fail(GTK_IS_PLOT(data->plot)); g_return_if_fail(gtk_widget_get_visible(GTK_WIDGET(data->plot))); plot = data->plot; gtk_widget_get_allocation( GTK_WIDGET(plot), &allocation); area.x = allocation.x; area.y = allocation.y; area.width = allocation.width; area.height = allocation.height; m = plot->magnification; legend = plot->legends_attr; if(data->legend) legend.text = data->legend; else legend.text = ""; gtk_plot_text_get_size(legend.text, legend.angle, legend.font, roundint(legend.height * m), &lwidth, &lheight, &lascent, &ldescent); if(data->show_legend){ legend.x = (gdouble)(area.x + x) / (gdouble)area.width; legend.y = (gdouble)(area.y + y + lascent) / (gdouble)area.height; gtk_plot_draw_text(plot, legend); } if(flux->show_scale){ gchar new_label[100], text_max[100]; flux->centered = FALSE; gtk_plot_flux_draw_arrow(flux, area.x + x, area.y + y + lheight * 3 / 2, area.x + x + roundint(flux->size_max*m), area.y + y + lheight * 3 / 2); y += MAX(lheight, roundint(m*flux->arrow_width)); gtk_plot_axis_parse_label(data->gradient, flux->scale_max, flux->labels_precision, flux->labels_style, text_max); if(flux->labels_prefix){ gchar aux_text[100]; g_snprintf(aux_text, 100, "%s%s", flux->labels_prefix, text_max); g_snprintf(text_max, 100, "%s", aux_text); } if(flux->labels_suffix){ gchar aux_text[100]; g_snprintf(aux_text, 100, "%s%s", text_max, flux->labels_suffix); g_snprintf(text_max, 100, "%s", aux_text); } g_snprintf(new_label, 100, "%s", text_max); legend.x = (gdouble)(area.x + x + m*(flux->size_max + 4)) / (gdouble)area.width; legend.y = (gdouble)(area.y + y + lascent) / (gdouble)area.height; legend.text = new_label; gtk_plot_draw_text(plot, legend); flux->centered = centered; y += lheight; } else y += lheight; }