annotate src/thumb.c @ 8:e0d0593d519e

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:07:07 +0000
parents c0e337a01cb7
children d907d608745f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2 * GQview image viewer
3
gqview
parents: 1
diff changeset
3 * (C)2000 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 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
7 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
8
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
9 #include "gqview.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10 #include "icons/img_unknown.xpm" /* fixme! duplicate, included in image.c too */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
12 #define THUMBNAIL_CACHE_DIR "/.gqview_thmb"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
14 static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15 static void normalize_thumb(gint *width, gint *height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
16 static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
17
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
18 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
19 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
20 * thumbnail routines: creation, caching, and maintenance (public)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
22 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
23
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
24 gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
25 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
26 gint width, height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
27 gint space;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
28 GdkImlibImage *thumb = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
29 GdkImlibImage *image = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
30 gint cached = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
31
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
32 if (debug) printf("Gen thumbnail:%s\n",path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
33
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
34 /* if xvpics enabled, check for that first */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
35 if (use_xvpics_thumbnails)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
36 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
37 space = get_xv_thumbnail(path, thumb_pixmap, thumb_mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
38 if (space != -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
40 if (debug) printf("XV thumbnail found, loaded\n");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
41 return space;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
42 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
44
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
45 /* start load from cache */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
46
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
47 if (enable_thumb_caching)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
48 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
49 gchar *cache_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
50 cache_path = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, path, ".png", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
51
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
52 if (isfile(cache_path) && filetime(cache_path) >= filetime(path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
53 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
54 if (debug) printf("Found in cache:%s\n", path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
55 image = gdk_imlib_load_image(cache_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
56 if (image && image->rgb_width != thumb_max_width && image->rgb_height != thumb_max_height)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
57 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
58 if (debug) printf("Thumbnail size may have changed, reloading:%s\n", path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
59 unlink(cache_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
60 gdk_imlib_destroy_image(image);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
61 image = gdk_imlib_load_image(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
62 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
63 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
64 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
65 cached = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
66 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
67 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
68 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
69 image = gdk_imlib_load_image(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
70
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
71 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
72 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
73 image = gdk_imlib_load_image(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
74
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
75 if (!image)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
76 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
77 image = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
78 cached = TRUE; /* no need to save a thumbnail of the unknown pixmap */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
79 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
80
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
81 if (image)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
82 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
83 if (image->rgb_width > thumb_max_width || image->rgb_height > thumb_max_height)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
84 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
85 if (((float)thumb_max_width / image->rgb_width) < ((float)thumb_max_height / image->rgb_height))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
86 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
87 width = thumb_max_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
88 height = (float)width / image->rgb_width * image->rgb_height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
89 if (height < 1) height = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
90 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
91 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
92 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
93 height = thumb_max_height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
94 width = (float)height / image->rgb_height * image->rgb_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
95 if (width < 1) width = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
96 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
97 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
98 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
99 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
100 width = image->rgb_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
101 height = image->rgb_height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
102 cached = TRUE; /* don't cache images smaller than thumbnail size */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
103 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
104 if (*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
105 *thumb_pixmap = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
106 *thumb_mask = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
107
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
108 /* start save cache */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
109
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
110 if (enable_thumb_caching && !cached)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
111 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
112 gchar *thumb_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
113 gchar *base_dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
114 gchar *thumb_dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
115 gchar *image_dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
116
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
117 /* attempt at speed-up? move this here */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
118 thumb = gdk_imlib_clone_scaled_image(image, width, height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
119 gdk_imlib_destroy_image(image);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
120 image = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
121
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
122 base_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
123 if (!isdir(base_dir))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
124 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
125 if (debug) printf("creating thumbnail dir:%s\n", base_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
126 if (mkdir(base_dir, 0755) < 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
127 printf(_("create dir failed: %s\n"), base_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
128 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
129
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
130 image_dir = remove_level_from_path(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
131 thumb_dir = g_strconcat(base_dir, image_dir, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
132 g_free(image_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
133 if (!isdir(thumb_dir))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
134 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
135 gchar *p = thumb_dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
136 while (p[0] != '\0')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
137 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
138 p++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
139 if (p[0] == '/' || p[0] == '\0')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
140 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
141 gint end = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
142 if (p[0] != '\0')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
143 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
144 p[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
145 end = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
146 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
147 if (!isdir(thumb_dir))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
149 if (debug) printf("creating sub dir:%s\n",thumb_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
150 if (mkdir(thumb_dir, 0755) < 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
151 printf(_("create dir failed: %s\n"), thumb_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
152 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
153 if (!end) p[0] = '/';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
154 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
155 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
156 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
157 g_free(thumb_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
158
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
159 thumb_path = g_strconcat(base_dir, path, ".png", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
160 if (debug) printf("Saving thumb: %s\n",thumb_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
161
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
162 gdk_imlib_save_image(thumb, thumb_path, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
163
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
164 g_free(base_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
165 g_free(thumb_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
166 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
167 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
168 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
169 thumb = image;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
170 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
171
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
172 /* end save cache */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
173
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
174 gdk_imlib_render(thumb, width, height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
175 *thumb_pixmap = gdk_imlib_move_image(thumb);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
176 *thumb_mask = gdk_imlib_move_mask(thumb);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
177 if (*thumb_pixmap)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
178 space = thumb_max_width - width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
179 gdk_imlib_destroy_image(thumb);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
180 thumb = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
181 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
182 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
183 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
184 space = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
185 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
186 return space;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
187 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
188
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
189 gint maintain_thumbnail_dir(gchar *dir, gint recursive)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
190 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
191 gchar *thumb_dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
192 gint base_length;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
193 gint still_have_a_file = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
194
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
195 if (debug) printf("maintainance check: %s\n", dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
196
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
197 base_length = strlen(homedir()) + strlen(THUMBNAIL_CACHE_DIR);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
198 thumb_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, dir, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
199
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
200 if (isdir(thumb_dir))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
201 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
202 DIR *dp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
203 struct dirent *dirent;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
204 struct stat ent_sbuf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
205
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
206 if((dp = opendir(thumb_dir))==NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
207 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
208 /* dir not found */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
209 g_free(thumb_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
210 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
211 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
212
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
213 while ((dirent = readdir(dp)) != NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
214 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
215 /* skips removed files */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
216 if (dirent->d_ino > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
217 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
218 int l = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
219 gchar *path_buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
220 if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
221 continue;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
222 path_buf = g_strconcat(thumb_dir, "/", dirent->d_name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
223 if (strlen(path_buf) > 4) l = strlen(path_buf) - 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
224
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
225 if (stat(path_buf,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
226 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
227 /* recurse dir then delete it */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
228 gchar *rdir = g_strconcat(dir, "/", dirent->d_name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
229 if (recursive && !maintain_thumbnail_dir(rdir, TRUE))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
230 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
231 if (debug) printf("Deleting thumb dir: %s\n",path_buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
232 if ( (rmdir (path_buf) < 0) )
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
233 printf(_("Unable to delete dir: %s\n"), path_buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
234 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
235 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
236 still_have_a_file = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
237 g_free(rdir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
238 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
239 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
240 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
241 gchar *fp = path_buf + l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
242 fp[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
243 if (strlen(path_buf) > base_length &&
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
244 !isfile(path_buf + base_length))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
245 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
246 fp[0] = '.';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
247 if (debug) printf("Deleting thumb: %s\n",path_buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
248 if ( (unlink (path_buf) < 0) )
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
249 printf(_("failed to delete:%s\n"),path_buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
250 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
251 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
252 still_have_a_file = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
253 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
254 g_free(path_buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
255 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
256 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
257 closedir(dp);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
258 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
259 g_free(thumb_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
260 return still_have_a_file;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
261 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
262
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
263 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
264 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
265 * xvpics thumbnail support, read-only (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
266 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
267 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
268
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
269 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
270 * xvpics code originally supplied by:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
271 * "Diederen Damien" <D.Diederen@student.ulg.ac.be>
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
272 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
273 * Note: Code has been modified to fit the style of the other code, and to use
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
274 * a few more glib-isms.
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
275 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
276
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
277 #define XV_BUFFER 2048
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
278 static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
279 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
280 FILE *file;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
281 gchar buffer[XV_BUFFER];
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
282 guchar *data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
283 gint width, height, depth;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
284
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
285 file = fopen(filename, "rt");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
286 if(!file) return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
287
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
288 fgets(buffer, XV_BUFFER, file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
289 if(strncmp(buffer, "P7 332", 6) != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
290 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
291 fclose(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
292 return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
293 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
294
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
295 while(fgets(buffer, XV_BUFFER, file) && buffer[0] == '#') /* do_nothing() */;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
296
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
297 if(sscanf(buffer, "%d %d %d", &width, &height, &depth) != 3)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
298 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
299 fclose(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
300 return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
301 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
302
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
303 data = g_new(guchar, width * height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
304 fread(data, 1, width * height, file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
305
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
306 fclose(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307 *widthp = width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
308 *heightp = height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
309 return data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
310 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
311 #undef XV_BUFFER
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
312
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
313 static void normalize_thumb(gint *width, gint *height)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
314 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
315 if(*width > thumb_max_width || *height > thumb_max_height)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
316 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
317 gfloat factor = MAX((gfloat) *width / thumb_max_width, (gfloat) *height / thumb_max_height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
318 *width = (gfloat) *width / factor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
319 *height = (gfloat) *height / factor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
320 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
322
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323 static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
324 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
325 gint width, height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
326 gchar *thumb_name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
327 gchar *tmp_string;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
328 gchar *last_slash;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 guchar *packed_data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
330
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
331 tmp_string = g_strdup(thumb_filename);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
332 last_slash = strrchr(tmp_string, '/');
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333 if(!last_slash) return -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
334 *last_slash++ = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
336 thumb_name = g_strconcat(tmp_string, "/.xvpics/", last_slash, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
337 packed_data = load_xv_thumbnail(thumb_name, &width, &height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
338 g_free(tmp_string);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
339 g_free(thumb_name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
340
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
341 if(packed_data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
342 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
343 guchar *rgb_data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
344 GdkImlibImage *image;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
345 gint i;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
346
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
347 rgb_data = g_new(guchar, width * height * 3);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
348 for(i = 0; i < width * height; i++)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
349 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
350 rgb_data[i * 3 + 0] = (packed_data[i] >> 5) * 36;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
351 rgb_data[i * 3 + 1] = ((packed_data[i] & 28) >> 2) * 36;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
352 rgb_data[i * 3 + 2] = (packed_data[i] & 3) * 85;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
353 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
354
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
355 g_free(packed_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
356 image = gdk_imlib_create_image_from_data(rgb_data, NULL, width, height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
357 g_free(rgb_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
358 normalize_thumb(&width, &height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
359 gdk_imlib_render(image, width, height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
360
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
361 if(*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
362
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
363 *thumb_pixmap = gdk_imlib_move_image(image);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
364 *thumb_mask = gdk_imlib_move_mask(image);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
365 gdk_imlib_destroy_image(image);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
366 return thumb_max_width - width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
367 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
368
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
369 return -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
370 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
371