]> git.scottworley.com Git - batteryviewer/commitdiff
Extract to_screen()
authorScott Worley <scottworley@scottworley.com>
Fri, 24 Feb 2023 04:58:33 +0000 (20:58 -0800)
committerScott Worley <scottworley@scottworley.com>
Fri, 24 Feb 2023 05:05:21 +0000 (21:05 -0800)
chart.c

diff --git a/chart.c b/chart.c
index 1fa76c542656f611eb2974fb1323f7d174cd8090..cdd7477eb421f570c10bad213f73b85859500975 100644 (file)
--- a/chart.c
+++ b/chart.c
@@ -21,11 +21,28 @@ struct BVChartPoint {
   float x, y;
 };
 
+struct ScreenPoint {
+  float x, y;
+};
+
 G_DEFINE_TYPE_WITH_CODE(BVChart, bv_chart, GTK_TYPE_DRAWING_AREA,
                         G_ADD_PRIVATE(BVChart))
 
 typedef void (*cairo_draw_func)(cairo_t *cr, double x, double y);
 
+static struct ScreenPoint to_screen(BVChartPrivate *priv,
+                                    GtkAllocation *allocation,
+                                    struct BVChartPoint *p) {
+  int margin = 3;
+  float xscale = (allocation->width - 2 * margin) / (priv->maxx - priv->minx);
+  float yscale = (allocation->height - 2 * margin) / (priv->miny - priv->maxy);
+  struct ScreenPoint screen_p = {
+      .x = xscale * (p->x - priv->minx) + margin,
+      .y = yscale * (p->y - priv->maxy) + margin,
+  };
+  return screen_p;
+}
+
 static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
   BVChart *chart = BV_CHART(widget);
   BVChartPrivate *priv = bv_chart_get_instance_private(chart);
@@ -39,9 +56,6 @@ static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
   GtkAllocation allocation;
   gtk_widget_get_allocation(widget, &allocation);
 
-  int margin = 3;
-  float xscale = (allocation.width - 2 * margin) / (priv->maxx - priv->minx);
-  float yscale = (allocation.height - 2 * margin) / (priv->miny - priv->maxy);
   cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
   float gap_threshold = 3.0;
   float prevx = 0.0;
@@ -50,9 +64,8 @@ static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
         &g_array_index(priv->points, struct BVChartPoint, i);
     gboolean is_gap = p->x - prevx > gap_threshold;
     cairo_draw_func f = is_gap ? cairo_move_to : cairo_line_to;
-    float screen_x = xscale * (p->x - priv->minx) + margin;
-    float screen_y = yscale * (p->y - priv->maxy) + margin;
-    f(cr, screen_x, screen_y);
+    struct ScreenPoint screen_p = to_screen(priv, &allocation, p);
+    f(cr, screen_p.x, screen_p.y);
     prevx = p->x;
   }
   cairo_stroke(cr);