+GtkWidget *drawing;
+static Sweep *cur_sweep; // make this not global
+static int nred, ngreen, nblue;
+static guint8 red[256], green[256], blue[256];
+
+/* Convert a sweep to an 2d array of data points */
+static void bscan_sweep(Sweep *sweep, guint8 **data, int *width, int *height)
+{
+ /* Calculate max number of bins */
+ int i, max_bins = 0;
+ for (i = 0; i < sweep->h.nrays; i++)
+ max_bins = MAX(max_bins, sweep->ray[i]->h.nbins);
+
+ /* Allocate buffer using max number of bins for each ray */
+ char *buf = g_malloc0(sweep->h.nrays * max_bins * 3);
+
+ /* Fill the data */
+ int ri, bi;
+ for (ri = 0; ri < sweep->h.nrays; ri++) {
+ Ray *ray = sweep->ray[ri];
+ for (bi = 0; bi < ray->h.nbins; bi++) {
+ Range bin = ray->range[bi];
+ /* copy RGB into buffer */
+ buf[(ri*max_bins+bi)*3+0] = red[(guint8)ray->h.f(bin)];
+ buf[(ri*max_bins+bi)*3+1] = green[(guint8)ray->h.f(bin)];
+ buf[(ri*max_bins+bi)*3+2] = blue[(guint8)ray->h.f(bin)];
+ }
+ }
+
+ /* set output */
+ *width = max_bins;
+ *height = sweep->h.nrays;
+ *data = buf;
+
+ /* debug */
+ static int fi = 0;
+ char fname[128];
+ sprintf(fname, "image-%d.ppm", fi);
+ FILE *fp = fopen(fname, "w+");
+ fprintf(fp, "P6\n");
+ fprintf(fp, "# Foo\n");
+ fprintf(fp, "%d %d\n", *width, *height);
+ fprintf(fp, "255\n");
+ fwrite(buf, 3, *width * *height, fp);
+ fclose(fp);
+ fi++;
+}
+
+/* Load a sweep as the active texture */
+static void load_sweep(Sweep *sweep)
+{
+ cur_sweep = sweep;
+ int height, width;
+ guint8 *data;
+ bscan_sweep(sweep, &data, &width, &height);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
+ free(data);
+ glEnable(GL_TEXTURE_2D);
+ gdk_window_invalidate_rect(drawing->window, &drawing->allocation, FALSE);
+}
+
+/* Load the default sweep */
+static gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
+{
+ GdkGLContext *glcontext = gtk_widget_get_gl_context(da);
+ GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da);
+
+ if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
+ g_assert_not_reached();
+
+ /* Load the texture */
+ load_sweep(cur_sweep);
+
+ gdk_gl_drawable_gl_end(gldrawable);
+
+ return FALSE;
+}