Beispiel #1
0
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;
}
Beispiel #2
0
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;
}