static gboolean gimp_color_area_expose (GtkWidget *widget, GdkEventExpose *event) { GimpColorArea *area = GIMP_COLOR_AREA (widget); GtkStyle *style = gtk_widget_get_style (widget); cairo_t *cr; cairo_surface_t *buffer; if (! area->buf || ! gtk_widget_is_drawable (widget)) return FALSE; if (area->needs_render) gimp_color_area_render (area); cr = gdk_cairo_create (gtk_widget_get_window (widget)); gdk_cairo_region (cr, event->region); cairo_clip (cr); buffer = cairo_image_surface_create_for_data (area->buf, CAIRO_FORMAT_RGB24, area->width, area->height, area->rowstride); cairo_set_source_surface (cr, buffer, 0.0, 0.0); cairo_surface_destroy (buffer); cairo_paint (cr); if (area->draw_border) { cairo_set_line_width (cr, 1.0); gdk_cairo_set_source_color (cr, &style->fg[gtk_widget_get_state (widget)]); cairo_rectangle (cr, 0.5, 0.5, area->width - 1, area->height - 1); cairo_stroke (cr); } cairo_destroy (cr); return FALSE; }
static gboolean gimp_color_area_expose (GtkWidget *widget, GdkEventExpose *event) { GimpColorArea *area = GIMP_COLOR_AREA (widget); guchar *buf; if (! area->buf || ! GTK_WIDGET_DRAWABLE (widget)) return FALSE; if (area->needs_render) gimp_color_area_render (area); buf = area->buf + event->area.y * area->rowstride + event->area.x * 3; gdk_draw_rgb_image_dithalign (widget->window, widget->style->black_gc, event->area.x, event->area.y, event->area.width, event->area.height, GDK_RGB_DITHER_MAX, buf, area->rowstride, event->area.x, event->area.y); if (area->draw_border) gdk_draw_rectangle (widget->window, widget->style->fg_gc[widget->state], FALSE, 0, 0, area->width - 1, area->height - 1); return FALSE; }