annotate src/thumb.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 c0e337a01cb7
children 25335c62cd9b
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: 3
diff changeset
2 * GQview
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
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: 3
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: 3
diff changeset
8 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
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: 3
diff changeset
12
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13 #include "gqview.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
14 #include "thumb.h"
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
16 #include "cache.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
17 #include "image-load.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
18 #include "pixbuf_util.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
19 #include "thumb_standard.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
20 #include "ui_fileops.h"
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
22 #include <utime.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
23
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
24
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
25 static void thumb_loader_error_cb(ImageLoader *il, gpointer data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
26 static void thumb_loader_setup(ThumbLoader *tl, gchar *path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
27
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
28 static gint normalize_thumb(gint *width, gint *height, gint max_w, gint max_h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
29 static GdkPixbuf *get_xv_thumbnail(gchar *thumb_filename, gint max_w, gint max_h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
30
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
31
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
32 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
33 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
34 * thumbnail routines: creation, caching, and maintenance (public)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
35 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
36 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
37
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
38 static gint thumb_loader_save_to_cache(ThumbLoader *tl)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
40 gchar *cache_dir;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
41 gint success = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
42 mode_t mode = 0755;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
44 if (!tl || !tl->pixbuf) return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
45
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
46 cache_dir = cache_get_location(CACHE_TYPE_THUMB, tl->path, FALSE, &mode);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
47
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
48 if (cache_ensure_dir_exists(cache_dir, mode))
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
49 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
50 gchar *cache_path;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
51 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
52
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
53 cache_path = g_strconcat(cache_dir, "/", filename_from_path(tl->path),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
54 GQVIEW_CACHE_EXT_THUMB, NULL);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
55
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
56 if (debug) printf("Saving thumb: %s\n", cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
57
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
58 pathl = path_from_utf8(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
59 success = pixbuf_to_file_as_png(tl->pixbuf, pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
60 if (success)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
61 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
62 struct utimbuf ut;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
63 /* set thumb time to that of source file */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
64
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
65 ut.actime = ut.modtime = filetime(tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
66 if (ut.modtime > 0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
67 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
68 utime(pathl, &ut);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
69 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
70 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
71 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
72 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
73 if (debug) printf("Saving failed: %s\n", pathl);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
74 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
75
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
76 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
77 g_free(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
78 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
79
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
80 g_free(cache_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
81
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
82 return success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
83 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
84
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
85 static gint thumb_loader_mark_failure(ThumbLoader *tl)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
86 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
87 gchar *cache_dir;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
88 gint success = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
89 mode_t mode = 0755;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
90
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
91 if (!tl) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
92
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
93 cache_dir = cache_get_location(CACHE_TYPE_THUMB, tl->path, FALSE, &mode);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
94
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
95 if (cache_ensure_dir_exists(cache_dir, mode))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
96 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
97 gchar *cache_path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
98 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
99 FILE *f;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
100
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
101 cache_path = g_strconcat(cache_dir, "/", filename_from_path(tl->path),
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
102 GQVIEW_CACHE_EXT_THUMB, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
103
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
104 if (debug) printf("marking thumb failure: %s\n", cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
105
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
106 pathl = path_from_utf8(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
107 f = fopen(pathl, "w");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
108 if (f)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
109 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
110 struct utimbuf ut;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
111
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
112 fclose (f);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
113
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
114 ut.actime = ut.modtime = filetime(tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
115 if (ut.modtime > 0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
116 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
117 utime(pathl, &ut);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
118 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
119
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
120 success = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
121 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
122
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
123 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
124 g_free(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
125 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
126
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
127 g_free(cache_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
128 return success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
129 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
130
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
131 static void thumb_loader_percent_cb(ImageLoader *il, gdouble percent, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
132 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
133 ThumbLoader *tl = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
134
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
135 tl->percent_done = percent;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
136
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
137 if (tl->func_progress) tl->func_progress(tl, tl->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
138 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
139
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
140 static void thumb_loader_done_cb(ImageLoader *il, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
141 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
142 ThumbLoader *tl = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
143 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
144 gint pw, ph;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
145 gint save;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
146
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
147 if (debug) printf("thumb done: %s\n", tl->path);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
149 pixbuf = image_loader_get_pixbuf(tl->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
150 if (!pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
151 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
152 if (debug) printf("...but no pixbuf: %s\n", tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
153 thumb_loader_error_cb(tl->il, tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
154 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
155 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
156
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
157 pw = gdk_pixbuf_get_width(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
158 ph = gdk_pixbuf_get_height(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
159
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
160 if (tl->cache_hit && pw != tl->max_w && ph != tl->max_h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
161 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
162 /* requested thumbnail size may have changed, load original */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
163 if (debug) printf("thumbnail size mismatch, regenerating: %s\n", tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
164 tl->cache_hit = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
165
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
166 thumb_loader_setup(tl, tl->path);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
167
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
168 if (!image_loader_start(tl->il, thumb_loader_done_cb, tl))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
169 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
170 image_loader_free(tl->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
171 tl->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
172
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
173 if (debug) printf("regeneration failure: %s\n", tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
174 thumb_loader_error_cb(tl->il, tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
175 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
176 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
177 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
178
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
179 /* scale ?? */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
180
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
181 if (pw > tl->max_w || ph > tl->max_h)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
182 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
183 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
184
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
185 if (((float)tl->max_w / pw) < ((float)tl->max_h / ph))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
186 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
187 w = tl->max_w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
188 h = (float)w / pw * ph;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
189 if (h < 1) h = 1;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
190 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
191 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
192 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
193 h = tl->max_h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
194 w = (float)h / ph * pw;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
195 if (w < 1) w = 1;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
196 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
197
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
198 tl->pixbuf = gdk_pixbuf_scale_simple(pixbuf, w, h, (GdkInterpType)thumbnail_quality);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
199 save = TRUE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
200 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
201 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
202 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
203 tl->pixbuf = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
204 gdk_pixbuf_ref(tl->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
205 save = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
206 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
207
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
208 /* save it ? */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
209 if (tl->cache_enable && save)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
210 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
211 thumb_loader_save_to_cache(tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
212 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
213
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
214 if (tl->func_done) tl->func_done(tl, tl->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
215 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
216
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
217 static void thumb_loader_error_cb(ImageLoader *il, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
218 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
219 ThumbLoader *tl = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
220
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
221 /* if at least some of the image is available, go to done_cb */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
222 if (image_loader_get_pixbuf(tl->il) != NULL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
223 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
224 thumb_loader_done_cb(il, data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
225 return;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
226 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
227
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
228 if (debug) printf("thumb error: %s\n", tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
229
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
230 image_loader_free(tl->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
231 tl->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
232
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
233 if (tl->func_error) tl->func_error(tl, tl->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
234 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
235
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
236 static gint thumb_loader_done_delay_cb(gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
237 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
238 ThumbLoader *tl = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
239
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
240 tl->idle_done_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
241
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
242 if (tl->func_done) tl->func_done(tl, tl->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
244 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
245 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
246
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
247 static void thumb_loader_delay_done(ThumbLoader *tl)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
248 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
249 if (tl->idle_done_id == -1) tl->idle_done_id = g_idle_add(thumb_loader_done_delay_cb, tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
250 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
251
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
252 static void thumb_loader_setup(ThumbLoader *tl, gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
253 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
254 image_loader_free(tl->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
255 tl->il = image_loader_new(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
256
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
257 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
258 /* this will speed up jpegs by up to 3x in some cases */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
259 image_loader_set_requested_size(tl->max_w, tl->max_h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
260 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
261
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
262 image_loader_set_error_func(tl->il, thumb_loader_error_cb, tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
263 if (tl->func_progress) image_loader_set_percent_func(tl->il, thumb_loader_percent_cb, tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
264 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
265
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
266 void thumb_loader_set_callbacks(ThumbLoader *tl,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
267 ThumbLoaderFunc func_done,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
268 ThumbLoaderFunc func_error,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
269 ThumbLoaderFunc func_progress,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
270 gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
271 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
272 if (!tl) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
273
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
274 if (tl->standard_loader)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
275 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
276 thumb_loader_std_set_callbacks((ThumbLoaderStd *)tl,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
277 (ThumbLoaderStdFunc) func_done,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
278 (ThumbLoaderStdFunc) func_error,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
279 (ThumbLoaderStdFunc) func_progress,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
280 data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
281 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
282 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
283
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
284 tl->func_done = func_done;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
285 tl->func_error = func_error;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
286 tl->func_progress = func_progress;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
287
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
288 tl->data = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
289 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
290
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
291 void thumb_loader_set_cache(ThumbLoader *tl, gint enable_cache, gint local, gint retry_failed)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
292 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
293 if (!tl) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
294
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
295 if (tl->standard_loader)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
296 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
297 thumb_loader_std_set_cache((ThumbLoaderStd *)tl, enable_cache, local, retry_failed);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
298 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
299 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
300
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
301 tl->cache_enable = enable_cache;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
302 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
303 tl->cache_local = local;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
304 tl->cache_retry = retry_failed;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
305 #endif
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
306 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
308
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
309 gint thumb_loader_start(ThumbLoader *tl, const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
310 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
311 gchar *cache_path = NULL;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
312
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
313 if (!tl) return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
314
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
315 if (tl->standard_loader)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
316 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
317 return thumb_loader_std_start((ThumbLoaderStd *)tl, path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
318 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
319
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
320 if (!tl->path && !path) return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
322 if (!tl->path) tl->path = g_strdup(path);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
324 if (tl->cache_enable)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
325 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
326 cache_path = cache_find_location(CACHE_TYPE_THUMB, tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
327
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
328 if (cache_path)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
330 if (cache_time_valid(cache_path, tl->path))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
331 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
332 if (debug) printf("Found in cache:%s\n", tl->path);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
334 if (filesize(cache_path) == 0)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
336 if (debug) printf("Broken image mark found:%s\n", cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
337 g_free(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
338 return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
339 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
340
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
341 if (debug) printf("Cache location:%s\n", cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
342 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
343 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
344 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
345 g_free(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
346 cache_path = NULL;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
347 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
348 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
349 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
350
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
351 if (!cache_path && use_xvpics_thumbnails)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
352 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
353 tl->pixbuf = get_xv_thumbnail(tl->path, tl->max_w, tl->max_h);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
354 if (tl->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
355 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
356 thumb_loader_delay_done(tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
357 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
358 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
359 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
360
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
361 if (cache_path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
362 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
363 thumb_loader_setup(tl, cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
364 g_free(cache_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
365 tl->cache_hit = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
366 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
367 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
368 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
369 thumb_loader_setup(tl, tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
370 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
371
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
372 if (!image_loader_start(tl->il, thumb_loader_done_cb, tl))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
373 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
374 /* try from original if cache attempt */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
375 if (tl->cache_hit)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
376 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
377 tl->cache_hit = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
378 print_term(_("Thumbnail image in cache failed to load, trying to recreate.\n"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
379
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
380 thumb_loader_setup(tl, tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
381 if (image_loader_start(tl->il, thumb_loader_done_cb, tl)) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
382 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
383 /* mark failed thumbnail in cache with 0 byte file */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
384 if (tl->cache_enable)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
385 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
386 thumb_loader_mark_failure(tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
387 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
388
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
389 image_loader_free(tl->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
390 tl->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
391 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
392 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
393
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
394 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
395 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
396
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
397 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
398 gint thumb_loader_to_pixmap(ThumbLoader *tl, GdkPixmap **pixmap, GdkBitmap **mask)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
399 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
400 if (!tl || !tl->pixbuf) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
401
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
402 gdk_pixbuf_render_pixmap_and_mask(tl->pixbuf, pixmap, mask, 128);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
403
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
404 return thumb_loader_get_space(tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
405 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
406 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
407
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
408 GdkPixbuf *thumb_loader_get_pixbuf(ThumbLoader *tl, gint with_fallback)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
409 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
410 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
411
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
412 if (tl && tl->standard_loader)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
413 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
414 return thumb_loader_std_get_pixbuf((ThumbLoaderStd *)tl, with_fallback);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
415 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
416
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
417 if (tl && tl->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
418 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
419 pixbuf = tl->pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
420 g_object_ref(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
421 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
422 else if (with_fallback)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
423 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
424 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
425
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
426 pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
427 w = gdk_pixbuf_get_width(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
428 h = gdk_pixbuf_get_height(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
429 if ((w > tl->max_w || h > tl->max_h) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
430 normalize_thumb(&w, &h, tl->max_w, tl->max_h))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
431 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
432 GdkPixbuf *tmp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
433
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
434 tmp = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
435 pixbuf = gdk_pixbuf_scale_simple(tmp, w, h, GDK_INTERP_NEAREST);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
436 gdk_pixbuf_unref(tmp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
437 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
438 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
439 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
440 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
441 pixbuf = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
442 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
443
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
444 return pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
445 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
446
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
447 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
448 gint thumb_loader_get_space(ThumbLoader *tl)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
449 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
450 if (!tl) return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
451
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
452 if (tl->pixbuf) return (tl->max_w - gdk_pixbuf_get_width(tl->pixbuf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
453
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
454 return tl->max_w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
455 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
456 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
457
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
458 ThumbLoader *thumb_loader_new(gint width, gint height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
459 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
460 ThumbLoader *tl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
461
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
462 if (thumbnail_spec_standard)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
463 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
464 return (ThumbLoader *)thumb_loader_std_new(width, height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
465 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
466
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
467 tl = g_new0(ThumbLoader, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
468 tl->standard_loader = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
469 tl->path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
470 tl->cache_enable = enable_thumb_caching;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
471 tl->cache_hit = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
472 tl->percent_done = 0.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
473 tl->max_w = width;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
474 tl->max_h = height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
475
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
476 tl->il = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
477
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
478 tl->idle_done_id = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
479
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
480 return tl;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
481 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
482
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
483 void thumb_loader_free(ThumbLoader *tl)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
484 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
485 if (!tl) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
486
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
487 if (tl->standard_loader)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
488 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
489 thumb_loader_std_free((ThumbLoaderStd *)tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
490 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
491 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
492
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
493 if (tl->pixbuf) gdk_pixbuf_unref(tl->pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
494 image_loader_free(tl->il);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
495 g_free(tl->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
496
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
497 if (tl->idle_done_id != -1) g_source_remove(tl->idle_done_id);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
498
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
499 g_free(tl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
500 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
501
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
502 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
503 gint thumb_from_xpm_d(const char **data, gint max_w, gint max_h, GdkPixmap **pixmap, GdkBitmap **mask)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
504 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
505 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
506 gint w, h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
507
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
508 pixbuf = gdk_pixbuf_new_from_xpm_data(data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
509 w = gdk_pixbuf_get_width(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
510 h = gdk_pixbuf_get_height(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
511
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
512 if ((w > max_w || h > max_h) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
513 normalize_thumb(&w, &h, max_w, max_h))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
514 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
515 /* scale */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
516 GdkPixbuf *tmp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
517
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
518 tmp = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
519 pixbuf = gdk_pixbuf_scale_simple(tmp, w, h, GDK_INTERP_NEAREST);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
520 gdk_pixbuf_unref(tmp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
521 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
522
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
523 gdk_pixbuf_render_pixmap_and_mask(pixbuf, pixmap, mask, 128);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
524 gdk_pixbuf_unref(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
525
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
526 return w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
527 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
528 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
529
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
530 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
531 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
532 * xvpics thumbnail support, read-only (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
533 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
534 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
535
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
536 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
537 * xvpics code originally supplied by:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
538 * "Diederen Damien" <D.Diederen@student.ulg.ac.be>
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
539 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
540 * Note: Code has been modified to fit the style of the other code, and to use
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
541 * a few more glib-isms.
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
542 * 08-28-2000: Updated to return a gdk_pixbuf, Imlib is dieing a death here.
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
543 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
544
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
545 #define XV_BUFFER 2048
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
546 static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
547 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
548 FILE *file;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
549 gchar buffer[XV_BUFFER];
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
550 guchar *data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
551 gint width, height, depth;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
552
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
553 file = fopen(filename, "rt");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
554 if(!file) return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
555
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
556 fgets(buffer, XV_BUFFER, file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
557 if(strncmp(buffer, "P7 332", 6) != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
558 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
559 fclose(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
560 return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
561 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
562
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
563 while(fgets(buffer, XV_BUFFER, file) && buffer[0] == '#') /* do_nothing() */;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
564
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
565 if(sscanf(buffer, "%d %d %d", &width, &height, &depth) != 3)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
566 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
567 fclose(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
568 return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
569 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
570
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
571 data = g_new(guchar, width * height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
572 fread(data, 1, width * height, file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
573
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
574 fclose(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
575 *widthp = width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
576 *heightp = height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
577 return data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
578 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
579 #undef XV_BUFFER
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
580
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
581 static gint normalize_thumb(gint *width, gint *height, gint max_w, gint max_h)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
582 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
583 gdouble scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
584 gint new_w, new_h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
585
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
586 scale = MIN((gdouble) max_w / *width, (gdouble) max_h / *height);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
587 new_w = *width * scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
588 new_h = *height * scale;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
589
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
590 if (new_w != *width || new_h != *height)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
591 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
592 *width = new_w;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
593 *height = new_h;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
594 return TRUE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
595 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
596
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
597 return FALSE;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
598 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
599
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
600 static void free_rgb_buffer(guchar *pixels, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
601 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
602 g_free(pixels);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
603 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
604
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
605 static GdkPixbuf *get_xv_thumbnail(gchar *thumb_filename, gint max_w, gint max_h)
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
606 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
607 gint width, height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
608 gchar *thumb_name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
609 gchar *tmp_string;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
610 gchar *last_slash;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
611 guchar *packed_data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
612
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
613 tmp_string = path_from_utf8(thumb_filename);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
614 last_slash = strrchr(tmp_string, '/');
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
615 if(!last_slash) return NULL;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
616 *last_slash++ = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
617
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
618 thumb_name = g_strconcat(tmp_string, "/.xvpics/", last_slash, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
619 packed_data = load_xv_thumbnail(thumb_name, &width, &height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
620 g_free(tmp_string);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
621 g_free(thumb_name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
622
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
623 if(packed_data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
624 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
625 guchar *rgb_data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
626 GdkPixbuf *pixbuf;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
627 gint i;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
628
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
629 rgb_data = g_new(guchar, width * height * 3);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
630 for(i = 0; i < width * height; i++)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
631 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
632 rgb_data[i * 3 + 0] = (packed_data[i] >> 5) * 36;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
633 rgb_data[i * 3 + 1] = ((packed_data[i] & 28) >> 2) * 36;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
634 rgb_data[i * 3 + 2] = (packed_data[i] & 3) * 85;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
635 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
636 g_free(packed_data);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
637
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
638 pixbuf = gdk_pixbuf_new_from_data(rgb_data, GDK_COLORSPACE_RGB, FALSE, 8,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
639 width, height, 3 * width, free_rgb_buffer, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
640
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
641 if (normalize_thumb(&width, &height, max_w, max_h))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
642 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
643 /* scale */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
644 GdkPixbuf *tmp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
645
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
646 tmp = pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
647 pixbuf = gdk_pixbuf_scale_simple(tmp, width, height, GDK_INTERP_NEAREST);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
648 gdk_pixbuf_unref(tmp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
649 }
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
650
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
651 return pixbuf;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
652 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
653
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
654 return NULL;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
655 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
656
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
657
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents: 3
diff changeset
658