1
0
mirror of git://projects.qi-hardware.com/ben-scans.git synced 2024-11-25 21:09:42 +02:00
ben-scans/solidify/level.c

140 lines
2.7 KiB
C
Raw Normal View History

#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>
#include "array.h"
#include "face.h"
#include "level.h"
static void draw_map(GtkWidget *widget, struct face *f)
{
int x, y, z;
guchar *rgbbuf, *p;
rgbbuf = p = calloc(f->sx*f->sy, 3);
if (!rgbbuf) {
perror("calloc");
exit(1);
}
for (y = f->sy-1; y >= 0; y--)
for (x = 0; x != f->sx ; x++) {
z = get(f->a, x+f->a->min_x, y+f->a->min_y);
if (z == UNDEF) {
p += 3;
continue;
}
if (z == f->z_ref) {
*p++ = 0;
*p++ = 0;
*p++ = 255;
continue;
}
if (z < f->z_ref) {
z = 255.0*(z-f->z_ref)/(f->z_ref-f->a->min_z);
*p++ = 255;
*p++ = z;
*p++ = z;
} else {
z = 255.0*(f->z_ref-z)/(f->a->max_z-f->z_ref);
*p++ = z;
*p++ = 255;
*p++ = z;
}
}
gdk_draw_rgb_image(widget->window,
widget->style->fg_gc[GTK_STATE_NORMAL],
0, 0, f->sx, f->sy, GDK_RGB_DITHER_MAX, rgbbuf, f->sx*3);
free(rgbbuf);
}
static void draw_image(GtkWidget *da, struct face *f)
{
fprintf(stderr, "%d\n", f->z_ref);
draw_map(da, f);
}
static gboolean scroll_event(GtkWidget *widget, GdkEventScroll *event,
gpointer data)
{
GtkWidget *da = gtk_bin_get_child(GTK_BIN(widget));
struct face *f = data;
switch (event->direction) {
case GDK_SCROLL_UP:
if (f->z_ref > f->a->min_z) {
f->z_ref--;
draw_image(da, f);
}
break;
case GDK_SCROLL_DOWN:
if (f->z_ref < f->a->max_z) {
f->z_ref++;
draw_image(da, f);
}
break;
default:
/* ignore */;
}
return TRUE;
}
static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event,
gpointer user_data)
{
draw_image(widget, user_data);
return TRUE;
}
static gboolean key_press_event(GtkWidget *widget, GdkEventKey *event,
gpointer data)
{
if (event->keyval == 'q')
gtk_main_quit();
return TRUE;
}
static void make_screen(GtkWidget *root, struct face *f)
{
GtkWidget *evbox, *da;
da = gtk_drawing_area_new();
gtk_widget_set_size_request(da, f->sx, f->sy);
evbox = gtk_event_box_new();
gtk_container_add(GTK_CONTAINER(evbox), da);
gtk_container_add(GTK_CONTAINER(root), evbox);
gtk_widget_show_all(root);
draw_map(da, f);
g_signal_connect(G_OBJECT(evbox), "scroll-event",
G_CALLBACK(scroll_event), f);
g_signal_connect(G_OBJECT(da), "expose-event",
G_CALLBACK(expose_event), f);
g_signal_connect(G_OBJECT(root), "key-press-event",
G_CALLBACK(key_press_event), NULL);
}
void level(struct face *f)
{
GtkWidget *root;
root = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(root), GTK_WIN_POS_CENTER);
#if 0
/* get root->window */
gtk_widget_show_all(root);
#endif
g_signal_connect(G_OBJECT(root), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
make_screen(root, f);
gtk_main();
}