annotate src/thumb.c @ 1:b3e0e515fabf

Initial revision
author gqview
date Mon, 03 Apr 2000 18:24:05 +0000
parents
children c0e337a01cb7
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
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
3 * (C)1999 John Ellis
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