Hi, everyone:     I am very sorry to trouble you, but  I hope you can help to 
solve a problem about function "gdk_draw_rgb_image".     I want to use function 
"gdk_draw_rgb_image" to show all colors in rgb buffer to the screen when the 
screen would be refreshed. My problems is that screen can only show the colors 
only one time, and then the screen becomes white. After screen is refreshed, 
how can I keep the colors on screen until next time to be refreshed?      Thank 
you very much!  The following  is the most important codes:

static int gtk_lcd_open(conf_object_t *lcd_dev, lcd_surface_t* surface){    
lcd_gtk_device* dev = lcd_dev->obj;    lcd_touchscreen_t* lcd_ts = 
SKY_get_interface(lcd_dev, LCD_TS_INTF_NAME);    SkyEyeLCD_GTK *lcd;    guint32 
*fbmem;    char *title;    GtkWidget *touch_screen;
    assert(dev != NULL);    DBG("In %s, width=%d, height=%d, 
begin_addr=0x%x,end_addr=0x%x\n, ", __FUNCTION__, surface->width, 
surface->height, surface->lcd_addr_begin, surface->lcd_addr_end);    if (dev == 
NULL ||        surface->width <= 0 || surface->height <= 0) return -1;
    if ((fbmem = (guint32*)get_dma_addr(surface->lcd_addr_begin)) == NULL) {    
    fprintf(stderr, "[GTK_LCD]: Can't find LCD DMA from address 0x%x\n", 
surface->lcd_addr_begin);        return -1;    }    DBG("In %s, fb_mem=0x%x\n", 
__FUNCTION__, fbmem);    if ((lcd = 
(SkyEyeLCD_GTK*)malloc(sizeof(SkyEyeLCD_GTK))) == NULL) return -1;    
memset(lcd, 0, sizeof(SkyEyeLCD_GTK));
    lcd->width = surface->width;    lcd->virtual_width = surface->width + 
surface->lcd_line_offset;    lcd->height = surface->height;    lcd->depth = 
surface->depth;    lcd->update_rect.width = -1;    lcd->update_rect.height = 
-1;    lcd->update_all = TRUE;    lcd->fbmem = fbmem;    /* allocate a 
ping-pong buffer to reduce unnecessary lcd fresh */    lcd->fbmem_cp = (void 
*)malloc(surface->lcd_addr_end - surface->lcd_addr_begin);   /* shenoubang 
2012-4-9 */    gdk_rgb_init();    gtk_widget_set_default_colormap 
(gdk_rgb_get_cmap());    gtk_widget_set_default_visual (gdk_rgb_get_visual());
    if(dev->lcd_lookup_color != NULL) {        lcd->rgbbuf = 
(guchar*)malloc(lcd->width * lcd->height * 4);    } else switch (lcd->depth) {  
      case 1:        case 2:        case 4:            lcd->rgbbuf = 
(guchar*)malloc(lcd->virtual_width * lcd->height);            break;        
case 12:        case 16:            lcd->rgbbuf = 
(guchar*)malloc(lcd->virtual_width * lcd->height * 3);            break;
        case 8:        case 24:        case 32:            lcd->rgbbuf = 
(guchar*)fbmem;            break;
        default:            break;    }
    DBG("In %s, lcd->rgbbuf=0x%x\n", __FUNCTION__, lcd->rgbbuf);    lcd->window 
= gtk_window_new(GTK_WINDOW_TOPLEVEL);    
gtk_signal_connect(GTK_OBJECT(lcd->window), "delete-event",               
GTK_SIGNAL_FUNC(gtk_true), NULL);   DBG("In %s, lcd->rgbbuf=0x%x\n", 
__FUNCTION__, lcd->rgbbuf);    lcd->window = 
gtk_window_new(GTK_WINDOW_TOPLEVEL);    
gtk_signal_connect(GTK_OBJECT(lcd->window), "delete-event",               
GTK_SIGNAL_FUNC(gtk_true), NULL);
    if ((title = g_strdup_printf("%dx%dx%d SkyEye LCD & Touch Screen (GTK+)",   
                  lcd->width, lcd->height, lcd->depth)) != NULL) {        
gtk_window_set_title(GTK_WINDOW(lcd->window), title);        g_free(title);    
}    DBG("In %s, set title\n", __FUNCTION__);
    gtk_widget_set_usize(lcd->window, lcd->width, lcd->height);    
gtk_widget_set_events(lcd->window, GDK_EXPOSURE_MASK);
    touch_screen = gtk_event_box_new();    /* shenobuang 2012-4-10 */    
gtk_event_box_set_above_child (touch_screen, TRUE);    
gtk_event_box_set_visible_window (touch_screen, TRUE);
    DBG("In %s, set event\n", __FUNCTION__);    if(lcd_ts){        
skyeye_printf_in_color(GREEN, "In %s, Have touch screen register 
callback\n\n\n", __FUNCTION__);        
gtk_container_add(GTK_CONTAINER(lcd->window), touch_screen);        
gtk_widget_set_events(touch_screen,                GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);        
gtk_signal_connect(GTK_OBJECT(touch_screen), "button-press-event",              
  GTK_SIGNAL_FUNC(callback_button_press), (gpointer)lcd_ts);        
gtk_signal_connect(GTK_OBJECT(touch_screen), "button-release-event",            
    GTK_SIGNAL_FUNC(callback_button_release), (gpointer)lcd_ts);        
gtk_signal_connect(GTK_OBJECT(touch_screen), "motion-notify-event",             
   GTK_SIGNAL_FUNC(callback_motion_notify), (gpointer)lcd_ts);        
gtk_widget_realize(touch_screen);        
gdk_window_set_cursor(touch_screen->window, gdk_cursor_new(GDK_HAND2));    }  
//zy 2004-4-02 Add Drawing area    lcd->drawing 
 = gtk_drawing_area_new();    gtk_container_add(GTK_CONTAINER(touch_screen), 
lcd->drawing);    gtk_signal_connect(GTK_OBJECT(lcd->drawing), "expose-event",  
             GTK_SIGNAL_FUNC(callback_expose_event), dev);
    gtk_widget_show_all(lcd->window);    DBG("In %s, show all\n", 
__FUNCTION__);    if (dev->lcd_lookup_color == NULL){    }     switch 
(lcd->depth) {        case 1:            lcd->colormap = 
gdk_rgb_cmap_new(colors1b, 2);            break;        case 2:            
break;        case 4:            lcd->colormap = gdk_rgb_cmap_new(colors4b, 
16);            break;        case 8:            lcd->colormap = 
gdk_rgb_cmap_new(colors8b, 256);            break;
        default:            break;    }    DBG("In %s, add redraw event\n", 
__FUNCTION__);
    //lcd->timer = gtk_timeout_add(200, (GtkFunction)callback_redraw, 
lcd->window);
    dev->gtk_win = (void*)lcd;#ifndef MK_LCD    int timer_id;    
create_thread_scheduler(10000, Periodic_sched, timer_update, dev->obj, 
&timer_id);#endif
    //gtk_main_iteration_do(FALSE);    return 0;}
static gboolean callback_expose_event(GtkWidget *widget, GdkEventExpose *event, 
lcd_gtk_device* dev){     .......    <ignore some codes>
wordnum = lcd->virtual_width * rect.height * lcd->depth / 32; switch 
(lcd->depth) {case 16:               {                    int refresh = 0;      
              for (i = lcd->virtual_width * rect.y / 2; i < wordnum / 2; i++) { 
                       /* shenoubang 2012-4-9 */                        fbdata 
= ((guint64*)lcd->fbmem + i);                        fbdata_cp = 
((guint64*)lcd->fbmem_cp + i);                        if (*fbdata != 
*fbdata_cp) {                            refresh = 1;                           
 *fbdata_cp = *fbdata;                            *(lcd->rgbbuf + i * 12 + 0) = 
                               (guchar)((*fbdata_cp & 0x0000f800) >> 8);        
                    *(lcd->rgbbuf + i * 12 + 1) =                               
 (guchar)((*fbdata_cp & 0x000007e0) >> 3);                            
*(lcd->rgbbuf + i * 12 + 2) =                                
(guchar)((*fbdata_cp & 0x0000001f) << 3);                            
*(lcd->rgbbuf + i * 12 + 3) 
 =                                (guchar)((*fbdata_cp & 0xf8000000) >> 24);    
                        *(lcd->rgbbuf + i * 12 + 4) =                           
     (guchar)((*fbdata_cp & 0x07e00000) >> 19);                            
*(lcd->rgbbuf + i * 12 + 5) =                                
(guchar)((*fbdata_cp & 0x001f0000) >> 13);                            
*(lcd->rgbbuf + i * 12 + 6) =                                
(guchar)(((*fbdata_cp >> 32) & 0x0000f800) >> 8);                            
*(lcd->rgbbuf + i * 12 + 7) =                                
(guchar)(((*fbdata_cp >> 32) & 0x000007e0) >> 3);                            
*(lcd->rgbbuf + i * 12 + 8) =                                
(guchar)(((*fbdata_cp >> 32) & 0x0000001f) << 3);                            
*(lcd->rgbbuf + i * 12 + 9) =                                
(guchar)(((*fbdata_cp >> 32) & 0xf8000000) >> 24);                            
*(lcd->rgbbuf + i * 12 + 10) =                                (guchar)(
 ((*fbdata_cp >> 32) & 0x07e00000) >> 19);                            
*(lcd->rgbbuf + i * 12 + 11) =                                
(guchar)(((*fbdata_cp >> 32) & 0x001f0000) >> 13);                        }     
              }                   if (refresh) {                       
GDK_THREADS_ENTER();                        skyeye_printf_in_color(RED, 
"refresh: %d\n", refresh);                       
gdk_draw_rgb_image(widget->window,                              
widget->style->fg_gc[GTK_STATE_NORMAL],                             0, rect.y, 
lcd->width, rect.height,                            GDK_RGB_DITHER_MAX,         
                   (guchar*)lcd->rgbbuf + rect.y * lcd->virtual_width * 3,      
                      lcd->virtual_width * 3);                   
GDK_THREADS_LEAVE();               }            }            break;       
.........       <ignore some codes>              return TRUE;}
                                                                                
  
_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to