annotate src/image.c @ 9:d907d608745f

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:13:35 +0000
parents e149abcda4eb
children 147f4c4b9025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2 * GQview
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3 * (C) 2004 John Ellis
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
4 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
5 * Author: John Ellis
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
6 *
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
7 * This software is released under the GNU General Public License (GNU GPL).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
8 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
9 * This software comes with no warranty of any kind, use at your own risk!
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
12
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13 #include "gqview.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
14 #include "image.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
15
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
16
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
17 #include "image-load.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
18 #include "collect.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
19 #include "exif.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
20 #include "pixbuf_util.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
21 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
22
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
23 #include <math.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
24
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
25
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
26 #define IMAGE_TILE_SIZE 128
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
27 #define IMAGE_ZOOM_MIN -32.0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
28 #define IMAGE_ZOOM_MAX 32.0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
29
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
30 /* size of the image loader buffer (512 bytes x defined number) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
31 #define IMAGE_LOAD_BUFFER_COUNT 8
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
32
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
33 /* define this so that more bytes are read per idle loop on larger images (> 1MB) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
34 #define IMAGE_THROTTLE_LARGER_IMAGES 1
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
35
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
36 /* throttle factor to increase read bytes by (2 is double, 3 is triple, etc.) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
37 #define IMAGE_THROTTLE_FACTOR 4
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
38
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
39 /* the file size at which throttling take place */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
40 #define IMAGE_THROTTLE_THRESHOLD 1048576
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
41
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
42 /* distance to drag mouse to disable image flip */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
43 #define IMAGE_DRAG_SCROLL_THRESHHOLD 4
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
44
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
45 /* alpha channel checkerboard background (same as gimp) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
46 #define IMAGE_ALPHA_CHECK1 0x00999999
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
47 #define IMAGE_ALPHA_CHECK2 0x00666666
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
48 #define IMAGE_ALPHA_CHECK_SIZE 16
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
49
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
50 #define IMAGE_AUTO_REFRESH_TIME 3000
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
51
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
52 /* when scaling image to below this size, use nearest pixel for scaling
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
53 * (below about 4, the other scale types become slow generating their conversion tables)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
54 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
55 #define IMAGE_MIN_SCALE_SIZE 8
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
56
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
57
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
58 typedef enum {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
59 TILE_RENDER_NONE = 0, /* do nothing */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
60 TILE_RENDER_AREA, /* render an area of the tile */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
61 TILE_RENDER_ALL /* render the whole tile */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
62 } TileRenderType;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
63
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
64 typedef struct _ImageTile ImageTile;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
65 struct _ImageTile
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
66 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
67 GdkPixmap *pixmap; /* off screen buffer */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
68 GdkPixbuf *pixbuf; /* pixbuf area for zooming */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
69 gint x; /* x offset into image */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
70 gint y; /* y offset into image */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
71 gint w; /* width that is visible (may be less if at edge of image) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
72 gint h; /* height '' */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
73
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
74 gint blank;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
75
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
76 /* render_todo: (explanation)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
77 NONE do nothing
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
78 AREA render area of tile, usually only used when loading an image
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
79 note: will jump to an ALL if render_done is not ALL.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
80 ALL render entire tile, if never done before w/ ALL, for expose events *only*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
81 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
82
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
83 TileRenderType render_todo; /* what to do (see above) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
84 TileRenderType render_done; /* highest that has been done before on tile */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
85 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
86
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
87 typedef struct _QueueData QueueData;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
88 struct _QueueData
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
89 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
90 ImageTile *it;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
91 gint x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
92 gint y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
93 gint w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
94 gint h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
95 gint new_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
96 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
97
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
98 typedef struct _CacheData CacheData;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
99 struct _CacheData
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
100 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
101 GdkPixmap *pixmap;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
102 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
103 ImageTile *it;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
104 guint size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
105 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
106
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
107 typedef struct _OverlayData OverlayData;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
108 struct _OverlayData
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
109 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
110 gint id;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
111
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
112 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
113
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
114 gint x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
115 gint y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
116 gint relative; /* x,y coordinates are relative, negative values start bottom right */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
117
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
118 gint visible;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
119 gint always; /* hide temporarily when scrolling */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
120 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
121
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
122
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
123 static void image_queue_clear(ImageWindow *imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
124
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
125 static void image_update_title(ImageWindow *imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
126 static void image_update_util(ImageWindow *imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
127 static void image_complete_util(ImageWindow *imd, gint preload);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
128
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
129 static void image_button_do(ImageWindow *imd, GdkEventButton *bevent);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
130
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
131 static void image_overlay_draw(ImageWindow *imd, gint x, gint y, gint w, gint h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
132 static void image_overlay_queue_all(ImageWindow *imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
133
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
134 static void image_scroller_timer_set(ImageWindow *imd, gint start);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
135
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
136
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
137 static gint util_clip_region(gint x, gint y, gint w, gint h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
138 gint clip_x, gint clip_y, gint clip_w, gint clip_h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
139 gint *rx, gint *ry, gint *rw, gint *rh)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
140 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
141 if (clip_x + clip_w <= x ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
142 clip_x >= x + w ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
143 clip_y + clip_h <= y ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
144 clip_y >= y + h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
145 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
146 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
147 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
148
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
149 *rx = MAX(x, clip_x);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
150 *rw = MIN((x + w), (clip_x + clip_w)) - *rx;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
151
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
152 *ry = MAX(y, clip_y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
153 *rh = MIN((y + h), (clip_y + clip_h)) - *ry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
154
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
155 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
156 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
157
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
158
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
159 /*
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
160 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
161 * tile cache
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
162 *-------------------------------------------------------------------
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
163 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
164
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
165 static gint pixmap_calc_size(GdkPixmap *pixmap)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
166 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
167 gint w, h, d;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
168
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
169 d = gdk_drawable_get_depth(pixmap);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
170 gdk_drawable_get_size(pixmap, &w, &h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
171 return w * h * (d / 8);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
172 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
173
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
174 static void image_tile_cache_remove(ImageWindow *imd, ImageTile *it)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
175 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
176 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
177
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
178 work = imd->tile_cache;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
179 while(work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
180 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
181 CacheData *cd = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
182 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
183
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
184 if (cd->it == it)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
185 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
186 imd->tile_cache = g_list_remove(imd->tile_cache, cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
187 imd->tile_cache_size -= cd->size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
188 g_free(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
189 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
190 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
191 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
192
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
193 static void image_tile_cache_free(ImageWindow *imd, CacheData *cd)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
194 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
195 imd->tile_cache = g_list_remove(imd->tile_cache, cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
196 if (cd->pixmap)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
197 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
198 g_object_unref(cd->it->pixmap);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
199 cd->it->pixmap = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
200 cd->it->render_done = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
201 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
202 if (cd->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
203 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
204 gdk_pixbuf_unref(cd->it->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
205 cd->it->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
206 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
207 imd->tile_cache_size -= cd->size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
208 g_free(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
209 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
210
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
211 static void image_tile_cache_free_space(ImageWindow *imd, gint space, ImageTile *it)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
212 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
213 GList *work = g_list_last(imd->tile_cache);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
214
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
215 while (work && imd->tile_cache_size > 0 && imd->tile_cache_size + space > tile_cache_max * 1048576)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
216 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
217 CacheData *cd = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
218 work = work->prev;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
219 if (cd->it != it) image_tile_cache_free(imd, cd);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
220 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
221 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
222
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
223 static void image_tile_cache_add(ImageWindow *imd, ImageTile *it,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
224 GdkPixmap *pixmap, GdkPixbuf *pixbuf, guint size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
225 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
226 CacheData *cd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
227
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
228 cd = g_new(CacheData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
229 cd->pixmap = pixmap;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
230 cd->pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
231 cd->it = it;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
232 cd->size = size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
233
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
234 imd->tile_cache = g_list_prepend(imd->tile_cache, cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
235
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
236 imd->tile_cache_size += cd->size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
237 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
238
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
239 static void image_tile_prepare(ImageWindow *imd, ImageTile *it)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
240 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
241 if (!it->pixmap)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
242 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
243 GdkPixmap *pixmap;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
244 guint size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
245
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
246 pixmap = gdk_pixmap_new(imd->image->window, imd->tile_width, imd->tile_height, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
247
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
248 size = pixmap_calc_size(pixmap);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
249 image_tile_cache_free_space(imd, size, it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
250
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
251 it->pixmap = pixmap;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
252 image_tile_cache_add(imd, it, pixmap, NULL, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
253 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
254
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
255 if ((imd->zoom != 1.0 || gdk_pixbuf_get_has_alpha(imd->pixbuf)) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
256 !it->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
257 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
258 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
259 guint size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
260
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
261 pixbuf = gdk_pixbuf_new(gdk_pixbuf_get_colorspace(imd->pixbuf),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
262 gdk_pixbuf_get_has_alpha(imd->pixbuf),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
263 gdk_pixbuf_get_bits_per_sample(imd->pixbuf),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
264 imd->tile_width, imd->tile_height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
265
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
266 size = gdk_pixbuf_get_rowstride(pixbuf) * imd->tile_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
267 image_tile_cache_free_space(imd, size, it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
268
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
269 it->pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
270 image_tile_cache_add(imd, it, NULL, pixbuf, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
271 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
272 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
273
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
274 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
275 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
276 * tiles
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
277 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
278 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
279
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
280 static ImageTile *image_tile_new(gint w, gint h)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
281 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
282 ImageTile *it;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
283
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
284 it = g_new0(ImageTile, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
285 it->w = w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
286 it->h = h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
287 it->pixmap = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
288 it->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
289 it->blank = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
290 it->render_todo = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
291 it->render_done = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
292
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
293 return it;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
294 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
295
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
296 static void image_tile_free(ImageTile *it)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
297 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
298 if (!it) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
299
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
300 if (it->pixbuf) gdk_pixbuf_unref(it->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
301 if (it->pixmap) g_object_unref(it->pixmap);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
302
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
303 g_free(it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
304 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
305
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
306 static void image_tile_sync_count(ImageWindow *imd, gint n)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
308 gint l;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
309
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
310 l = g_list_length(imd->tiles);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
311
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
312 if (l == n) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
313
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
314 if (l < n)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
315 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
316 while (l < n)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
317 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
318 imd->tiles = g_list_prepend(imd->tiles, image_tile_new(imd->tile_width, imd->tile_height));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
319 l++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
320 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
322 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
324 /* This should remove from the tail of the GList, but with large images there are many tiles,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
325 * making this significantly faster for those cases.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
326 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
327 while (l > n && imd->tiles)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
328 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
329 ImageTile *it = imd->tiles->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
330 imd->tiles = g_list_remove(imd->tiles, it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
331 image_tile_cache_remove(imd, it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
332 image_tile_free(it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
333 l--;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
334 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
335 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
336 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
337
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
338 static void image_tile_sync(ImageWindow *imd, gint width, gint height, gint blank)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
339 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
340 gint rows;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
341 gint x, y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
342 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
343
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
344 imd->tile_cols = (width + imd->tile_width - 1) / imd->tile_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
345
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
346 rows = (height + imd->tile_height - 1) / imd->tile_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
347
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
348 image_tile_sync_count(imd, imd->tile_cols * rows);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
349
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
350 x = y = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
351 work = imd->tiles;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
352 while(work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
353 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
354 ImageTile *it = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
355 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
356
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
357 it->x = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
358 it->y = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
359 if (x + imd->tile_width > width)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
360 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
361 it->w = width - x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
362 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
363 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
364 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
365 it->w = imd->tile_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
366 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
367 if (y + imd->tile_height > height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
368 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
369 it->h = height - y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
370 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
371 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
372 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
373 it->h = imd->tile_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
374 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
375
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
376 it->blank = blank;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
377 it->render_todo = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
378 it->render_done = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
379
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
380 x += imd->tile_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
381 if (x >= width)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
382 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
383 x = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
384 y += imd->tile_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
385 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
386 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
387
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
388 /* all it's are now useless in queue */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
389 image_queue_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
390 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
391
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
392 static void image_tile_render(ImageWindow *imd, ImageTile *it,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
393 gint x, gint y, gint w, gint h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
394 gint new_data, gint fast)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
395 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
396 gint has_alpha;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
397 gint draw = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
398
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
399 if (it->render_todo == TILE_RENDER_NONE && it->pixmap) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
400
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
401 if (it->render_done != TILE_RENDER_ALL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
402 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
403 x = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
404 y = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
405 w = it->w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
406 h = it->h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
407 if (!fast) it->render_done = TILE_RENDER_ALL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
408 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
409 else if (it->render_todo != TILE_RENDER_AREA)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
410 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
411 if (!fast) it->render_todo = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
412 return;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
413 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
414
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
415 if (!fast) it->render_todo = TILE_RENDER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
416
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
417 if (new_data) it->blank = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
418
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
419 image_tile_prepare(imd, it);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
420 has_alpha = gdk_pixbuf_get_has_alpha(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
421
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
422 /* FIXME checker colors for alpha should be configurable,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
423 * also should be drawn for blank = TRUE
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
424 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
425
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
426 if (it->blank)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
427 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
428 /* no data, do fast rect fill */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
429 gdk_draw_rectangle(it->pixmap, imd->image->style->black_gc, TRUE,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
430 0, 0, it->w, it->h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
431 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
432 else if (imd->zoom == 1.0 || imd->scale == 1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
433 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
434 if (has_alpha)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
435 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
436 gdk_pixbuf_composite_color(imd->pixbuf, it->pixbuf, x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
437 (double) 0.0 - it->x,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
438 (double) 0.0 - it->y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
439 1.0, 1.0, GDK_INTERP_NEAREST,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
440 255, it->x + x, it->y + y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
441 IMAGE_ALPHA_CHECK_SIZE, IMAGE_ALPHA_CHECK1, IMAGE_ALPHA_CHECK2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
442 draw = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
443 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
444 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
445 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
446 /* faster, simple */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
447 gdk_draw_pixbuf(it->pixmap,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
448 imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
449 imd->pixbuf,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
450 it->x + x, it->y + y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
451 x, y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
452 w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
453 (GdkRgbDither)dither_quality, it->x + x, it->y + y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
454 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
455 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
456 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
457 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
458 double scale_x, scale_y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
459
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
460 if (imd->image_width == 0 || imd->image_height == 0) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
461 scale_x = (double)imd->width / imd->image_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
462 scale_y = (double)imd->height / imd->image_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
463
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
464 /* HACK: The pixbuf scalers get kinda buggy(crash) with extremely
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
465 * small sizes for anything but GDK_INTERP_NEAREST
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
466 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
467 if (imd->width < IMAGE_MIN_SCALE_SIZE || imd->height < IMAGE_MIN_SCALE_SIZE) fast = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
468
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
469 if (!has_alpha)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
470 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
471 gdk_pixbuf_scale(imd->pixbuf, it->pixbuf, x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
472 (double) 0.0 - it->x,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
473 (double) 0.0 - it->y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
474 scale_x, scale_y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
475 (fast) ? GDK_INTERP_NEAREST : (GdkInterpType)zoom_quality);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
476 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
477 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
478 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
479 gdk_pixbuf_composite_color(imd->pixbuf, it->pixbuf, x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
480 (double) 0.0 - it->x,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
481 (double) 0.0 - it->y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
482 scale_x, scale_y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
483 (fast) ? GDK_INTERP_NEAREST : (GdkInterpType)zoom_quality,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
484 255, it->x + x, it->y + y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
485 IMAGE_ALPHA_CHECK_SIZE, IMAGE_ALPHA_CHECK1, IMAGE_ALPHA_CHECK2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
486 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
487 draw = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
488 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
489
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
490 if (draw && it->pixbuf && !it->blank)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
491 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
492 gdk_draw_pixbuf(it->pixmap,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
493 imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
494 it->pixbuf,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
495 x, y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
496 x, y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
497 w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
498 (GdkRgbDither)dither_quality, it->x + x, it->y + y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
499 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
500 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
501
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
502 static void image_tile_expose(ImageWindow *imd, ImageTile *it,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
503 gint x, gint y, gint w, gint h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
504 gint new_data, gint fast)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
505 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
506 image_tile_render(imd, it, x, y, w, h, new_data, fast);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
507
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
508 gdk_draw_drawable(imd->image->window, imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
509 it->pixmap, x, y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
510 imd->x_offset + (it->x - imd->x_scroll) + x, imd->y_offset + (it->y - imd->y_scroll) + y, w, h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
511
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
512 if (imd->overlay_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
513 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
514 image_overlay_draw(imd, imd->x_offset + (it->x - imd->x_scroll) + x,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
515 imd->y_offset + (it->y - imd->y_scroll) + y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
516 w, h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
517 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
518 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
519
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
520 static gint image_tile_is_visible(ImageWindow *imd, ImageTile *it)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
521 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
522 return (it->x + it->w >= imd->x_scroll && it->x <= imd->x_scroll + imd->window_width - imd->x_offset * 2 &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
523 it->y + it->h >= imd->y_scroll && it->y <= imd->y_scroll + imd->window_height - imd->y_offset * 2);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
524 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
525
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
526 /*
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
527 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
528 * render queue
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
529 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
530 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
531
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
532
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
533 static gint image_queue_draw_idle_cb(gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
534 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
535 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
536 QueueData *qd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
537 gint fast;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
538
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
539 if (!imd->pixbuf || (!imd->draw_queue && !imd->draw_queue_2pass) || imd->draw_idle_id == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
540 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
541 if (!imd->completed) image_complete_util(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
542
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
543 imd->draw_idle_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
544 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
545 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
546
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
547 if (imd->draw_queue)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
548 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
549 qd = imd->draw_queue->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
550 fast = (two_pass_zoom && (GdkInterpType)zoom_quality != GDK_INTERP_NEAREST && imd->scale != 1.0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
551 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
552 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
553 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
554 if (imd->il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
555 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
556 /* still loading, wait till done (also drops the higher priority) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
557
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
558 imd->draw_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
559 image_queue_draw_idle_cb, imd, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
560 imd->draw_idle_high = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
561 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
562 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
563 qd = imd->draw_queue_2pass->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
564 fast = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
565 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
566
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
567 if (GTK_WIDGET_REALIZED(imd->image))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
568 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
569 if (image_tile_is_visible(imd, qd->it))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
570 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
571 image_tile_expose(imd, qd->it, qd->x, qd->y, qd->w, qd->h, qd->new_data, fast);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
572 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
573 else if (qd->new_data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
574 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
575 /* if new pixel data, and we already have a pixmap, update the tile */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
576 qd->it->blank = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
577 if (qd->it->pixmap && qd->it->render_done == TILE_RENDER_ALL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
578 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
579 image_tile_render(imd, qd->it, qd->x, qd->y, qd->w, qd->h, qd->new_data, fast);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
580 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
581 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
582 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
583
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
584 if (imd->draw_queue)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
585 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
586 imd->draw_queue = g_list_remove(imd->draw_queue, qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
587 if (fast)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
588 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
589 imd->draw_queue_2pass = g_list_append(imd->draw_queue_2pass, qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
590 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
591 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
592 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
593 g_free(qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
594 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
595 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
596 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
597 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
598 imd->draw_queue_2pass = g_list_remove(imd->draw_queue_2pass, qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
599 g_free(qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
600 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
601
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
602 if (!imd->draw_queue && !imd->draw_queue_2pass)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
603 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
604 if (!imd->completed) image_complete_util(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
605
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
606 imd->draw_idle_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
607 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
608 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
609
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
610 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
611 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
612
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
613 static QueueData *image_queue_combine(ImageWindow *imd, QueueData *qd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
614 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
615 QueueData *found = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
616 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
617
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
618 work = imd->draw_queue;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
619 while (work && !found)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
620 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
621 found = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
622 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
623
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
624 if (found->it != qd->it) found = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
625 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
626
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
627 if (found)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
628 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
629 if (found->x + found->w < qd->x + qd->w) found->w += (qd->x + qd->w) - (found->x + found->w);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
630 if (found->x > qd->x)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
631 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
632 found->w += found->x - qd->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
633 found->x = qd->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
634 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
635
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
636 if (found->y + found->h < qd->y + qd->h) found->h += (qd->y + qd->h) - (found->y + found->h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
637 if (found->y > qd->y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
638 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
639 found->h += found->y - qd->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
640 found->y = qd->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
641 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
642 found->new_data |= qd->new_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
643 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
644
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
645 return found;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
646 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
647
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
648 static gint image_clamp_to_visible(ImageWindow *imd, gint *x, gint *y, gint *w, gint *h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
649 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
650 gint nx, ny;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
651 gint nw, nh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
652 gint vx, vy;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
653 gint vw, vh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
654
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
655 vw = imd->vis_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
656 vh = imd->vis_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
657
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
658 vx = imd->x_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
659 vy = imd->y_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
660
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
661 if (*x + *w < vx || *x > vx + vw || *y + *h < vy || *y > vy + vh) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
662
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
663 /* now clamp it */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
664 nx = CLAMP(*x, vx, vx + vw);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
665 nw = CLAMP(*w - (nx - *x), 1, vw);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
666
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
667 ny = CLAMP(*y, vy, vy + vh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
668 nh = CLAMP(*h - (ny - *y), 1, vh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
669
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
670 *x = nx;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
671 *y = ny;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
672 *w = nw;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
673 *h = nh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
674
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
675 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
676 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
677
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
678 static gint image_queue_to_tiles(ImageWindow *imd, gint x, gint y, gint w, gint h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
679 gint clamp, TileRenderType render, gint new_data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
680 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
681 gint i, j;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
682 gint x1, x2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
683 gint y1, y2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
684 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
685
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
686 if (clamp && !image_clamp_to_visible(imd, &x, &y, &w, &h)) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
687
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
688 x1 = (gint)floor(x / imd->tile_width) * imd->tile_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
689 x2 = (gint)ceil((x + w) / imd->tile_width) * imd->tile_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
690
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
691 y1 = (gint)floor(y / imd->tile_height) * imd->tile_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
692 y2 = (gint)ceil((y + h) / imd->tile_height) * imd->tile_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
693
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
694 work = g_list_nth(imd->tiles, y1 / imd->tile_height * imd->tile_cols + (x1 / imd->tile_width));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
695 for (j = y1; j <= y2; j += imd->tile_height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
696 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
697 GList *tmp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
698 tmp = work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
699 for (i = x1; i <= x2; i += imd->tile_width)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
700 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
701 if (tmp)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
702 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
703 ImageTile *it = tmp->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
704 QueueData *qd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
705
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
706 if ((render == TILE_RENDER_ALL && it->render_done != TILE_RENDER_ALL) ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
707 (render == TILE_RENDER_AREA && it->render_todo != TILE_RENDER_ALL))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
708 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
709 it->render_todo = render;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
710 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
711
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
712 qd = g_new(QueueData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
713 qd->it = it;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
714 qd->new_data = new_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
715
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
716 if (i < x)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
717 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
718 qd->x = x - i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
719 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
720 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
721 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
722 qd->x = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
723 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
724 qd->w = x + w - i - qd->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
725 if (qd->x + qd->w > imd->tile_width) qd->w = imd->tile_width - qd->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
726
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
727
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
728 if (j < y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
729 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
730 qd->y = y - j;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
731 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
732 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
733 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
734 qd->y = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
735 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
736 qd->h = y + h - j - qd->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
737 if (qd->y + qd->h > imd->tile_height) qd->h = imd->tile_height - qd->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
738
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
739 if (qd->w < 1 || qd->h < 1 || /* <--- sanity checks, rare cases cause this */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
740 image_queue_combine(imd, qd))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
741 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
742 g_free(qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
743 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
744 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
745 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
746 imd->draw_queue = g_list_append(imd->draw_queue, qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
747 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
748
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
749 tmp = tmp->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
750 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
751 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
752 work = g_list_nth(work, imd->tile_cols); /* step 1 row */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
753 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
754
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
755 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
756 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
757
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
758 static void image_queue(ImageWindow *imd, gint x, gint y, gint w, gint h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
759 gint clamp, TileRenderType render, gint new_data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
760 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
761 gint nx, ny;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
762
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
763 nx = CLAMP(x, 0, imd->width - 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
764 ny = CLAMP(y, 0, imd->height - 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
765 w -= (nx - x);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
766 h -= (ny - y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
767 w = CLAMP(w, 0, imd->width - nx);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
768 h = CLAMP(h, 0, imd->height - ny);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
769 if (w < 1 || h < 1) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
770
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
771 if (image_queue_to_tiles(imd, nx, ny, w, h, clamp, render, new_data) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
772 ((!imd->draw_queue && !imd->draw_queue_2pass) || imd->draw_idle_id == -1 || !imd->draw_idle_high))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
773 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
774 if (imd->draw_idle_id != -1) g_source_remove(imd->draw_idle_id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
775 imd->draw_idle_id = g_idle_add_full(GDK_PRIORITY_REDRAW,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
776 image_queue_draw_idle_cb, imd, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
777 imd->draw_idle_high = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
778 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
779 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
780
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
781 static void image_queue_list_free(GList *list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
782 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
783 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
784
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
785 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
786 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
787 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
788 QueueData *qd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
789
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
790 qd = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
791 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
792 g_free(qd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
793 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
794
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
795 g_list_free(list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
796 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
797
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
798 static void image_queue_clear(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
799 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
800 image_queue_list_free(imd->draw_queue);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
801 imd->draw_queue = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
802
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
803 image_queue_list_free(imd->draw_queue_2pass);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
804 imd->draw_queue_2pass = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
805
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
806 if (imd->draw_idle_id != -1) g_source_remove(imd->draw_idle_id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
807 imd->draw_idle_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
808 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
809
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
810 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
811 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
812 * core calculations
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
813 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
814 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
815
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
816 static gint image_top_window_sizable(ImageWindow *imd)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
817 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
818 if (!imd->top_window) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
819 if (!fit_window) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
820 if (!imd->top_window_sync) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
821 if (!imd->image->window) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
822 if (window_maximized(imd->top_window)) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
823
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
824 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
825 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
826
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
827 static gint image_size_top_window(ImageWindow *imd, gint w, gint h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
828 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
829 gint ww, wh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
830
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
831 if (!image_top_window_sizable(imd)) return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
832
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
833 if (limit_window_size)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
834 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
835 gint sw = gdk_screen_width() * max_window_size / 100;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
836 gint sh = gdk_screen_height() * max_window_size / 100;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
837
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
838 if (w > sw) w = sw;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
839 if (h > sh) h = sh;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
840 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
841
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
842 w += (imd->top_window->allocation.width - imd->image->allocation.width);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
843 h += (imd->top_window->allocation.height - imd->image->allocation.height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
844
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
845 gdk_drawable_get_size(imd->top_window->window, &ww, &wh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
846 if (w == ww && h == wh) return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
847
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
848 gdk_window_resize(imd->top_window->window, w, h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
849
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
850 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
851 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
852
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
853 static void image_redraw(ImageWindow *imd, gint new_data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
854 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
855 image_queue_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
856 image_queue(imd, 0, 0, imd->width, imd->height, TRUE, TILE_RENDER_ALL, new_data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
857 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
858
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
859 static void image_border_draw(ImageWindow *imd, gint x, gint y, gint w, gint h)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
860 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
861 gint rx, ry, rw, rh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
862
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
863 if (!imd->image->window) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
864
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
865 if (!imd->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
866 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
867 if (util_clip_region(x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
868 0, 0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
869 imd->window_width, imd->window_height,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
870 &rx, &ry, &rw, &rh))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
871 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
872 gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
873 image_overlay_draw(imd, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
874 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
875 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
876 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
877
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
878 if (imd->vis_width < imd->window_width)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
879 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
880 if (imd->x_offset > 0 &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
881 util_clip_region(x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
882 0, 0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
883 imd->x_offset, imd->window_height,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
884 &rx, &ry, &rw, &rh))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
885 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
886 gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
887 image_overlay_draw(imd, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
888 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
889 if (imd->window_width - imd->vis_width - imd->x_offset > 0 &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
890 util_clip_region(x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
891 imd->x_offset + imd->vis_width, 0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
892 imd->window_width - imd->vis_width - imd->x_offset, imd->window_height,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
893 &rx, &ry, &rw, &rh))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
894 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
895 gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
896 image_overlay_draw(imd, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
897 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
898 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
899 if (imd->vis_height < imd->window_height)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
900 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
901 if (imd->y_offset > 0 &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
902 util_clip_region(x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
903 imd->x_offset, 0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
904 imd->vis_width, imd->y_offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
905 &rx, &ry, &rw, &rh))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
906 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
907 gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
908 image_overlay_draw(imd, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
909 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
910 if (imd->window_height - imd->vis_height - imd->y_offset > 0 &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
911 util_clip_region(x, y, w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
912 imd->x_offset, imd->y_offset + imd->vis_height,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
913 imd->vis_width, imd->window_height - imd->vis_height - imd->y_offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
914 &rx, &ry, &rw, &rh))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
915 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
916 gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
917 image_overlay_draw(imd, rx, ry, rw, rh);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
918 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
919 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
920 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
921
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
922 static void image_border_clear(ImageWindow *imd)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
923 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
924 image_border_draw(imd, 0, 0, imd->window_width, imd->window_height);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
925 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
926
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
927 static gint image_scroll_clamp(ImageWindow *imd)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
928 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
929 gint old_xs;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
930 gint old_ys;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
931
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
932 if (imd->zoom == 0.0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
933 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
934 imd->x_scroll = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
935 imd->y_scroll = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
936 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
937 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
938
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
939 old_xs = imd->x_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
940 old_ys = imd->y_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
941
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
942 if (imd->x_offset > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
943 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
944 imd->x_scroll = 0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
945 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
946 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
947 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
948 imd->x_scroll = CLAMP(imd->x_scroll, 0, imd->width - imd->vis_width);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
949 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
950
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
951 if (imd->y_offset > 0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
952 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
953 imd->y_scroll = 0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
954 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
955 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
956 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
957 imd->y_scroll = CLAMP(imd->y_scroll, 0, imd->height - imd->vis_height);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
958 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
959
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
960 return (old_xs != imd->x_scroll || old_ys != imd->y_scroll);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
961 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
962
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
963 static gint image_zoom_clamp(ImageWindow *imd, gdouble zoom, gint force, gint new)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
964 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
965 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
966 gdouble scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
967
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
968 zoom = CLAMP(zoom, IMAGE_ZOOM_MIN, IMAGE_ZOOM_MAX);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
969
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
970 if (imd->zoom == zoom && !force) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
971
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
972 w = imd->image_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
973 h = imd->image_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
974
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
975 if (zoom == 0.0 && !imd->pixbuf)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
976 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
977 scale = 1.0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
978 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
979 else if (zoom == 0.0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
980 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
981 gint max_w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
982 gint max_h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
983 gint sizeable;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
984
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
985 sizeable = (new && image_top_window_sizable(imd));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
986
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
987 if (sizeable)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
988 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
989 max_w = gdk_screen_width();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
990 max_h = gdk_screen_height();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
991
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
992 if (limit_window_size)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
993 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
994 max_w = max_w * max_window_size / 100;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
995 max_h = max_h * max_window_size / 100;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
996 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
997 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
998 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
999 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1000 max_w = imd->window_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1001 max_h = imd->window_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1002 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1003
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1004 if ((zoom_to_fit_expands && !sizeable) || w > max_w || h > max_h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1005 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1006 if ((gdouble)max_w / w > (gdouble)max_h / h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1007 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1008 scale = (gdouble)max_h / h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1009 h = max_h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1010 w = w * scale + 0.5;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1011 if (w > max_w) w = max_w;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1012 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1013 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1014 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1015 scale = (gdouble)max_w / w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1016 w = max_w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1017 h = h * scale + 0.5;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1018 if (h > max_h) h = max_h;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1019 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1020 if (w < 1) w = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1021 if (h < 1) h = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1022 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1023 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1024 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1025 scale = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1026 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1027 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1028 else if (zoom > 0.0) /* zoom orig, in */
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1029 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1030 scale = zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1031 w = w * scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1032 h = h * scale;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1033 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1034 else /* zoom out */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1035 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1036 scale = 1.0 / (0.0 - zoom);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1037 w = w * scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1038 h = h * scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1039 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1040
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1041 imd->zoom = zoom;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1042 imd->width = w;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1043 imd->height = h;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1044 imd->scale = scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1045
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1046 return TRUE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1047 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1048
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1049 static gint image_size_clamp(ImageWindow *imd)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1050 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1051 gint old_vw, old_vh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1052
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1053 old_vw = imd->vis_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1054 old_vh = imd->vis_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1055
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1056 if (imd->width < imd->window_width)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1057 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1058 imd->vis_width = imd->width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1059 imd->x_offset = (imd->window_width - imd->width) / 2;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1060 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1061 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1062 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1063 imd->vis_width = imd->window_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1064 imd->x_offset = 0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1065 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1066
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1067 if (imd->height < imd->window_height)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1068 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1069 imd->vis_height = imd->height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1070 imd->y_offset = (imd->window_height - imd->height) / 2;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1071 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1072 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1073 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1074 imd->vis_height = imd->window_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1075 imd->y_offset = 0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1076 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1077
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1078 return (old_vw != imd->vis_width || old_vh != imd->vis_height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1079 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1080
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1081 static void image_size_sync(ImageWindow *imd, gint new_width, gint new_height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1082 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1083 if (imd->window_width == new_width && imd->window_height == new_height) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1084
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1085 imd->window_width = new_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1086 imd->window_height = new_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1087
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1088 if (imd->zoom == 0.0) image_zoom_clamp(imd, 0.0, TRUE, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1089
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1090 image_size_clamp(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1091 image_scroll_clamp(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1092
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1093 gtk_widget_set_size_request(imd->image, imd->window_width, imd->window_height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1094
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1095 /* ensure scroller remains visible */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1096 if (imd->scroller_overlay != -1)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1097 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1098 gint update = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1099
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1100 if (imd->scroller_x > new_width)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1101 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1102 imd->scroller_x = new_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1103 imd->scroller_xpos = new_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1104 update = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1105 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1106 if (imd->scroller_y > new_height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1107 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1108 imd->scroller_y = new_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1109 imd->scroller_ypos = new_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1110 update = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1111 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1112
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1113 if (update)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1114 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1115 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1116
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1117 if (image_overlay_get(imd, imd->scroller_overlay, &pixbuf, NULL, NULL))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1118 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1119 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1120
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1121 w = gdk_pixbuf_get_width(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1122 h = gdk_pixbuf_get_height(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1123 image_overlay_set(imd, imd->scroller_overlay, pixbuf,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1124 imd->scroller_x - w / 2, imd->scroller_y - h / 2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1125 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1126 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1127 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1128
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1129 /* clear any borders */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1130 image_border_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1131
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1132 image_tile_sync(imd, imd->width, imd->height, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1133 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1134 /* no longer needed? (expose event should be doing this for us) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1135 image_redraw(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1136 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1137
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1138 if (imd->title_show_zoom) image_update_title(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1139 image_update_util(imd);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1140 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1141
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1142 /*
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1143 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1144 * misc
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1145 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1146 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1147
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1148 static void image_update_title(ImageWindow *imd)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1149 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1150 gchar *title = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1151 gchar *zoom = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1152 gchar *collection = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1153
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1154 if (!imd->top_window) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1155
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1156 if (imd->collection && collection_to_number(imd->collection) >= 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1157 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1158 const gchar *name;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1159 name = imd->collection->name;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1160 if (!name) name = _("Untitled");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1161 collection = g_strdup_printf(" (Collection %s)", name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1162 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1163
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1164 if (imd->title_show_zoom)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1165 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1166 gchar *buf = image_zoom_get_as_text(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1167 zoom = g_strconcat(" [", buf, "]", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1168 g_free(buf);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1169 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1170
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1171 title = g_strdup_printf("%s%s%s%s%s%s",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1172 imd->title ? imd->title : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1173 imd->image_name ? imd->image_name : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1174 zoom ? zoom : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1175 collection ? collection : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1176 imd->image_name ? " - " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1177 imd->title_right ? imd->title_right : "");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1178
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1179 gtk_window_set_title(GTK_WINDOW(imd->top_window), title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1180
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1181 g_free(title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1182 g_free(zoom);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1183 g_free(collection);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1184 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1185
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1186 static void image_update_util(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1187 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1188 if (imd->func_update) imd->func_update(imd, imd->data_update);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1189 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1190
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1191 static void image_complete_util(ImageWindow *imd, gint preload)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1192 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1193 if (imd->il && imd->pixbuf != image_loader_get_pixbuf(imd->il)) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1194
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1195 if (debug) printf("image load completed \"%s\" (%s)\n",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1196 (preload) ? imd->read_ahead_path : imd->image_path,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1197 (preload) ? "preload" : "current");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1198
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1199 if (!preload) imd->completed = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1200 if (imd->func_complete) imd->func_complete(imd, preload, imd->data_complete);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1201 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1203 static void image_new_util(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1204 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1205 if (imd->func_new) imd->func_new(imd, imd->data_new);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1206 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1207
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1208 static void image_scroll_real(ImageWindow *imd, gint x, gint y)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1209 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1210 gint old_x, old_y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1211 gint x_off, y_off;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1212 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1213
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1214 if (!imd->pixbuf) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1215
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1216 old_x = imd->x_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1217 old_y = imd->y_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1218
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1219 imd->x_scroll += x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1220 imd->y_scroll += y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1221
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1222 image_scroll_clamp(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1223 if (imd->x_scroll == old_x && imd->y_scroll == old_y) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1224
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1225 if (imd->overlay_list)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1226 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1227 gint new_x, new_y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1228
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1229 new_x = imd->x_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1230 new_y = imd->y_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1231 imd->x_scroll = old_x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1232 imd->y_scroll = old_y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1233 image_overlay_queue_all(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1234 imd->x_scroll = new_x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1235 imd->y_scroll = new_y;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1236 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1237
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1238 x_off = imd->x_scroll - old_x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1239 y_off = imd->y_scroll - old_y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1240
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1241 w = imd->vis_width - abs(x_off);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1242 h = imd->vis_height - abs(y_off);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1244 if (w < 1 || h < 1)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1245 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1246 /* scrolled completely to new material */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1247 image_queue(imd, 0, 0, imd->width, imd->height, TRUE, TILE_RENDER_ALL, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1248 return;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1249 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1250 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1251 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1252 gint x1, y1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1253 gint x2, y2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1254 GdkGC *gc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1255
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1256 if (x_off < 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1257 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1258 x1 = abs(x_off);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1259 x2 = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1260 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1261 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1262 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1263 x1 = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1264 x2 = abs(x_off);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1265 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1266
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1267 if (y_off < 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1268 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1269 y1 = abs(y_off);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1270 y2 = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1271 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1272 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1273 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1274 y1 = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1275 y2 = abs(y_off);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1276 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1277
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1278 gc = gdk_gc_new(imd->image->window);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1279 gdk_gc_set_exposures(gc, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1280 gdk_draw_drawable(imd->image->window, gc,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1281 imd->image->window,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1282 x2 + imd->x_offset, y2 + imd->y_offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1283 x1 + imd->x_offset, y1 + imd->y_offset, w, h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1284 g_object_unref(gc);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1285
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1286 if (imd->overlay_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1287 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1288 image_overlay_queue_all(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1289 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1290
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1291 w = imd->vis_width - w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1292 h = imd->vis_height - h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1293
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1294 if (w > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1295 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1296 image_queue(imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1297 x_off > 0 ? imd->x_scroll + (imd->vis_width - w) : imd->x_scroll, imd->y_scroll,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1298 w, imd->vis_height, TRUE, TILE_RENDER_ALL, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1299 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1300 if (h > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1301 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1302 /* FIXME, to optimize this, remove overlap */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1303 image_queue(imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1304 imd->x_scroll, y_off > 0 ? imd->y_scroll + (imd->vis_height - h) : imd->y_scroll,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1305 imd->vis_width, h, TRUE, TILE_RENDER_ALL, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1306 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1307 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1308 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1309
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1310 static void widget_set_cursor(GtkWidget *widget, gint icon)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1311 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1312 GdkCursor *cursor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1313
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1314 if (!widget->window) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1315
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1316 if (icon == -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1317 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1318 cursor = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1319 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1320 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1321 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1322 cursor = gdk_cursor_new (icon);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1323 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1324
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1325 gdk_window_set_cursor(widget->window, cursor);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1326
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1327 if (cursor) gdk_cursor_unref(cursor);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1328 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1329
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1330 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1331 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1332 * image pixbuf handling
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1333 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1334 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1335
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1336 static void image_zoom_sync(ImageWindow *imd, gdouble zoom,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1337 gint force, gint blank, gint new,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1338 gint center_point, gint px, gint py)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1339 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1340 gdouble old_scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1341 gint old_cx, old_cy;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1342 gint clamped;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1343 gint sized;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1344
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1345 old_scale = imd->scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1346 if (center_point)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1347 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1348 px = CLAMP(px, 0, imd->width);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1349 py = CLAMP(py, 0, imd->height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1350 old_cx = imd->x_scroll + (px - imd->x_offset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1351 old_cy = imd->y_scroll + (py - imd->y_offset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1352 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1353 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1354 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1355 px = py = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1356 old_cx = imd->x_scroll + imd->vis_width / 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1357 old_cy = imd->y_scroll + imd->vis_height / 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1358 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1359
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1360 if (!image_zoom_clamp(imd, zoom, force, new)) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1361
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1362 clamped = image_size_clamp(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1363 sized = image_size_top_window(imd, imd->width, imd->height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1364
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1365 if (force)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1366 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1367 /* force means new image, so update scroll offset per options */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1368 switch (scroll_reset_method)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1369 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1370 case SCROLL_RESET_NOCHANGE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1371 /* maintain old scroll position, do nothing */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1372 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1373 case SCROLL_RESET_CENTER:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1374 /* center new image */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1375 imd->x_scroll = ((double)imd->image_width / 2.0 * imd->scale) - imd->vis_width / 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1376 imd->y_scroll = ((double)imd->image_height / 2.0 * imd->scale) - imd->vis_height / 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1377 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1378 case SCROLL_RESET_TOPLEFT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1379 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1380 /* reset to upper left */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1381 imd->x_scroll = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1382 imd->y_scroll = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1383 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1384 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1385 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1386 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1387 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1388 /* user zoom does not force, so keep visible center point */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1389 if (center_point)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1390 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1391 imd->x_scroll = old_cx / old_scale * imd->scale - (px - imd->x_offset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1392 imd->y_scroll = old_cy / old_scale * imd->scale - (py - imd->y_offset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1393 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1394 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1395 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1396 imd->x_scroll = old_cx / old_scale * imd->scale - (imd->vis_width / 2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1397 imd->y_scroll = old_cy / old_scale * imd->scale - (imd->vis_height / 2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1398 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1399 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1400 image_scroll_clamp(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1401
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1402 image_tile_sync(imd, imd->width, imd->height, blank);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1403
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1404 /* If the window was not sized, redraw the image - we know there will be no size/expose signal.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1405 * But even if a size is claimed, there is no guarantee that the window manager will allow it,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1406 * so redraw the window anyway :/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1407 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1408 if (sized || clamped) image_border_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1409 image_redraw(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1410
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1411 if (imd->title_show_zoom) image_update_title(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1412 image_update_util(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1413 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1414
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1415 static void image_pixbuf_sync(ImageWindow *imd, gdouble zoom, gint blank, gint new)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1416 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1417 if (!imd->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1418 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1419 /* no pixbuf so just clear the window */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1420 imd->image_width = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1421 imd->image_height = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1422 imd->scale = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1423
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1424 if (imd->image->window)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1425 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1426 gdk_window_clear(imd->image->window);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1427 image_overlay_draw(imd, 0, 0, imd->window_width, imd->window_height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1428 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1429
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1430 image_update_util(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1431
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1432 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1433 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1434
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1435 imd->image_width = gdk_pixbuf_get_width(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1436 imd->image_height = gdk_pixbuf_get_height(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1437
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1438 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1439 /* reset scrolling */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1440 imd->x_scroll = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1441 imd->y_scroll = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1442 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1443
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1444 image_zoom_sync(imd, zoom, TRUE, blank, new, FALSE, 0, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1445 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1446
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1447 static void image_set_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gint new)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1448 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1449 if (pixbuf) g_object_ref(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1450 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1451 imd->pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1452
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1453 image_pixbuf_sync(imd, zoom, FALSE, new);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1454 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1455
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1456 static void image_alter_real(ImageWindow *imd, AlterType type, gint clamp)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1457 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1458 GdkPixbuf *new = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1459 gint x, y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1460 gint t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1461
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1462 imd->delay_alter_type = ALTER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1463
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1464 if (!imd->pixbuf) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1465
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1466 x = imd->x_scroll + (imd->vis_width / 2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1467 y = imd->y_scroll + (imd->vis_height / 2);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1468
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1469 switch (type)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1470 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1471 case ALTER_ROTATE_90:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1472 new = pixbuf_copy_rotate_90(imd->pixbuf, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1473 t = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1474 x = imd->height - y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1475 y = t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1476 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1477 case ALTER_ROTATE_90_CC:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1478 new = pixbuf_copy_rotate_90(imd->pixbuf, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1479 t = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1480 x = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1481 y = imd->width - t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1482 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1483 case ALTER_ROTATE_180:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1484 new = pixbuf_copy_mirror(imd->pixbuf, TRUE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1485 x = imd->width - x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1486 y = imd->height - y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1487 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1488 case ALTER_MIRROR:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1489 new = pixbuf_copy_mirror(imd->pixbuf, TRUE, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1490 x = imd->width - x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1491 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1492 case ALTER_FLIP:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1493 new = pixbuf_copy_mirror(imd->pixbuf, FALSE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1494 y = imd->height - y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1495 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1496 case ALTER_NONE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1497 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1498 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1499 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1500 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1501
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1502 if (!new) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1503
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1504 if (clamp)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1505 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1506 image_set_pixbuf(imd, new, imd->zoom, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1507 g_object_unref(new);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1508
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1509 if (imd->zoom != 0.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1510 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1511 image_scroll(imd, x - (imd->vis_width / 2), y - (imd->vis_height / 2));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1512 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1513 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1514 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1515 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1516 g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1517 imd->pixbuf = new;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1518 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1519 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1520
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1521 static void image_post_process(ImageWindow *imd, gint clamp)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1522 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1523 if (exif_rotate_enable && imd->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1524 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1525 ExifData *ed;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1526 gint orientation;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1527
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1528 ed = exif_read(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1529 if (ed && exif_get_integer(ed, "Orientation", &orientation))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1530 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1531 /* see http://jpegclub.org/exif_orientation.html
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1532 1 2 3 4 5 6 7 8
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1533
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1534 888888 888888 88 88 8888888888 88 88 8888888888
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1535 88 88 88 88 88 88 88 88 88 88 88 88
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1536 8888 8888 8888 8888 88 8888888888 8888888888 88
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1537 88 88 88 88
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1538 88 88 888888 888888
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1539 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1540
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1541 switch (orientation)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1542 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1543 case EXIF_ORIENTATION_TOP_LEFT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1544 /* normal -- nothing to do */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1545 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1546 case EXIF_ORIENTATION_TOP_RIGHT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1547 /* mirrored */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1548 imd->delay_alter_type = ALTER_MIRROR;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1549 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1550 case EXIF_ORIENTATION_BOTTOM_RIGHT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1551 /* upside down */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1552 imd->delay_alter_type = ALTER_ROTATE_180;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1553 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1554 case EXIF_ORIENTATION_BOTTOM_LEFT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1555 /* flipped */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1556 imd->delay_alter_type = ALTER_FLIP;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1557 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1558 case EXIF_ORIENTATION_LEFT_TOP:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1559 /* not implemented -- too wacky to fix in one step */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1560 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1561 case EXIF_ORIENTATION_RIGHT_TOP:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1562 /* rotated -90 (270) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1563 imd->delay_alter_type = ALTER_ROTATE_90;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1564 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1565 case EXIF_ORIENTATION_RIGHT_BOTTOM:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1566 /* not implemented -- too wacky to fix in one step */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1567 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1568 case EXIF_ORIENTATION_LEFT_BOTTOM:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1569 /* rotated 90 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1570 imd->delay_alter_type = ALTER_ROTATE_90_CC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1571 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1572 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1573 /* The other values are out of range */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1574 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1575 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1576 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1577 exif_free(ed);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1578 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1579
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1580 if (imd->delay_alter_type != ALTER_NONE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1581 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1582 image_alter_real(imd, imd->delay_alter_type, clamp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1583 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1584 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1585
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1586 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1587 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1588 * read ahead (prebuffer)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1589 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1590 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1591
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1592 static void image_read_ahead_cancel(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1593 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1594 if (debug) printf("read ahead cancelled for :%s\n", imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1595
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1596 image_loader_free(imd->read_ahead_il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1597 imd->read_ahead_il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1598
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1599 if (imd->read_ahead_pixbuf) g_object_unref(imd->read_ahead_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1600 imd->read_ahead_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1601
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1602 g_free(imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1603 imd->read_ahead_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1604 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1605
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1606 static void image_read_ahead_done_cb(ImageLoader *il, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1607 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1608 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1609
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1610 if (debug) printf("read ahead done for :%s\n", imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1611
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1612 imd->read_ahead_pixbuf = image_loader_get_pixbuf(imd->read_ahead_il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1613 if (imd->read_ahead_pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1614 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1615 g_object_ref(imd->read_ahead_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1616 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1617 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1618 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1619 imd->read_ahead_pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1620 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1621 image_loader_free(imd->read_ahead_il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1622 imd->read_ahead_il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1623
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1624 image_complete_util(imd, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1625 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1626
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1627 static void image_read_ahead_error_cb(ImageLoader *il, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1628 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1629 /* we even treat errors as success, maybe at least some of the file was ok */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1630 image_read_ahead_done_cb(il, data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1631 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1632
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1633 static void image_read_ahead_start(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1634 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1635 /* already started ? */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1636 if (!imd->read_ahead_path || imd->read_ahead_il || imd->read_ahead_pixbuf) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1637
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1638 /* still loading ?, do later */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1639 if (imd->il) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1640
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1641 if (debug) printf("read ahead started for :%s\n", imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1642
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1643 imd->read_ahead_il = image_loader_new(imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1644
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1645 image_loader_set_error_func(imd->read_ahead_il, image_read_ahead_error_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1646 if (!image_loader_start(imd->read_ahead_il, image_read_ahead_done_cb, imd))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1647 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1648 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1649 image_complete_util(imd, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1650 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1651 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1652
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1653 static void image_read_ahead_set(ImageWindow *imd, const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1654 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1655 if (imd->read_ahead_path && path && strcmp(imd->read_ahead_path, path) == 0) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1656
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1657 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1658
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1659 imd->read_ahead_path = g_strdup(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1660
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1661 if (debug) printf("read ahead set to :%s\n", imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1662
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1663 image_read_ahead_start(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1664 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1665
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1666 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1667 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1668 * post buffering
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1669 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1670 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1671
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1672 static void image_post_buffer_set(ImageWindow *imd, const gchar *path, GdkPixbuf *pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1673 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1674 g_free(imd->prev_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1675 if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1676
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1677 if (path && pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1678 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1679 imd->prev_path = g_strdup(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1680
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1681 g_object_ref(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1682 imd->prev_pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1683 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1684 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1685 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1686 imd->prev_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1687 imd->prev_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1688 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1689
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1690 if (debug) printf("post buffer set: %s\n", path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1691 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1692
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1693 static gint image_post_buffer_get(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1694 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1695 gint success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1696
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1697 if (imd->prev_pixbuf &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1698 imd->image_path && imd->prev_path && strcmp(imd->image_path, imd->prev_path) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1699 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1700 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1701 imd->pixbuf = imd->prev_pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1702 success = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1703 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1704 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1705 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1706 if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1707 success = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1708 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1709
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1710 imd->prev_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1711
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1712 g_free(imd->prev_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1713 imd->prev_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1714
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1715 return success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1716 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1717
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1718 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1719 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1720 * loading
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1721 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1722 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1723
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1724 static void image_load_pixbuf_ready(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1725 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1726 if (imd->pixbuf || !imd->il) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1727
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1728 imd->pixbuf = image_loader_get_pixbuf(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1729
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1730 if (imd->pixbuf) g_object_ref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1731
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1732 image_pixbuf_sync(imd, imd->zoom, TRUE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1733 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1734
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1735 static void image_load_area_cb(ImageLoader *il, guint x, guint y, guint w, guint h, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1736 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1737 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1738
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1739 if (imd->delay_flip &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1740 imd->pixbuf != image_loader_get_pixbuf(il))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1741 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1742 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1743 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1744
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1745 if (!imd->pixbuf) image_load_pixbuf_ready(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1746
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1747 if (imd->scale != 1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1748 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1749 x = (guint) floor((double)x * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1750 y = (guint) floor((double)y * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1751 w = (guint) ceil((double)w * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1752 h = (guint) ceil((double)h * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1753
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1754 if (w == 0) w = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1755 if (h == 0) h = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1756
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1757 if ((GdkInterpType)zoom_quality != GDK_INTERP_NEAREST)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1758 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1759 /* some scaling types use surrounding pixels to smooth the image,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1760 * this will expand the new area to cover up for faint black
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1761 * lines caused by previous renders with non-complete image
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1762 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1763 y -= 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1764 h += 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1765 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1766
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1767 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1768
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1769 image_queue(imd, (gint) x, (gint) y, (gint) w, (gint) h, FALSE, TILE_RENDER_AREA, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1770 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1771
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1772 static void image_load_done_cb(ImageLoader *il, gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1773 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1774 ImageWindow *imd = data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1775
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1776 if (debug) printf ("image done\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1777
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1778 if (imd->delay_flip &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1779 imd->pixbuf != image_loader_get_pixbuf(imd->il))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1780 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1781 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1782 imd->pixbuf = image_loader_get_pixbuf(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1783 if (imd->pixbuf) g_object_ref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1784 image_pixbuf_sync(imd, imd->zoom, FALSE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1785 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1786
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1787 image_loader_free(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1788 imd->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1789
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1790 image_post_process(imd, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1791
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1792 image_read_ahead_start(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1793 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1794
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1795 static void image_load_error_cb(ImageLoader *il, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1796 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1797 if (debug) printf ("image error\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1798
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1799 /* even on error handle it like it was done,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1800 * since we have a pixbuf with _something_ */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1801
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1802 image_load_done_cb(il, data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1803 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1804
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1805 #ifdef IMAGE_THROTTLE_LARGER_IMAGES
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1806 static void image_load_buffer_throttle(ImageLoader *il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1807 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1808 if (!il || il->bytes_total < IMAGE_THROTTLE_THRESHOLD) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1809
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1810 /* Larger image files usually have larger chunks of data per pixel...
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1811 * So increase the buffer read size so that the rendering chunks called
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1812 * are also larger.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1813 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1814
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1815 image_loader_set_buffer_size(il, IMAGE_LOAD_BUFFER_COUNT * IMAGE_THROTTLE_FACTOR);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1816 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1817 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1818
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1819 /* this read ahead is located here merely for the callbacks, above */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1820
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1821 static gint image_read_ahead_check(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1822 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1823 if (!imd->read_ahead_path) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1824 if (imd->il) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1825
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1826 if (!imd->image_path || strcmp(imd->read_ahead_path, imd->image_path) != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1827 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1828 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1829 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1830 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1831
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1832 if (imd->read_ahead_il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1833 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1834 imd->il = imd->read_ahead_il;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1835 imd->read_ahead_il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1836
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1837 /* override the old signals */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1838 image_loader_set_area_ready_func(imd->il, image_load_area_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1839 image_loader_set_error_func(imd->il, image_load_error_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1840 image_loader_set_buffer_size(imd->il, IMAGE_LOAD_BUFFER_COUNT);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1841
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1842 #ifdef IMAGE_THROTTLE_LARGER_IMAGES
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1843 image_load_buffer_throttle(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1844 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1845
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1846 /* do this one directly (probably should add a set func) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1847 imd->il->func_done = image_load_done_cb;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1848
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1849 if (!imd->delay_flip)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1850 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1851 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1852 imd->pixbuf = image_loader_get_pixbuf(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1853 if (imd->pixbuf) g_object_ref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1854 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1855
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1856 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1857 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1858 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1859 else if (imd->read_ahead_pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1860 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1861 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1862 imd->pixbuf = imd->read_ahead_pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1863 imd->read_ahead_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1864
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1865 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1866
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1867 image_post_process(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1868 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1869 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1870
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1871 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1872 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1873 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1874
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1875 static gint image_load_begin(ImageWindow *imd, const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1876 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1877 if (debug) printf ("image begin \n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1878
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1879 if (imd->il) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1880
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1881 imd->completed = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1882
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1883 if (image_post_buffer_get(imd))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1884 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1885 if (debug) printf("from post buffer: %s\n", imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1886
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1887 image_pixbuf_sync(imd, imd->zoom, FALSE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1888 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1889 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1890
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1891 if (image_read_ahead_check(imd))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1892 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1893 if (debug) printf("from read ahead buffer: %s\n", imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1894
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1895 if (!imd->delay_flip || !imd->il) image_pixbuf_sync(imd, imd->zoom, FALSE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1896 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1897 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1898
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1899 if (!imd->delay_flip && imd->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1900 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1901 g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1902 imd->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1903 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1904
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1905 imd->il = image_loader_new(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1906
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1907 image_loader_set_area_ready_func(imd->il, image_load_area_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1908 image_loader_set_error_func(imd->il, image_load_error_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1909 image_loader_set_buffer_size(imd->il, IMAGE_LOAD_BUFFER_COUNT);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1910
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1911 if (!image_loader_start(imd->il, image_load_done_cb, imd))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1912 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1913 if (debug) printf("image start error\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1914
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1915 image_loader_free(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1916 imd->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1917
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1918 image_complete_util(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1919
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1920 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1921 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1922
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1923 #ifdef IMAGE_THROTTLE_LARGER_IMAGES
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1924 image_load_buffer_throttle(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1925 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1926
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1927 if (!imd->delay_flip && !imd->pixbuf) image_load_pixbuf_ready(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1928
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1929 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1930 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1931
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1932 static void image_reset(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1933 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1934 /* stops anything currently being done */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1935
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1936 if (debug) printf("image reset\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1937
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1938 image_loader_free(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1939 imd->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1940
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1941 image_queue_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1942 imd->delay_alter_type = ALTER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1943 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1944
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1945 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1946 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1947 * image changer
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1948 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1949 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1950
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1951 static void image_change_complete(ImageWindow *imd, gdouble zoom, gint new)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1952 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1953 gint sync = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1954
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1955 imd->zoom = zoom; /* store the zoom, needed by the loader */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1956
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1957 image_reset(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1958
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1959 if (imd->image_path && isfile(imd->image_path))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1960 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1961 if (image_load_begin(imd, imd->image_path))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1962 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1963 imd->unknown = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1964 sync = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1965 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1966 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1967 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1968 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1969 imd->pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1970 imd->unknown = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1971 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1972 imd->size = filesize(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1973 imd->mtime = filetime(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1974 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1975 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1976 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1977 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1978 imd->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1979
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1980 if (imd->image_path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1981 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1982 imd->pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1983 imd->mtime = filetime(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1984 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1985 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1986 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1987 imd->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1988 imd->mtime = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1989 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1990 imd->unknown = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1991 imd->size = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1992 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1993
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1994 if (sync)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1995 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1996 image_pixbuf_sync(imd, zoom, FALSE, new);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1997 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1998 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
1999 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2000 image_update_util(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2001 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2002 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2003
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2004 static void image_change_real(ImageWindow *imd, const gchar *path,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2005 CollectionData *cd, CollectInfo *info, gdouble zoom)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2006 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2007 GdkPixbuf *prev_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2008 gchar *prev_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2009 gint prev_clear = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2010
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2011 imd->collection = cd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2012 imd->collection_info = info;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2013
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2014 if (enable_read_ahead && imd->image_path && imd->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2015 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2016 if (imd->il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2017 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2018 /* current image is not finished */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2019 prev_clear = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2020 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2021 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2022 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2023 prev_path = g_strdup(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2024 prev_pixbuf = imd->pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2025 g_object_ref(prev_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2026 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2027 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2028
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2029 g_free(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2030 imd->image_path = g_strdup(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2031 imd->image_name = filename_from_path(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2032
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2033 image_change_complete(imd, zoom, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2034
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2035 if (prev_pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2036 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2037 image_post_buffer_set(imd, prev_path, prev_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2038 g_free(prev_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2039 g_object_unref(prev_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2040 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2041 else if (prev_clear)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2042 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2043 image_post_buffer_set(imd, NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2044 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2045
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2046 image_update_title(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2047 image_new_util(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2048 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2049
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2050 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2051 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2052 * callbacks
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2053 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2054 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2055
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2056 static gint image_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2057 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2058 gint x, y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2059
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2060 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2061
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2062 image_border_draw(imd, event->area.x, event->area.y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2063 event->area.width, event->area.height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2064
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2065 /* image */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2066 x = MAX(0, (gint)event->area.x - imd->x_offset + imd->x_scroll);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2067 y = MAX(0, (gint)event->area.y - imd->y_offset + imd->y_scroll);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2068
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2069 image_queue(imd, x, y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2070 MIN((gint)event->area.width, imd->width - x),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2071 MIN((gint)event->area.height, imd->height - y),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2072 FALSE, TILE_RENDER_ALL, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2073
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2074 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2075 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2076
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2077 static void image_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2078 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2079 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2080
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2081 image_size_sync(imd, allocation->width, allocation->height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2082 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2083
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2084 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2085 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2086 * focus stuff
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2087 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2088 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2089
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2090 static void image_focus_paint(ImageWindow *imd, gint has_focus, GdkRectangle *area)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2091 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2092 GtkWidget *widget;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2093
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2094 widget = imd->widget;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2095 if (!widget->window) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2096
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2097 if (has_focus)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2098 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2099 gtk_paint_focus (widget->style, widget->window, GTK_STATE_ACTIVE,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2100 area, widget, "image_window",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2101 widget->allocation.x, widget->allocation.y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2102 widget->allocation.width - 1, widget->allocation.height - 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2103 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2104 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2105 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2106 gtk_paint_shadow (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2107 area, widget, "image_window",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2108 widget->allocation.x, widget->allocation.y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2109 widget->allocation.width - 1, widget->allocation.height - 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2110 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2111 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2112
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2113 static gint image_focus_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2114 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2115 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2116
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2117 image_focus_paint(imd, GTK_WIDGET_HAS_FOCUS(widget), &event->area);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2118 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2119 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2120
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2121 static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2122 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2123 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2124
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2125 GTK_WIDGET_SET_FLAGS(imd->widget, GTK_HAS_FOCUS);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2126 image_focus_paint(imd, TRUE, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2127
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2128 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2129 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2130
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2131 static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2132 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2133 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2134
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2135 GTK_WIDGET_UNSET_FLAGS(imd->widget, GTK_HAS_FOCUS);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2136 image_focus_paint(imd, FALSE, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2137
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2138 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2139 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2140
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2141
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2142 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2143 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2144 * overlays
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2145 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2146 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2147
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2148 static void image_overlay_draw(ImageWindow *imd, gint x, gint y, gint w, gint h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2149 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2150 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2151
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2152 work = imd->overlay_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2153 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2154 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2155 OverlayData *od;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2156 gint px, py, pw, ph;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2157 gint rx, ry, rw, rh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2158
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2159 od = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2160 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2161
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2162 if (!od->visible) continue;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2163
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2164 pw = gdk_pixbuf_get_width(od->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2165 ph = gdk_pixbuf_get_height(od->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2166 px = od->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2167 py = od->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2168
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2169 if (od->relative)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2170 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2171 if (px < 0) px = imd->window_width - pw + px;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2172 if (py < 0) py = imd->window_height - ph + py;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2173 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2174
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2175 if (util_clip_region(x, y, w, h, px, py, pw, ph, &rx, &ry, &rw, &rh))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2176 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2177 gdk_draw_pixbuf(imd->image->window,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2178 imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2179 od->pixbuf,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2180 rx - px, ry - py,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2181 rx, ry, rw, rh,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2182 (GdkRgbDither)dither_quality, rx, ry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2183 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2184 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2185 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2186
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2187 static void image_overlay_queue_draw(ImageWindow *imd, OverlayData *od, gint hidden)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2188 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2189 gint x, y, w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2190 gint old_vis;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2191
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2192 w = gdk_pixbuf_get_width(od->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2193 h = gdk_pixbuf_get_height(od->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2194 x = od->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2195 y = od->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2196
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2197 if (od->relative)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2198 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2199 if (x < 0) x = imd->window_width - w + x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2200 if (y < 0) y = imd->window_height - h + y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2201 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2203 image_queue(imd, imd->x_scroll - imd->x_offset + x,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2204 imd->y_scroll - imd->y_offset + y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2205 w, h,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2206 FALSE, TILE_RENDER_ALL, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2207
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2208 old_vis = od->visible;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2209 if (hidden) od->visible = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2210 image_border_draw(imd, x, y, w, h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2211 od->visible = old_vis;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2212 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2213
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2214 static void image_overlay_queue_all(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2215 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2216 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2217
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2218 work = imd->overlay_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2219 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2220 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2221 OverlayData *od = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2222 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2223
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2224 image_overlay_queue_draw(imd, od, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2225 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2226 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2227
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2228 static OverlayData *image_overlay_find(ImageWindow *imd, gint id)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2229 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2230 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2231
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2232 work = imd->overlay_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2233 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2234 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2235 OverlayData *od = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2236 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2237
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2238 if (od->id == id) return od;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2239 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2240
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2241 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2242 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2244 gint image_overlay_add(ImageWindow *imd, GdkPixbuf *pixbuf, gint x, gint y,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2245 gint relative, gint always)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2246 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2247 OverlayData *od;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2248 gint id;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2249
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2250 if (!imd || !pixbuf) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2251
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2252 id = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2253 while (image_overlay_find(imd, id)) id++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2254
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2255 od = g_new0(OverlayData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2256 od->id = id;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2257 od->pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2258 g_object_ref(G_OBJECT(od->pixbuf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2259 od->x = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2260 od->y = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2261 od->relative = relative;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2262 od->visible = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2263 od->always = always;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2264
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2265 imd->overlay_list = g_list_append(imd->overlay_list, od);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2266
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2267 image_overlay_queue_draw(imd, od, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2268
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2269 return od->id;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2270 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2271
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2272 static void image_overlay_free(ImageWindow *imd, OverlayData *od)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2273 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2274 imd->overlay_list = g_list_remove(imd->overlay_list, od);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2275
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2276 if (od->pixbuf) g_object_unref(G_OBJECT(od->pixbuf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2277 g_free(od);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2278 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2279
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2280 static void image_overlay_list_clear(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2281 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2282 while (imd->overlay_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2283 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2284 OverlayData *od;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2285
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2286 od = imd->overlay_list->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2287 image_overlay_free(imd, od);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2288 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2289 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2290
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2291 void image_overlay_set(ImageWindow *imd, gint id, GdkPixbuf *pixbuf, gint x, gint y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2292 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2293 OverlayData *od;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2294
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2295 if (!imd) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2296
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2297 od = image_overlay_find(imd, id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2298 if (!od) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2299
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2300 if (pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2301 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2302 image_overlay_queue_draw(imd, od, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2303
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2304 g_object_ref(G_OBJECT(pixbuf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2305 g_object_unref(G_OBJECT(od->pixbuf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2306 od->pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2307
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2308 od->x = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2309 od->y = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2310
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2311 image_overlay_queue_draw(imd, od, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2312 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2313 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2314 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2315 image_overlay_queue_draw(imd, od, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2316 image_overlay_free(imd, od);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2317 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2318 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2319
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2320 gint image_overlay_get(ImageWindow *imd, gint id, GdkPixbuf **pixbuf, gint *x, gint *y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2321 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2322 OverlayData *od;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2323
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2324 if (!imd) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2325
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2326 od = image_overlay_find(imd, id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2327 if (!od) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2328
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2329 if (pixbuf) *pixbuf = od->pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2330 if (x) *x = od->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2331 if (y) *y = od->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2332
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2333 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2334 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2335
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2336 void image_overlay_remove(ImageWindow *imd, gint id)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2337 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2338 image_overlay_set(imd, id, NULL, 0, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2339 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2340
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2341 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2342 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2343 * scroller
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2344 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2345 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2346
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2347 #define SCROLLER_UPDATES_PER_SEC 30
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2348 #define SCROLLER_DEAD_ZONE 6
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2349
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2350
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2351 static gboolean image_scroller_update_cb(gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2352 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2353 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2354 gint x, y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2355 gint xinc, yinc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2356
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2357 /* this was a simple scroll by difference between scroller and mouse position,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2358 * but all this math results in a smoother result and accounts for a dead zone.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2359 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2360
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2361 if (abs(imd->scroller_xpos - imd->scroller_x) < SCROLLER_DEAD_ZONE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2362 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2363 x = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2364 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2365 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2366 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2367 gint shift = SCROLLER_DEAD_ZONE / 2 * SCROLLER_UPDATES_PER_SEC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2368 x = (imd->scroller_xpos - imd->scroller_x) / 2 * SCROLLER_UPDATES_PER_SEC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2369 x += (x > 0) ? -shift : shift;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2370 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2371
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2372 if (abs(imd->scroller_ypos - imd->scroller_y) < SCROLLER_DEAD_ZONE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2373 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2374 y = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2375 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2376 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2377 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2378 gint shift = SCROLLER_DEAD_ZONE / 2 * SCROLLER_UPDATES_PER_SEC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2379 y = (imd->scroller_ypos - imd->scroller_y) / 2 * SCROLLER_UPDATES_PER_SEC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2380 y += (y > 0) ? -shift : shift;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2381 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2382
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2383 if (abs(x) < SCROLLER_DEAD_ZONE * SCROLLER_UPDATES_PER_SEC)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2384 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2385 xinc = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2386 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2387 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2388 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2389 xinc = imd->scroller_xinc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2390
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2391 if (x >= 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2392 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2393 if (xinc < 0) xinc = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2394 if (x < xinc) xinc = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2395 if (x > xinc) xinc = MIN(xinc + x / SCROLLER_UPDATES_PER_SEC, x);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2396 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2397 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2398 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2399 if (xinc > 0) xinc = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2400 if (x > xinc) xinc = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2401 if (x < xinc) xinc = MAX(xinc + x / SCROLLER_UPDATES_PER_SEC, x);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2402 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2403 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2404
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2405 if (abs(y) < SCROLLER_DEAD_ZONE * SCROLLER_UPDATES_PER_SEC)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2406 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2407 yinc = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2408 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2409 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2410 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2411 yinc = imd->scroller_yinc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2412
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2413 if (y >= 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2414 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2415 if (yinc < 0) yinc = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2416 if (y < yinc) yinc = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2417 if (y > yinc) yinc = MIN(yinc + y / SCROLLER_UPDATES_PER_SEC, y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2418 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2419 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2420 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2421 if (yinc > 0) yinc = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2422 if (y > yinc) yinc = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2423 if (y < yinc) yinc = MAX(yinc + y / SCROLLER_UPDATES_PER_SEC, y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2424 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2425 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2426
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2427 imd->scroller_xinc = xinc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2428 imd->scroller_yinc = yinc;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2429
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2430 xinc = xinc / SCROLLER_UPDATES_PER_SEC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2431 yinc = yinc / SCROLLER_UPDATES_PER_SEC;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2432
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2433 image_scroll(imd, xinc, yinc);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2434
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2435 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2436 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2437
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2438 static void image_scroller_timer_set(ImageWindow *imd, gint start)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2439 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2440 if (imd->scroller_id != -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2441 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2442 g_source_remove(imd->scroller_id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2443 imd->scroller_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2444 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2445
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2446 if (start)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2447 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2448 imd->scroller_id = g_timeout_add(1000 / SCROLLER_UPDATES_PER_SEC,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2449 image_scroller_update_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2450 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2451 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2452
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2453 static void image_scroller_start(ImageWindow *imd, gint x, gint y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2454 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2455 if (imd->scroller_overlay == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2456 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2457 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2458 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2459
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2460 pixbuf = pixbuf_inline(PIXBUF_INLINE_SCROLLER);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2461 w = gdk_pixbuf_get_width(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2462 h = gdk_pixbuf_get_height(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2463
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2464 imd->scroller_overlay = image_overlay_add(imd, pixbuf, x - w / 2, y - h / 2, FALSE, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2465 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2466
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2467 imd->scroller_x = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2468 imd->scroller_y = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2469 imd->scroller_xpos = x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2470 imd->scroller_ypos = y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2471
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2472 image_scroller_timer_set(imd, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2473 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2474
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2475 static void image_scroller_stop(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2476 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2477 if (imd->scroller_id == -1) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2478
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2479 image_overlay_remove(imd, imd->scroller_overlay);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2480 imd->scroller_overlay = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2481
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2482 image_scroller_timer_set(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2483 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2484
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2485 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2486 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2487 * mouse stuff
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2488 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2489 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2490
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2491 static gint image_mouse_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2492 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2493 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2494
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2495 if (imd->scroller_id != -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2496 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2497 imd->scroller_xpos = bevent->x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2498 imd->scroller_ypos = bevent->y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2499 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2500
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2501 if (!imd->in_drag || !gdk_pointer_is_grabbed()) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2502
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2503 if (imd->drag_moved < IMAGE_DRAG_SCROLL_THRESHHOLD)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2504 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2505 imd->drag_moved++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2506 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2507 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2508 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2509 widget_set_cursor (imd->image, GDK_FLEUR);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2510 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2511
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2512 /* do the scroll */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2513 image_scroll_real(imd, imd->drag_last_x - bevent->x, imd->drag_last_y - bevent->y);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2514
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2515 imd->drag_last_x = bevent->x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2516 imd->drag_last_y = bevent->y;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2517
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2518 return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2519 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2520
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2521 static gint image_mouse_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2522 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2523 ImageWindow *imd = data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2524
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2525 if (imd->scroller_id != -1) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2526
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2527 switch (bevent->button)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2528 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2529 case 1:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2530 imd->in_drag = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2531 imd->drag_last_x = bevent->x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2532 imd->drag_last_y = bevent->y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2533 imd->drag_moved = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2534 gdk_pointer_grab(imd->image->window, FALSE,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2535 GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2536 NULL, NULL, bevent->time);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2537 gtk_grab_add(imd->image);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2538 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2539 case 2:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2540 imd->drag_moved = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2541 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2542 case 3:
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2543 image_button_do(imd, bevent);
4
e149abcda4eb Syncing to 0.8.1
gqview
parents: 3
diff changeset
2544 break;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2545 default:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2546 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2547 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2548
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2549 gtk_widget_grab_focus(imd->widget);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2550
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2551 return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2552 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2553
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2554 static gint image_mouse_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2555 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2556 ImageWindow *imd = data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2557
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2558 if (imd->scroller_id != -1)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2559 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2560 image_scroller_stop(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2561 return TRUE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2562 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2563
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2564 if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB(imd->image))
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2565 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2566 gtk_grab_remove(imd->image);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2567 gdk_pointer_ungrab(bevent->time);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2568 widget_set_cursor(imd->image, -1);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2569 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2570
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2571 if (bevent->button == 1 && (bevent->state & GDK_SHIFT_MASK))
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2572 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2573 image_scroller_start(imd, bevent->x, bevent->y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2574 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2575 else if (bevent->button == 1 || bevent->button == 2)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2576 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2577 if (imd->drag_moved < IMAGE_DRAG_SCROLL_THRESHHOLD) image_button_do(imd, bevent);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2578 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2579
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2580 imd->in_drag = FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2581
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2582 return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2583 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2584
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2585 static gint image_mouse_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2586 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2587 ImageWindow *imd = data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2588
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2589 if (imd->scroller_id != -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2590 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2591 imd->scroller_xpos = imd->scroller_x;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2592 imd->scroller_ypos = imd->scroller_y;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2593 imd->scroller_xinc = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2594 imd->scroller_yinc = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2595 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2596
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2597 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2598 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2599
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2600 static gint image_scroll_cb(GtkWidget *widget, GdkEventScroll *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2601 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2602 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2603
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2604 if (imd->func_scroll &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2605 event && event->type == GDK_SCROLL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2606 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2607 imd->func_scroll(imd, event->direction, event->time,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2608 event->x, event->y, event->state, imd->data_scroll);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2609 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2610 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2611
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2612 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2613 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2614
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2615 static void image_mouse_drag_cb(GtkWidget *widget, GdkDragContext *context, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2616 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2617 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2618
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2619 imd->drag_moved = IMAGE_DRAG_SCROLL_THRESHHOLD;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2620 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2621
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2622 /*
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2623 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2624 * drag and drop
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2625 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2626 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2627
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2628 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2629 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2630 * public interface
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2631 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2632 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2633
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2634 void image_attach_window(ImageWindow *imd, GtkWidget *window,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2635 const gchar *title, const gchar *title_right, gint show_zoom)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2636 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2637 imd->top_window = window;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2638 g_free(imd->title);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2639 imd->title = g_strdup(title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2640 g_free(imd->title_right);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2641 imd->title_right = g_strdup(title_right);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2642 imd->title_show_zoom = show_zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2643
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2644 image_update_title(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2645 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2646
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2647 void image_set_update_func(ImageWindow *imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2648 void (*func)(ImageWindow *imd, gpointer data),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2649 gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2650 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2651 imd->func_update = func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2652 imd->data_update = data;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2653 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2654
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2655 void image_set_complete_func(ImageWindow *imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2656 void (*func)(ImageWindow *, gint preload, gpointer),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2657 gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2658 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2659 imd->func_complete = func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2660 imd->data_complete = data;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2661 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2662
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2663 void image_set_new_func(ImageWindow *imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2664 void (*func)(ImageWindow *, gpointer),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2665 gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2666 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2667 imd->func_new = func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2668 imd->data_new = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2669 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2670
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2671
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2672 static void image_button_do(ImageWindow *imd, GdkEventButton *bevent)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2673 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2674 if (imd->func_button &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2675 bevent &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2676 (bevent->type == GDK_BUTTON_PRESS || bevent->type == GDK_BUTTON_RELEASE))
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2677 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2678 imd->func_button(imd, bevent->button, bevent->time,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2679 bevent->x, bevent->y, bevent->state, imd->data_button);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2680 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2681 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2682
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2683 void image_set_button_func(ImageWindow *imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2684 void (*func)(ImageWindow *, gint button, guint32 time, gdouble x, gdouble y, guint state, gpointer),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2685 gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2686 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2687 imd->func_button = func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2688 imd->data_button = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2689 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2690
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2691 void image_set_scroll_func(ImageWindow *imd,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2692 void (*func)(ImageWindow *, GdkScrollDirection direction, guint32 time, gdouble x, gdouble y, guint state, gpointer),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2693 gpointer data)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2694 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2695 imd->func_scroll = func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2696 imd->data_scroll = data;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2697 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2698
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2699 /* path, name */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2700
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2701 const gchar *image_get_path(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2702 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2703 return imd->image_path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2704 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2705
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2706 const gchar *image_get_name(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2707 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2708 return imd->image_name;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2709 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2710
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2711 /* merely changes path string, does not change the image! */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2712 void image_set_path(ImageWindow *imd, const gchar *newpath)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2713 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2714 g_free(imd->image_path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2715 imd->image_path = g_strdup(newpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2716 imd->image_name = filename_from_path(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2717
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2718 image_update_title(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2719 image_new_util(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2720 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2721
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2722 /* load a new image */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2723
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2724 void image_change_path(ImageWindow *imd, const gchar *path, gdouble zoom)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2725 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2726 if (imd->image_path == path ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2727 (path && imd->image_path && !strcmp(path, imd->image_path)) ) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2728
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2729 image_change_real(imd, path, NULL, NULL, zoom);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2730 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2731
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2732 void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2733 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2734 image_set_pixbuf(imd, pixbuf, zoom, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2735 image_new_util(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2736 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2737
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2738 void image_change_from_collection(ImageWindow *imd, CollectionData *cd, CollectInfo *info, gdouble zoom)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2739 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2740 if (!cd || !info || !g_list_find(cd->list, info)) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2741
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2742 image_change_real(imd, info->path, cd, info, zoom);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2743 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2744
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2745 CollectionData *image_get_collection(ImageWindow *imd, CollectInfo **info)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2746 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2747 if (collection_to_number(imd->collection) >= 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2748 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2749 if (g_list_find(imd->collection->list, imd->collection_info) != NULL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2750 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2751 if (info) *info = imd->collection_info;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2752 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2753 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2754 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2755 if (info) *info = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2756 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2757 return imd->collection;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2758 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2759
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2760 if (info) *info = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2761 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2762 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2763
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2764 static void image_loader_sync_data(ImageLoader *il, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2765 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2766 /* change data for the callbacks directly */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2767
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2768 il->data_area_ready = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2769 il->data_error = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2770 il->data_done = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2771 il->data_percent = data;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2772 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2773
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2774 /* this is more like a move function
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2775 * it moves most data from source to imd, source does keep a ref on the pixbuf
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2776 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2777 void image_change_from_image(ImageWindow *imd, ImageWindow *source)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2778 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2779 if (imd == source) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2780
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2781 imd->unknown = source->unknown;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2782
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2783 image_set_pixbuf(imd, source->pixbuf, image_zoom_get(source), TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2784
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2785 imd->collection = source->collection;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2786 imd->collection_info = source->collection_info;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2787 imd->size = source->size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2788 imd->mtime = source->mtime;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2789
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2790 image_set_path(imd, image_get_path(source));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2791
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2792 image_loader_free(imd->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2793 imd->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2794
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2795 if (imd->pixbuf && source->il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2796 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2797 imd->il = source->il;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2798 source->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2799
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2800 image_loader_sync_data(imd->il, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2801
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2802 imd->delay_alter_type = source->delay_alter_type;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2803 source->delay_alter_type = ALTER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2804 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2805
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2806 image_loader_free(imd->read_ahead_il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2807 imd->read_ahead_il = source->read_ahead_il;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2808 source->read_ahead_il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2809 if (imd->read_ahead_il) image_loader_sync_data(imd->read_ahead_il, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2810
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2811 if (imd->read_ahead_pixbuf) g_object_unref(imd->read_ahead_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2812 imd->read_ahead_pixbuf = source->read_ahead_pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2813 source->read_ahead_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2814
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2815 g_free(imd->read_ahead_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2816 imd->read_ahead_path = source->read_ahead_path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2817 source->read_ahead_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2818
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2819 if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2820 imd->prev_pixbuf = source->prev_pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2821 source->prev_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2822
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2823 g_free(imd->prev_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2824 imd->prev_path = source->prev_path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2825 source->prev_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2826
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2827 imd->completed = source->completed;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2828
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2829 imd->x_scroll = source->x_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2830 imd->y_scroll = source->y_scroll;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2831
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2832 image_scroll_clamp(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2833 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2834
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2835 /* manipulation */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2836
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2837 void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2838 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2839 gint sx, sy, sw, sh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2840
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2841 sx = (gint)floor((double)x * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2842 sy = (gint)floor((double)y * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2843 sw = (gint)ceil((double)width * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2844 sh = (gint)ceil((double)height * imd->scale);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2845
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2846 image_queue(imd, sx, sy, sw, sh, FALSE, TILE_RENDER_AREA, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2847 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2848
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2849 void image_reload(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2850 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2851 image_change_complete(imd, imd->zoom, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2852 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2853
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2854 void image_scroll(ImageWindow *imd, gint x, gint y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2855 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2856 image_scroll_real(imd, x, y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2857 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2858
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2859 void image_alter(ImageWindow *imd, AlterType type)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2860 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2861 if (imd->il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2862 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2863 /* still loading, wait till done */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2864 imd->delay_alter_type = type;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2865 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2866 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2867
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2868 image_alter_real(imd, type, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2869 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2870
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2871 /* zoom */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2872
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2873 static void image_zoom_adjust_real(ImageWindow *imd, gdouble increment,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2874 gint center_point, gint x, gint y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2875 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2876 gdouble zoom = imd->zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2877
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2878 if (increment == 0.0) return; /* avoid possible div by zero, a no-op anyway... */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2879
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2880 if (zoom == 0.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2881 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2882 if (imd->scale < 1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2883 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2884 zoom = 0.0 - 1.0 / imd->scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2885 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2886 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2887 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2888 zoom = imd->scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2889 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2890 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2891
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2892 if (increment < 0.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2893 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2894 if (zoom >= 1.0 && zoom + increment < 1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2895 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2896 zoom = zoom + increment - 2.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2897 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2898 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2899 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2900 zoom = zoom + increment;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2901 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2902 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2903 else
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2904 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2905 if (zoom <= -1.0 && zoom + increment > -1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2906 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2907 zoom = zoom + increment + 2.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2908 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2909 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2910 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2911 zoom = zoom + increment;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2912 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2913 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2914
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2915 image_zoom_sync(imd, zoom, FALSE, FALSE, FALSE, center_point, x, y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2916 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2917
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2918 void image_zoom_adjust(ImageWindow *imd, gdouble increment)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2919 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2920 image_zoom_adjust_real(imd, increment, FALSE, 0, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2921 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2922
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2923 void image_zoom_adjust_at_point(ImageWindow *imd, gdouble increment, gint x, gint y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2924 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2925 image_zoom_adjust_real(imd, increment, TRUE, x, y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2926 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2927
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2928 void image_zoom_set(ImageWindow *imd, gdouble zoom)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2929 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2930 image_zoom_sync(imd, zoom, FALSE, FALSE, FALSE, FALSE, 0, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2931 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2932
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2933 void image_zoom_set_fill_geometry(ImageWindow *imd, gint vertical)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2934 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2935 gdouble zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2936
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2937 if (!imd->pixbuf || imd->image_width < 1 || imd->image_height < 1) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2938
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2939 if (vertical)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2940 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2941 zoom = (gdouble)imd->window_height / imd->image_height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2942 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2943 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2944 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2945 zoom = (gdouble)imd->window_width / imd->image_width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2946 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2947
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2948 if (zoom < 1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2949 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2950 zoom = 0.0 - 1.0 / zoom;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2951 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2952
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2953 image_zoom_set(imd, zoom);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2954 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2955
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2956 gdouble image_zoom_get(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2957 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2958 return imd->zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2959 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2960
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2961 gdouble image_zoom_get_real(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2962 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2963 return imd->scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2964 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2965
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2966 gchar *image_zoom_get_as_text(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2967 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2968 gdouble l = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2969 gdouble r = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2970 gint pl = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2971 gint pr = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2972 gchar *approx = " ";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2973
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2974 if (imd->zoom > 0.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2975 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2976 l = imd->zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2977 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2978 else if (imd->zoom < 0.0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2979 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2980 r = 0.0 - imd->zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2981 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2982 else if (imd->zoom == 0.0 && imd->scale != 0.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2983 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2984 if (imd->scale >= 1.0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2985 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2986 l = imd->scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2987 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2988 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2989 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2990 r = 1.0 / imd->scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2991 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2992 approx = " ~";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2993 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2994
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2995 if (rint(l) != l) pl = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2996 if (rint(r) != r) pr = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2997
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2998 return g_strdup_printf("%.*f :%s%.*f", pl, l, approx, pr, r);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
2999 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3000
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3001 gdouble image_zoom_get_default(ImageWindow *imd, gint mode)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3002 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3003 gdouble zoom;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3004
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3005 if (mode == ZOOM_RESET_ORIGINAL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3006 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3007 zoom = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3008 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3009 else if (mode == ZOOM_RESET_FIT_WINDOW)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3010 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3011 zoom = 0.0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3012 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3013 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3014 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3015 if (imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3016 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3017 zoom = image_zoom_get(imd);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3018 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3019 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3020 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3021 zoom = 1.0;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3022 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3023 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3024
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3025 return zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3026 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3027
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3028 /* read ahead */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3029
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3030 void image_prebuffer_set(ImageWindow *imd, const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3031 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3032 if (path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3033 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3034 image_read_ahead_set(imd, path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3035 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3036 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3037 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3038 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3039 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3040 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3041
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3042 static gint image_auto_refresh_cb(gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3043 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3044 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3045 time_t newtime;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3046
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3047 if (!imd || !imd->pixbuf ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3048 imd->il || !imd->image_path ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3049 !update_on_time_change) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3050
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3051 newtime = filetime(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3052 if (newtime > 0 && newtime != imd->mtime)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3053 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3054 imd->mtime = newtime;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3055 image_reload(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3056 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3057
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3058 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3059 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3060
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3061 /* image auto refresh on time stamp change, in 1/1000's second, -1 disables */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3062
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3063 void image_auto_refresh(ImageWindow *imd, gint interval)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3064 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3065 if (!imd) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3066
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3067 if (imd->auto_refresh_id > -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3068 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3069 g_source_remove(imd->auto_refresh_id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3070 imd->auto_refresh_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3071 imd->auto_refresh_interval = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3072 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3073
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3074 if (interval < 0) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3075
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3076 if (interval == 0) interval = IMAGE_AUTO_REFRESH_TIME;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3077
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3078 imd->auto_refresh_id = g_timeout_add((guint32)interval, image_auto_refresh_cb, imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3079 imd->auto_refresh_interval = interval;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3080 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3081
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3082 /* allow top window to be resized ? */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3083
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3084 void image_top_window_set_sync(ImageWindow *imd, gint allow_sync)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3085 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3086 imd->top_window_sync = allow_sync;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3087 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3088
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3089 /* background colors */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3090
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3091 void image_background_set_black(ImageWindow *imd, gint black)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3092 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3093 GtkStyle *style;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3094
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3095 if (!imd) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3096
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3097 style = gtk_style_copy(gtk_widget_get_style(imd->widget));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3098 g_object_ref(G_OBJECT(style));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3099
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3100 if (black)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3101 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3102 style->bg[GTK_STATE_NORMAL] = style->black;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3103 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3104
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3105 gtk_widget_set_style(imd->image, style);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3106 g_object_unref(G_OBJECT(style));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3107
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3108 if (GTK_WIDGET_VISIBLE(imd->widget)) image_border_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3109 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3110
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3111 void image_background_set_color(ImageWindow *imd, GdkColor *color)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3112 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3113 GtkStyle *style;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3114
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3115 if (!imd) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3116
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3117 style = gtk_style_copy(gtk_widget_get_style(imd->widget));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3118 g_object_ref(G_OBJECT(style));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3119
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3120 if (color)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3121 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3122 GdkColor *slot;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3123
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3124 slot = &style->bg[GTK_STATE_NORMAL];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3125
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3126 slot->red = color->red;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3127 slot->green = color->green;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3128 slot->blue = color->blue;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3129 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3130
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3131 gtk_widget_set_style(imd->image, style);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3132 g_object_unref(G_OBJECT(style));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3133
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3134 if (GTK_WIDGET_VISIBLE(imd->widget)) image_border_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3135 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3136
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3137 void image_set_delay_flip(ImageWindow *imd, gint delay)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3138 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3139 if (!imd ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3140 imd->delay_flip == delay) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3141
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3142 imd->delay_flip = delay;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3143 if (!imd->delay_flip && imd->il)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3144 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3145 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3146 imd->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3147 image_load_pixbuf_ready(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3148
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3149 image_queue_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3150 image_queue(imd, 0, 0, imd->width, imd->height, FALSE, TILE_RENDER_AREA, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3151 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3152 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3153
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3154 /* wallpaper util */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3155
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3156 void image_to_root_window(ImageWindow *imd, gint scaled)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3157 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3158 GdkScreen *screen;
3
gqview
parents: 1
diff changeset
3159 GdkWindow *rootwindow;
gqview
parents: 1
diff changeset
3160 GdkPixmap *pixmap;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3161 GdkPixbuf *pb;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3162
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3163 if (!imd || !imd->pixbuf) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3164
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3165
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3166 screen = gtk_widget_get_screen(imd->image);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3167 rootwindow = gdk_screen_get_root_window(screen);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3168 if (gdk_drawable_get_visual(rootwindow) != gdk_visual_get_system()) return;
3
gqview
parents: 1
diff changeset
3169
gqview
parents: 1
diff changeset
3170 if (scaled)
gqview
parents: 1
diff changeset
3171 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3172 pb = gdk_pixbuf_scale_simple(imd->pixbuf, gdk_screen_width(), gdk_screen_height(), (GdkInterpType)zoom_quality);
3
gqview
parents: 1
diff changeset
3173 }
gqview
parents: 1
diff changeset
3174 else
gqview
parents: 1
diff changeset
3175 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3176 pb = gdk_pixbuf_scale_simple(imd->pixbuf, imd->width, imd->height, (GdkInterpType)zoom_quality);
3
gqview
parents: 1
diff changeset
3177 }
gqview
parents: 1
diff changeset
3178
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3179 gdk_pixbuf_render_pixmap_and_mask (pb, &pixmap, NULL, 128);
3
gqview
parents: 1
diff changeset
3180 gdk_window_set_back_pixmap(rootwindow, pixmap, FALSE);
gqview
parents: 1
diff changeset
3181 gdk_window_clear(rootwindow);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3182 g_object_unref(pb);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3183 g_object_unref(pixmap);
3
gqview
parents: 1
diff changeset
3184
gqview
parents: 1
diff changeset
3185 gdk_flush();
gqview
parents: 1
diff changeset
3186 }
gqview
parents: 1
diff changeset
3187
gqview
parents: 1
diff changeset
3188
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3189 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3190 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3191 * init / destroy
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3192 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3193 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3194
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3195 static void image_free(ImageWindow *imd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3196 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3197 image_read_ahead_cancel(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3198 image_post_buffer_set(imd, NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3199 image_auto_refresh(imd, -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3200
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3201 g_free(imd->image_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3202 g_free(imd->title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3203 g_free(imd->title_right);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3204
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3205 image_reset(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3206 image_tile_sync_count(imd, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3207 if (imd->pixbuf) g_object_unref(imd->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3208
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3209 image_scroller_timer_set(imd, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3210
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3211 image_overlay_list_clear(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3212
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3213 g_free(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3214 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3215
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3216 static void image_destroy_cb(GtkObject *widget, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3217 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3218 ImageWindow *imd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3219 image_free(imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3220 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3221
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3222 ImageWindow *image_new(gint frame)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3223 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3224 ImageWindow *imd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3225
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3226 imd = g_new0(ImageWindow, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3227 imd->zoom = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3228 imd->scale = 1.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3229
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3230 imd->draw_idle_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3231
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3232 imd->tile_width = IMAGE_TILE_SIZE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3233 imd->tile_height = IMAGE_TILE_SIZE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3234
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3235 imd->top_window = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3236 imd->title = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3237 imd->title_right = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3238 imd->title_show_zoom = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3239
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3240 imd->unknown = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3241
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3242 imd->pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3244 imd->has_frame = frame;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3245 imd->top_window_sync = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3246
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3247 imd->tile_cache = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3248 imd->tile_cache_size = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3249
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3250 imd->delay_alter_type = ALTER_NONE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3251
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3252 imd->read_ahead_il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3253 imd->read_ahead_pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3254 imd->read_ahead_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3255
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3256 imd->completed = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3257
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3258 imd->auto_refresh_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3259 imd->auto_refresh_interval = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3260
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3261 imd->delay_flip = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3262
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3263 imd->func_update = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3264 imd->func_complete = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3265
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3266 imd->func_button = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3267 imd->func_scroll = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3268
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3269 imd->scroller_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3270 imd->scroller_overlay = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3271
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3272 imd->image = gtk_drawing_area_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3273 gtk_widget_set_double_buffered(imd->image, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3274
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3275 if (imd->has_frame)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3276 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3277 imd->widget = gtk_frame_new(NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3278 gtk_frame_set_shadow_type(GTK_FRAME(imd->widget), GTK_SHADOW_IN);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3279 gtk_container_add(GTK_CONTAINER(imd->widget), imd->image);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3280 gtk_widget_show(imd->image);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3281
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3282 GTK_WIDGET_SET_FLAGS(imd->widget, GTK_CAN_FOCUS);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3283 g_signal_connect(G_OBJECT(imd->widget), "focus_in_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3284 G_CALLBACK(image_focus_in_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3285 g_signal_connect(G_OBJECT(imd->widget), "focus_out_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3286 G_CALLBACK(image_focus_out_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3287
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3288 g_signal_connect_after(G_OBJECT(imd->widget), "expose_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3289 G_CALLBACK(image_focus_expose), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3290 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3291 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3292 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3293 imd->widget = imd->image;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3294 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3295
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3296 g_signal_connect(G_OBJECT(imd->image), "motion_notify_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3297 G_CALLBACK(image_mouse_motion_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3298 g_signal_connect(G_OBJECT(imd->image), "button_press_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3299 G_CALLBACK(image_mouse_press_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3300 g_signal_connect(G_OBJECT(imd->image), "button_release_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3301 G_CALLBACK(image_mouse_release_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3302 g_signal_connect(G_OBJECT(imd->image), "leave_notify_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3303 G_CALLBACK(image_mouse_leave_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3304 gtk_widget_set_events(imd->image, GDK_POINTER_MOTION_MASK |
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3305 GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK |
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3306 GDK_LEAVE_NOTIFY_MASK);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3307
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3308 g_signal_connect(G_OBJECT(imd->image), "expose_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3309 G_CALLBACK(image_expose_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3310 g_signal_connect_after(G_OBJECT(imd->image), "size_allocate",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3311 G_CALLBACK(image_size_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3312
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3313 g_signal_connect(G_OBJECT(imd->image), "drag_begin",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3314 G_CALLBACK(image_mouse_drag_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3315 g_signal_connect(G_OBJECT(imd->image), "scroll_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3316 G_CALLBACK(image_scroll_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3317
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3318 g_signal_connect(G_OBJECT(imd->widget), "destroy",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3319 G_CALLBACK(image_destroy_cb), imd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3320
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3321 return imd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3322 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 4
diff changeset
3323