[gthumb] fixed the image selector
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] fixed the image selector
- Date: Sat, 9 Nov 2013 20:08:01 +0000 (UTC)
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]