[gthumb] fixed the image selector



commit 0645b39448a128d8c7b329ad4ca9ae51a892acbc
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Oct 31 16:30:36 2013 +0100

    fixed the image selector

 gthumb/gth-image-dragger.c  |   72 +++---------------------------------
 gthumb/gth-image-selector.c |   69 ++++++++++++++++++++--------------
 gthumb/gth-image-viewer.c   |   86 +++++++++++++++++++++++++++++++++++++++---
 gthumb/gth-image-viewer.h   |    2 +
 4 files changed, 128 insertions(+), 101 deletions(-)
---
diff --git a/gthumb/gth-image-dragger.c b/gthumb/gth-image-dragger.c
index 4d90ecf..a457901 100644
--- a/gthumb/gth-image-dragger.c
+++ b/gthumb/gth-image-dragger.c
@@ -178,7 +178,7 @@ gth_image_dragger_unset_viewer (GthImageViewerTool *base,
 {
        GthImageDragger *self = GTH_IMAGE_DRAGGER (base);
 
-       if ((self->priv->viewer != NULL) &&  self->priv->show_frame)
+       if ((self->priv->viewer != NULL) && self->priv->show_frame)
                gth_image_viewer_hide_frame (self->priv->viewer);
        self->priv->viewer = NULL;
 }
@@ -249,21 +249,6 @@ gth_image_dragger_unmap (GthImageViewerTool *base)
 }
 
 
-static gboolean
-image_has_alpha (GthImageViewer *viewer)
-{
-       cairo_surface_t *image;
-       guchar          *first_pixel;
-
-       image = gth_image_viewer_get_current_image (viewer);
-       if (image == NULL)
-               return FALSE;
-
-       first_pixel = cairo_image_surface_get_data (image);
-       return first_pixel[CAIRO_ALPHA] < 255;
-}
-
-
 static void
 gth_image_dragger_draw (GthImageViewerTool *self,
                        cairo_t            *cr)
@@ -279,67 +264,22 @@ gth_image_dragger_draw (GthImageViewerTool *self,
        if (gth_image_viewer_get_current_image (viewer) == NULL)
                return;
 
-       /* draw a frame around the image */
-
-       if (gth_image_viewer_is_frame_visible (viewer)
-           && ! gth_image_viewer_is_animation (viewer)
-           && ! image_has_alpha (viewer))
-       {
-               int x_ofs, y_ofs;
-
-               cairo_save (cr);
-
-               x_ofs = (viewer->frame_area.x < 0) ? viewer->frame_area.x + viewer->visible_area.x : 0;
-               y_ofs = (viewer->frame_area.y < 0) ? viewer->frame_area.y + viewer->visible_area.y : 0;
-               cairo_translate (cr, -x_ofs, -y_ofs);
-
-               /* drop shadow */
-
-               cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
-               cairo_rectangle (cr,
-                                viewer->image_area.x + 2 + 0.5,
-                                viewer->image_area.y + 2 + 0.5,
-                                viewer->image_area.width + 2,
-                                viewer->image_area.height + 2);
-               cairo_fill (cr);
-
-               /* frame */
-
-               cairo_set_line_width (cr, 2.0);
-               cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
-               cairo_rectangle (cr,
-                                viewer->image_area.x - 1,
-                                viewer->image_area.y - 1,
-                                viewer->image_area.width + 1,
-                                viewer->image_area.height + 1);
-               cairo_stroke (cr);
-
-               cairo_set_line_width (cr, 1.0);
-               cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
-               cairo_rectangle (cr,
-                                viewer->image_area.x - 2,
-                                viewer->image_area.y - 2,
-                                viewer->image_area.width + 4,
-                                viewer->image_area.height + 4);
-               cairo_stroke (cr);
-
-               cairo_restore (cr);
-       }
+       gth_image_viewer_paint_frame (viewer, cr);
 
        if (dragger->priv->scaled != NULL)
                gth_image_viewer_paint_region (viewer,
                                               cr,
                                               dragger->priv->scaled,
-                                              viewer->image_area.x > 0 ? viewer->image_area.x : 
viewer->visible_area.x,
-                                              viewer->image_area.y > 0 ? viewer->image_area.y : 
viewer->visible_area.y,
+                                              viewer->image_area.x,
+                                              viewer->image_area.y,
                                               &viewer->visible_area,
                                               CAIRO_FILTER_FAST);
        else
                gth_image_viewer_paint_region (viewer,
                                               cr,
                                               gth_image_viewer_get_current_image (viewer),
-                                              viewer->image_area.x > 0 ? viewer->image_area.x : 
viewer->visible_area.x,
-                                              viewer->image_area.y > 0 ? viewer->image_area.y : 
viewer->visible_area.y,
+                                              viewer->image_area.x,
+                                              viewer->image_area.y,
                                               &viewer->visible_area,
                                               gth_image_viewer_get_zoom_quality_filter (viewer));
 
diff --git a/gthumb/gth-image-selector.c b/gthumb/gth-image-selector.c
index 53f1873..fafa729 100644
--- a/gthumb/gth-image-selector.c
+++ b/gthumb/gth-image-selector.c
@@ -320,8 +320,8 @@ get_event_area_from_position (GthImageSelector *self,
                cairo_rectangle_int_t  widget_area;
 
                widget_area = event_area->area;
-               widget_area.x += self->priv->viewer->image_area.x;
-               widget_area.y += self->priv->viewer->image_area.y;
+               widget_area.x += MAX (self->priv->viewer->image_area.x, gth_image_viewer_get_frame_border 
(self->priv->viewer));
+               widget_area.y += MAX (self->priv->viewer->image_area.y, gth_image_viewer_get_frame_border 
(self->priv->viewer));
 
                if (point_in_rectangle (x, y, widget_area))
                        return event_area;
@@ -423,8 +423,8 @@ event_area_paint (GthImageSelector *self,
        }
 
        _cairo_rectangle_partial (cr,
-                                 event_area->area.x + self->priv->viewer->image_area.x - 
self->priv->viewer->x_offset + 0.5,
-                                 event_area->area.y + self->priv->viewer->image_area.y - 
self->priv->viewer->y_offset + 0.5,
+                                 self->priv->viewer->image_area.x + event_area->area.x - 
self->priv->viewer->visible_area.x + 0.5,
+                                 self->priv->viewer->image_area.y + event_area->area.y - 
self->priv->viewer->visible_area.y + 0.5,
                                  event_area->area.width - 1.0,
                                  event_area->area.height - 1.0,
                                  sides);
@@ -524,8 +524,8 @@ queue_draw (GthImageSelector      *self,
                return;
 
        gtk_widget_queue_draw_area (GTK_WIDGET (self->priv->viewer),
-                                   self->priv->viewer->image_area.x + area.x - self->priv->viewer->x_offset,
-                                   self->priv->viewer->image_area.y + area.y - self->priv->viewer->y_offset,
+                                   self->priv->viewer->image_area.x + area.x - 
self->priv->viewer->visible_area.x,
+                                   self->priv->viewer->image_area.y + area.y - 
self->priv->viewer->visible_area.y,
                                    area.width,
                                    area.height);
 }
@@ -612,7 +612,9 @@ gth_image_selector_set_viewer (GthImageViewerTool *base,
                               GthImageViewer     *image_viewer)
 {
        GthImageSelector *self = GTH_IMAGE_SELECTOR (base);
+
        self->priv->viewer = image_viewer;
+       gth_image_viewer_show_frame (self->priv->viewer, 25);
 }
 
 
@@ -621,6 +623,9 @@ gth_image_selector_unset_viewer (GthImageViewerTool *base,
                                 GthImageViewer     *image_viewer)
 {
        GthImageSelector *self = GTH_IMAGE_SELECTOR (base);
+
+       if (self->priv->viewer != NULL)
+               gth_image_viewer_hide_frame (self->priv->viewer);
        self->priv->viewer = NULL;
 }
 
@@ -697,16 +702,19 @@ paint_background (GthImageSelector *self,
        gth_image_viewer_paint_region (self->priv->viewer,
                                       cr,
                                       self->priv->surface,
-                                      self->priv->viewer->x_offset - self->priv->viewer->image_area.x,
-                                      self->priv->viewer->y_offset - self->priv->viewer->image_area.y,
-                                      &self->priv->viewer->image_area,
-                                      NULL,
+                                      self->priv->viewer->image_area.x,
+                                      self->priv->viewer->image_area.y,
+                                      &self->priv->viewer->visible_area,
                                       gth_image_viewer_get_zoom_quality_filter (self->priv->viewer));
 
        /* make the background darker */
 
        cairo_save (cr);
-       gdk_cairo_rectangle (cr, &self->priv->viewer->image_area);
+       cairo_rectangle (cr,
+                        self->priv->viewer->image_area.x - self->priv->viewer->visible_area.x,
+                        self->priv->viewer->image_area.y - self->priv->viewer->visible_area.y,
+                        self->priv->viewer->image_area.width,
+                        self->priv->viewer->image_area.height);
        cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
        cairo_fill (cr);
        cairo_restore (cr);
@@ -719,22 +727,26 @@ paint_selection (GthImageSelector *self,
 {
        cairo_rectangle_int_t selection_area;
 
-       selection_area = self->priv->selection_area;
-       selection_area.x += self->priv->viewer->image_area.x - self->priv->viewer->x_offset;
-       selection_area.y += self->priv->viewer->image_area.y - self->priv->viewer->y_offset;
+       if (! self->priv->viewer->dragging) {
+               int frame_border = gth_image_viewer_get_frame_border (self->priv->viewer);
 
-       if (! self->priv->viewer->dragging)
+               selection_area = self->priv->selection_area;
+               selection_area.x += frame_border;
+               selection_area.y += frame_border;
                gth_image_viewer_paint_region (self->priv->viewer,
                                               cr,
                                               self->priv->surface,
-                                              self->priv->viewer->x_offset - 
self->priv->viewer->image_area.x,
-                                              self->priv->viewer->y_offset - 
self->priv->viewer->image_area.y,
+                                              selection_area.x + self->priv->viewer->image_area.x - 
self->priv->viewer->visible_area.x,
+                                              selection_area.y + self->priv->viewer->image_area.y - 
self->priv->viewer->visible_area.y,
                                               &selection_area,
-                                              NULL,
                                               gth_image_viewer_get_zoom_quality_filter (self->priv->viewer));
+       }
 
        cairo_save (cr);
 
+       selection_area = self->priv->selection_area;
+       selection_area.x += self->priv->viewer->image_area.x - self->priv->viewer->visible_area.x;
+       selection_area.y += self->priv->viewer->image_area.y - self->priv->viewer->visible_area.y;
        cairo_rectangle (cr,
                         selection_area.x + 0.5,
                         selection_area.y + 0.5,
@@ -764,10 +776,9 @@ paint_image (GthImageSelector *self,
        gth_image_viewer_paint_region (self->priv->viewer,
                                       cr,
                                       self->priv->surface,
-                                      self->priv->viewer->x_offset - self->priv->viewer->image_area.x,
-                                      self->priv->viewer->y_offset - self->priv->viewer->image_area.y,
-                                      &self->priv->viewer->image_area,
-                                      NULL,
+                                      self->priv->viewer->image_area.x,
+                                      self->priv->viewer->image_area.y,
+                                      &self->priv->viewer->visible_area,
                                       gth_image_viewer_get_zoom_quality_filter (self->priv->viewer));
 }
 
@@ -783,6 +794,8 @@ gth_image_selector_draw (GthImageViewerTool *base,
        if (self->priv->surface == NULL)
                return;
 
+       gth_image_viewer_paint_frame (self->priv->viewer, cr);
+
        if (self->priv->mask_visible) {
                if (self->priv->viewer->dragging)
                        paint_image (self, cr);
@@ -857,8 +870,8 @@ gth_image_selector_button_release (GthImageViewerTool *base,
        }
 
        update_cursor (self,
-                      event->x + self->priv->viewer->x_offset,
-                      event->y + self->priv->viewer->y_offset);
+                      event->x + self->priv->viewer->visible_area.x,
+                      event->y + self->priv->viewer->visible_area.y);
        gtk_widget_queue_draw (GTK_WIDGET (self->priv->viewer));
 
        return FALSE;
@@ -1009,8 +1022,8 @@ gth_image_selector_button_press (GthImageViewerTool *base,
        if (! point_in_rectangle (event->x, event->y, self->priv->viewer->image_area))
                return FALSE;
 
-       x = event->x + self->priv->viewer->x_offset;
-       y = event->y + self->priv->viewer->y_offset;
+       x = event->x + self->priv->viewer->visible_area.x;
+       y = event->y + self->priv->viewer->visible_area.y;
 
        if (self->priv->current_area == NULL) {
                cairo_rectangle_int_t new_selection;
@@ -1445,8 +1458,8 @@ gth_image_selector_motion_notify (GthImageViewerTool *base,
        int               absolute_x, absolute_y;
 
        widget = GTK_WIDGET (self->priv->viewer);
-       x = event->x + self->priv->viewer->x_offset;
-       y = event->y + self->priv->viewer->y_offset;
+       x = event->x + self->priv->viewer->visible_area.x;
+       y = event->y + self->priv->viewer->visible_area.y;
 
        if (self->priv->type == GTH_SELECTOR_TYPE_POINT) {
                x = selector_to_real (self, x - self->priv->viewer->image_area.x);
diff --git a/gthumb/gth-image-viewer.c b/gthumb/gth-image-viewer.c
index 988a8b4..e06de99 100644
--- a/gthumb/gth-image-viewer.c
+++ b/gthumb/gth-image-viewer.c
@@ -287,8 +287,8 @@ _gth_image_viewer_update_image_area (GthImageViewer *self)
 
        _gth_image_viewer_get_zoomed_size (self, &zoomed_width, &zoomed_height);
 
-       self->frame_area.x = (self->visible_area.width - zoomed_width) / 2;
-       self->frame_area.y = (self->visible_area.height - zoomed_height) / 2;
+       self->frame_area.x = MAX (0, (self->visible_area.width - zoomed_width) / 2);
+       self->frame_area.y = MAX (0, (self->visible_area.height - zoomed_height) / 2);
        self->frame_area.width = zoomed_width;
        self->frame_area.height = zoomed_height;
 
@@ -347,8 +347,10 @@ set_zoom (GthImageViewer *self,
        self->priv->zoom_level = zoom_level;
 
        _gth_image_viewer_update_image_area (self);
-       if (self->priv->update_image_after_zoom)
+       if (self->priv->update_image_after_zoom) {
                gth_image_viewer_tool_image_changed (self->priv->tool);
+               self->priv->update_image_after_zoom = FALSE;
+       }
        else
                gth_image_viewer_tool_zoom_changed (self->priv->tool);
 
@@ -761,6 +763,21 @@ queue_animation_frame_change (GthImageViewer *self)
 
 
 static gboolean
+image_has_alpha (GthImageViewer *viewer)
+{
+       cairo_surface_t *image;
+       guchar          *first_pixel;
+
+       image = gth_image_viewer_get_current_image (viewer);
+       if (image == NULL)
+               return FALSE;
+
+       first_pixel = cairo_image_surface_get_data (image);
+       return first_pixel[CAIRO_ALPHA] < 255;
+}
+
+
+static gboolean
 gth_image_viewer_draw (GtkWidget *widget,
                       cairo_t   *cr)
 {
@@ -771,6 +788,9 @@ gth_image_viewer_draw (GtkWidget *widget,
        cairo_set_line_width (cr, 0.5);
        cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
 
+       /* draw a frame around the image */
+
+
        /* delegate the rest to the tool  */
 
        gth_image_viewer_tool_draw (self->priv->tool, cr);
@@ -2479,6 +2499,9 @@ gth_image_viewer_paint (GthImageViewer  *self,
 
        cairo_save (cr);
 
+       cairo_rectangle (cr, 0, 0, self->visible_area.width, self->visible_area.height);
+       cairo_clip (cr);
+
        gth_image_viewer_get_original_size (self, &original_width, NULL);
        zoom_level = self->priv->zoom_level * ((double) original_width / cairo_image_surface_get_width 
(surface));
        src_dx = (double) src_x / zoom_level;
@@ -2492,8 +2515,7 @@ gth_image_viewer_paint (GthImageViewer  *self,
        cairo_set_source_surface (cr, surface, dest_dx - src_dx, dest_dy - src_dy);
        cairo_pattern_set_filter (cairo_get_source (cr), filter);
        cairo_rectangle (cr, dest_dx, dest_dy, dwidth, dheight);
-       cairo_clip_preserve (cr);
-       cairo_fill (cr);
+       cairo_fill (cr);
 
        cairo_restore (cr);
 }
@@ -2516,8 +2538,8 @@ gth_image_viewer_paint_region (GthImageViewer        *self,
                                surface,
                                paint_area->x - frame_border,
                                paint_area->y - frame_border,
-                               MAX (0, self->frame_area.x),
-                               MAX (0, self->frame_area.y),
+                               dest_x - frame_border,
+                               dest_y - frame_border,
                                MIN (paint_area->width, self->image_area.width + frame_border),
                                MIN (paint_area->height, self->image_area.height + frame_border),
                                filter);
@@ -2544,6 +2566,56 @@ gth_image_viewer_paint_background (GthImageViewer *self,
 
 
 void
+gth_image_viewer_paint_frame (GthImageViewer *self,
+                             cairo_t        *cr)
+{
+       if (! gth_image_viewer_is_frame_visible (self)
+           || gth_image_viewer_is_animation (self)
+           || image_has_alpha (self))
+       {
+               return;
+
+       }
+
+       cairo_save (cr);
+
+       cairo_translate (cr, -self->visible_area.x, -self->visible_area.y);
+
+       /* drop shadow */
+
+       cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
+       cairo_rectangle (cr,
+                        self->image_area.x + 2 + 0.5,
+                        self->image_area.y + 2 + 0.5,
+                        self->image_area.width + 2,
+                        self->image_area.height + 2);
+       cairo_fill (cr);
+
+       /* frame */
+
+       cairo_set_line_width (cr, 2.0);
+       cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+       cairo_rectangle (cr,
+                        self->image_area.x - 1,
+                        self->image_area.y - 1,
+                        self->image_area.width + 2,
+                        self->image_area.height + 2);
+       cairo_stroke (cr);
+
+       cairo_set_line_width (cr, 1.0);
+       cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+       cairo_rectangle (cr,
+                        self->image_area.x - 2,
+                        self->image_area.y - 2,
+                        self->image_area.width + 5,
+                        self->image_area.height + 5);
+       cairo_stroke (cr);
+
+       cairo_restore (cr);
+}
+
+
+void
 gth_image_viewer_apply_painters (GthImageViewer *self,
                                 cairo_t        *cr)
 {
diff --git a/gthumb/gth-image-viewer.h b/gthumb/gth-image-viewer.h
index 7f78f2b..709f557 100644
--- a/gthumb/gth-image-viewer.h
+++ b/gthumb/gth-image-viewer.h
@@ -284,6 +284,8 @@ void           gth_image_viewer_paint_region             (GthImageViewer
                                                          cairo_filter_t         filter);
 void           gth_image_viewer_paint_background         (GthImageViewer        *self,
                                                          cairo_t               *cr);
+void          gth_image_viewer_paint_frame              (GthImageViewer        *self,
+                                                         cairo_t               *cr);
 void           gth_image_viewer_apply_painters           (GthImageViewer        *image_viewer,
                                                          cairo_t               *cr);
 void           gth_image_viewer_crop_area                (GthImageViewer        *viewer,


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