| The libart library | |||
|---|---|---|---|
| <<< Previous Page | Home | Up | Next Page >>> |
Once more, the code for this example can be found there.
Now that we know how to render our data in a pixel buffer, we want to display it on screen in a window. To do this, we use the gdkrgb library which transfers pixel buffers to the X server in Drawables. The code below is very similar to our previous example: we just initialize GTK+ and gdkrgb and instead of saving the pixel buffer to a file, we create a widget to display it and run the GTK+ main loop:
int main (int argc, char *argv[])
{
ArtSVP *path;
char *buffer;
/* gtk/gdkrgb initialization */
gtk_init (&argc, &argv);
gdk_rgb_init ();
gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
gtk_widget_set_default_visual(gdk_rgb_get_visual());
path = make_path ();
buffer = render_path (path);
build_widget (buffer);
/* gtk main loop */
gtk_main ();
return 0;
}
|
The only new function is build_widget which is shown below. This function just creates a drawing area and connects a drawing callback to the expose signal.
static void
build_widget (unsigned char *buffer)
{
GtkWidget *window = NULL, *drawing_area = NULL;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW(window), WIDTH, HEIGHT);
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
GTK_SIGNAL_FUNC (destroy_cb), NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (destroy_cb), NULL);
drawing_area = gtk_drawing_area_new ();
gtk_container_add (GTK_CONTAINER (window),
GTK_WIDGET (drawing_area));
gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
GTK_SIGNAL_FUNC (expose_cb), buffer);
gtk_signal_connect (GTK_OBJECT (drawing_area), "configure_event",
GTK_SIGNAL_FUNC (expose_cb), buffer);
gtk_widget_show_all (window);
}
|
The expose callback is very simple: it just calls gdkrgb's entry point to render the pixel buffer onto the drawing area we instantiated a little before.
static int
expose_cb (GtkWidget *widget, GdkEventExpose *evt, gpointer data)
{
art_u8 *buf = (art_u8 *)data;
gdk_draw_rgb_image (widget->window, widget->style->black_gc,
0, 0, WIDTH, HEIGHT,
GDK_RGB_DITHER_NONE,
buf,
ROWSTRIDE);
return FALSE;
}
|