* Axes work for what I have implemented thus far.
[scdataviz] / graphwidget.c
index 1c97eee..473aa49 100644 (file)
@@ -35,6 +35,7 @@
 G_DEFINE_TYPE(GraphWidget, graph_widget, GTK_TYPE_DRAWING_AREA);
 
 #define INSET_PERCENT 0.1
+#define DEBUG_DRAW_AXIS
 
 struct drawing_context {
   GtkWidget *widget;
@@ -79,9 +80,37 @@ static void draw_lines(gpointer data, gpointer user_data) {
   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) {
@@ -139,6 +168,15 @@ 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);
 }