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_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_grid_real_draw (GtkDataboxGraph * graph, GtkDatabox* box) { GtkWidget *widget; GtkDataboxGrid *grid = GTK_DATABOX_GRID (graph); GtkDataboxGridPrivate *priv = GTK_DATABOX_GRID_GET_PRIVATE(grid); gint i = 0; gfloat x; gfloat y; gint16 width; gint16 height; gfloat offset_x; gfloat offset_y; gfloat factor_x; gfloat factor_y; gint16 pixel_x; gint16 pixel_y; gfloat left, right, top, bottom; cairo_t *cr; GtkAllocation allocation; g_return_if_fail (GTK_DATABOX_IS_GRID (grid)); g_return_if_fail (GTK_IS_DATABOX (box)); widget = GTK_WIDGET(box); gtk_widget_get_allocation(widget, &allocation); gtk_databox_get_total_limits (box, &left, &right, &top, &bottom); cr = gtk_databox_graph_create_gc (graph, box); width = allocation.width; height = allocation.height; offset_x = left; factor_x = (right - left) / (priv->vlines + 1); offset_y = top; factor_y = (bottom - top) / (priv->hlines + 1); if (priv->hline_vals == NULL) for (i = 0; i < priv->hlines; i++) { y = offset_y + (i + 1) * factor_y; pixel_y = gtk_databox_value_to_pixel_y (box, y); cairo_move_to (cr, 0.0, pixel_y + 0.5); cairo_line_to (cr, width, pixel_y + 0.5); } else for (i = 0; i < priv->hlines; i++) { y = priv->hline_vals[i]; pixel_y = gtk_databox_value_to_pixel_y (box, y); cairo_move_to (cr, 0.0, pixel_y + 0.5); cairo_line_to (cr, width, pixel_y + 0.5); } if (priv->vline_vals == NULL) for (i = 0; i < priv->vlines; i++) { x = offset_x + (i + 1) * factor_x; pixel_x = gtk_databox_value_to_pixel_x (box, x); cairo_move_to (cr, pixel_x + 0.5, 0.0); cairo_line_to (cr, pixel_x + 0.5, height); } else for (i = 0; i < priv->vlines; i++) { x = priv->vline_vals[i]; pixel_x = gtk_databox_value_to_pixel_x (box, x); cairo_move_to (cr, pixel_x + 0.5, 0); cairo_line_to (cr, pixel_x + 0.5, height); } cairo_stroke(cr); cairo_destroy(cr); 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; }