Mercurial > geeqie
annotate src/image.c @ 1701:2309e6150e8c
do not try to reload deleted image
deleted image is replaced by the next one from the list, keep
the old image displayed until the new one is set
author | nadvornik |
---|---|
date | Fri, 24 Jul 2009 12:56:54 +0000 |
parents | b8235f919d6b |
children | 155268f3bc76 |
rev | line source |
---|---|
1 | 1 /* |
196 | 2 * Geeqie |
115
53b2bfdcff69
Tue Nov 28 11:54:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
114
diff
changeset
|
3 * (C) 2006 John Ellis |
1284 | 4 * Copyright (C) 2008 - 2009 The Geeqie Team |
1 | 5 * |
6 * Author: John Ellis | |
7 * | |
9 | 8 * This software is released under the GNU General Public License (GNU GPL). |
9 * Please read the included file COPYING for more information. | |
10 * This software comes with no warranty of any kind, use at your own risk! | |
1 | 11 */ |
12 | |
9 | 13 |
281 | 14 #include "main.h" |
1 | 15 #include "image.h" |
9 | 16 |
17 | |
18 #include "collect.h" | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
19 #include "color-man.h" |
9 | 20 #include "exif.h" |
1288 | 21 #include "metadata.h" |
480
805c3258d228
Make histogram depends on image window not layout window.
zas_
parents:
475
diff
changeset
|
22 #include "histogram.h" |
507 | 23 #include "image-load.h" |
415 | 24 #include "image-overlay.h" |
284 | 25 #include "layout.h" |
26 #include "layout_image.h" | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
27 #include "pixbuf-renderer.h" |
9 | 28 #include "pixbuf_util.h" |
29 #include "ui_fileops.h" | |
30 | |
586 | 31 #include "filedata.h" |
846 | 32 #include "filecache.h" |
138 | 33 |
9 | 34 #include <math.h> |
35 | |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
36 static GList *image_list = NULL; |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
37 |
61
0c912a2d94f1
Mon Jun 13 20:22:58 2005 John Ellis <johne@verizon.net>
gqview
parents:
42
diff
changeset
|
38 static void image_update_title(ImageWindow *imd); |
115
53b2bfdcff69
Tue Nov 28 11:54:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
114
diff
changeset
|
39 static void image_read_ahead_start(ImageWindow *imd); |
846 | 40 static void image_cache_set(ImageWindow *imd, FileData *fd); |
61
0c912a2d94f1
Mon Jun 13 20:22:58 2005 John Ellis <johne@verizon.net>
gqview
parents:
42
diff
changeset
|
41 |
1 | 42 /* |
9 | 43 *------------------------------------------------------------------- |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
44 * 'signals' |
9 | 45 *------------------------------------------------------------------- |
46 */ | |
47 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
48 static void image_click_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data) |
9 | 49 { |
50 ImageWindow *imd = data; | |
51 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
52 if (imd->func_button) |
9 | 53 { |
868
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
54 imd->func_button(imd, event, imd->data_button); |
9 | 55 } |
56 } | |
57 | |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
58 static void image_drag_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data) |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
59 { |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
60 ImageWindow *imd = data; |
129 | 61 gint width, height; |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
62 |
129 | 63 pixbuf_renderer_get_scaled_size(pr, &width, &height); |
442 | 64 |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
65 if (imd->func_drag) |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
66 { |
868
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
67 imd->func_drag(imd, event, |
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
68 (gfloat)(pr->drag_last_x - event->x) / width, |
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
69 (gfloat)(pr->drag_last_y - event->y) / height, |
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
70 imd->data_button); |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
71 } |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
72 } |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
73 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
74 static void image_scroll_notify_cb(PixbufRenderer *pr, gpointer data) |
9 | 75 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
76 ImageWindow *imd = data; |
9 | 77 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
78 if (imd->func_scroll_notify && pr->scale) |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
79 { |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
80 imd->func_scroll_notify(imd, |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
81 (gint)((gdouble)pr->x_scroll / pr->scale), |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
82 (gint)((gdouble)pr->y_scroll / pr->scale), |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
83 (gint)((gdouble)pr->image_width - pr->vis_width / pr->scale), |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
84 (gint)((gdouble)pr->image_height - pr->vis_height / pr->scale), |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
85 imd->data_scroll_notify); |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
86 } |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
87 } |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
88 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
89 static void image_update_util(ImageWindow *imd) |
1 | 90 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
91 if (imd->func_update) imd->func_update(imd, imd->data_update); |
9 | 92 } |
93 | |
25
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
94 static void image_zoom_cb(PixbufRenderer *pr, gdouble zoom, gpointer data) |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
95 { |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
96 ImageWindow *imd = data; |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
97 |
61
0c912a2d94f1
Mon Jun 13 20:22:58 2005 John Ellis <johne@verizon.net>
gqview
parents:
42
diff
changeset
|
98 if (imd->title_show_zoom) image_update_title(imd); |
415 | 99 if (imd->overlay_show_zoom) image_osd_update(imd); |
100 | |
25
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
101 image_update_util(imd); |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
102 } |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
103 |
1431 | 104 static void image_complete_util(ImageWindow *imd, gboolean preload) |
9 | 105 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
106 if (imd->il && image_get_pixbuf(imd) != image_loader_get_pixbuf(imd->il)) return; |
9 | 107 |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
108 DEBUG_1("%s image load completed \"%s\" (%s)", get_exec_time(), |
442 | 109 (preload) ? (imd->read_ahead_fd ? imd->read_ahead_fd->path : "null") : |
110 (imd->image_fd ? imd->image_fd->path : "null"), | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
111 (preload) ? "preload" : "current"); |
9 | 112 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
113 if (!preload) imd->completed = TRUE; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
114 if (imd->func_complete) imd->func_complete(imd, preload, imd->data_complete); |
1 | 115 } |
116 | |
25
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
117 static void image_render_complete_cb(PixbufRenderer *pr, gpointer data) |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
118 { |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
119 ImageWindow *imd = data; |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
120 |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
121 image_complete_util(imd, FALSE); |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
122 } |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
123 |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
124 static void image_state_set(ImageWindow *imd, ImageState state) |
9 | 125 { |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
126 if (state == IMAGE_STATE_NONE) |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
127 { |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
128 imd->state = state; |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
129 } |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
130 else |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
131 { |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
132 imd->state |= state; |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
133 } |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
134 if (imd->func_state) imd->func_state(imd, state, imd->data_state); |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
135 } |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
136 |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
137 static void image_state_unset(ImageWindow *imd, ImageState state) |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
138 { |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
139 imd->state &= ~state; |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
140 if (imd->func_state) imd->func_state(imd, state, imd->data_state); |
1 | 141 } |
142 | |
143 /* | |
9 | 144 *------------------------------------------------------------------- |
145 * misc | |
146 *------------------------------------------------------------------- | |
147 */ | |
148 | |
149 static void image_update_title(ImageWindow *imd) | |
1 | 150 { |
9 | 151 gchar *title = NULL; |
152 gchar *zoom = NULL; | |
153 gchar *collection = NULL; | |
154 | |
155 if (!imd->top_window) return; | |
156 | |
157 if (imd->collection && collection_to_number(imd->collection) >= 0) | |
158 { | |
987 | 159 const gchar *name = imd->collection->name; |
9 | 160 if (!name) name = _("Untitled"); |
987 | 161 collection = g_strdup_printf(_(" (Collection %s)"), name); |
9 | 162 } |
163 | |
164 if (imd->title_show_zoom) | |
1 | 165 { |
9 | 166 gchar *buf = image_zoom_get_as_text(imd); |
167 zoom = g_strconcat(" [", buf, "]", NULL); | |
168 g_free(buf); | |
1 | 169 } |
170 | |
9 | 171 title = g_strdup_printf("%s%s%s%s%s%s", |
172 imd->title ? imd->title : "", | |
138 | 173 imd->image_fd ? imd->image_fd->name : "", |
9 | 174 zoom ? zoom : "", |
175 collection ? collection : "", | |
138 | 176 imd->image_fd ? " - " : "", |
9 | 177 imd->title_right ? imd->title_right : ""); |
178 | |
179 gtk_window_set_title(GTK_WINDOW(imd->top_window), title); | |
180 | |
181 g_free(title); | |
182 g_free(zoom); | |
183 g_free(collection); | |
184 } | |
185 | |
186 /* | |
187 *------------------------------------------------------------------- | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
188 * rotation, flip, etc. |
9 | 189 *------------------------------------------------------------------- |
190 */ | |
1548 | 191 static gboolean image_get_x11_screen_profile(ImageWindow *imd, guchar **screen_profile, gint *screen_profile_len) |
192 { | |
193 GdkScreen *screen = gtk_widget_get_screen(imd->widget);; | |
194 GdkAtom type = GDK_NONE; | |
195 gint format = 0; | |
196 | |
197 return (gdk_property_get(gdk_screen_get_root_window(screen), | |
198 gdk_atom_intern ("_ICC_PROFILE", FALSE), | |
199 GDK_NONE, | |
200 0, 64 * 1024 * 1024, FALSE, | |
201 &type, &format, screen_profile_len, screen_profile) && *screen_profile_len > 0); | |
202 } | |
9 | 203 |
1431 | 204 static gboolean image_post_process_color(ImageWindow *imd, gint start_row, gboolean run_in_bg) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
205 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
206 ColorMan *cm; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
207 ColorManProfileType input_type; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
208 ColorManProfileType screen_type; |
1548 | 209 const gchar *input_file = NULL; |
210 const gchar *screen_file = NULL; | |
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
995
diff
changeset
|
211 guchar *profile = NULL; |
449 | 212 guint profile_len; |
1548 | 213 guchar *screen_profile = NULL; |
214 gint screen_profile_len; | |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
215 ExifData *exif; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
216 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
217 if (imd->cm) return FALSE; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
218 |
426
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
219 if (imd->color_profile_input >= COLOR_PROFILE_FILE && |
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
220 imd->color_profile_input < COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
221 { |
1356
681e79dd0820
Slightly modify access_file() and use it to test profile files existence and read access.
zas_
parents:
1346
diff
changeset
|
222 const gchar *file = options->color_profile.input_file[imd->color_profile_input - COLOR_PROFILE_FILE]; |
681e79dd0820
Slightly modify access_file() and use it to test profile files existence and read access.
zas_
parents:
1346
diff
changeset
|
223 |
1362 | 224 if (!is_readable_file(file)) return FALSE; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
225 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
226 input_type = COLOR_PROFILE_FILE; |
1356
681e79dd0820
Slightly modify access_file() and use it to test profile files existence and read access.
zas_
parents:
1346
diff
changeset
|
227 input_file = file; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
228 } |
442 | 229 else if (imd->color_profile_input >= COLOR_PROFILE_SRGB && |
230 imd->color_profile_input < COLOR_PROFILE_FILE) | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
231 { |
426
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
232 input_type = imd->color_profile_input; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
233 input_file = NULL; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
234 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
235 else |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
236 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
237 return FALSE; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
238 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
239 |
1548 | 240 if (options->color_profile.use_x11_screen_profile && |
241 image_get_x11_screen_profile(imd, &screen_profile, &screen_profile_len)) | |
242 { | |
243 screen_type = COLOR_PROFILE_MEM; | |
244 DEBUG_1("Using X11 screen profile, length: %d", screen_profile_len); | |
245 } | |
1550 | 246 else if (options->color_profile.screen_file && |
1362 | 247 is_readable_file(options->color_profile.screen_file)) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
248 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
249 screen_type = COLOR_PROFILE_FILE; |
327 | 250 screen_file = options->color_profile.screen_file; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
251 } |
1548 | 252 else |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
253 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
254 screen_type = COLOR_PROFILE_SRGB; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
255 screen_file = NULL; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
256 } |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
257 |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
258 |
426
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
259 imd->color_profile_from_image = COLOR_PROFILE_NONE; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
260 |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
261 exif = exif_read_fd(imd->image_fd); |
1357
4ca837d74999
image_post_process_color(): remove exif parameter, just extract it when needed.
zas_
parents:
1356
diff
changeset
|
262 |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
263 if (exif) |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
264 { |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
265 profile = exif_get_color_profile(exif, &profile_len); |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
266 if (profile) |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
267 { |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
268 if (!imd->color_profile_use_image) |
424 | 269 { |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
270 g_free(profile); |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
271 profile = NULL; |
424 | 272 } |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
273 DEBUG_1("Found embedded color profile"); |
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
274 imd->color_profile_from_image = COLOR_PROFILE_MEM; |
115
53b2bfdcff69
Tue Nov 28 11:54:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
114
diff
changeset
|
275 } |
1364 | 276 else |
277 { | |
278 gchar *interop_index = exif_get_data_as_text(exif, "Exif.Iop.InteroperabilityIndex"); | |
279 | |
280 if (interop_index) | |
281 { | |
282 /* Exif 2.21 specification */ | |
283 if (!strcmp(interop_index, "R98")) | |
284 { | |
285 imd->color_profile_from_image = COLOR_PROFILE_SRGB; | |
286 DEBUG_1("Found EXIF 2.21 ColorSpace of sRGB"); | |
287 } | |
288 else if (!strcmp(interop_index, "R03")) | |
289 { | |
290 imd->color_profile_from_image = COLOR_PROFILE_ADOBERGB; | |
291 DEBUG_1("Found EXIF 2.21 ColorSpace of AdobeRGB"); | |
292 } | |
293 g_free(interop_index); | |
294 } | |
295 else | |
296 { | |
297 gint cs; | |
298 | |
299 /* ColorSpace == 1 specifies sRGB per EXIF 2.2 */ | |
300 if (!exif_get_integer(exif, "Exif.Photo.ColorSpace", &cs)) cs = 0; | |
301 if (cs == 1) | |
302 { | |
303 imd->color_profile_from_image = COLOR_PROFILE_SRGB; | |
304 DEBUG_1("Found EXIF 2.2 ColorSpace of sRGB"); | |
305 } | |
306 else if (cs == 2) | |
307 { | |
308 /* non-standard way of specifying AdobeRGB (used by some software) */ | |
309 imd->color_profile_from_image = COLOR_PROFILE_ADOBERGB; | |
310 DEBUG_1("Found EXIF 2.2 ColorSpace of AdobeRGB"); | |
311 } | |
312 } | |
313 | |
314 if (imd->color_profile_use_image && imd->color_profile_from_image != COLOR_PROFILE_NONE) | |
315 { | |
316 input_type = imd->color_profile_from_image; | |
317 input_file = NULL; | |
318 } | |
319 } | |
320 | |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
321 exif_free_fd(imd->image_fd, exif); |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
322 } |
1363
d87deb05d59f
Enable 'Use profile from image' item of color management menu only if such profile information is available from image.
zas_
parents:
1362
diff
changeset
|
323 |
176
695e1ad3b169
simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents:
175
diff
changeset
|
324 |
449 | 325 if (profile) |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
326 { |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
327 cm = color_man_new_embedded(run_in_bg ? imd : NULL, NULL, |
449 | 328 profile, profile_len, |
1548 | 329 screen_type, screen_file, screen_profile, screen_profile_len); |
449 | 330 g_free(profile); |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
331 } |
442 | 332 else |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
333 { |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
334 cm = color_man_new(run_in_bg ? imd : NULL, NULL, |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
335 input_type, input_file, |
1548 | 336 screen_type, screen_file, screen_profile, screen_profile_len); |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
337 } |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
338 |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
339 if (cm) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
340 { |
116
1bd40943dc2a
Tue Nov 28 13:17:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
115
diff
changeset
|
341 if (start_row > 0) |
1bd40943dc2a
Tue Nov 28 13:17:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
115
diff
changeset
|
342 { |
1bd40943dc2a
Tue Nov 28 13:17:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
115
diff
changeset
|
343 cm->row = start_row; |
1bd40943dc2a
Tue Nov 28 13:17:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
115
diff
changeset
|
344 cm->incremental_sync = TRUE; |
1bd40943dc2a
Tue Nov 28 13:17:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
115
diff
changeset
|
345 } |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
346 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
347 imd->cm = (gpointer)cm; |
442 | 348 #if 0 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
349 if (run_in_bg) color_man_start_bg(imd->cm, image_post_process_color_cb, imd); |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
350 #endif |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
351 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
352 |
1550 | 353 image_update_util(imd); |
1638 | 354 |
355 if (screen_profile) | |
356 { | |
357 g_free(screen_profile); | |
358 screen_profile = NULL; | |
359 } | |
360 | |
1550 | 361 return !!cm; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
362 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
363 |
9 | 364 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
365 static void image_post_process_tile_color_cb(PixbufRenderer *pr, GdkPixbuf **pixbuf, gint x, gint y, gint w, gint h, gpointer data) |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
366 { |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
367 ImageWindow *imd = (ImageWindow *)data; |
442 | 368 if (imd->cm) color_man_correct_region(imd->cm, *pixbuf, x, y, w, h); |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
369 if (imd->desaturate) pixbuf_desaturate_rect(*pixbuf, x, y, w, h); |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
370 |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
371 } |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
372 |
1566 | 373 void image_alter_orientation(ImageWindow *imd, AlterType type) |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
374 { |
691 | 375 static const gint rotate_90[] = {1, 6, 7, 8, 5, 2, 3, 4, 1}; |
376 static const gint rotate_90_cc[] = {1, 8, 5, 6, 7, 4, 1, 2, 3}; | |
377 static const gint rotate_180[] = {1, 3, 4, 1, 2, 7, 8, 5, 6}; | |
378 static const gint mirror[] = {1, 2, 1, 4, 3, 6, 5, 8, 7}; | |
379 static const gint flip[] = {1, 4, 3, 2, 1, 8, 7, 6, 5}; | |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
380 |
442 | 381 |
994
c879a4c14f33
Fixed segfaulting when alter image in directory without images.
bruclik
parents:
987
diff
changeset
|
382 if (!imd || !imd->pr || !imd->image_fd) return; |
442 | 383 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
384 if (imd->orientation < 1 || imd->orientation > 8) imd->orientation = 1; |
442 | 385 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
386 switch (type) |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
387 { |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
388 case ALTER_ROTATE_90: |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
389 imd->orientation = rotate_90[imd->orientation]; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
390 break; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
391 case ALTER_ROTATE_90_CC: |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
392 imd->orientation = rotate_90_cc[imd->orientation]; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
393 break; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
394 case ALTER_ROTATE_180: |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
395 imd->orientation = rotate_180[imd->orientation]; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
396 break; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
397 case ALTER_MIRROR: |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
398 imd->orientation = mirror[imd->orientation]; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
399 break; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
400 case ALTER_FLIP: |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
401 imd->orientation = flip[imd->orientation]; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
402 break; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
403 case ALTER_NONE: |
439 | 404 imd->orientation = imd->image_fd->exif_orientation ? imd->image_fd->exif_orientation : 1; |
405 break; | |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
406 default: |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
407 return; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
408 break; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
409 } |
434
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
410 |
1567
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
411 if (imd->orientation != imd->image_fd->exif_orientation ? imd->image_fd->exif_orientation : 1) |
434
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
412 { |
1567
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
413 if (!options->metadata.write_orientation) |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
414 { |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
415 /* user_orientation does not work together with options->metadata.write_orientation, |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
416 use either one or the other. |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
417 we must however handle switching metadata.write_orientation on and off, therefore |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
418 we just disable referencing new fd's, not unreferencing the old ones |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
419 */ |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
420 if (imd->image_fd->user_orientation == 0) file_data_ref(imd->image_fd); |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
421 imd->image_fd->user_orientation = imd->orientation; |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
422 } |
434
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
423 } |
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
424 else |
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
425 { |
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
426 if (imd->image_fd->user_orientation != 0) file_data_unref(imd->image_fd); |
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
427 imd->image_fd->user_orientation = 0; |
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
428 } |
1b0aee2b162e
Keep image orientation set by the user during the session.
zas_
parents:
432
diff
changeset
|
429 |
1567
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
430 if (options->metadata.write_orientation) |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
431 { |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
432 if (type == ALTER_NONE) |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
433 { |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
434 metadata_write_revert(imd->image_fd, ORIENTATION_KEY); |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
435 } |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
436 else |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
437 { |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
438 metadata_write_int(imd->image_fd, ORIENTATION_KEY, imd->orientation); |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
439 } |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
440 } |
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
441 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
442 pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation); |
1566 | 443 } |
444 | |
445 void image_set_desaturate(ImageWindow *imd, gboolean desaturate) | |
446 { | |
447 imd->desaturate = desaturate; | |
442 | 448 if (imd->cm || imd->desaturate) |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
449 pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, image_post_process_tile_color_cb, (gpointer) imd, (imd->cm != NULL) ); |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
450 else |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
451 pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, NULL, NULL, TRUE); |
1566 | 452 pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation); |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
453 } |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
454 |
1566 | 455 gboolean image_get_desaturate(ImageWindow *imd) |
456 { | |
457 return imd->desaturate; | |
458 } | |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
459 |
9 | 460 /* |
461 *------------------------------------------------------------------- | |
462 * read ahead (prebuffer) | |
463 *------------------------------------------------------------------- | |
464 */ | |
465 | |
466 static void image_read_ahead_cancel(ImageWindow *imd) | |
467 { | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
468 DEBUG_1("%s read ahead cancelled for :%s", get_exec_time(), imd->read_ahead_fd ? imd->read_ahead_fd->path : "null"); |
9 | 469 |
470 image_loader_free(imd->read_ahead_il); | |
471 imd->read_ahead_il = NULL; | |
472 | |
138 | 473 file_data_unref(imd->read_ahead_fd); |
474 imd->read_ahead_fd = NULL; | |
9 | 475 } |
476 | |
477 static void image_read_ahead_done_cb(ImageLoader *il, gpointer data) | |
478 { | |
479 ImageWindow *imd = data; | |
480 | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
481 DEBUG_1("%s read ahead done for :%s", get_exec_time(), imd->read_ahead_fd->path); |
9 | 482 |
846 | 483 if (!imd->read_ahead_fd->pixbuf) |
9 | 484 { |
846 | 485 imd->read_ahead_fd->pixbuf = image_loader_get_pixbuf(imd->read_ahead_il); |
486 if (imd->read_ahead_fd->pixbuf) | |
487 { | |
488 g_object_ref(imd->read_ahead_fd->pixbuf); | |
489 image_cache_set(imd, imd->read_ahead_fd); | |
490 } | |
9 | 491 } |
492 image_loader_free(imd->read_ahead_il); | |
493 imd->read_ahead_il = NULL; | |
494 | |
495 image_complete_util(imd, TRUE); | |
496 } | |
497 | |
498 static void image_read_ahead_error_cb(ImageLoader *il, gpointer data) | |
499 { | |
500 /* we even treat errors as success, maybe at least some of the file was ok */ | |
501 image_read_ahead_done_cb(il, data); | |
502 } | |
503 | |
504 static void image_read_ahead_start(ImageWindow *imd) | |
505 { | |
506 /* already started ? */ | |
846 | 507 if (!imd->read_ahead_fd || imd->read_ahead_il || imd->read_ahead_fd->pixbuf) return; |
9 | 508 |
509 /* still loading ?, do later */ | |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
510 if (imd->il /*|| imd->cm*/) return; |
9 | 511 |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
512 DEBUG_1("%s read ahead started for :%s", get_exec_time(), imd->read_ahead_fd->path); |
9 | 513 |
138 | 514 imd->read_ahead_il = image_loader_new(imd->read_ahead_fd); |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
515 |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
516 image_loader_delay_area_ready(imd->read_ahead_il, TRUE); /* we will need the area_ready signals later */ |
9 | 517 |
1346
c9949c19a6d0
No space between function name and first parenthesis, it eases greping (see CODING).
zas_
parents:
1338
diff
changeset
|
518 g_signal_connect(G_OBJECT(imd->read_ahead_il), "error", (GCallback)image_read_ahead_error_cb, imd); |
c9949c19a6d0
No space between function name and first parenthesis, it eases greping (see CODING).
zas_
parents:
1338
diff
changeset
|
519 g_signal_connect(G_OBJECT(imd->read_ahead_il), "done", (GCallback)image_read_ahead_done_cb, imd); |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
520 |
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
521 if (!image_loader_start(imd->read_ahead_il)) |
9 | 522 { |
523 image_read_ahead_cancel(imd); | |
524 image_complete_util(imd, TRUE); | |
525 } | |
526 } | |
527 | |
138 | 528 static void image_read_ahead_set(ImageWindow *imd, FileData *fd) |
9 | 529 { |
138 | 530 if (imd->read_ahead_fd && fd && imd->read_ahead_fd == fd) return; |
9 | 531 |
532 image_read_ahead_cancel(imd); | |
533 | |
138 | 534 imd->read_ahead_fd = file_data_ref(fd); |
9 | 535 |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
536 DEBUG_1("read ahead set to :%s", imd->read_ahead_fd->path); |
9 | 537 |
538 image_read_ahead_start(imd); | |
539 } | |
540 | |
541 /* | |
542 *------------------------------------------------------------------- | |
543 * post buffering | |
544 *------------------------------------------------------------------- | |
545 */ | |
546 | |
846 | 547 static void image_cache_release_cb(FileData *fd) |
9 | 548 { |
846 | 549 g_object_unref(fd->pixbuf); |
550 fd->pixbuf = NULL; | |
9 | 551 } |
552 | |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
553 static FileCacheData *image_get_cache(void) |
846 | 554 { |
555 static FileCacheData *cache = NULL; | |
848 | 556 if (!cache) cache = file_cache_new(image_cache_release_cb, 1); |
557 file_cache_set_max_size(cache, (gulong)options->image.image_cache_max * 1048576); /* update from options */ | |
846 | 558 return cache; |
559 } | |
560 | |
561 static void image_cache_set(ImageWindow *imd, FileData *fd) | |
562 { | |
847 | 563 g_assert(fd->pixbuf); |
846 | 564 |
847 | 565 file_cache_put(image_get_cache(), fd, (gulong)gdk_pixbuf_get_rowstride(fd->pixbuf) * (gulong)gdk_pixbuf_get_height(fd->pixbuf)); |
1432 | 566 file_data_send_notification(fd, NOTIFY_PIXBUF); /* to update histogram */ |
846 | 567 } |
568 | |
569 static gint image_cache_get(ImageWindow *imd) | |
9 | 570 { |
571 gint success; | |
572 | |
846 | 573 success = file_cache_get(image_get_cache(), imd->image_fd); |
574 if (success) | |
9 | 575 { |
846 | 576 g_assert(imd->image_fd->pixbuf); |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
577 image_change_pixbuf(imd, imd->image_fd->pixbuf, image_zoom_get(imd), FALSE); |
9 | 578 } |
846 | 579 |
1498 | 580 // file_cache_dump(image_get_cache()); |
9 | 581 return success; |
582 } | |
583 | |
584 /* | |
585 *------------------------------------------------------------------- | |
586 * loading | |
587 *------------------------------------------------------------------- | |
588 */ | |
589 | |
590 static void image_load_pixbuf_ready(ImageWindow *imd) | |
591 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
592 if (image_get_pixbuf(imd) || !imd->il) return; |
9 | 593 |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
594 image_change_pixbuf(imd, image_loader_get_pixbuf(imd->il), image_zoom_get(imd), FALSE); |
9 | 595 } |
596 | |
597 static void image_load_area_cb(ImageLoader *il, guint x, guint y, guint w, guint h, gpointer data) | |
598 { | |
599 ImageWindow *imd = data; | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
600 PixbufRenderer *pr; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
601 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
602 pr = (PixbufRenderer *)imd->pr; |
9 | 603 |
604 if (imd->delay_flip && | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
605 pr->pixbuf != image_loader_get_pixbuf(il)) |
9 | 606 { |
607 return; | |
608 } | |
609 | |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
610 if (!pr->pixbuf) image_change_pixbuf(imd, image_loader_get_pixbuf(imd->il), image_zoom_get(imd), TRUE); |
9 | 611 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
612 pixbuf_renderer_area_changed(pr, x, y, w, h); |
9 | 613 } |
614 | |
615 static void image_load_done_cb(ImageLoader *il, gpointer data) | |
1 | 616 { |
617 ImageWindow *imd = data; | |
9 | 618 |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
619 DEBUG_1("%s image done", get_exec_time()); |
9 | 620 |
846 | 621 if (options->image.enable_read_ahead && imd->image_fd && !imd->image_fd->pixbuf && image_loader_get_pixbuf(imd->il)) |
622 { | |
1043 | 623 imd->image_fd->pixbuf = g_object_ref(image_loader_get_pixbuf(imd->il)); |
846 | 624 image_cache_set(imd, imd->image_fd); |
625 } | |
1294 | 626 /* call the callback triggered by image_state after fd->pixbuf is set */ |
627 g_object_set(G_OBJECT(imd->pr), "loading", FALSE, NULL); | |
628 image_state_unset(imd, IMAGE_STATE_LOADING); | |
846 | 629 |
1031 | 630 if (!image_loader_get_pixbuf(imd->il)) |
631 { | |
632 GdkPixbuf *pixbuf; | |
633 | |
634 pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); | |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
635 image_change_pixbuf(imd, pixbuf, image_zoom_get(imd), FALSE); |
1031 | 636 g_object_unref(pixbuf); |
637 | |
638 imd->unknown = TRUE; | |
639 } | |
640 else if (imd->delay_flip && | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
641 image_get_pixbuf(imd) != image_loader_get_pixbuf(imd->il)) |
9 | 642 { |
42
606fcf461a68
Sat May 14 13:04:23 2005 John Ellis <johne@verizon.net>
gqview
parents:
29
diff
changeset
|
643 g_object_set(G_OBJECT(imd->pr), "complete", FALSE, NULL); |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
644 image_change_pixbuf(imd, image_loader_get_pixbuf(imd->il), image_zoom_get(imd), FALSE); |
9 | 645 } |
646 | |
647 image_loader_free(imd->il); | |
648 imd->il = NULL; | |
649 | |
846 | 650 // image_post_process(imd, TRUE); |
9 | 651 |
652 image_read_ahead_start(imd); | |
653 } | |
654 | |
655 static void image_load_error_cb(ImageLoader *il, gpointer data) | |
656 { | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
657 DEBUG_1("%s image error", get_exec_time()); |
9 | 658 |
659 /* even on error handle it like it was done, | |
660 * since we have a pixbuf with _something_ */ | |
661 | |
662 image_load_done_cb(il, data); | |
663 } | |
664 | |
1338 | 665 static void image_load_set_signals(ImageWindow *imd, gboolean override_old_signals) |
666 { | |
667 g_assert(imd->il); | |
668 if (override_old_signals) | |
669 { | |
670 /* override the old signals */ | |
671 g_signal_handlers_disconnect_matched(G_OBJECT(imd->il), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, imd); | |
672 } | |
673 | |
674 g_signal_connect(G_OBJECT(imd->il), "area_ready", (GCallback)image_load_area_cb, imd); | |
675 g_signal_connect(G_OBJECT(imd->il), "error", (GCallback)image_load_error_cb, imd); | |
676 g_signal_connect(G_OBJECT(imd->il), "done", (GCallback)image_load_done_cb, imd); | |
677 } | |
678 | |
9 | 679 /* this read ahead is located here merely for the callbacks, above */ |
680 | |
1431 | 681 static gboolean image_read_ahead_check(ImageWindow *imd) |
9 | 682 { |
138 | 683 if (!imd->read_ahead_fd) return FALSE; |
9 | 684 if (imd->il) return FALSE; |
685 | |
138 | 686 if (!imd->image_fd || imd->read_ahead_fd != imd->image_fd) |
9 | 687 { |
688 image_read_ahead_cancel(imd); | |
689 return FALSE; | |
690 } | |
691 | |
692 if (imd->read_ahead_il) | |
693 { | |
694 imd->il = imd->read_ahead_il; | |
695 imd->read_ahead_il = NULL; | |
696 | |
1338 | 697 image_load_set_signals(imd, TRUE); |
9 | 698 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
699 g_object_set(G_OBJECT(imd->pr), "loading", TRUE, NULL); |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
700 image_state_set(imd, IMAGE_STATE_LOADING); |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
701 |
9 | 702 if (!imd->delay_flip) |
703 { | |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
704 image_change_pixbuf(imd, image_loader_get_pixbuf(imd->il), image_zoom_get(imd), TRUE); |
9 | 705 } |
706 | |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
707 image_loader_delay_area_ready(imd->il, FALSE); /* send the delayed area_ready signals */ |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
708 |
846 | 709 file_data_unref(imd->read_ahead_fd); |
710 imd->read_ahead_fd = NULL; | |
9 | 711 return TRUE; |
712 } | |
846 | 713 else if (imd->read_ahead_fd->pixbuf) |
9 | 714 { |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
715 image_change_pixbuf(imd, imd->read_ahead_fd->pixbuf, image_zoom_get(imd), FALSE); |
9 | 716 |
846 | 717 file_data_unref(imd->read_ahead_fd); |
718 imd->read_ahead_fd = NULL; | |
9 | 719 |
846 | 720 // image_post_process(imd, FALSE); |
9 | 721 return TRUE; |
722 } | |
723 | |
724 image_read_ahead_cancel(imd); | |
725 return FALSE; | |
726 } | |
727 | |
1431 | 728 static gboolean image_load_begin(ImageWindow *imd, FileData *fd) |
9 | 729 { |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
730 DEBUG_1("%s image begin", get_exec_time()); |
9 | 731 |
732 if (imd->il) return FALSE; | |
733 | |
734 imd->completed = FALSE; | |
25
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
735 g_object_set(G_OBJECT(imd->pr), "complete", FALSE, NULL); |
9 | 736 |
846 | 737 if (image_cache_get(imd)) |
9 | 738 { |
847 | 739 DEBUG_1("from cache: %s", imd->image_fd->path); |
9 | 740 return TRUE; |
741 } | |
742 | |
743 if (image_read_ahead_check(imd)) | |
744 { | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
745 DEBUG_1("from read ahead buffer: %s", imd->image_fd->path); |
9 | 746 return TRUE; |
747 } | |
748 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
749 if (!imd->delay_flip && image_get_pixbuf(imd)) |
9 | 750 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
751 PixbufRenderer *pr; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
752 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
753 pr = PIXBUF_RENDERER(imd->pr); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
754 if (pr->pixbuf) g_object_unref(pr->pixbuf); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
755 pr->pixbuf = NULL; |
9 | 756 } |
757 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
758 g_object_set(G_OBJECT(imd->pr), "loading", TRUE, NULL); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
759 |
138 | 760 imd->il = image_loader_new(fd); |
9 | 761 |
1338 | 762 image_load_set_signals(imd, FALSE); |
9 | 763 |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
764 if (!image_loader_start(imd->il)) |
9 | 765 { |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
766 DEBUG_1("image start error"); |
9 | 767 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
768 g_object_set(G_OBJECT(imd->pr), "loading", FALSE, NULL); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
769 |
9 | 770 image_loader_free(imd->il); |
771 imd->il = NULL; | |
772 | |
773 image_complete_util(imd, FALSE); | |
774 | |
775 return FALSE; | |
776 } | |
777 | |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
778 image_state_set(imd, IMAGE_STATE_LOADING); |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
779 |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
780 /* |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
781 if (!imd->delay_flip && !image_get_pixbuf(imd) && image_loader_get_pixbuf(imd->il)) |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
782 { |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
783 image_change_pixbuf(imd, image_loader_get_pixbuf(imd->il), image_zoom_get(imd), TRUE); |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
784 } |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
785 */ |
9 | 786 return TRUE; |
787 } | |
788 | |
789 static void image_reset(ImageWindow *imd) | |
790 { | |
791 /* stops anything currently being done */ | |
792 | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
793 DEBUG_1("%s image reset", get_exec_time()); |
9 | 794 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
795 g_object_set(G_OBJECT(imd->pr), "loading", FALSE, NULL); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
796 |
9 | 797 image_loader_free(imd->il); |
798 imd->il = NULL; | |
799 | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
800 color_man_free((ColorMan *)imd->cm); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
801 imd->cm = NULL; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
802 |
9 | 803 imd->delay_alter_type = ALTER_NONE; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
804 |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
805 image_state_set(imd, IMAGE_STATE_NONE); |
9 | 806 } |
807 | |
808 /* | |
809 *------------------------------------------------------------------- | |
810 * image changer | |
811 *------------------------------------------------------------------- | |
812 */ | |
813 | |
1431 | 814 static void image_change_complete(ImageWindow *imd, gdouble zoom) |
9 | 815 { |
816 image_reset(imd); | |
1337
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
817 imd->unknown = TRUE; |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
818 |
1337
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
819 if (!imd->image_fd) |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
820 { |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
821 image_change_pixbuf(imd, NULL, zoom, FALSE); |
9 | 822 } |
823 else | |
824 { | |
1337
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
825 |
1362 | 826 if (is_readable_file(imd->image_fd->path)) |
1337
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
827 { |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
828 PixbufRenderer *pr; |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
829 |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
830 pr = PIXBUF_RENDERER(imd->pr); |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
831 pr->zoom = zoom; /* store the zoom, needed by the loader */ |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
832 |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
833 if (image_load_begin(imd, imd->image_fd)) |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
834 { |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
835 imd->unknown = FALSE; |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
836 } |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
837 } |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
838 |
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
839 if (imd->unknown == TRUE) |
9 | 840 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
841 GdkPixbuf *pixbuf; |
1337
091ba3e6aedb
image_change_complete(): reduce code redundancy and implify.
zas_
parents:
1333
diff
changeset
|
842 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
843 pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
844 image_change_pixbuf(imd, pixbuf, zoom, FALSE); |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
845 g_object_unref(pixbuf); |
9 | 846 } |
847 } | |
848 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
849 image_update_util(imd); |
9 | 850 } |
851 | |
138 | 852 static void image_change_real(ImageWindow *imd, FileData *fd, |
9 | 853 CollectionData *cd, CollectInfo *info, gdouble zoom) |
854 { | |
855 | |
856 imd->collection = cd; | |
857 imd->collection_info = info; | |
858 | |
888 | 859 if (imd->auto_refresh && imd->image_fd) |
860 file_data_unregister_real_time_monitor(imd->image_fd); | |
861 | |
138 | 862 file_data_unref(imd->image_fd); |
863 imd->image_fd = file_data_ref(fd); | |
9 | 864 |
888 | 865 |
1431 | 866 image_change_complete(imd, zoom); |
9 | 867 |
868 image_update_title(imd); | |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
869 image_state_set(imd, IMAGE_STATE_IMAGE); |
888 | 870 |
871 if (imd->auto_refresh && imd->image_fd) | |
872 file_data_register_real_time_monitor(imd->image_fd); | |
9 | 873 } |
874 | |
875 /* | |
876 *------------------------------------------------------------------- | |
877 * focus stuff | |
878 *------------------------------------------------------------------- | |
879 */ | |
880 | |
1431 | 881 static void image_focus_paint(ImageWindow *imd, gboolean has_focus, GdkRectangle *area) |
9 | 882 { |
883 GtkWidget *widget; | |
884 | |
885 widget = imd->widget; | |
886 if (!widget->window) return; | |
887 | |
888 if (has_focus) | |
889 { | |
512
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
890 gtk_paint_focus(widget->style, widget->window, GTK_STATE_ACTIVE, |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
891 area, widget, "image_window", |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
892 widget->allocation.x, widget->allocation.y, |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
893 widget->allocation.width - 1, widget->allocation.height - 1); |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
894 } |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
895 else |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
896 { |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
897 gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, |
9 | 898 area, widget, "image_window", |
899 widget->allocation.x, widget->allocation.y, | |
442 | 900 widget->allocation.width - 1, widget->allocation.height - 1); |
9 | 901 } |
902 } | |
903 | |
1431 | 904 static gboolean image_focus_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) |
9 | 905 { |
906 ImageWindow *imd = data; | |
907 | |
908 image_focus_paint(imd, GTK_WIDGET_HAS_FOCUS(widget), &event->area); | |
909 return TRUE; | |
910 } | |
911 | |
1431 | 912 static gboolean image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) |
9 | 913 { |
914 ImageWindow *imd = data; | |
915 | |
916 GTK_WIDGET_SET_FLAGS(imd->widget, GTK_HAS_FOCUS); | |
917 image_focus_paint(imd, TRUE, NULL); | |
918 | |
1481 | 919 if (imd->func_focus_in) |
920 { | |
921 imd->func_focus_in(imd, imd->data_focus_in); | |
922 } | |
923 | |
9 | 924 return TRUE; |
925 } | |
926 | |
1431 | 927 static gboolean image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) |
9 | 928 { |
929 ImageWindow *imd = data; | |
930 | |
931 GTK_WIDGET_UNSET_FLAGS(imd->widget, GTK_HAS_FOCUS); | |
932 image_focus_paint(imd, FALSE, NULL); | |
933 | |
934 return TRUE; | |
935 } | |
936 | |
1431 | 937 static gboolean image_scroll_cb(GtkWidget *widget, GdkEventScroll *event, gpointer data) |
9 | 938 { |
939 ImageWindow *imd = data; | |
940 | |
941 if (imd->func_scroll && | |
942 event && event->type == GDK_SCROLL) | |
442 | 943 { |
868
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
944 imd->func_scroll(imd, event, imd->data_scroll); |
9 | 945 return TRUE; |
946 } | |
947 | |
948 return FALSE; | |
949 } | |
950 | |
951 /* | |
952 *------------------------------------------------------------------- | |
953 * public interface | |
954 *------------------------------------------------------------------- | |
955 */ | |
956 | |
957 void image_attach_window(ImageWindow *imd, GtkWidget *window, | |
1431 | 958 const gchar *title, const gchar *title_right, gboolean show_zoom) |
1 | 959 { |
960 imd->top_window = window; | |
961 g_free(imd->title); | |
9 | 962 imd->title = g_strdup(title); |
963 g_free(imd->title_right); | |
964 imd->title_right = g_strdup(title_right); | |
965 imd->title_show_zoom = show_zoom; | |
966 | |
334 | 967 if (!options->image.fit_window_to_image) window = NULL; |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
968 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
969 pixbuf_renderer_set_parent((PixbufRenderer *)imd->pr, (GtkWindow *)window); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
970 |
9 | 971 image_update_title(imd); |
972 } | |
973 | |
974 void image_set_update_func(ImageWindow *imd, | |
975 void (*func)(ImageWindow *imd, gpointer data), | |
976 gpointer data) | |
977 { | |
978 imd->func_update = func; | |
979 imd->data_update = data; | |
1 | 980 } |
981 | |
9 | 982 void image_set_complete_func(ImageWindow *imd, |
1431 | 983 void (*func)(ImageWindow *imd, gboolean preload, gpointer data), |
9 | 984 gpointer data) |
1 | 985 { |
9 | 986 imd->func_complete = func; |
987 imd->data_complete = data; | |
1 | 988 } |
989 | |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
990 void image_set_state_func(ImageWindow *imd, |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
991 void (*func)(ImageWindow *imd, ImageState state, gpointer data), |
9 | 992 gpointer data) |
1 | 993 { |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
994 imd->func_state = func; |
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
995 imd->data_state = data; |
9 | 996 } |
997 | |
998 | |
999 void image_set_button_func(ImageWindow *imd, | |
868
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
1000 void (*func)(ImageWindow *, GdkEventButton *event, gpointer), |
9 | 1001 gpointer data) |
1002 { | |
1003 imd->func_button = func; | |
1004 imd->data_button = data; | |
1005 } | |
1006 | |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1007 void image_set_drag_func(ImageWindow *imd, |
868
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
1008 void (*func)(ImageWindow *, GdkEventButton *event, gdouble dx, gdouble dy, gpointer), |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1009 gpointer data) |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1010 { |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1011 imd->func_drag = func; |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1012 imd->data_drag = data; |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1013 } |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1014 |
9 | 1015 void image_set_scroll_func(ImageWindow *imd, |
868
db6977f8b0f1
Reduce number of parameters (mostly unused), just pass the event pointer.
zas_
parents:
863
diff
changeset
|
1016 void (*func)(ImageWindow *, GdkEventScroll *event, gpointer), |
9 | 1017 gpointer data) |
1 | 1018 { |
9 | 1019 imd->func_scroll = func; |
1020 imd->data_scroll = data; | |
1 | 1021 } |
1022 | |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1023 void image_set_scroll_notify_func(ImageWindow *imd, |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1024 void (*func)(ImageWindow *imd, gint x, gint y, gint width, gint height, gpointer data), |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1025 gpointer data) |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1026 { |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1027 imd->func_scroll_notify = func; |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1028 imd->data_scroll_notify = data; |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1029 } |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1030 |
1481 | 1031 void image_set_focus_in_func(ImageWindow *imd, |
1032 void (*func)(ImageWindow *, gpointer), | |
1033 gpointer data) | |
1034 { | |
1035 imd->func_focus_in = func; | |
1036 imd->data_focus_in = data; | |
1037 } | |
1038 | |
9 | 1039 /* path, name */ |
1040 | |
1041 const gchar *image_get_path(ImageWindow *imd) | |
1042 { | |
138 | 1043 if (imd->image_fd == NULL) return NULL; |
1044 return imd->image_fd->path; | |
9 | 1045 } |
1046 | |
1047 const gchar *image_get_name(ImageWindow *imd) | |
1048 { | |
138 | 1049 if (imd->image_fd == NULL) return NULL; |
1050 return imd->image_fd->name; | |
1051 } | |
1052 | |
1053 FileData *image_get_fd(ImageWindow *imd) | |
1054 { | |
1055 return imd->image_fd; | |
9 | 1056 } |
1057 | |
1058 /* merely changes path string, does not change the image! */ | |
138 | 1059 void image_set_fd(ImageWindow *imd, FileData *fd) |
1 | 1060 { |
888 | 1061 if (imd->auto_refresh && imd->image_fd) |
1062 file_data_unregister_real_time_monitor(imd->image_fd); | |
1063 | |
138 | 1064 file_data_unref(imd->image_fd); |
1065 imd->image_fd = file_data_ref(fd); | |
9 | 1066 |
1067 image_update_title(imd); | |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
1068 image_state_set(imd, IMAGE_STATE_IMAGE); |
888 | 1069 |
1070 if (imd->auto_refresh && imd->image_fd) | |
1071 file_data_register_real_time_monitor(imd->image_fd); | |
9 | 1072 } |
1073 | |
1074 /* load a new image */ | |
1075 | |
138 | 1076 void image_change_fd(ImageWindow *imd, FileData *fd, gdouble zoom) |
9 | 1077 { |
138 | 1078 if (imd->image_fd == fd) return; |
9 | 1079 |
138 | 1080 image_change_real(imd, fd, NULL, NULL, zoom); |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1081 } |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1082 |
1431 | 1083 gboolean image_get_image_size(ImageWindow *imd, gint *width, gint *height) |
530
1d67ef911fa8
fixed connected zoom and scroll that didn't work in some cases
nadvornik
parents:
513
diff
changeset
|
1084 { |
1d67ef911fa8
fixed connected zoom and scroll that didn't work in some cases
nadvornik
parents:
513
diff
changeset
|
1085 return pixbuf_renderer_get_image_size(PIXBUF_RENDERER(imd->pr), width, height); |
1d67ef911fa8
fixed connected zoom and scroll that didn't work in some cases
nadvornik
parents:
513
diff
changeset
|
1086 } |
1d67ef911fa8
fixed connected zoom and scroll that didn't work in some cases
nadvornik
parents:
513
diff
changeset
|
1087 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1088 GdkPixbuf *image_get_pixbuf(ImageWindow *imd) |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1089 { |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1090 return pixbuf_renderer_get_pixbuf((PixbufRenderer *)imd->pr); |
9 | 1091 } |
1092 | |
1431 | 1093 void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboolean lazy) |
9 | 1094 { |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1095 |
1639 | 1096 /* read_exif and similar functions can actually notice that the file has changed and trigger |
1097 a notification that removes the pixbuf from cache and unrefs it. Therefore we must ref it | |
1098 here before it is taken over by the renderer. */ | |
1251 | 1099 if (pixbuf) g_object_ref(pixbuf); |
1247 | 1100 |
1288 | 1101 if (imd->image_fd) |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1102 { |
1288 | 1103 if (imd->image_fd->user_orientation) |
437
f707aa712b1f
Fix the case "orientation from FileData, color profile from exif".
zas_
parents:
434
diff
changeset
|
1104 { |
1288 | 1105 imd->orientation = imd->image_fd->user_orientation; |
1106 } | |
1107 else if (options->image.exif_rotate_enable) | |
1108 { | |
1567
c776b1310ca6
added an option to write image orientation to the metadata
nadvornik
parents:
1566
diff
changeset
|
1109 imd->orientation = metadata_read_int(imd->image_fd, ORIENTATION_KEY, EXIF_ORIENTATION_TOP_LEFT); |
439 | 1110 imd->image_fd->exif_orientation = imd->orientation; |
437
f707aa712b1f
Fix the case "orientation from FileData, color profile from exif".
zas_
parents:
434
diff
changeset
|
1111 } |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1112 } |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1113 |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1114 pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, NULL, NULL, FALSE); |
442 | 1115 if (imd->cm) |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1116 { |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1117 color_man_free(imd->cm); |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1118 imd->cm = NULL; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1119 } |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1120 |
1045
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1121 if (lazy) |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1122 { |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1123 pixbuf_renderer_set_pixbuf_lazy((PixbufRenderer *)imd->pr, pixbuf, zoom, imd->orientation); |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1124 } |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1125 else |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1126 { |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1127 pixbuf_renderer_set_pixbuf((PixbufRenderer *)imd->pr, pixbuf, zoom); |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1128 pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation); |
0ab0deb0cfcc
added possibility to redraw only the parts of image that are already
nadvornik
parents:
1043
diff
changeset
|
1129 } |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1130 |
1251 | 1131 if (pixbuf) g_object_unref(pixbuf); |
1247 | 1132 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1133 if (imd->color_profile_enable) |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1134 { |
1357
4ca837d74999
image_post_process_color(): remove exif parameter, just extract it when needed.
zas_
parents:
1356
diff
changeset
|
1135 image_post_process_color(imd, 0, FALSE); /* TODO: error handling */ |
1288 | 1136 } |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1137 |
442 | 1138 if (imd->cm || imd->desaturate) |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1139 pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, image_post_process_tile_color_cb, (gpointer) imd, (imd->cm != NULL) ); |
442 | 1140 |
117
0c2e1f0a001b
Wed Nov 29 14:28:30 2006 John Ellis <johne@verizon.net>
gqview
parents:
116
diff
changeset
|
1141 image_state_set(imd, IMAGE_STATE_IMAGE); |
9 | 1142 } |
1143 | |
1144 void image_change_from_collection(ImageWindow *imd, CollectionData *cd, CollectInfo *info, gdouble zoom) | |
1145 { | |
1146 if (!cd || !info || !g_list_find(cd->list, info)) return; | |
1147 | |
138 | 1148 image_change_real(imd, info->fd, cd, info, zoom); |
9 | 1149 } |
1150 | |
1151 CollectionData *image_get_collection(ImageWindow *imd, CollectInfo **info) | |
1152 { | |
1153 if (collection_to_number(imd->collection) >= 0) | |
1154 { | |
1155 if (g_list_find(imd->collection->list, imd->collection_info) != NULL) | |
1156 { | |
1157 if (info) *info = imd->collection_info; | |
1158 } | |
1159 else | |
1160 { | |
1161 if (info) *info = NULL; | |
1162 } | |
1163 return imd->collection; | |
1164 } | |
1165 | |
1166 if (info) *info = NULL; | |
1167 return NULL; | |
1168 } | |
1169 | |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1170 static void image_loader_sync_read_ahead_data(ImageLoader *il, gpointer old_data, gpointer data) |
9 | 1171 { |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1172 if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_read_ahead_error_cb, old_data)) |
1338 | 1173 g_signal_connect(G_OBJECT(il), "error", (GCallback)image_read_ahead_error_cb, data); |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1174 |
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1175 if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_read_ahead_done_cb, old_data)) |
1338 | 1176 g_signal_connect(G_OBJECT(il), "done", (GCallback)image_read_ahead_done_cb, data); |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1177 } |
9 | 1178 |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1179 static void image_loader_sync_data(ImageLoader *il, gpointer old_data, gpointer data) |
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1180 { |
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1181 if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_load_area_cb, old_data)) |
1338 | 1182 g_signal_connect(G_OBJECT(il), "area_ready", (GCallback)image_load_area_cb, data); |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1183 |
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1184 if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_load_error_cb, old_data)) |
1338 | 1185 g_signal_connect(G_OBJECT(il), "error", (GCallback)image_load_error_cb, data); |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1186 |
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1187 if (g_signal_handlers_disconnect_by_func(G_OBJECT(il), (GCallback)image_load_done_cb, old_data)) |
1338 | 1188 g_signal_connect(G_OBJECT(il), "done", (GCallback)image_load_done_cb, data); |
1 | 1189 } |
1190 | |
9 | 1191 /* this is more like a move function |
24
104e34f9ab1f
Wed Mar 23 00:22:28 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
1192 * it moves most data from source to imd |
9 | 1193 */ |
1194 void image_change_from_image(ImageWindow *imd, ImageWindow *source) | |
1195 { | |
1196 if (imd == source) return; | |
1197 | |
1198 imd->unknown = source->unknown; | |
1199 | |
1200 imd->collection = source->collection; | |
1201 imd->collection_info = source->collection_info; | |
1202 | |
1203 image_loader_free(imd->il); | |
1204 imd->il = NULL; | |
1205 | |
846 | 1206 image_set_fd(imd, image_get_fd(source)); |
1207 | |
1208 | |
24
104e34f9ab1f
Wed Mar 23 00:22:28 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
1209 if (source->il) |
9 | 1210 { |
863
8ddd00cc8b69
fixed crash in entering fullscreen during loading
nadvornik
parents:
848
diff
changeset
|
1211 imd->il = source->il; |
8ddd00cc8b69
fixed crash in entering fullscreen during loading
nadvornik
parents:
848
diff
changeset
|
1212 source->il = NULL; |
9 | 1213 |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1214 image_loader_sync_data(imd->il, source, imd); |
9 | 1215 |
1216 imd->delay_alter_type = source->delay_alter_type; | |
1217 source->delay_alter_type = ALTER_NONE; | |
1218 } | |
1219 | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1220 imd->color_profile_enable = source->color_profile_enable; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1221 imd->color_profile_input = source->color_profile_input; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1222 imd->color_profile_use_image = source->color_profile_use_image; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1223 color_man_free((ColorMan *)imd->cm); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1224 imd->cm = NULL; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1225 if (source->cm) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1226 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1227 ColorMan *cm; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1228 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1229 imd->cm = source->cm; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1230 source->cm = NULL; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1231 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1232 cm = (ColorMan *)imd->cm; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1233 cm->imd = imd; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1234 cm->func_done_data = imd; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1235 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1236 |
9 | 1237 image_loader_free(imd->read_ahead_il); |
1238 imd->read_ahead_il = source->read_ahead_il; | |
1239 source->read_ahead_il = NULL; | |
1012
fe82830ab8fd
converted image loader to a GObject and use signals for notification
nadvornik
parents:
1000
diff
changeset
|
1240 if (imd->read_ahead_il) image_loader_sync_read_ahead_data(imd->read_ahead_il, source, imd); |
9 | 1241 |
138 | 1242 file_data_unref(imd->read_ahead_fd); |
1243 imd->read_ahead_fd = source->read_ahead_fd; | |
1244 source->read_ahead_fd = NULL; | |
9 | 1245 |
1246 imd->completed = source->completed; | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1247 imd->state = source->state; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1248 source->state = IMAGE_STATE_NONE; |
442 | 1249 |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1250 imd->orientation = source->orientation; |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1251 imd->desaturate = source->desaturate; |
9 | 1252 |
24
104e34f9ab1f
Wed Mar 23 00:22:28 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
1253 pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr)); |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1254 |
442 | 1255 if (imd->cm || imd->desaturate) |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1256 pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, image_post_process_tile_color_cb, (gpointer) imd, (imd->cm != NULL) ); |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1257 else |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1258 pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, NULL, NULL, TRUE); |
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1259 |
9 | 1260 } |
1261 | |
1262 /* manipulation */ | |
1263 | |
1264 void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height) | |
1265 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1266 pixbuf_renderer_area_changed((PixbufRenderer *)imd->pr, x, y, width, height); |
9 | 1267 } |
1268 | |
1269 void image_reload(ImageWindow *imd) | |
1270 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1271 if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return; |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1272 |
1431 | 1273 image_change_complete(imd, image_zoom_get(imd)); |
9 | 1274 } |
1275 | |
1276 void image_scroll(ImageWindow *imd, gint x, gint y) | |
1277 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1278 pixbuf_renderer_scroll((PixbufRenderer *)imd->pr, x, y); |
9 | 1279 } |
1280 | |
13
ef790149ae21
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
12
diff
changeset
|
1281 void image_scroll_to_point(ImageWindow *imd, gint x, gint y, |
ef790149ae21
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
12
diff
changeset
|
1282 gdouble x_align, gdouble y_align) |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1283 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1284 pixbuf_renderer_scroll_to_point((PixbufRenderer *)imd->pr, x, y, x_align, y_align); |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1285 } |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1286 |
131 | 1287 void image_get_scroll_center(ImageWindow *imd, gdouble *x, gdouble *y) |
1288 { | |
1289 pixbuf_renderer_get_scroll_center(PIXBUF_RENDERER(imd->pr), x, y); | |
1290 } | |
1291 | |
1292 void image_set_scroll_center(ImageWindow *imd, gdouble x, gdouble y) | |
1293 { | |
1294 pixbuf_renderer_set_scroll_center(PIXBUF_RENDERER(imd->pr), x, y); | |
1295 } | |
1296 | |
9 | 1297 void image_zoom_adjust(ImageWindow *imd, gdouble increment) |
1298 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1299 pixbuf_renderer_zoom_adjust((PixbufRenderer *)imd->pr, increment); |
9 | 1300 } |
1301 | |
1302 void image_zoom_adjust_at_point(ImageWindow *imd, gdouble increment, gint x, gint y) | |
1303 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1304 pixbuf_renderer_zoom_adjust_at_point((PixbufRenderer *)imd->pr, increment, x, y); |
9 | 1305 } |
1306 | |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1307 void image_zoom_set_limits(ImageWindow *imd, gdouble min, gdouble max) |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1308 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1309 pixbuf_renderer_zoom_set_limits((PixbufRenderer *)imd->pr, min, max); |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1310 } |
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1311 |
9 | 1312 void image_zoom_set(ImageWindow *imd, gdouble zoom) |
1313 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1314 pixbuf_renderer_zoom_set((PixbufRenderer *)imd->pr, zoom); |
9 | 1315 } |
1316 | |
1269 | 1317 void image_zoom_set_fill_geometry(ImageWindow *imd, gboolean vertical) |
9 | 1318 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1319 PixbufRenderer *pr; |
9 | 1320 gdouble zoom; |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1321 gint width, height; |
9 | 1322 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1323 pr = (PixbufRenderer *)imd->pr; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1324 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1325 if (!pixbuf_renderer_get_pixbuf(pr) || |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1326 !pixbuf_renderer_get_image_size(pr, &width, &height)) return; |
9 | 1327 |
1328 if (vertical) | |
1329 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1330 zoom = (gdouble)pr->window_height / height; |
9 | 1331 } |
1332 else | |
1333 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1334 zoom = (gdouble)pr->window_width / width; |
9 | 1335 } |
1336 | |
1337 if (zoom < 1.0) | |
1338 { | |
1339 zoom = 0.0 - 1.0 / zoom; | |
1 | 1340 } |
9 | 1341 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1342 pixbuf_renderer_zoom_set(pr, zoom); |
9 | 1343 } |
1344 | |
1345 gdouble image_zoom_get(ImageWindow *imd) | |
1346 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1347 return pixbuf_renderer_zoom_get((PixbufRenderer *)imd->pr); |
9 | 1348 } |
1349 | |
1350 gdouble image_zoom_get_real(ImageWindow *imd) | |
1351 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1352 return pixbuf_renderer_zoom_get_scale((PixbufRenderer *)imd->pr); |
9 | 1353 } |
1354 | |
1355 gchar *image_zoom_get_as_text(ImageWindow *imd) | |
1356 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1357 gdouble zoom; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1358 gdouble scale; |
9 | 1359 gdouble l = 1.0; |
1360 gdouble r = 1.0; | |
1361 gint pl = 0; | |
1362 gint pr = 0; | |
1363 gchar *approx = " "; | |
1364 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1365 zoom = image_zoom_get(imd); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1366 scale = image_zoom_get_real(imd); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1367 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1368 if (zoom > 0.0) |
1 | 1369 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1370 l = zoom; |
9 | 1371 } |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1372 else if (zoom < 0.0) |
9 | 1373 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1374 r = 0.0 - zoom; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1375 } |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1376 else if (zoom == 0.0 && scale != 0.0) |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1377 { |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1378 if (scale >= 1.0) |
9 | 1379 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1380 l = scale; |
9 | 1381 } |
1382 else | |
1383 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1384 r = 1.0 / scale; |
9 | 1385 } |
415 | 1386 approx = "~"; |
9 | 1387 } |
1388 | |
1389 if (rint(l) != l) pl = 1; | |
1390 if (rint(r) != r) pr = 1; | |
1391 | |
1392 return g_strdup_printf("%.*f :%s%.*f", pl, l, approx, pr, r); | |
1393 } | |
1394 | |
885
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1395 gdouble image_zoom_get_default(ImageWindow *imd) |
9 | 1396 { |
885
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1397 gdouble zoom = 1.0; |
9 | 1398 |
885
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1399 switch (options->image.zoom_mode) |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1400 { |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1401 case ZOOM_RESET_ORIGINAL: |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1402 break; |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1403 case ZOOM_RESET_FIT_WINDOW: |
9 | 1404 zoom = 0.0; |
885
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1405 break; |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1406 case ZOOM_RESET_NONE: |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1407 if (imd) zoom = image_zoom_get(imd); |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1408 break; |
ad420f2eb789
Use a specific enum for image.zoom_mode values (ZoomMode) and
zas_
parents:
868
diff
changeset
|
1409 } |
1 | 1410 |
1411 return zoom; | |
1412 } | |
1413 | |
9 | 1414 /* read ahead */ |
1415 | |
138 | 1416 void image_prebuffer_set(ImageWindow *imd, FileData *fd) |
9 | 1417 { |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1418 if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return; |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1419 |
138 | 1420 if (fd) |
9 | 1421 { |
846 | 1422 if (!file_cache_get(image_get_cache(), fd)) |
1423 { | |
1424 image_read_ahead_set(imd, fd); | |
1425 } | |
9 | 1426 } |
1427 else | |
1428 { | |
1429 image_read_ahead_cancel(imd); | |
1430 } | |
1431 } | |
1432 | |
888 | 1433 static void image_notify_cb(FileData *fd, NotifyType type, gpointer data) |
9 | 1434 { |
1435 ImageWindow *imd = data; | |
442 | 1436 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1437 if (!imd || !image_get_pixbuf(imd) || |
995 | 1438 /* imd->il || */ /* loading in progress - do not check - it should start from the beginning anyway */ |
891 | 1439 !imd->image_fd || /* nothing to reload */ |
903
c93823609f15
periodic testing of changed files can be now disabled
nadvornik
parents:
891
diff
changeset
|
1440 imd->state == IMAGE_STATE_NONE /* loading not started, no need to reload */ |
c93823609f15
periodic testing of changed files can be now disabled
nadvornik
parents:
891
diff
changeset
|
1441 ) return; |
9 | 1442 |
1432 | 1443 if ((type & (NOTIFY_REREAD | NOTIFY_CHANGE)) && fd == imd->image_fd) |
9 | 1444 { |
1701 | 1445 if ((type & NOTIFY_CHANGE) && fd->change && fd->change->type == FILEDATA_CHANGE_DELETE) |
1446 return; /* keep the image displayed, it will be replaced by the next image from the list soon */ | |
1498 | 1447 DEBUG_1("Notify image: %s %04x", fd->path, type); |
9 | 1448 image_reload(imd); |
1449 } | |
1450 } | |
1451 | |
888 | 1452 void image_auto_refresh_enable(ImageWindow *imd, gboolean enable) |
9 | 1453 { |
888 | 1454 if (!enable && imd->auto_refresh && imd->image_fd) |
1455 file_data_unregister_real_time_monitor(imd->image_fd); | |
9 | 1456 |
888 | 1457 if (enable && !imd->auto_refresh && imd->image_fd) |
1458 file_data_register_real_time_monitor(imd->image_fd); | |
9 | 1459 |
888 | 1460 imd->auto_refresh = enable; |
9 | 1461 } |
1462 | |
1431 | 1463 void image_top_window_set_sync(ImageWindow *imd, gboolean allow_sync) |
9 | 1464 { |
1465 imd->top_window_sync = allow_sync; | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1466 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1467 g_object_set(G_OBJECT(imd->pr), "window_fit", allow_sync, NULL); |
9 | 1468 } |
1469 | |
1470 void image_background_set_color(ImageWindow *imd, GdkColor *color) | |
1471 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1472 pixbuf_renderer_set_color((PixbufRenderer *)imd->pr, color); |
9 | 1473 } |
1474 | |
1626
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1475 void image_background_set_color_from_options(ImageWindow *imd, gboolean fullscreen) |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1476 { |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1477 GdkColor *color = NULL; |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1478 |
1644
b8235f919d6b
the options for custom border color were made independent
nadvornik
parents:
1639
diff
changeset
|
1479 if ((options->image.use_custom_border_color && !fullscreen) || |
b8235f919d6b
the options for custom border color were made independent
nadvornik
parents:
1639
diff
changeset
|
1480 (options->image.use_custom_border_color_in_fullscreen && fullscreen)) |
1626
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1481 { |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1482 color = &options->image.border_color; |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1483 } |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1484 |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1485 image_background_set_color(imd, color); |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1486 } |
1d7941c147be
Add an option to Image preferences to restrict custom border to fullscreen mode only. Bug 2798062.
zas_
parents:
1567
diff
changeset
|
1487 |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1488 void image_color_profile_set(ImageWindow *imd, |
1548 | 1489 gint input_type, |
1431 | 1490 gboolean use_image) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1491 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1492 if (!imd) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1493 |
1548 | 1494 if (input_type < 0 || input_type >= COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1495 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1496 return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1497 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1498 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1499 imd->color_profile_input = input_type; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1500 imd->color_profile_use_image = use_image; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1501 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1502 |
1431 | 1503 gboolean image_color_profile_get(ImageWindow *imd, |
1548 | 1504 gint *input_type, |
1431 | 1505 gboolean *use_image) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1506 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1507 if (!imd) return FALSE; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1508 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1509 if (input_type) *input_type = imd->color_profile_input; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1510 if (use_image) *use_image = imd->color_profile_use_image; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1511 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1512 return TRUE; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1513 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1514 |
1431 | 1515 void image_color_profile_set_use(ImageWindow *imd, gboolean enable) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1516 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1517 if (!imd) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1518 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1519 if (imd->color_profile_enable == enable) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1520 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1521 imd->color_profile_enable = enable; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1522 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1523 |
1431 | 1524 gboolean image_color_profile_get_use(ImageWindow *imd) |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1525 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1526 if (!imd) return FALSE; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1527 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1528 return imd->color_profile_enable; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1529 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1530 |
1549 | 1531 gboolean image_color_profile_get_status(ImageWindow *imd, gchar **image_profile, gchar **screen_profile) |
426
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
1532 { |
1549 | 1533 ColorMan *cm; |
1534 if (!imd) return FALSE; | |
1535 | |
1536 cm = imd->cm; | |
1537 if (!cm) return FALSE; | |
1538 return color_man_get_status(cm, image_profile, screen_profile); | |
426
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
1539 |
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
1540 } |
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
1541 |
1431 | 1542 void image_set_delay_flip(ImageWindow *imd, gboolean delay) |
9 | 1543 { |
1544 if (!imd || | |
1545 imd->delay_flip == delay) return; | |
1546 | |
1547 imd->delay_flip = delay; | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1548 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1549 g_object_set(G_OBJECT(imd->pr), "delay_flip", delay, NULL); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1550 |
9 | 1551 if (!imd->delay_flip && imd->il) |
1552 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1553 PixbufRenderer *pr; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1554 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1555 pr = PIXBUF_RENDERER(imd->pr); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1556 if (pr->pixbuf) g_object_unref(pr->pixbuf); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1557 pr->pixbuf = NULL; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1558 |
9 | 1559 image_load_pixbuf_ready(imd); |
1560 } | |
1561 } | |
1562 | |
1431 | 1563 void image_to_root_window(ImageWindow *imd, gboolean scaled) |
9 | 1564 { |
1565 GdkScreen *screen; | |
3 | 1566 GdkWindow *rootwindow; |
1567 GdkPixmap *pixmap; | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1568 GdkPixbuf *pixbuf; |
9 | 1569 GdkPixbuf *pb; |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1570 gint width, height; |
9 | 1571 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1572 if (!imd) return; |
9 | 1573 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1574 pixbuf = image_get_pixbuf(imd); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1575 if (!pixbuf) return; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1576 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1577 screen = gtk_widget_get_screen(imd->widget); |
9 | 1578 rootwindow = gdk_screen_get_root_window(screen); |
1579 if (gdk_drawable_get_visual(rootwindow) != gdk_visual_get_system()) return; | |
3 | 1580 |
1581 if (scaled) | |
1582 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1583 width = gdk_screen_width(); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1584 height = gdk_screen_height(); |
3 | 1585 } |
1586 else | |
1587 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1588 pixbuf_renderer_get_scaled_size((PixbufRenderer *)imd->pr, &width, &height); |
3 | 1589 } |
1590 | |
334 | 1591 pb = gdk_pixbuf_scale_simple(pixbuf, width, height, (GdkInterpType)options->image.zoom_quality); |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1592 |
512
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
1593 gdk_pixbuf_render_pixmap_and_mask(pb, &pixmap, NULL, 128); |
3 | 1594 gdk_window_set_back_pixmap(rootwindow, pixmap, FALSE); |
1595 gdk_window_clear(rootwindow); | |
9 | 1596 g_object_unref(pb); |
1597 g_object_unref(pixmap); | |
3 | 1598 |
1599 gdk_flush(); | |
1600 } | |
1601 | |
127 | 1602 void image_select(ImageWindow *imd, gboolean select) |
1603 { | |
1359 | 1604 if (!imd->has_frame) return; |
1605 | |
1606 if (select) | |
127 | 1607 { |
1359 | 1608 gtk_widget_set_state(imd->widget, GTK_STATE_SELECTED); |
1609 gtk_widget_set_state(imd->pr, GTK_STATE_NORMAL); /* do not propagate */ | |
127 | 1610 } |
1359 | 1611 else |
1612 gtk_widget_set_state(imd->widget, GTK_STATE_NORMAL); | |
127 | 1613 } |
1614 | |
174 | 1615 void image_set_selectable(ImageWindow *imd, gboolean selectable) |
1616 { | |
1359 | 1617 if (!imd->has_frame) return; |
1618 | |
1619 gtk_frame_set_shadow_type(GTK_FRAME(imd->frame), GTK_SHADOW_NONE); | |
1620 gtk_container_set_border_width(GTK_CONTAINER(imd->frame), selectable ? 4 : 0); | |
174 | 1621 } |
1622 | |
1482 | 1623 void image_grab_focus(ImageWindow *imd) |
1624 { | |
1625 if (imd->has_frame) | |
1626 { | |
1627 gtk_widget_grab_focus(imd->frame); | |
1628 } | |
1629 else | |
1630 { | |
1631 gtk_widget_grab_focus(imd->widget); | |
1632 } | |
1633 } | |
1634 | |
1635 | |
9 | 1636 /* |
1637 *------------------------------------------------------------------- | |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1638 * prefs sync |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1639 *------------------------------------------------------------------- |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1640 */ |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1641 |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1642 static void image_options_set(ImageWindow *imd) |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1643 { |
334 | 1644 g_object_set(G_OBJECT(imd->pr), "zoom_quality", options->image.zoom_quality, |
1645 "zoom_2pass", options->image.zoom_2pass, | |
1646 "zoom_expand", options->image.zoom_to_fit_allow_expand, | |
1647 "dither_quality", options->image.dither_quality, | |
1648 "scroll_reset", options->image.scroll_reset_method, | |
1649 "cache_display", options->image.tile_cache_max, | |
1650 "window_fit", (imd->top_window_sync && options->image.fit_window_to_image), | |
1651 "window_limit", options->image.limit_window_size, | |
1652 "window_limit_value", options->image.max_window_size, | |
1653 "autofit_limit", options->image.limit_autofit_size, | |
1654 "autofit_limit_value", options->image.max_autofit_size, | |
209
ad78ad18523a
configurable frame around image - geeqie_autofit_maxsize.patch by Laurent MONIN
nadvornik
parents:
208
diff
changeset
|
1655 |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1656 NULL); |
27
9c24765c2d3a
Sat Apr 2 17:28:16 2005 John Ellis <johne@verizon.net>
gqview
parents:
26
diff
changeset
|
1657 |
9c24765c2d3a
Sat Apr 2 17:28:16 2005 John Ellis <johne@verizon.net>
gqview
parents:
26
diff
changeset
|
1658 pixbuf_renderer_set_parent((PixbufRenderer *)imd->pr, (GtkWindow *)imd->top_window); |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1659 } |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1660 |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1661 void image_options_sync(void) |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1662 { |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1663 GList *work; |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1664 |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1665 work = image_list; |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1666 while (work) |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1667 { |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1668 ImageWindow *imd; |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1669 |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1670 imd = work->data; |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1671 work = work->next; |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1672 |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1673 image_options_set(imd); |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1674 } |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1675 } |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1676 |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1677 /* |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1678 *------------------------------------------------------------------- |
9 | 1679 * init / destroy |
1680 *------------------------------------------------------------------- | |
1681 */ | |
1682 | |
1683 static void image_free(ImageWindow *imd) | |
1684 { | |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1685 image_list = g_list_remove(image_list, imd); |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1686 |
888 | 1687 if (imd->auto_refresh && imd->image_fd) |
1688 file_data_unregister_real_time_monitor(imd->image_fd); | |
1689 | |
1690 file_data_unregister_notify_func(image_notify_cb, imd); | |
1691 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1692 image_reset(imd); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1693 |
9 | 1694 image_read_ahead_cancel(imd); |
1695 | |
138 | 1696 file_data_unref(imd->image_fd); |
9 | 1697 g_free(imd->title); |
1698 g_free(imd->title_right); | |
1699 g_free(imd); | |
1700 } | |
1701 | |
1702 static void image_destroy_cb(GtkObject *widget, gpointer data) | |
1703 { | |
1704 ImageWindow *imd = data; | |
1705 image_free(imd); | |
1706 } | |
1707 | |
512
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
1708 gboolean selectable_frame_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data) |
151 | 1709 { |
1710 gtk_paint_flat_box(widget->style, | |
442 | 1711 widget->window, |
1712 widget->state, | |
512
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
1713 (GTK_FRAME(widget))->shadow_type, |
442 | 1714 NULL, |
1715 widget, | |
1716 NULL, | |
1717 widget->allocation.x + 3, widget->allocation.y + 3, | |
1718 widget->allocation.width - 6, widget->allocation.height - 6); | |
1719 | |
1720 | |
151 | 1721 return FALSE; |
1722 } | |
1723 | |
1724 | |
175 | 1725 void image_set_frame(ImageWindow *imd, gboolean frame) |
1726 { | |
1727 frame = !!frame; | |
442 | 1728 |
175 | 1729 if (frame == imd->has_frame) return; |
442 | 1730 |
175 | 1731 gtk_widget_hide(imd->pr); |
442 | 1732 |
175 | 1733 if (frame) |
1734 { | |
1735 imd->frame = gtk_frame_new(NULL); | |
1043 | 1736 #if GTK_CHECK_VERSION(2,12,0) |
1358 | 1737 g_object_ref(imd->pr); |
1043 | 1738 #else |
1358 | 1739 gtk_widget_ref(imd->pr); |
1043 | 1740 #endif |
175 | 1741 if (imd->has_frame != -1) gtk_container_remove(GTK_CONTAINER(imd->widget), imd->pr); |
1742 gtk_container_add(GTK_CONTAINER(imd->frame), imd->pr); | |
1043 | 1743 |
1744 #if GTK_CHECK_VERSION(2,12,0) | |
1358 | 1745 g_object_unref(imd->pr); |
1043 | 1746 #else |
1358 | 1747 gtk_widget_unref(imd->pr); |
1043 | 1748 #endif |
512
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
1749 g_signal_connect(G_OBJECT(imd->frame), "expose_event", |
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
1750 G_CALLBACK(selectable_frame_expose_cb), NULL); |
175 | 1751 |
1752 GTK_WIDGET_SET_FLAGS(imd->frame, GTK_CAN_FOCUS); | |
1753 g_signal_connect(G_OBJECT(imd->frame), "focus_in_event", | |
1754 G_CALLBACK(image_focus_in_cb), imd); | |
1755 g_signal_connect(G_OBJECT(imd->frame), "focus_out_event", | |
1756 G_CALLBACK(image_focus_out_cb), imd); | |
1757 | |
1758 g_signal_connect_after(G_OBJECT(imd->frame), "expose_event", | |
1759 G_CALLBACK(image_focus_expose), imd); | |
1760 | |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
1761 #if GTK_CHECK_VERSION(2,14,0) |
1358 | 1762 gtk_box_pack_start(GTK_BOX(imd->widget), imd->frame, TRUE, TRUE, 0); |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
1763 #else |
1358 | 1764 gtk_box_pack_start_defaults(GTK_BOX(imd->widget), imd->frame); |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
1765 #endif |
1358 | 1766 gtk_widget_show(imd->frame); |
175 | 1767 } |
1768 else | |
1769 { | |
1043 | 1770 #if GTK_CHECK_VERSION(2,12,0) |
1771 g_object_ref(imd->pr); | |
1772 #else | |
175 | 1773 gtk_widget_ref(imd->pr); |
1043 | 1774 #endif |
442 | 1775 if (imd->frame) |
175 | 1776 { |
1777 gtk_container_remove(GTK_CONTAINER(imd->frame), imd->pr); | |
1778 gtk_widget_destroy(imd->frame); | |
1779 imd->frame = NULL; | |
1780 } | |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
1781 #if GTK_CHECK_VERSION(2,14,0) |
1358 | 1782 gtk_box_pack_start(GTK_BOX(imd->widget), imd->pr, TRUE, TRUE, 0); |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
1783 #else |
175 | 1784 gtk_box_pack_start_defaults(GTK_BOX(imd->widget), imd->pr); |
1182
6ae6d77a1f15
Fix up deprecated function and not a prototype warnings.
zas_
parents:
1055
diff
changeset
|
1785 #endif |
1043 | 1786 |
1787 #if GTK_CHECK_VERSION(2,12,0) | |
1358 | 1788 g_object_unref(imd->pr); |
1043 | 1789 #else |
1358 | 1790 gtk_widget_unref(imd->pr); |
1043 | 1791 #endif |
175 | 1792 } |
1793 | |
1794 gtk_widget_show(imd->pr); | |
442 | 1795 |
175 | 1796 imd->has_frame = frame; |
1797 } | |
1798 | |
1431 | 1799 ImageWindow *image_new(gboolean frame) |
9 | 1800 { |
1801 ImageWindow *imd; | |
1802 | |
1803 imd = g_new0(ImageWindow, 1); | |
12
147f4c4b9025
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
1804 |
9 | 1805 imd->unknown = TRUE; |
175 | 1806 imd->has_frame = -1; /* not initialized; for image_set_frame */ |
9 | 1807 imd->delay_alter_type = ALTER_NONE; |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
109
diff
changeset
|
1808 imd->state = IMAGE_STATE_NONE; |
426
9fe0ca1b5263
show the AdobeRGB profile in the menu, indicate input profile from image
nadvornik
parents:
424
diff
changeset
|
1809 imd->color_profile_from_image = COLOR_PROFILE_NONE; |
398
c4080362d619
image post-processing (rotation and color management) moved to
nadvornik
parents:
386
diff
changeset
|
1810 imd->orientation = 1; |
9 | 1811 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1812 imd->pr = GTK_WIDGET(pixbuf_renderer_new()); |
9 | 1813 |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1814 image_options_set(imd); |
9 | 1815 |
175 | 1816 imd->widget = gtk_vbox_new(0, 0); |
151 | 1817 |
175 | 1818 image_set_frame(imd, frame); |
9 | 1819 |
175 | 1820 image_set_selectable(imd, 0); |
9 | 1821 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1822 g_signal_connect(G_OBJECT(imd->pr), "clicked", |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1823 G_CALLBACK(image_click_cb), imd); |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1824 g_signal_connect(G_OBJECT(imd->pr), "scroll_notify", |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1825 G_CALLBACK(image_scroll_notify_cb), imd); |
9 | 1826 |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1827 g_signal_connect(G_OBJECT(imd->pr), "scroll_event", |
9 | 1828 G_CALLBACK(image_scroll_cb), imd); |
1829 | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
14
diff
changeset
|
1830 g_signal_connect(G_OBJECT(imd->pr), "destroy", |
9 | 1831 G_CALLBACK(image_destroy_cb), imd); |
1832 | |
25
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
1833 g_signal_connect(G_OBJECT(imd->pr), "zoom", |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
1834 G_CALLBACK(image_zoom_cb), imd); |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
1835 g_signal_connect(G_OBJECT(imd->pr), "render_complete", |
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
1836 G_CALLBACK(image_render_complete_cb), imd); |
128
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1837 g_signal_connect(G_OBJECT(imd->pr), "drag", |
98e2632b5d3d
improved connected scroll and active image switching
nadvornik
parents:
127
diff
changeset
|
1838 G_CALLBACK(image_drag_cb), imd); |
25
0c3b353b666e
Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
gqview
parents:
24
diff
changeset
|
1839 |
888 | 1840 file_data_register_notify_func(image_notify_cb, imd, NOTIFY_PRIORITY_LOW); |
1841 | |
26
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1842 image_list = g_list_append(image_list, imd); |
acd9885ebd78
Mon Mar 28 20:23:34 2005 John Ellis <johne@verizon.net>
gqview
parents:
25
diff
changeset
|
1843 |
9 | 1844 return imd; |
1845 } | |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1045
diff
changeset
|
1846 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |