static void gtk_databox_bars_real_draw (GtkDataboxGraph *graph, GtkDataboxCanvas *canvas) { GtkDataboxBars *bars = GTK_DATABOX_BARS (graph); GdkSegment *data; guint i = 0; gfloat *X; gfloat *Y; gint len; gint size = 0; gint16 zero = 0; g_return_if_fail (GTK_DATABOX_IS_BARS (bars)); g_return_if_fail (canvas); g_return_if_fail (canvas->pixmap); if (!graph->gc) gtk_databox_graph_create_gc (graph, canvas); len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph)); X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph)); Y = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (graph)); size = gtk_databox_graph_get_size (graph); data = bars->priv->data; zero = (gint16) ((0 - canvas->top_left_visible.y) * canvas->translation_factor.y); for (i = 0; i < len; i++, data++, X++, Y++) { data->x1 = data->x2 = (gint16) ((*X - canvas->top_left_visible.x) * canvas->translation_factor.x); data->y1 = zero; data->y2 = (gint16) ((*Y - canvas->top_left_visible.y) * canvas->translation_factor.y); } /* More than 2^16 bars will cause X IO error on most XServers (Hint from Paul Barton-Davis) */ for (i = 0; i < len; i += 65536) { gdk_draw_segments (canvas->pixmap, graph->gc, bars->priv->data + i, MIN (65536, len - i)); } return; }
static void cross_simple_finalize (GObject * object) { gpointer pointer; pointer = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (object)); if (pointer) g_free (pointer); pointer = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (object)); if (pointer) g_free (pointer); /* Chain up to the parent class */ G_OBJECT_CLASS (gtk_databox_cross_simple_parent_class)->finalize (object); }
static void gtk_databox_xyc_graph_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (object); switch (property_id) { case PROP_X: { gtk_databox_xyc_graph_set_X (xyc_graph, (gfloat *) g_value_get_pointer (value)); } break; case PROP_Y: { gtk_databox_xyc_graph_set_Y (xyc_graph, (gfloat *) g_value_get_pointer (value)); } break; case PROP_LEN: { gtk_databox_xyc_graph_set_length (xyc_graph, g_value_get_int (value)); } break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static gint gtk_databox_xyc_graph_real_calculate_extrema (GtkDataboxGraph * graph, gfloat * min_x, gfloat * max_x, gfloat * min_y, gfloat * max_y) { GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (graph); guint i; g_return_val_if_fail (GTK_DATABOX_IS_XYC_GRAPH (graph), -1); g_return_val_if_fail (min_x, -1); g_return_val_if_fail (max_x, -1); g_return_val_if_fail (min_y, -1); g_return_val_if_fail (max_y, -1); g_return_val_if_fail (xyc_graph->priv->len, -1); *min_x = *max_x = xyc_graph->priv->X[0]; *min_y = *max_y = xyc_graph->priv->Y[0]; for (i = 1; i < xyc_graph->priv->len; ++i) { if (xyc_graph->priv->X[i] < *min_x) *min_x = xyc_graph->priv->X[i]; else if (xyc_graph->priv->X[i] > *max_x) *max_x = xyc_graph->priv->X[i]; if (xyc_graph->priv->Y[i] < *min_y) *min_y = xyc_graph->priv->Y[i]; else if (xyc_graph->priv->Y[i] > *max_y) *max_y = xyc_graph->priv->Y[i]; } return 0; }
static void gtk_databox_xyc_graph_instance_init (GTypeInstance * instance /*, gpointer g_class */ ) { GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (instance); xyc_graph->priv = g_new0 (GtkDataboxXYCGraphPrivate, 1); }
static void complete (GtkDataboxMarker *marker) { marker->priv->marker_info = g_new0 (GtkDataboxMarkerInfo, gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (marker))); }
static void gtk_databox_bars_complete (GtkDataboxBars *bars) { bars->priv->data = g_new0 (GdkSegment, gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (bars))); }
static void xyc_graph_finalize (GObject * object) { GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (object); g_free (xyc_graph->priv->xyc_graph); g_free (xyc_graph->priv); /* Chain up to the parent class */ G_OBJECT_CLASS (parent_class)->finalize (object); }
void gtk_databox_marker_set_position (GtkDataboxMarker *marker, guint index, GtkDataboxMarkerPosition position) { gint len; g_return_if_fail (GTK_DATABOX_IS_MARKER (marker)); len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (marker)); g_return_if_fail (index < len); marker->priv->marker_info[index].position = position; }
void gtk_databox_marker_set_label (GtkDataboxMarker *marker, guint index, GtkDataboxTextPosition label_position, gchar *text, gboolean boxed) { gint len; g_return_if_fail (GTK_DATABOX_IS_MARKER (marker)); len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (marker)); g_return_if_fail (index < len); marker->priv->marker_info[index].label_position = label_position; marker->priv->marker_info[index].text = g_strdup (text); marker->priv->marker_info[index].boxed = boxed; if (marker->priv->marker_info[index].label) { pango_layout_set_text (marker->priv->marker_info[index].label, marker->priv->marker_info[index].text, -1); } }
static void gtk_databox_marker_real_draw (GtkDataboxGraph *graph, GtkDataboxCanvas *canvas) { GtkDataboxMarker *marker = GTK_DATABOX_MARKER (graph); GdkPoint points [3]; gfloat *X; gfloat *Y; gint len; gint16 x; gint16 y; GtkDataboxCoord coord; gint size; gint i; g_return_if_fail (GTK_DATABOX_IS_MARKER (marker)); g_return_if_fail (canvas); g_return_if_fail (canvas->pixmap); g_return_if_fail (canvas->context); if (!graph->gc) gtk_databox_graph_create_gc (graph, canvas); len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph)); X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph)); Y = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (graph)); size = gtk_databox_graph_get_size (graph); for (i = 0; i < len; ++i) { x = (gint16) ((X[i] - canvas->top_left_visible.x) * canvas->translation_factor.x); y = (gint16) ((Y[i] - canvas->top_left_visible.y) * canvas->translation_factor.y); switch (marker->priv->type) { case GTK_DATABOX_MARKER_TRIANGLE: switch (marker->priv->marker_info[i].position) { case GTK_DATABOX_MARKER_C: coord.x = x; coord.y = y; y = y - size / 2; points[0].x = x; points[0].y = y; points[1].x = x - size / 2; points[1].y = y + size; points[2].x = x + size / 2; points[2].y = y + size; break; case GTK_DATABOX_MARKER_N: coord.x = x; coord.y = y - 2 - size / 2; y = y - 2; points[0].x = x; points[0].y = y; points[1].x = x - size / 2; points[1].y = y - size; points[2].x = x + size / 2; points[2].y = y - size; break; case GTK_DATABOX_MARKER_E: coord.x = x + 2 + size / 2; coord.y = y; x = x + 2; points[0].x = x; points[0].y = y; points[1].x = x + size; points[1].y = y + size / 2; points[2].x = x + size; points[2].y = y - size / 2; break; case GTK_DATABOX_MARKER_S: coord.x = x; coord.y = y + 2 + size / 2; y = y + 2; points[0].x = x; points[0].y = y; points[1].x = x - size / 2; points[1].y = y + size; points[2].x = x + size / 2; points[2].y = y + size; break; case GTK_DATABOX_MARKER_W: coord.x = x - 2 - size / 2; coord.y = y; x = x - 2; points[0].x = x; points[0].y = y; points[1].x = x - size; points[1].y = y + size / 2; points[2].x = x - size; points[2].y = y - size / 2; break; } gdk_draw_polygon (canvas->pixmap, graph->gc, TRUE, points, 3); break; /* End of GTK_DATABOX_MARKER_TRIANGLE */ case GTK_DATABOX_MARKER_SOLID_LINE: case GTK_DATABOX_MARKER_DASHED_LINE: switch (marker->priv->marker_info[i].position) { case GTK_DATABOX_MARKER_C: coord.x = x; coord.y = y; points[0].x = x; points[0].y = 0; points[1].x = x; points[1].y = canvas->height; break; case GTK_DATABOX_MARKER_N: coord.x = x; points[0].x = x; points[0].y = 0; points[1].x = x; points[1].y = canvas->height; break; case GTK_DATABOX_MARKER_E: coord.y = y; points[0].x = 0; points[0].y = y; points[1].x = canvas->width; points[1].y = y; break; case GTK_DATABOX_MARKER_S: coord.x = x; points[0].x = x; points[0].y = 0; points[1].x = x; points[1].y = canvas->height; break; case GTK_DATABOX_MARKER_W: coord.y = y; points[0].x = 0; points[0].y = y; points[1].x = canvas->width; points[1].y = y; break; } gdk_draw_line (canvas->pixmap, graph->gc, points[0].x, points[0].y, points[1].x, points[1].y); break; /* End of GTK_DATABOX_MARKER_LINE */ case GTK_DATABOX_MARKER_NONE: default: coord.x = x; coord.y = y; break; } if (marker->priv->marker_info[i].text) { if (!marker->priv->marker_info[i].label) { marker->priv->marker_info[i].label = pango_layout_new (canvas->context); pango_layout_set_text (marker->priv->marker_info[i].label, marker->priv->marker_info[i].text, -1); } if (marker->priv->type == GTK_DATABOX_MARKER_SOLID_LINE || marker->priv->type == GTK_DATABOX_MARKER_DASHED_LINE) { gint width; gint height; pango_layout_get_pixel_size (marker->priv->marker_info[i].label, &width, &height); width = (width + 1) / 2 + 2; height = (height + 1) / 2 + 2; size = 0; switch (marker->priv->marker_info[i].position) { case GTK_DATABOX_MARKER_C: break; case GTK_DATABOX_MARKER_N: coord.y = height; break; case GTK_DATABOX_MARKER_E: coord.x = canvas->width - width; break; case GTK_DATABOX_MARKER_S: coord.y = canvas->height - height; break; case GTK_DATABOX_MARKER_W: coord.x = width; break; } } gtk_databox_label_write_at (canvas->pixmap, marker->priv->marker_info[i].label, marker->priv->label_gc, coord, marker->priv->marker_info[i].label_position, (size + 1) / 2 + 2, marker->priv->marker_info[i].boxed); } } return; }
static void gtk_databox_bars_real_draw (GtkDataboxGraph * graph, GtkDatabox* box) { GtkDataboxBars *bars = GTK_DATABOX_BARS (graph); GtkDataboxBarsPrivate *priv=GTK_DATABOX_BARS_GET_PRIVATE(bars); guint i = 0; void *X; void *Y; guint len, maxlen; gint16 zero = 0; gfloat fzero = 0.0; cairo_t *cr; gint16 *xpixels, *ypixels; guint xstart, xstride, ystart, ystride; GType xtype, ytype; g_return_if_fail (GTK_DATABOX_IS_BARS (bars)); g_return_if_fail (GTK_IS_DATABOX (box)); if (gtk_databox_get_scale_type_y (box) == GTK_DATABOX_SCALE_LOG) g_warning ("gtk_databox_bars do not work well with logarithmic scale in Y axis"); cr = gtk_databox_graph_create_gc (graph, box); len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph)); maxlen = gtk_databox_xyc_graph_get_maxlen (GTK_DATABOX_XYC_GRAPH (graph)); if (priv->pixelsalloc < len) { priv->pixelsalloc = len; priv->xpixels = (gint16 *)g_realloc(priv->xpixels, len * sizeof(gint16)); priv->ypixels = (gint16 *)g_realloc(priv->ypixels, len * sizeof(gint16)); } xpixels = priv->xpixels; ypixels = priv->ypixels; X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph)); xstart = gtk_databox_xyc_graph_get_xstart (GTK_DATABOX_XYC_GRAPH (graph)); xstride = gtk_databox_xyc_graph_get_xstride (GTK_DATABOX_XYC_GRAPH (graph)); xtype = gtk_databox_xyc_graph_get_xtype (GTK_DATABOX_XYC_GRAPH (graph)); gtk_databox_values_to_xpixels(box, xpixels, X, xtype, maxlen, xstart, xstride, len); Y = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (graph)); ystart = gtk_databox_xyc_graph_get_ystart (GTK_DATABOX_XYC_GRAPH (graph)); ystride = gtk_databox_xyc_graph_get_ystride (GTK_DATABOX_XYC_GRAPH (graph)); ytype = gtk_databox_xyc_graph_get_ytype (GTK_DATABOX_XYC_GRAPH (graph)); gtk_databox_values_to_ypixels(box, ypixels, Y, ytype, maxlen, ystart, ystride, len); gtk_databox_values_to_ypixels(box, &zero, &fzero, G_TYPE_FLOAT, 1, 0, 1, 1); for (i = 0; i < len; i++, xpixels++, ypixels++) { cairo_move_to (cr, *xpixels + 0.5, zero + 0.5); cairo_line_to (cr, *xpixels + 0.5, *ypixels + 0.5); } cairo_stroke(cr); cairo_destroy(cr); return; }