A litle problem with RGB images



Hi.
In the past, I wrote a program ( in DOS), to display a
signal collected from ADC. I use 2 video pages - 1 is
visible, second is hidden (to draw), and switch they very
fast. The result is very smooth animated graphic. Now i try
to convert my program on Linux. But the picture isn't very
good. The graphic start blinking. Becouse my program is too
large, I write some little example to show my idea:

#include <gtk/gtk.h>

#define WIDTH   300
#define HEIGHT  300

guchar buf[WIDTH * HEIGHT * 3];

gboolean on_expose(GtkWidget *widget, GdkEventExpose *event,
gpointer user_data)
{
        gdk_draw_rgb_image (widget->window,
                            widget->style->fg_gc[GTK_STATE_NORMAL],
                            0, 0, WIDTH, HEIGHT, GDK_RGB_DITHER_NONE,
                            buf, WIDTH * 3);
        return FALSE;
}

/* In real program this function collect data from ADC */
gint timeout_func(gpointer data)
{
        int x, y;
        gchar *pos;
        int size = WIDTH * 3 * (HEIGHT - 1);

        memmove(buf,buf + WIDTH * 3, size);     /* move image 1
line up */
        pos = buf + (HEIGHT-1) * WIDTH * 3;     /* last line start
position */

        for(x=0;x<WIDTH;x++)                    /* fill last line with random */
        {
                y = rand();                     /* simulate ADC
reading - only to test */
                *pos++ = y;
                *pos++ = y;
                *pos++ = y;
        }
        gtk_widget_queue_draw(GTK_WIDGET(data));  /* draw image on
screen */
        return TRUE;
}

int main(int argc, char *argv[])
{
        guint handler;
        GtkWidget *window;
        GtkWidget *draw_area;

        gtk_init(&argc, &argv);
        gdk_rgb_init();

        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_widget_push_visual(gdk_rgb_get_visual());
        gtk_widget_push_colormap(gdk_rgb_get_cmap());
        draw_area = gtk_drawing_area_new();
        gtk_widget_pop_visual();
        gtk_widget_pop_colormap();

        gtk_drawing_area_size( GTK_DRAWING_AREA(draw_area),
                                WIDTH, HEIGHT);
        gtk_container_add(GTK_CONTAINER (window), draw_area);
        gtk_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(gtk_exit), NULL);
        gtk_signal_connect(GTK_OBJECT(draw_area), "expose-event",
                           GTK_SIGNAL_FUNC (on_expose), NULL);
        gtk_widget_show_all (window);

        /* set timeout function - 20 times per second */
        handler = g_timeout_add(1000/20, timeout_func, draw_area);

        gtk_main();

        g_source_remove(handler);
}

Are someone idea what is wrong? My compter is 1Ghz Epia-M
10000 , and I thing - it's enought powerfull. I can see
movies with totem with no problem (no blinking, no loss
frames). Maybe gdk_draw_rbg_image isn't too fast? Or maybe
there is another way to change a big picture on display?


Thanks

-----------------------------

* Какво знаят тези, които правят пари в Мрежата? (нищо, което Вие не можете да научите)
* Как най-бързо да превърнем сайта си в машина за пари? (анатомия на комерсиалния сайт)
* ОТГОВОР: еднодневен ускорен курс "Основи на е-бизнеса"-част 1 ( 21 май, гр.София, ограничени места)
http://lifeconsult.info/?mbg_m




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]