static gboolean um_crop_area_draw (GtkWidget *widget, cairo_t *cr) { GdkRectangle crop; gint width, height; UmCropArea *uarea = UM_CROP_AREA (widget); if (uarea->priv->browse_pixbuf == NULL) return FALSE; update_pixbufs (uarea); width = gdk_pixbuf_get_width (uarea->priv->pixbuf); height = gdk_pixbuf_get_height (uarea->priv->pixbuf); crop_to_widget (uarea, &crop); gdk_cairo_set_source_pixbuf (cr, uarea->priv->color_shifted, 0, 0); cairo_rectangle (cr, 0, 0, width, crop.y); cairo_rectangle (cr, 0, crop.y, crop.x, crop.height); cairo_rectangle (cr, crop.x + crop.width, crop.y, width - crop.x - crop.width, crop.height); cairo_rectangle (cr, 0, crop.y + crop.height, width, height - crop.y - crop.height); cairo_fill (cr); gdk_cairo_set_source_pixbuf (cr, uarea->priv->pixbuf, 0, 0); cairo_rectangle (cr, crop.x, crop.y, crop.width, crop.height); cairo_fill (cr); if (uarea->priv->active_region != OUTSIDE) { gint x1, x2, y1, y2; cairo_set_source_rgb (cr, 1, 1, 1); cairo_set_line_width (cr, 1.0); x1 = crop.x + crop.width / 3.0; x2 = crop.x + 2 * crop.width / 3.0; y1 = crop.y + crop.height / 3.0; y2 = crop.y + 2 * crop.height / 3.0; cairo_move_to (cr, x1 + 0.5, crop.y); cairo_line_to (cr, x1 + 0.5, crop.y + crop.height); cairo_move_to (cr, x2 + 0.5, crop.y); cairo_line_to (cr, x2 + 0.5, crop.y + crop.height); cairo_move_to (cr, crop.x, y1 + 0.5); cairo_line_to (cr, crop.x + crop.width, y1 + 0.5); cairo_move_to (cr, crop.x, y2 + 0.5); cairo_line_to (cr, crop.x + crop.width, y2 + 0.5); cairo_stroke (cr); } cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_line_width (cr, 1.0); cairo_rectangle (cr, crop.x + 0.5, crop.y + 0.5, crop.width - 1.0, crop.height - 1.0); cairo_stroke (cr); cairo_set_source_rgb (cr, 1, 1, 1); cairo_set_line_width (cr, 2.0); cairo_rectangle (cr, crop.x + 2.0, crop.y + 2.0, crop.width - 4.0, crop.height - 4.0); cairo_stroke (cr); return FALSE; }
static gboolean um_crop_area_expose (GtkWidget *widget, GdkEventExpose *event) { cairo_t *cr; GdkRectangle area; GdkRectangle crop; gint width, height; UmCropArea *uarea = UM_CROP_AREA (widget); if (uarea->priv->browse_pixbuf == NULL) return FALSE; update_pixbufs (uarea); width = gdk_pixbuf_get_width (uarea->priv->pixbuf); height = gdk_pixbuf_get_height (uarea->priv->pixbuf); crop_to_widget (uarea, &crop); area.x = 0; area.y = 0; area.width = width; area.height = crop.y; gdk_rectangle_intersect (&area, &event->area, &area); gdk_draw_pixbuf (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], uarea->priv->color_shifted, area.x, area.y, area.x, area.y, area.width, area.height, GDK_RGB_DITHER_NONE, 0, 0); area.x = 0; area.y = crop.y; area.width = crop.x; area.height = crop.height; gdk_rectangle_intersect (&area, &event->area, &area); gdk_draw_pixbuf (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], uarea->priv->color_shifted, area.x, area.y, area.x, area.y, area.width, area.height, GDK_RGB_DITHER_NONE, 0, 0); area.x = crop.x; area.y = crop.y; area.width = crop.width; area.height = crop.height; gdk_rectangle_intersect (&area, &event->area, &area); gdk_draw_pixbuf (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], uarea->priv->pixbuf, area.x, area.y, area.x, area.y, area.width, area.height, GDK_RGB_DITHER_NONE, 0, 0); area.x = crop.x + crop.width; area.y = crop.y; area.width = width - area.x; area.height = crop.height; gdk_rectangle_intersect (&area, &event->area, &area); gdk_draw_pixbuf (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], uarea->priv->color_shifted, area.x, area.y, area.x, area.y, area.width, area.height, GDK_RGB_DITHER_NONE, 0, 0); area.x = 0; area.y = crop.y + crop.height; area.width = width; area.height = height - area.y; gdk_rectangle_intersect (&area, &event->area, &area); gdk_draw_pixbuf (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], uarea->priv->color_shifted, area.x, area.y, area.x, area.y, area.width, area.height, GDK_RGB_DITHER_NONE, 0, 0); cr = gdk_cairo_create (widget->window); gdk_cairo_rectangle (cr, &event->area); cairo_clip (cr); if (uarea->priv->active_region != OUTSIDE) { gint x1, x2, y1, y2; gdk_cairo_set_source_color (cr, &widget->style->white); cairo_set_line_width (cr, 1.0); x1 = crop.x + crop.width / 3.0; x2 = crop.x + 2 * crop.width / 3.0; y1 = crop.y + crop.height / 3.0; y2 = crop.y + 2 * crop.height / 3.0; cairo_move_to (cr, x1 + 0.5, crop.y); cairo_line_to (cr, x1 + 0.5, crop.y + crop.height); cairo_move_to (cr, x2 + 0.5, crop.y); cairo_line_to (cr, x2 + 0.5, crop.y + crop.height); cairo_move_to (cr, crop.x, y1 + 0.5); cairo_line_to (cr, crop.x + crop.width, y1 + 0.5); cairo_move_to (cr, crop.x, y2 + 0.5); cairo_line_to (cr, crop.x + crop.width, y2 + 0.5); cairo_stroke (cr); } gdk_cairo_set_source_color (cr, &widget->style->black); cairo_set_line_width (cr, 1.0); cairo_rectangle (cr, crop.x + 0.5, crop.y + 0.5, crop.width - 1.0, crop.height - 1.0); cairo_stroke (cr); gdk_cairo_set_source_color (cr, &widget->style->white); cairo_set_line_width (cr, 2.0); cairo_rectangle (cr, crop.x + 2.0, crop.y + 2.0, crop.width - 4.0, crop.height - 4.0); cairo_stroke (cr); cairo_destroy (cr); return FALSE; }