#include #include #include #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(); }