G_DEFINE_TYPE(GraphWidget, graph_widget, GTK_TYPE_DRAWING_AREA);
#define INSET_PERCENT 0.1
+#define DEBUG_DRAW_AXIS
struct drawing_context {
GtkWidget *widget;
cairo_curve_to(cxt->cr, p1_x, p1_y, p2_x, p2_y, p3_x, p3_y);
}
-static void draw_axis(gpointer data, gpointer user_data) {
- struct graph_axis *xs = data;
- struct drawing_context *cxt = user_data;
+static void draw_axis(struct drawing_context* cxt, struct graph_axis *axis, double scaling, double offset) {
+ #ifdef DEBUG_DRAW_AXIS
+ fprintf(stderr, "draw_axis; major_start=%g, major_step=%g, >major=%d, minor=%d, subminor=%d, label=%s\n", axis->major_start, axis->major_step, axis->major, axis->minor, axis->subminor, axis->title->str);
+ #endif
+ cairo_move_to(cxt->cr, 0, 0);
+ cairo_line_to(cxt->cr, 1, 0);
+ register int i, j, k;
+ register double pos, mpos, smpos;
+ for(i=0; i<axis->major; i++) {
+ pos=i*axis->major_step + axis->major_start;
+ cairo_move_to(cxt->cr, (pos + offset)*scaling, 0);
+ cairo_line_to(cxt->cr, (pos + offset)*scaling, 0.05);
+ for(k=0; k<axis->subminor; k++) {
+ smpos=(k+1)*(axis->major_step/(axis->minor+1)/(axis->subminor+1)) + pos;
+ cairo_move_to(cxt->cr, (smpos + offset)*scaling, 0);
+ cairo_line_to(cxt->cr, (smpos + offset)*scaling, 0.0125);
+ }
+ for(j=0; j<axis->minor; j++) {
+ mpos=(j+1)*(axis->major_step/(axis->minor+1)) + pos;
+ cairo_move_to(cxt->cr, (mpos + offset)*scaling, 0);
+ cairo_line_to(cxt->cr, (mpos + offset)*scaling, 0.025);
+ for(k=0; k<axis->subminor; k++) {
+ smpos=(k+1)*(axis->major_step/(axis->minor+1)/(axis->subminor+1)) + mpos;
+ cairo_move_to(cxt->cr, (smpos + offset)*scaling, 0);
+ cairo_line_to(cxt->cr, (smpos + offset)*scaling, 0.0125);
+ }
+ }
+ }
+ pos=i*axis->major_step + axis->major_start;
+ cairo_move_to(cxt->cr, (pos + offset)*scaling, 0);
+ cairo_line_to(cxt->cr, (pos + offset)*scaling, 0.05);
}
static void draw(GtkWidget *graph, cairo_t *cr) {
cairo_fill_preserve(cr);
cairo_set_source_rgb(cr, 0, 0, 0);
g_ptr_array_foreach(gw->graph->points, &draw_point, (gpointer)&cxt);
+ if(gw->graph->xaxis != NULL)
+ draw_axis(&cxt, gw->graph->xaxis, cxt.xscaling, cxt.xoffset);
+ if(gw->graph->yaxis != NULL) {
+ cairo_save(cr);
+ cairo_matrix_t matrix = { .xx=0, .xy = 1, .x0 = 0, .yx = 1, .yy = 0, .y0 = 0 };
+ cairo_transform(cr, &matrix);
+ draw_axis(&cxt, gw->graph->yaxis, cxt.yscaling, cxt.yoffset);
+ cairo_restore(cr);
+ }
cairo_stroke(cr);
cairo_restore(cr);
}