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 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; }