mirror of
git://projects.qi-hardware.com/ben-scans.git
synced 2024-11-25 21:09:42 +02:00
140 lines
2.7 KiB
C
140 lines
2.7 KiB
C
|
#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();
|
||
|
}
|