[gthumb] image viewer: show a frame around the image, removed unused options
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] image viewer: show a frame around the image, removed unused options
- Date: Sat, 9 Nov 2013 20:07:15 +0000 (UTC)
commit 38030079fb1440ec5d78d3c161032f136a8101d8
Author: Paolo Bacchilega <paobac src gnome org>
Date: Wed Oct 30 22:07:31 2013 +0100
image viewer: show a frame around the image, removed unused options
data/org.gnome.gthumb.image-viewer.gschema.xml.in | 10 -
.../data/ui/image-viewer-preferences.ui | 65 +--
extensions/image_viewer/gth-image-viewer-page.c | 62 +--
extensions/image_viewer/preferences.c | 14 -
extensions/image_viewer/preferences.h | 3 -
extensions/slideshow/gth-slideshow.c | 2 -
gthumb/gth-image-dragger.c | 156 +++++-
gthumb/gth-image-dragger.h | 3 +-
gthumb/gth-image-viewer.c | 627 +++++---------------
gthumb/gth-image-viewer.h | 49 +--
gthumb/gth-overwrite-dialog.c | 2 -
11 files changed, 308 insertions(+), 685 deletions(-)
---
diff --git a/data/org.gnome.gthumb.image-viewer.gschema.xml.in
b/data/org.gnome.gthumb.image-viewer.gschema.xml.in
index a27bd26..335517a 100644
--- a/data/org.gnome.gthumb.image-viewer.gschema.xml.in
+++ b/data/org.gnome.gthumb.image-viewer.gschema.xml.in
@@ -25,20 +25,10 @@
<key name="zoom-change" enum="org.gnome.gthumb.GthZoomChange">
<default>'fit-size-if-larger'</default>
</key>
- <key name="transparency-type" enum="org.gnome.gthumb.GthTranspType">
- <default>'none'</default>
- <_description>Possible values are: white, black, checked, none.</_description>
- </key>
<key name="reset-scrollbars" type="b">
<default>true</default>
<_description>Whether to reset the scrollbars position after changing image</_description>
</key>
- <key name="check-type" enum="org.gnome.gthumb.GthCheckType">
- <default>'midtone'</default>
- </key>
- <key name="check-size" enum="org.gnome.gthumb.GthCheckSize">
- <default>'medium'</default>
- </key>
</schema>
</schemalist>
diff --git a/extensions/image_viewer/data/ui/image-viewer-preferences.ui
b/extensions/image_viewer/data/ui/image-viewer-preferences.ui
index cba0783..a384c16 100644
--- a/extensions/image_viewer/data/ui/image-viewer-preferences.ui
+++ b/extensions/image_viewer/data/ui/image-viewer-preferences.ui
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.16.0 on Tue Oct 29 20:36:21 2013 -->
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkBox" id="preferences_page">
@@ -62,7 +63,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
- <property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
@@ -107,43 +107,9 @@
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<child>
- <object class="GtkGrid" id="grid1">
+ <object class="GtkBox" id="box6">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
- <child>
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">_Zoom quality:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">zoom_quality_combobox</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Transparency _type:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">transp_type_combobox</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
<child>
<object class="GtkComboBoxText" id="zoom_quality_combobox">
<property name="visible">True</property>
@@ -154,28 +120,9 @@
</items>
</object>
<packing>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBoxText" id="transp_type_combobox">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <items>
- <item translatable="yes">White</item>
- <item translatable="yes">None</item>
- <item translatable="yes">Black</item>
- <item translatable="yes">Checked</item>
- </items>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
</object>
@@ -186,7 +133,7 @@
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Other</property>
+ <property name="label" translatable="yes">Zoom quality:</property>
<property name="use_markup">True</property>
<attributes>
<attribute name="weight" value="bold"/>
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 1cbbfcb..403722a 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -422,45 +422,6 @@ pref_zoom_change_changed (GSettings *settings,
static void
-pref_transp_type_changed (GSettings *settings,
- char *key,
- gpointer user_data)
-{
- GthImageViewerPage *self = user_data;
-
- gth_image_viewer_set_transp_type (GTH_IMAGE_VIEWER (self->priv->viewer),
- g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_TRANSP_TYPE));
- gtk_widget_queue_draw (self->priv->viewer);
-}
-
-
-static void
-pref_check_type_changed (GSettings *settings,
- char *key,
- gpointer user_data)
-{
- GthImageViewerPage *self = user_data;
-
- gth_image_viewer_set_check_type (GTH_IMAGE_VIEWER (self->priv->viewer),
- g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_CHECK_TYPE));
- gtk_widget_queue_draw (self->priv->viewer);
-}
-
-
-static void
-pref_check_size_changed (GSettings *settings,
- char *key,
- gpointer user_data)
-{
- GthImageViewerPage *self = user_data;
-
- gth_image_viewer_set_check_size (GTH_IMAGE_VIEWER (self->priv->viewer),
- g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_CHECK_SIZE));
- gtk_widget_queue_draw (self->priv->viewer);
-}
-
-
-static void
pref_reset_scrollbars_changed (GSettings *settings,
char *key,
gpointer user_data)
@@ -623,6 +584,7 @@ gth_image_viewer_page_real_activate (GthViewerPage *base,
GthBrowser *browser)
{
GthImageViewerPage *self;
+ GthImageViewerTool *dragger;
self = (GthImageViewerPage*) base;
@@ -674,15 +636,13 @@ gth_image_viewer_page_real_activate (GthViewerPage *base,
g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_ZOOM_QUALITY));
gth_image_viewer_set_zoom_change (GTH_IMAGE_VIEWER (self->priv->viewer),
g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_ZOOM_CHANGE));
- gth_image_viewer_set_transp_type (GTH_IMAGE_VIEWER (self->priv->viewer),
- g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_TRANSP_TYPE));
- gth_image_viewer_set_check_type (GTH_IMAGE_VIEWER (self->priv->viewer),
- g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_CHECK_TYPE));
- gth_image_viewer_set_check_size (GTH_IMAGE_VIEWER (self->priv->viewer),
- g_settings_get_enum (self->priv->settings,
PREF_IMAGE_VIEWER_CHECK_SIZE));
gth_image_viewer_set_reset_scrollbars (GTH_IMAGE_VIEWER (self->priv->viewer),
g_settings_get_boolean (self->priv->settings,
PREF_IMAGE_VIEWER_RESET_SCROLLBARS));
+ dragger = gth_image_dragger_new (TRUE);
+ gth_image_viewer_set_tool (GTH_IMAGE_VIEWER (self->priv->viewer), dragger);
+ g_object_unref (dragger);
+
gtk_widget_show (self->priv->viewer);
g_signal_connect (G_OBJECT (self->priv->viewer),
@@ -735,18 +695,6 @@ gth_image_viewer_page_real_activate (GthViewerPage *base,
G_CALLBACK (pref_zoom_change_changed),
self);
g_signal_connect (self->priv->settings,
- "changed::" PREF_IMAGE_VIEWER_TRANSP_TYPE,
- G_CALLBACK (pref_transp_type_changed),
- self);
- g_signal_connect (self->priv->settings,
- "changed::" PREF_IMAGE_VIEWER_CHECK_TYPE,
- G_CALLBACK (pref_check_type_changed),
- self);
- g_signal_connect (self->priv->settings,
- "changed::" PREF_IMAGE_VIEWER_CHECK_SIZE,
- G_CALLBACK (pref_check_size_changed),
- self);
- g_signal_connect (self->priv->settings,
"changed::" PREF_IMAGE_VIEWER_RESET_SCROLLBARS,
G_CALLBACK (pref_reset_scrollbars_changed),
self);
diff --git a/extensions/image_viewer/preferences.c b/extensions/image_viewer/preferences.c
index e59343f..a84c514 100644
--- a/extensions/image_viewer/preferences.c
+++ b/extensions/image_viewer/preferences.c
@@ -68,14 +68,6 @@ reset_scrollbars_toggled_cb (GtkToggleButton *button,
}
-static void
-transp_type_changed_cb (GtkComboBox *combo_box,
- BrowserData *data)
-{
- g_settings_set_enum (data->settings, PREF_IMAGE_VIEWER_TRANSP_TYPE, gtk_combo_box_get_active
(combo_box));
-}
-
-
void
image_viewer__dlg_preferences_construct_cb (GtkWidget *dialog,
GthBrowser *browser,
@@ -100,8 +92,6 @@ image_viewer__dlg_preferences_construct_cb (GtkWidget *dialog,
g_settings_get_enum (data->settings, PREF_IMAGE_VIEWER_ZOOM_CHANGE));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("toggle_reset_scrollbars")),
g_settings_get_boolean (data->settings,
PREF_IMAGE_VIEWER_RESET_SCROLLBARS));
- gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("transp_type_combobox")),
- g_settings_get_enum (data->settings, PREF_IMAGE_VIEWER_TRANSP_TYPE));
gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("zoom_quality_combobox")),
g_settings_get_enum (data->settings, PREF_IMAGE_VIEWER_ZOOM_QUALITY));
@@ -113,10 +103,6 @@ image_viewer__dlg_preferences_construct_cb (GtkWidget *dialog,
"changed",
G_CALLBACK (zoom_change_changed_cb),
data);
- g_signal_connect (GET_WIDGET ("transp_type_combobox"),
- "changed",
- G_CALLBACK (transp_type_changed_cb),
- data);
g_signal_connect (GET_WIDGET ("toggle_reset_scrollbars"),
"toggled",
G_CALLBACK (reset_scrollbars_toggled_cb),
diff --git a/extensions/image_viewer/preferences.h b/extensions/image_viewer/preferences.h
index 0760e0b..23411f5 100644
--- a/extensions/image_viewer/preferences.h
+++ b/extensions/image_viewer/preferences.h
@@ -32,10 +32,7 @@
#define PREF_IMAGE_VIEWER_ZOOM_QUALITY "zoom-quality"
#define PREF_IMAGE_VIEWER_ZOOM_CHANGE "zoom-change"
-#define PREF_IMAGE_VIEWER_TRANSP_TYPE "transparency-type"
#define PREF_IMAGE_VIEWER_RESET_SCROLLBARS "reset-scrollbars"
-#define PREF_IMAGE_VIEWER_CHECK_TYPE "check-type"
-#define PREF_IMAGE_VIEWER_CHECK_SIZE "check-size"
void image_viewer__dlg_preferences_construct_cb (GtkWidget *dialog,
GthBrowser *browser,
diff --git a/extensions/slideshow/gth-slideshow.c b/extensions/slideshow/gth-slideshow.c
index 1395e38..8797b7d 100644
--- a/extensions/slideshow/gth-slideshow.c
+++ b/extensions/slideshow/gth-slideshow.c
@@ -739,11 +739,9 @@ default_projector_construct (GthSlideshow *self)
self->priv->paint_paused = FALSE;
self->priv->viewer = gth_image_viewer_new ();
- gth_image_viewer_set_black_background (GTH_IMAGE_VIEWER (self->priv->viewer), TRUE);
gth_image_viewer_hide_frame (GTH_IMAGE_VIEWER (self->priv->viewer));
gth_image_viewer_set_fit_mode (GTH_IMAGE_VIEWER (self->priv->viewer), GTH_FIT_SIZE);
gth_image_viewer_set_zoom_change (GTH_IMAGE_VIEWER (self->priv->viewer), GTH_ZOOM_CHANGE_FIT_SIZE);
- gth_image_viewer_set_transp_type (GTH_IMAGE_VIEWER (self->priv->viewer), GTH_TRANSP_TYPE_BLACK);
gth_image_viewer_set_zoom_quality (GTH_IMAGE_VIEWER (self->priv->viewer), GTH_ZOOM_QUALITY_LOW);
gth_image_viewer_add_painter (GTH_IMAGE_VIEWER (self->priv->viewer), default_projector_pause_painter,
self);
diff --git a/gthumb/gth-image-dragger.c b/gthumb/gth-image-dragger.c
index 7d94c0d..4d90ecf 100644
--- a/gthumb/gth-image-dragger.c
+++ b/gthumb/gth-image-dragger.c
@@ -29,11 +29,20 @@
#define SIZE_TOO_BIG_FOR_SCALE_BILINEAR (3000 * 3000)
+#define FRAME_BORDER 25
+
+
+/* Properties */
+enum {
+ PROP_0,
+ PROP_SHOW_FRAME
+};
struct _GthImageDraggerPrivate {
GthImageViewer *viewer;
gboolean draggable;
+ gboolean show_frame;
cairo_surface_t *scaled;
double scaled_zoom;
GthTask *scale_task;
@@ -69,6 +78,53 @@ gth_image_dragger_finalize (GObject *object)
static void
+gth_image_dragger_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GthImageDragger *self;
+
+ self = GTH_IMAGE_DRAGGER (object);
+
+ switch (property_id) {
+ case PROP_SHOW_FRAME:
+ self->priv->show_frame = g_value_get_boolean (value);
+ if (self->priv->viewer != NULL) {
+ if (self->priv->show_frame)
+ gth_image_viewer_show_frame (self->priv->viewer, FRAME_BORDER);
+ else
+ gth_image_viewer_hide_frame (self->priv->viewer);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+
+static void
+gth_image_dragger_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GthImageDragger *self;
+
+ self = GTH_IMAGE_DRAGGER (object);
+
+ switch (property_id) {
+ case PROP_SHOW_FRAME:
+ g_value_set_boolean (value, self->priv->show_frame);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
+static void
gth_image_dragger_class_init (GthImageDraggerClass *class)
{
GObjectClass *gobject_class;
@@ -77,6 +133,18 @@ gth_image_dragger_class_init (GthImageDraggerClass *class)
gobject_class = (GObjectClass*) class;
gobject_class->finalize = gth_image_dragger_finalize;
+ gobject_class->set_property = gth_image_dragger_set_property;
+ gobject_class->get_property = gth_image_dragger_get_property;
+
+ /* properties */
+
+ g_object_class_install_property (gobject_class,
+ PROP_SHOW_FRAME,
+ g_param_spec_boolean ("show-frame",
+ "Show Frame",
+ "Whether to show a frame around the image",
+ FALSE,
+ G_PARAM_READWRITE));
}
@@ -89,6 +157,7 @@ gth_image_dragger_init (GthImageDragger *dragger)
dragger->priv->scale_task = NULL;
dragger->priv->viewer = NULL;
dragger->priv->draggable = FALSE;
+ dragger->priv->show_frame = FALSE;
}
@@ -98,6 +167,8 @@ gth_image_dragger_set_viewer (GthImageViewerTool *base,
{
GthImageDragger *self = GTH_IMAGE_DRAGGER (base);
self->priv->viewer = image_viewer;
+ if (self->priv->show_frame)
+ gth_image_viewer_show_frame (self->priv->viewer, FRAME_BORDER);
}
@@ -106,6 +177,9 @@ gth_image_dragger_unset_viewer (GthImageViewerTool *base,
GthImageViewer *image_viewer)
{
GthImageDragger *self = GTH_IMAGE_DRAGGER (base);
+
+ if ((self->priv->viewer != NULL) && self->priv->show_frame)
+ gth_image_viewer_hide_frame (self->priv->viewer);
self->priv->viewer = NULL;
}
@@ -175,6 +249,21 @@ 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)
@@ -190,23 +279,68 @@ 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);
+ }
+
if (dragger->priv->scaled != NULL)
gth_image_viewer_paint_region (viewer,
cr,
dragger->priv->scaled,
- viewer->x_offset - viewer->image_area.x,
- viewer->y_offset - viewer->image_area.y,
- &viewer->image_area,
- NULL,
+ 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->visible_area,
CAIRO_FILTER_FAST);
else
gth_image_viewer_paint_region (viewer,
cr,
gth_image_viewer_get_current_image (viewer),
- viewer->x_offset - viewer->image_area.x,
- viewer->y_offset - viewer->image_area.y,
- &viewer->image_area,
- NULL,
+ 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->visible_area,
gth_image_viewer_get_zoom_quality_filter (viewer));
gth_image_viewer_apply_painters (viewer, cr);
@@ -495,7 +629,9 @@ gth_image_dragger_gth_image_tool_interface_init (GthImageViewerToolInterface *if
GthImageViewerTool *
-gth_image_dragger_new (void)
+gth_image_dragger_new (gboolean show_frame)
{
- return (GthImageViewerTool *) g_object_new (GTH_TYPE_IMAGE_DRAGGER, NULL);
+ return (GthImageViewerTool *) g_object_new (GTH_TYPE_IMAGE_DRAGGER,
+ "show-frame", show_frame,
+ NULL);
}
diff --git a/gthumb/gth-image-dragger.h b/gthumb/gth-image-dragger.h
index f778449..102d64b 100644
--- a/gthumb/gth-image-dragger.h
+++ b/gthumb/gth-image-dragger.h
@@ -1,3 +1,4 @@
+
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
@@ -51,7 +52,7 @@ struct _GthImageDraggerClass
};
GType gth_image_dragger_get_type (void);
-GthImageViewerTool * gth_image_dragger_new (void);
+GthImageViewerTool * gth_image_dragger_new (gboolean show_frame);
G_END_DECLS
diff --git a/gthumb/gth-image-viewer.c b/gthumb/gth-image-viewer.c
index c82d091..58bd74b 100644
--- a/gthumb/gth-image-viewer.c
+++ b/gthumb/gth-image-viewer.c
@@ -92,12 +92,6 @@ struct _GthImageViewerPrivate {
gboolean frame_visible;
int frame_border;
- int frame_border2;
-
- GthTranspType transp_type;
- GthCheckType check_type;
- int check_size;
- cairo_pattern_t *checked_pattern;
GthImageViewerTool *tool;
@@ -118,7 +112,6 @@ struct _GthImageViewerPrivate {
* image is loaded. */
gboolean double_click;
gboolean just_focused;
- gboolean black_bg;
gboolean skip_zoom_change;
gboolean update_image_after_zoom;
gboolean reset_scrollbars;
@@ -233,6 +226,16 @@ _gth_image_viewer_get_quality_zoom (GthImageViewer *self)
}
+static int
+_gth_image_viewer_get_frame_border (GthImageViewer *self)
+{
+ if (! self->priv->frame_visible)
+ return 0;
+
+ return self->priv->frame_border;
+}
+
+
static void
_gth_image_viewer_get_zoomed_size_for_zoom (GthImageViewer *self,
int *width,
@@ -244,8 +247,9 @@ _gth_image_viewer_get_zoomed_size_for_zoom (GthImageViewer *self,
if (height != NULL) *height = 0;
}
else {
- if (width != NULL) *width = (int) floor ((double) self->priv->original_width * zoom_level);
- if (height != NULL) *height = (int) floor ((double) self->priv->original_height * zoom_level);
+ int frame_border = _gth_image_viewer_get_frame_border (self);
+ if (width != NULL) *width = (int) floor ((double) self->priv->original_width * zoom_level) +
(frame_border * 2);
+ if (height != NULL) *height = (int) floor ((double) self->priv->original_height * zoom_level)
+ (frame_border * 2);
}
}
@@ -260,10 +264,8 @@ _gth_image_viewer_get_zoomed_size (GthImageViewer *self,
static void
-_gth_image_viewer_get_visible_area_size_for_allocation (GthImageViewer *self,
- int *width,
- int *height,
- GtkAllocation *allocation)
+_gth_image_viewer_update_visible_area (GthImageViewer *self,
+ GtkAllocation *allocation)
{
GtkAllocation local_allocation;
@@ -272,19 +274,8 @@ _gth_image_viewer_get_visible_area_size_for_allocation (GthImageViewer *self,
else
gtk_widget_get_allocation (GTK_WIDGET (self), &local_allocation);
- if (width != NULL)
- *width = local_allocation.width - self->priv->frame_border2;
- if (height != NULL)
- *height = local_allocation.height - self->priv->frame_border2;
-}
-
-
-static void
-_gth_image_viewer_get_visible_area_size (GthImageViewer *self,
- int *width,
- int *height)
-{
- _gth_image_viewer_get_visible_area_size_for_allocation (self, width, height, NULL);
+ self->visible_area.width = local_allocation.width;
+ self->visible_area.height = local_allocation.height;
}
@@ -293,16 +284,18 @@ _gth_image_viewer_update_image_area (GthImageViewer *self)
{
int zoomed_width;
int zoomed_height;
- int visible_width;
- int visible_height;
- _gth_image_viewer_get_visible_area_size (self, &visible_width, &visible_height);
_gth_image_viewer_get_zoomed_size (self, &zoomed_width, &zoomed_height);
- self->image_area.x = MAX (self->priv->frame_border, (visible_width - zoomed_width) / 2);
- self->image_area.y = MAX (self->priv->frame_border, (visible_height - zoomed_height) / 2);
- self->image_area.width = MIN (zoomed_width, visible_width);
- self->image_area.height = MIN (zoomed_height, visible_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.width = zoomed_width;
+ self->frame_area.height = zoomed_height;
+
+ self->image_area.x = self->frame_area.x + self->priv->frame_border;
+ self->image_area.y = self->frame_area.y + self->priv->frame_border;
+ self->image_area.width = self->frame_area.width - (self->priv->frame_border * 2);
+ self->image_area.height = self->frame_area.height - (self->priv->frame_border * 2);
}
@@ -319,8 +312,6 @@ set_zoom (GthImageViewer *self,
int center_x,
int center_y)
{
- int visible_width;
- int visible_height;
gdouble zoom_ratio;
g_return_if_fail (self != NULL);
@@ -349,12 +340,11 @@ set_zoom (GthImageViewer *self,
}
/* try to keep the center of the view visible. */
- _gth_image_viewer_get_visible_area_size (self, &visible_width, &visible_height);
zoom_ratio = zoom_level / self->priv->zoom_level;
- center_x = center_x - self->image_area.x;
- center_y = center_y - self->image_area.y;
- self->x_offset = ((self->x_offset + center_x) * zoom_ratio - visible_width / 2);
- self->y_offset = ((self->y_offset + center_y) * zoom_ratio - visible_height / 2);
+ center_x = center_x - self->frame_area.x;
+ center_y = center_y - self->frame_area.y;
+ self->visible_area.x = ((self->visible_area.x + center_x) * zoom_ratio - self->visible_area.width /
2);
+ self->visible_area.y = ((self->visible_area.y + center_y) * zoom_ratio - self->visible_area.height /
2);
self->priv->zoom_level = zoom_level;
@@ -390,14 +380,13 @@ set_zoom_centered_at (GthImageViewer *self,
static void
set_zoom_centered (GthImageViewer *self,
gdouble zoom_level,
- gboolean zoom_to_fit,
- GtkAllocation *allocation)
+ gboolean zoom_to_fit)
{
- int visible_width;
- int visible_height;
-
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
allocation);
- set_zoom_centered_at (self, zoom_level, zoom_to_fit, visible_width / 2, visible_height / 2);
+ set_zoom_centered_at (self,
+ zoom_level,
+ zoom_to_fit,
+ self->visible_area.width / 2,
+ self->visible_area.height / 2);
}
@@ -432,17 +421,12 @@ gth_image_viewer_realize (GtkWidget *widget)
| GDK_BUTTON_MOTION_MASK
| GDK_SCROLL_MASK
| GDK_STRUCTURE_MASK);
-
- attributes_mask = (GDK_WA_X
- | GDK_WA_Y
- | GDK_WA_VISUAL);
-
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
window = gdk_window_new (gtk_widget_get_parent_window (widget),
&attributes,
attributes_mask);
+ gtk_widget_register_window (widget, window);
gtk_widget_set_window (widget, window);
- gdk_window_set_user_data (window, self);
-
gtk_style_context_set_background (gtk_widget_get_style_context (widget), window);
self->priv->cursor = gdk_cursor_new (GDK_LEFT_PTR);
@@ -474,11 +458,6 @@ gth_image_viewer_unrealize (GtkWidget *widget)
self->priv->cursor_void = NULL;
}
- if (self->priv->checked_pattern != NULL) {
- cairo_pattern_destroy (self->priv->checked_pattern);
- self->priv->checked_pattern = NULL;
- }
-
gth_image_viewer_tool_unrealize (self->priv->tool);
GTK_WIDGET_CLASS (gth_image_viewer_parent_class)->unrealize (widget);
@@ -517,18 +496,15 @@ static void
_gth_image_viewer_configure_hadjustment (GthImageViewer *self)
{
int zoomed_width;
- int visible_width;
_gth_image_viewer_get_zoomed_size (self, &zoomed_width, NULL);
- _gth_image_viewer_get_visible_area_size (self, &visible_width, NULL);
-
gtk_adjustment_configure (self->hadj,
- self->x_offset,
+ self->visible_area.x,
0.0,
zoomed_width,
STEP_INCREMENT,
- visible_width / 2,
- visible_width);
+ self->visible_area.width / 2,
+ self->visible_area.width);
}
@@ -536,18 +512,15 @@ static void
_gth_image_viewer_configure_vadjustment (GthImageViewer *self)
{
int zoomed_height;
- int visible_height;
_gth_image_viewer_get_zoomed_size (self, NULL, &zoomed_height);
- _gth_image_viewer_get_visible_area_size (self, NULL, &visible_height);
-
gtk_adjustment_configure (self->vadj,
- self->y_offset,
+ self->visible_area.y,
0.0,
zoomed_height,
STEP_INCREMENT,
- visible_height / 2,
- visible_height);
+ self->visible_area.height / 2,
+ self->visible_area.height);
}
@@ -590,18 +563,17 @@ static double
get_zoom_to_fit (GthImageViewer *self,
GtkAllocation *allocation)
{
- int visible_width;
- int visible_height;
int original_width;
int original_height;
+ int frame_border_2;
double x_level;
double y_level;
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
allocation);
gth_image_viewer_get_original_size (self, &original_width, &original_height);
+ frame_border_2 = _gth_image_viewer_get_frame_border (self) * 2;
- x_level = (double) visible_width / original_width;
- y_level = (double) visible_height / original_height;
+ x_level = (double) (allocation->width - frame_border_2) / original_width;
+ y_level = (double) (allocation->height - frame_border_2) / original_height;
return (x_level < y_level) ? x_level : y_level;
}
@@ -611,13 +583,13 @@ static double
get_zoom_to_fit_width (GthImageViewer *self,
GtkAllocation *allocation)
{
- int visible_width;
int original_width;
+ int frame_border_2;
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, NULL, allocation);
gth_image_viewer_get_original_size (self, &original_width, NULL);
+ frame_border_2 = _gth_image_viewer_get_frame_border (self) * 2;
- return (double) visible_width / original_width;
+ return (double) (allocation->width - frame_border_2) / original_width;
}
@@ -629,8 +601,6 @@ get_zoom_level_for_allocation (GthImageViewer *self,
cairo_surface_t *current_image;
int original_width;
int original_height;
- int visible_width;
- int visible_height;
zoom_level = self->priv->zoom_level;
current_image = gth_image_viewer_get_current_image (self);
@@ -638,7 +608,6 @@ get_zoom_level_for_allocation (GthImageViewer *self,
return zoom_level;
gth_image_viewer_get_original_size (self, &original_width, &original_height);
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
allocation);
switch (self->priv->fit) {
case GTH_FIT_SIZE:
@@ -646,7 +615,7 @@ get_zoom_level_for_allocation (GthImageViewer *self,
break;
case GTH_FIT_SIZE_IF_LARGER:
- if ((visible_width < original_width) || (visible_height < original_height))
+ if ((allocation->width < original_width) || (allocation->height < original_height))
zoom_level = get_zoom_to_fit (self, allocation);
else
zoom_level = 1.0;
@@ -657,7 +626,7 @@ get_zoom_level_for_allocation (GthImageViewer *self,
break;
case GTH_FIT_WIDTH_IF_LARGER:
- if (visible_width < original_width)
+ if (allocation->width < original_width)
zoom_level = get_zoom_to_fit_width (self, allocation);
else
zoom_level = 1.0;
@@ -677,12 +646,12 @@ gth_image_viewer_size_allocate (GtkWidget *widget,
{
GthImageViewer *self = GTH_IMAGE_VIEWER (widget);
double zoom_level;
- int visible_width;
- int visible_height;
int zoomed_width;
int zoomed_height;
cairo_surface_t *current_image;
+ _gth_image_viewer_update_visible_area (self, allocation);
+
gtk_widget_set_allocation (widget, allocation);
if (gtk_widget_get_realized (widget))
gdk_window_move_resize (gtk_widget_get_window (widget),
@@ -691,20 +660,18 @@ gth_image_viewer_size_allocate (GtkWidget *widget,
allocation->width,
allocation->height);
-
/* update the zoom level if the automatic fit mode is active */
zoom_level = get_zoom_level_for_allocation (self, allocation);
if (self->priv->fit != GTH_FIT_NONE)
- set_zoom_centered (self, zoom_level, TRUE, allocation);
+ set_zoom_centered (self, zoom_level, TRUE);
/* Keep the scrollbars offset in a valid range */
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
allocation);
_gth_image_viewer_get_zoomed_size (self, &zoomed_width, &zoomed_height);
current_image = gth_image_viewer_get_current_image (self);
- self->x_offset = (current_image == NULL || zoomed_width <= visible_width) ? 0 : CLAMP
(self->x_offset, 0, zoomed_width - visible_width);
- self->y_offset = (current_image == NULL || zoomed_height <= visible_height) ? 0 : CLAMP
(self->y_offset, 0, zoomed_height - visible_height);
+ self->visible_area.x = (current_image == NULL || zoomed_width <= self->visible_area.width) ? 0 :
CLAMP (self->visible_area.x, 0, zoomed_width - self->visible_area.width);
+ self->visible_area.y = (current_image == NULL || zoomed_height <= self->visible_area.height) ? 0 :
CLAMP (self->visible_area.y, 0, zoomed_height - self->visible_area.height);
_gth_image_viewer_configure_hadjustment (self);
_gth_image_viewer_configure_vadjustment (self);
@@ -838,8 +805,8 @@ gth_image_viewer_button_press (GtkWidget *widget,
if (self->pressed && ! self->priv->double_click) {
self->event_x_start = self->event_x_prev = event->x;
self->event_y_start = self->event_y_prev = event->y;
- self->drag_x = self->drag_x_start = self->drag_x_prev = event->x + self->x_offset;
- self->drag_y = self->drag_y_start = self->drag_y_prev = event->y + self->y_offset;
+ self->drag_x = self->drag_x_start = self->drag_x_prev = event->x + self->visible_area.x;
+ self->drag_y = self->drag_y_start = self->drag_y_prev = event->y + self->visible_area.y;
}
return retval;
@@ -877,39 +844,32 @@ scroll_to (GthImageViewer *self,
int x_offset,
int y_offset)
{
- GtkAllocation allocation;
- int zoomed_width, zoomed_height;
- int delta_x, delta_y;
- int visible_width, visible_height;
- GdkWindow *window;
+ int delta_x, delta_y;
+ GdkWindow *window;
g_return_if_fail (self != NULL);
if (gth_image_viewer_get_current_image (self) == NULL)
return;
- _gth_image_viewer_get_zoomed_size (self, &zoomed_width, &zoomed_height);
- gtk_widget_get_allocation (GTK_WIDGET (self), &allocation);
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
&allocation);
-
- if (zoomed_width > visible_width)
- x_offset = CLAMP (x_offset, 0, zoomed_width - visible_width);
+ if (self->frame_area.width > self->visible_area.width)
+ x_offset = CLAMP (x_offset, 0, self->frame_area.width - self->visible_area.width);
else
- x_offset = self->x_offset;
+ x_offset = self->visible_area.x;
- if (zoomed_height > visible_height)
- y_offset = CLAMP (y_offset, 0, zoomed_height - visible_height);
+ if (self->frame_area.height > self->visible_area.height)
+ y_offset = CLAMP (y_offset, 0, self->frame_area.height - self->visible_area.height);
else
- y_offset = self->y_offset;
+ y_offset = self->visible_area.y;
- if ((x_offset == self->x_offset) && (y_offset == self->y_offset))
+ if ((x_offset == self->visible_area.x) && (y_offset == self->visible_area.y))
return;
- delta_x = x_offset - self->x_offset;
- delta_y = y_offset - self->y_offset;
+ delta_x = x_offset - self->visible_area.x;
+ delta_y = y_offset - self->visible_area.y;
- self->x_offset = x_offset;
- self->y_offset = y_offset;
+ self->visible_area.x = x_offset;
+ self->visible_area.y = y_offset;
window = gtk_widget_get_window (GTK_WIDGET (self));
@@ -918,8 +878,8 @@ scroll_to (GthImageViewer *self,
area.x = 0;
area.y = 0;
- area.width = allocation.width;
- area.height = allocation.height;
+ area.width = self->visible_area.width;
+ area.height = self->visible_area.height;
gdk_window_invalidate_rect (window, &area, TRUE);
gdk_window_process_updates (window, TRUE);
@@ -932,10 +892,10 @@ scroll_to (GthImageViewer *self,
cairo_rectangle_int_t area;
cairo_region_t *region;
- area.x = (delta_x < 0) ? self->priv->frame_border : self->priv->frame_border + delta_x;
- area.y = (delta_y < 0) ? self->priv->frame_border : self->priv->frame_border + delta_y;
- area.width = visible_width - abs (delta_x);
- area.height = visible_height - abs (delta_y);
+ area.x = (delta_x < 0) ? 0 : delta_x;
+ area.y = (delta_y < 0) ? 0 : delta_y;
+ area.width = self->visible_area.width - abs (delta_x);
+ area.height = self->visible_area.height - abs (delta_y);
region = cairo_region_create_rectangle (&area);
gdk_window_move_region (window, region, -delta_x, -delta_y);
@@ -950,16 +910,16 @@ scroll_to (GthImageViewer *self,
region = cairo_region_create ();
- area.x = self->priv->frame_border;
- area.y = (delta_y < 0) ? self->priv->frame_border : self->priv->frame_border + visible_height
- delta_y;
- area.width = visible_width;
+ area.x = 0;
+ area.y = (delta_y < 0) ? 0 : self->visible_area.height - delta_y;
+ area.width = self->visible_area.width;
area.height = abs (delta_y);
cairo_region_union_rectangle (region, &area);
- area.x = (delta_x < 0) ? self->priv->frame_border : self->priv->frame_border + visible_width
- delta_x;
- area.y = self->priv->frame_border;
+ area.x = (delta_x < 0) ? 0 : self->visible_area.width - delta_x;
+ area.y = 0;
area.width = abs (delta_x);
- area.height = visible_height;
+ area.height = self->visible_area.height;
cairo_region_union_rectangle (region, &area);
gdk_window_invalidate_region (window, region, TRUE);
@@ -978,8 +938,8 @@ gth_image_viewer_motion_notify (GtkWidget *widget,
GthImageViewer *self = GTH_IMAGE_VIEWER (widget);
if (self->pressed) {
- self->drag_x = event->x + self->x_offset;
- self->drag_y = event->y + self->y_offset;
+ self->drag_x = event->x + self->visible_area.x;
+ self->drag_y = event->y + self->visible_area.y;
}
gth_image_viewer_tool_motion_notify (self->priv->tool, event);
@@ -1055,27 +1015,13 @@ gth_image_viewer_scroll_event (GtkWidget *widget,
static void
-gth_image_viewer_style_updated (GtkWidget *widget)
-{
- GthImageViewer *self = GTH_IMAGE_VIEWER (widget);
-
- GTK_WIDGET_CLASS (gth_image_viewer_parent_class)->style_updated (widget);
-
- if (self->priv->checked_pattern != NULL) {
- cairo_pattern_destroy (self->priv->checked_pattern);
- self->priv->checked_pattern = NULL;
- }
-}
-
-
-static void
scroll_relative (GthImageViewer *self,
int delta_x,
int delta_y)
{
gth_image_viewer_scroll_to (self,
- self->x_offset + delta_x,
- self->y_offset + delta_y);
+ self->visible_area.x + delta_x,
+ self->visible_area.y + delta_y);
}
@@ -1131,7 +1077,7 @@ static gboolean
hadj_value_changed (GtkAdjustment *adj,
GthImageViewer *self)
{
- scroll_to (self, (int) gtk_adjustment_get_value (adj), self->y_offset);
+ scroll_to (self, (int) gtk_adjustment_get_value (adj), self->visible_area.y);
return FALSE;
}
@@ -1140,7 +1086,7 @@ static gboolean
vadj_value_changed (GtkAdjustment *adj,
GthImageViewer *self)
{
- scroll_to (self, self->x_offset, (int) gtk_adjustment_get_value (adj));
+ scroll_to (self, self->visible_area.x, (int) gtk_adjustment_get_value (adj));
return FALSE;
}
@@ -1397,7 +1343,6 @@ gth_image_viewer_class_init (GthImageViewerClass *class)
widget_class->button_release_event = gth_image_viewer_button_release;
widget_class->motion_notify_event = gth_image_viewer_motion_notify;
widget_class->scroll_event = gth_image_viewer_scroll_event;
- widget_class->style_updated = gth_image_viewer_style_updated;
class->clicked = NULL;
class->zoom_changed = NULL;
@@ -1539,17 +1484,12 @@ gth_image_viewer_init (GthImageViewer *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_IMAGE_VIEWER, GthImageViewerPrivate);
- self->priv->check_type = GTH_CHECK_TYPE_MIDTONE;
- self->priv->check_size = GTH_CHECK_SIZE_LARGE;
- self->priv->checked_pattern = NULL;
-
self->priv->is_animation = FALSE;
self->priv->play_animation = TRUE;
self->priv->cursor_visible = TRUE;
self->priv->frame_visible = FALSE;
self->priv->frame_border = 0;
- self->priv->frame_border2 = 0;
self->priv->anim_id = 0;
self->priv->iter = NULL;
@@ -1567,14 +1507,12 @@ gth_image_viewer_init (GthImageViewer *self)
self->priv->update_image_after_zoom = FALSE;
self->priv->is_void = TRUE;
- self->x_offset = 0;
- self->y_offset = 0;
+ self->visible_area.x = 0;
+ self->visible_area.y = 0;
self->dragging = FALSE;
self->priv->double_click = FALSE;
self->priv->just_focused = FALSE;
- self->priv->black_bg = TRUE;
-
self->priv->cursor = NULL;
self->priv->cursor_void = NULL;
@@ -1653,8 +1591,8 @@ _gth_image_viewer_content_changed (GthImageViewer *self,
halt_animation (self);
if (! better_quality && self->priv->reset_scrollbars) {
- self->x_offset = 0;
- self->y_offset = 0;
+ self->visible_area.x = 0;
+ self->visible_area.y = 0;
}
if (better_quality || ! self->priv->zoom_enabled) {
@@ -1671,6 +1609,7 @@ _gth_image_viewer_content_changed (GthImageViewer *self,
break;
case GTH_ZOOM_CHANGE_KEEP_PREV:
+ gth_image_viewer_tool_image_changed (self->priv->tool);
gtk_widget_queue_resize (GTK_WIDGET (self));
break;
@@ -2100,7 +2039,7 @@ gth_image_viewer_set_zoom (GthImageViewer *self,
if (! self->priv->zoom_enabled)
return;
- set_zoom_centered (self, zoom_level, FALSE, NULL);
+ set_zoom_centered (self, zoom_level, FALSE);
gtk_widget_queue_resize (GTK_WIDGET (self));
}
@@ -2223,69 +2162,6 @@ gth_image_viewer_enable_zoom_with_keys (GthImageViewer *self,
void
-gth_image_viewer_set_transp_type (GthImageViewer *self,
- GthTranspType transp_type)
-{
- g_return_if_fail (GTH_IS_IMAGE_VIEWER (self));
-
- self->priv->transp_type = transp_type;
-
- if (self->priv->checked_pattern != NULL) {
- cairo_pattern_destroy (self->priv->checked_pattern);
- self->priv->checked_pattern = NULL;
- }
-}
-
-
-GthTranspType
-gth_image_viewer_get_transp_type (GthImageViewer *self)
-{
- return self->priv->transp_type;
-}
-
-
-void
-gth_image_viewer_set_check_type (GthImageViewer *self,
- GthCheckType check_type)
-{
- g_return_if_fail (GTH_IS_IMAGE_VIEWER (self));
-
- self->priv->check_type = check_type;
- if (self->priv->checked_pattern != NULL) {
- cairo_pattern_destroy (self->priv->checked_pattern);
- self->priv->checked_pattern = NULL;
- }
-}
-
-
-GthCheckType
-gth_image_viewer_get_check_type (GthImageViewer *self)
-{
- return self->priv->check_type;
-}
-
-
-void
-gth_image_viewer_set_check_size (GthImageViewer *self,
- GthCheckSize check_size)
-{
- self->priv->check_size = check_size;
-
- if (self->priv->checked_pattern != NULL) {
- cairo_pattern_destroy (self->priv->checked_pattern);
- self->priv->checked_pattern = NULL;
- }
-}
-
-
-GthCheckSize
-gth_image_viewer_get_check_size (GthImageViewer *self)
-{
- return self->priv->check_size;
-}
-
-
-void
gth_image_viewer_clicked (GthImageViewer *self)
{
g_signal_emit (G_OBJECT (self), gth_image_viewer_signals[CLICKED], 0);
@@ -2293,26 +2169,6 @@ gth_image_viewer_clicked (GthImageViewer *self)
void
-gth_image_viewer_set_black_background (GthImageViewer *self,
- gboolean set_black)
-{
- self->priv->black_bg = set_black;
- if (set_black)
- gth_image_viewer_hide_frame (self);
- else
- gth_image_viewer_show_frame (self);
- gtk_widget_queue_draw (GTK_WIDGET (self));
-}
-
-
-gboolean
-gth_image_viewer_is_black_background (GthImageViewer *self)
-{
- return self->priv->black_bg;
-}
-
-
-void
gth_image_viewer_set_tool (GthImageViewer *self,
GthImageViewerTool *tool)
{
@@ -2321,7 +2177,7 @@ gth_image_viewer_set_tool (GthImageViewer *self,
g_object_unref (self->priv->tool);
}
if (tool == NULL)
- self->priv->tool = gth_image_dragger_new ();
+ self->priv->tool = gth_image_dragger_new (FALSE);
else
self->priv->tool = g_object_ref (tool);
gth_image_viewer_tool_set_viewer (self->priv->tool, self);
@@ -2348,8 +2204,8 @@ gth_image_viewer_scroll_to (GthImageViewer *self,
g_signal_handlers_block_by_data (G_OBJECT (self->hadj), self);
g_signal_handlers_block_by_data (G_OBJECT (self->vadj), self);
- gtk_adjustment_set_value (self->hadj, self->x_offset);
- gtk_adjustment_set_value (self->vadj, self->y_offset);
+ gtk_adjustment_set_value (self->hadj, self->visible_area.x);
+ gtk_adjustment_set_value (self->vadj, self->visible_area.y);
g_signal_handlers_unblock_by_data (G_OBJECT (self->hadj), self);
g_signal_handlers_unblock_by_data (G_OBJECT (self->vadj), self);
}
@@ -2360,15 +2216,12 @@ gth_image_viewer_scroll_to_center (GthImageViewer *self)
{
int zoomed_width;
int zoomed_height;
- int visible_width;
- int visible_height;
_gth_image_viewer_get_zoomed_size (self, &zoomed_width, &zoomed_height);
- _gth_image_viewer_get_visible_area_size (self, &visible_width, &visible_height);
gth_image_viewer_scroll_to (self,
- (zoomed_width - visible_width) / 2,
- (zoomed_height - visible_height) / 2);
+ (zoomed_width - self->visible_area.width) / 2,
+ (zoomed_height - self->visible_area.height) / 2);
}
@@ -2432,8 +2285,8 @@ gth_image_viewer_get_scroll_offset (GthImageViewer *self,
double quality_zoom;
quality_zoom = _gth_image_viewer_get_quality_zoom (self);
- *x = self->x_offset * quality_zoom;
- *y = self->y_offset * quality_zoom;
+ *x = self->visible_area.x * quality_zoom;
+ *y = self->visible_area.y * quality_zoom;
}
@@ -2470,7 +2323,8 @@ gth_image_viewer_needs_scrollbars (GthImageViewer *self,
zoom_level = get_zoom_level_for_allocation (self, allocation);
_gth_image_viewer_get_zoomed_size_for_zoom (self, &zoomed_width, &zoomed_height, zoom_level);
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
allocation);
+ visible_width = allocation->width;
+ visible_height = allocation->height;
hscrollbar_visible = (zoomed_width > visible_width);
vscrollbar_visible = (zoomed_height > visible_height);
@@ -2570,11 +2424,11 @@ gth_image_viewer_is_cursor_visible (GthImageViewer *self)
void
-gth_image_viewer_show_frame (GthImageViewer *self)
+gth_image_viewer_show_frame (GthImageViewer *self,
+ int frame_border)
{
self->priv->frame_visible = TRUE;
- self->priv->frame_border = GTH_IMAGE_VIEWER_FRAME_BORDER;
- self->priv->frame_border2 = GTH_IMAGE_VIEWER_FRAME_BORDER2;
+ self->priv->frame_border = frame_border;
gtk_widget_queue_resize (GTK_WIDGET (self));
}
@@ -2585,7 +2439,6 @@ gth_image_viewer_hide_frame (GthImageViewer *self)
{
self->priv->frame_visible = FALSE;
self->priv->frame_border = 0;
- self->priv->frame_border2 = 0;
gtk_widget_queue_resize (GTK_WIDGET (self));
}
@@ -2598,6 +2451,13 @@ gth_image_viewer_is_frame_visible (GthImageViewer *self)
}
+int
+gth_image_viewer_get_frame_border (GthImageViewer *self)
+{
+ return _gth_image_viewer_get_frame_border (self);
+}
+
+
void
gth_image_viewer_paint (GthImageViewer *self,
cairo_t *cr,
@@ -2631,11 +2491,10 @@ gth_image_viewer_paint (GthImageViewer *self,
dheight = (double) height / zoom_level;
cairo_scale (cr, zoom_level, zoom_level);
-
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_rectangle (cr, dest_dx, dest_dy, dwidth - 0.5, dheight - 0.5);
+ cairo_clip_preserve (cr);
cairo_fill (cr);
cairo_restore (cr);
@@ -2646,29 +2505,24 @@ void
gth_image_viewer_paint_region (GthImageViewer *self,
cairo_t *cr,
cairo_surface_t *surface,
- int src_x,
- int src_y,
- cairo_rectangle_int_t *pixbuf_area,
- cairo_region_t *region,
+ int dest_x,
+ int dest_y,
+ cairo_rectangle_int_t *paint_area,
cairo_filter_t filter)
{
- cairo_save (cr);
-
- gdk_cairo_rectangle (cr, pixbuf_area);
- cairo_clip (cr);
+ int frame_border;
+ frame_border = _gth_image_viewer_get_frame_border (self);
gth_image_viewer_paint (self,
cr,
surface,
- src_x + pixbuf_area->x,
- src_y + pixbuf_area->y,
- pixbuf_area->x,
- pixbuf_area->y,
- pixbuf_area->width,
- pixbuf_area->height,
+ paint_area->x - frame_border,
+ paint_area->y - frame_border,
+ MAX (0, self->frame_area.x),
+ MAX (0, self->frame_area.y),
+ MIN (paint_area->width, self->image_area.width + frame_border),
+ MIN (paint_area->height, self->image_area.height + frame_border),
filter);
-
- cairo_restore (cr);
}
@@ -2676,213 +2530,18 @@ void
gth_image_viewer_paint_background (GthImageViewer *self,
cairo_t *cr)
{
- GtkAllocation allocation;
- int visible_width;
- int visible_height;
- GtkStyleContext *style_context;
+ GtkAllocation allocation;
+ cairo_save (cr);
gtk_widget_get_allocation (GTK_WIDGET (self), &allocation);
- _gth_image_viewer_get_visible_area_size_for_allocation (self, &visible_width, &visible_height,
&allocation);
- style_context = gtk_widget_get_style_context (GTK_WIDGET (self));
-
- if ((self->image_area.x > self->priv->frame_border)
- || (self->image_area.y > self->priv->frame_border)
- || (self->image_area.width < visible_width)
- || (self->image_area.height < visible_height))
- {
- int rx, ry, rw, rh;
-
- if (self->priv->black_bg) {
- cairo_set_source_rgb (cr, BLACK_VALUE, BLACK_VALUE, BLACK_VALUE);
- }
- else {
- GdkRGBA color;
-
- gtk_style_context_get_background_color (style_context,
- gtk_widget_get_state (GTK_WIDGET (self)),
- &color);
- gdk_cairo_set_source_rgba (cr, &color);
- }
-
- if (gth_image_viewer_get_current_image (self) == NULL) {
- cairo_rectangle (cr,
- 0,
- 0,
- allocation.width,
- allocation.height);
- }
- else {
- /* If an image is present draw in four phases to avoid
- * flickering. */
-
- /* Top rectangle. */
-
- rx = 0;
- ry = 0;
- rw = allocation.width;
- rh = self->image_area.y;
- if ((rw > 0) && (rh > 0))
- cairo_rectangle (cr, rx, ry, rw, rh);
-
- /* Bottom rectangle. */
-
- rx = 0;
- ry = self->image_area.y + self->image_area.height;
- rw = allocation.width;
- rh = allocation.height - self->image_area.y - self->image_area.height;
- if ((rw > 0) && (rh > 0))
- cairo_rectangle (cr, rx, ry, rw, rh);
-
- /* Left rectangle. */
-
- rx = 0;
- ry = self->image_area.y - 1;
- rw = self->image_area.x;
- rh = self->image_area.height + 2;
- if ((rw > 0) && (rh > 0))
- cairo_rectangle (cr, rx, ry, rw, rh);
-
- /* Right rectangle. */
-
- rx = self->image_area.x + self->image_area.width;
- ry = self->image_area.y - 1;
- rw = allocation.width - self->image_area.x - self->image_area.width;
- rh = self->image_area.height + 2;
- if ((rw > 0) && (rh > 0))
- cairo_rectangle (cr, rx, ry, rw, rh);
- }
-
- cairo_fill (cr);
- }
-
- /* Draw the frame. */
-
- if ((self->priv->frame_border > 0)
- && (gth_image_viewer_get_current_image (self) != NULL))
- {
- GdkRGBA background_color;
- GdkRGBA darker_color;
- GdkRGBA lighter_color;
-
- gtk_style_context_get_background_color (style_context,
- gtk_widget_get_state (GTK_WIDGET (self)),
- &background_color);
- _gdk_rgba_darker (&background_color, &darker_color);
- _gdk_rgba_lighter (&background_color, &lighter_color);
-
- /* bottom and right side */
-
- if (self->priv->black_bg)
- cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
- else
- gdk_cairo_set_source_rgba (cr, &lighter_color);
-
- cairo_move_to (cr,
- self->image_area.x + self->image_area.width + 0.5,
- self->image_area.y - 1 + 0.5);
- cairo_line_to (cr,
- self->image_area.x + self->image_area.width + 0.5,
- self->image_area.y + self->image_area.height + 0.5);
- cairo_line_to (cr,
- self->image_area.x - 1 + 0.5,
- self->image_area.y + self->image_area.height + 0.5);
- cairo_stroke (cr);
-
- /* top and left side */
-
- if (! self->priv->black_bg)
- gdk_cairo_set_source_rgba (cr, &darker_color);
-
- cairo_move_to (cr,
- self->image_area.x - 1 + 0.5,
- self->image_area.y + self->image_area.height + 0.5);
- cairo_line_to (cr,
- self->image_area.x - 1 + 0.5,
- self->image_area.y - 1 + 0.5);
- cairo_line_to (cr,
- self->image_area.x + self->image_area.width + 0.5,
- self->image_area.y - 1 + 0.5);
- cairo_stroke (cr);
- }
-
- if (gth_image_viewer_get_has_alpha (self)) {
-
- /* Draw the background for the transparency */
-
- if ((self->priv->transp_type == GTH_TRANSP_TYPE_BLACK)
- || ((self->priv->transp_type == GTH_TRANSP_TYPE_NONE) && self->priv->black_bg))
- {
- cairo_set_source_rgb (cr, BLACK_VALUE, BLACK_VALUE, BLACK_VALUE);
- cairo_rectangle (cr,
- self->image_area.x + 0.5,
- self->image_area.y + 0.5,
- self->image_area.width,
- self->image_area.height);
- cairo_fill (cr);
- }
- else if (self->priv->transp_type == GTH_TRANSP_TYPE_WHITE) {
- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
- cairo_rectangle (cr,
- self->image_area.x + 0.5,
- self->image_area.y + 0.5,
- self->image_area.width,
- self->image_area.height);
- cairo_fill (cr);
- }
- else if (self->priv->transp_type == GTH_TRANSP_TYPE_CHECKED) {
- if (self->priv->checked_pattern == NULL) {
- cairo_surface_t *surface;
- cairo_t *cr_surface;
- double color1;
- double color2;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
self->priv->check_size * 2, self->priv->check_size * 2);
- cr_surface = cairo_create (surface);
-
- switch (self->priv->check_type) {
- case GTH_CHECK_TYPE_DARK:
- color1 = 0.0;
- color2 = 0.2;
- break;
-
- case GTH_CHECK_TYPE_MIDTONE:
- color1 = 0.4;
- color2 = 0.6;
- break;
-
- case GTH_CHECK_TYPE_LIGHT:
- color1 = 0.8;
- color2 = 1.0;
- break;
- }
-
- cairo_set_source_rgb (cr_surface, color1, color1, color1);
- cairo_rectangle (cr_surface, 0, 0, self->priv->check_size,
self->priv->check_size);
- cairo_rectangle (cr_surface, self->priv->check_size, self->priv->check_size,
self->priv->check_size, self->priv->check_size);
- cairo_fill (cr_surface);
-
- cairo_set_source_rgb (cr_surface, color2, color2, color2);
- cairo_rectangle (cr_surface, self->priv->check_size, 0,
self->priv->check_size, self->priv->check_size);
- cairo_rectangle (cr_surface, 0, self->priv->check_size,
self->priv->check_size, self->priv->check_size);
- cairo_fill (cr_surface);
-
- cairo_surface_flush (surface);
-
- self->priv->checked_pattern = cairo_pattern_create_for_surface (surface);
- cairo_pattern_set_extend (self->priv->checked_pattern, CAIRO_EXTEND_REPEAT);
-
- cairo_destroy (cr_surface);
- }
-
- cairo_set_source (cr, self->priv->checked_pattern);
- cairo_rectangle (cr,
- self->image_area.x + 0.5,
- self->image_area.y + 0.5,
- self->image_area.width,
- self->image_area.height);
- cairo_fill (cr);
- }
- }
+ cairo_set_source_rgb (cr, BLACK_VALUE, BLACK_VALUE, BLACK_VALUE);
+ cairo_rectangle (cr,
+ 0,
+ 0,
+ allocation.width,
+ allocation.height);
+ cairo_fill (cr);
+ cairo_restore (cr);
}
@@ -2906,10 +2565,6 @@ void
gth_image_viewer_crop_area (GthImageViewer *self,
cairo_rectangle_int_t *area)
{
- int visible_width;
- int visible_height;
-
- _gth_image_viewer_get_visible_area_size (self, &visible_width, &visible_height);
- area->width = MIN (area->width, visible_width);
- area->width = MIN (area->height, visible_height);
+ area->width = MIN (area->width, self->visible_area.width);
+ area->width = MIN (area->height, self->visible_area.height);
}
diff --git a/gthumb/gth-image-viewer.h b/gthumb/gth-image-viewer.h
index 2940905..7f78f2b 100644
--- a/gthumb/gth-image-viewer.h
+++ b/gthumb/gth-image-viewer.h
@@ -43,8 +43,6 @@ G_BEGIN_DECLS
typedef struct _GthImageViewerClass GthImageViewerClass;
typedef struct _GthImageViewerPrivate GthImageViewerPrivate;
-#define GTH_IMAGE_VIEWER_FRAME_BORDER 1
-#define GTH_IMAGE_VIEWER_FRAME_BORDER2 (GTH_IMAGE_VIEWER_FRAME_BORDER * 2)
typedef void (*GthImageViewerPaintFunc) (GthImageViewer *image_viewer,
cairo_t *cr,
@@ -75,28 +73,6 @@ typedef enum {
} GthZoomChange;
-typedef enum {
- GTH_TRANSP_TYPE_WHITE,
- GTH_TRANSP_TYPE_NONE,
- GTH_TRANSP_TYPE_BLACK,
- GTH_TRANSP_TYPE_CHECKED
-} GthTranspType;
-
-
-typedef enum {
- GTH_CHECK_TYPE_LIGHT,
- GTH_CHECK_TYPE_MIDTONE,
- GTH_CHECK_TYPE_DARK
-} GthCheckType;
-
-
-typedef enum {
- GTH_CHECK_SIZE_SMALL = 4,
- GTH_CHECK_SIZE_MEDIUM = 8,
- GTH_CHECK_SIZE_LARGE = 16
-} GthCheckSize;
-
-
struct _GthImageViewer
{
GtkWidget __parent;
@@ -105,8 +81,13 @@ struct _GthImageViewer
/*< protected, used by the tools >*/
cairo_rectangle_int_t image_area;
+ cairo_rectangle_int_t frame_area;
+ cairo_rectangle_int_t visible_area; /* x,y: scroll offsets */
+ /* width,height: allocation size */
+#if 0
int x_offset; /* Scroll offsets. */
int y_offset;
+#endif
gboolean pressed;
int event_x_start;
int event_y_start;
@@ -230,24 +211,9 @@ gboolean gth_image_viewer_get_zoom_enabled (GthImageViewer
void gth_image_viewer_enable_zoom_with_keys (GthImageViewer *viewer,
gboolean value);
-/* visualization options. */
-
-void gth_image_viewer_set_transp_type (GthImageViewer *viewer,
- GthTranspType transp_type);
-GthTranspType gth_image_viewer_get_transp_type (GthImageViewer *viewer);
-void gth_image_viewer_set_check_type (GthImageViewer *viewer,
- GthCheckType check_type);
-GthCheckType gth_image_viewer_get_check_type (GthImageViewer *viewer);
-void gth_image_viewer_set_check_size (GthImageViewer *view,
- GthCheckSize check_size);
-GthCheckSize gth_image_viewer_get_check_size (GthImageViewer *viewer);
-
/* misc. */
void gth_image_viewer_clicked (GthImageViewer *viewer);
-void gth_image_viewer_set_black_background (GthImageViewer *viewer,
- gboolean set_black);
-gboolean gth_image_viewer_is_black_background (GthImageViewer *viewer);
void gth_image_viewer_set_tool (GthImageViewer *viewer,
GthImageViewerTool *tool);
@@ -291,9 +257,11 @@ gboolean gth_image_viewer_is_cursor_visible (GthImageViewer
/* Frame. */
-void gth_image_viewer_show_frame (GthImageViewer *viewer);
+void gth_image_viewer_show_frame (GthImageViewer *viewer,
+ int frame_border);
void gth_image_viewer_hide_frame (GthImageViewer *viewer);
gboolean gth_image_viewer_is_frame_visible (GthImageViewer *viewer);
+int gth_image_viewer_get_frame_border (GthImageViewer *self);
/*< protected, used by the tools >*/
@@ -313,7 +281,6 @@ void gth_image_viewer_paint_region (GthImageViewer
int src_x,
int src_y,
cairo_rectangle_int_t *pixbuf_area,
- cairo_region_t *region,
cairo_filter_t filter);
void gth_image_viewer_paint_background (GthImageViewer *self,
cairo_t *cr);
diff --git a/gthumb/gth-overwrite-dialog.c b/gthumb/gth-overwrite-dialog.c
index 4191e90..36c0efb 100644
--- a/gthumb/gth-overwrite-dialog.c
+++ b/gthumb/gth-overwrite-dialog.c
@@ -289,14 +289,12 @@ gth_overwrite_dialog_construct (GthOverwriteDialog *self,
gtk_widget_set_size_request (_gtk_builder_get_widget (self->priv->builder, "new_image_frame"),
PREVIEW_SIZE, PREVIEW_SIZE);
self->priv->old_image_viewer = gth_image_viewer_new ();
- gth_image_viewer_set_transp_type (GTH_IMAGE_VIEWER (self->priv->old_image_viewer),
GTH_TRANSP_TYPE_NONE);
gth_image_viewer_set_fit_mode (GTH_IMAGE_VIEWER (self->priv->old_image_viewer),
GTH_FIT_SIZE_IF_LARGER);
gth_image_viewer_hide_frame (GTH_IMAGE_VIEWER (self->priv->old_image_viewer));
gtk_widget_show (self->priv->old_image_viewer);
gtk_container_add (GTK_CONTAINER (_gtk_builder_get_widget (self->priv->builder, "old_image_frame")),
self->priv->old_image_viewer);
self->priv->new_image_viewer = gth_image_viewer_new ();
- gth_image_viewer_set_transp_type (GTH_IMAGE_VIEWER (self->priv->new_image_viewer),
GTH_TRANSP_TYPE_NONE);
gth_image_viewer_set_fit_mode (GTH_IMAGE_VIEWER (self->priv->new_image_viewer),
GTH_FIT_SIZE_IF_LARGER);
gth_image_viewer_hide_frame (GTH_IMAGE_VIEWER (self->priv->new_image_viewer));
gtk_widget_show (self->priv->new_image_viewer);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]