summaryrefslogtreecommitdiffstats
path: root/src/ithumb-writer.c
diff options
context:
space:
mode:
authorjcsjcs <jcsjcs@f01d2545-417e-4e96-918e-98f8d0dbbcb6>2006-09-17 17:14:21 +0000
committerjcsjcs <jcsjcs@f01d2545-417e-4e96-918e-98f8d0dbbcb6>2006-09-17 17:14:21 +0000
commitdaed5361c83e5c47ff528ded11f99c08005a8152 (patch)
treed4e5e8c4b49b8414cb14a31bce0a98e48fbb0ebe /src/ithumb-writer.c
parent5800e1e016c544b49acfd3e7b6d890045efebd08 (diff)
downloadlibgpod-daed5361c83e5c47ff528ded11f99c08005a8152.tar.gz
libgpod-daed5361c83e5c47ff528ded11f99c08005a8152.tar.xz
libgpod-daed5361c83e5c47ff528ded11f99c08005a8152.zip
* src/itdb.h
src/itdb_artwork.c: added itdb_artwork_add_thumbnail_from_data(). * src/itdb.h src/itdb_track.c: added itdb_track_set_thumbnails_from_data(). * src/itdb.h src/itdb_photoalbum.c: added itdb_photodb_add_photo_from_data(). * src/itdb_artwork.c (itdb_thumb_get_gdk_pixbuf): added support to retreive thumbnail from raw data instead of file. * src/ithumb-writer.c (ithumb_writer_write_thumbnail): added support to write thumbnail from raw data instead of file. git-svn-id: https://gtkpod.svn.sf.net/svnroot/gtkpod/libgpod/trunk@1313 f01d2545-417e-4e96-918e-98f8d0dbbcb6
Diffstat (limited to 'src/ithumb-writer.c')
-rw-r--r--src/ithumb-writer.c73
1 files changed, 52 insertions, 21 deletions
diff --git a/src/ithumb-writer.c b/src/ithumb-writer.c
index 2aad604..98f350c 100644
--- a/src/ithumb-writer.c
+++ b/src/ithumb-writer.c
@@ -195,9 +195,9 @@ static gboolean
ithumb_writer_write_thumbnail (iThumbWriter *writer,
Itdb_Thumb *thumb)
{
- GdkPixbuf *pixbuf;
+ GdkPixbuf *pixbuf = NULL;
guint16 *pixels;
- gchar *filename;
+ gchar *filename = NULL;
gint width, height;
Itdb_Thumb *old_thumb;
@@ -205,24 +205,48 @@ ithumb_writer_write_thumbnail (iThumbWriter *writer,
g_return_val_if_fail (writer, FALSE);
g_return_val_if_fail (thumb, FALSE);
- /* If the same filename was written before, just use the old
- thumbnail to save space on the iPod */
- old_thumb = g_hash_table_lookup (writer->cache, thumb->filename);
- if (old_thumb != NULL)
- {
- g_free (thumb->filename);
- memcpy (thumb, old_thumb, sizeof (Itdb_Thumb));
- thumb->filename = g_strdup (old_thumb->filename);
- return TRUE;
- }
+ if (thumb->filename)
+ { /* read image from filename */
+ /* If the same filename was written before, just use the old
+ thumbnail to save space on the iPod */
+ old_thumb = g_hash_table_lookup (writer->cache, thumb->filename);
+ if (old_thumb != NULL)
+ {
+ g_free (thumb->filename);
+ memcpy (thumb, old_thumb, sizeof (Itdb_Thumb));
+ thumb->filename = g_strdup (old_thumb->filename);
+ return TRUE;
+ }
- filename = g_strdup (thumb->filename);
+ pixbuf = gdk_pixbuf_new_from_file_at_size (thumb->filename,
+ writer->img_info->width,
+ writer->img_info->height,
+ NULL);
- pixbuf = gdk_pixbuf_new_from_file_at_size (filename,
- writer->img_info->width,
- writer->img_info->height,
- NULL);
- if (pixbuf == NULL) {
+ }
+ else if (thumb->image_data)
+ { /* image data is stored in image_data and image_data_len */
+ GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
+ g_return_val_if_fail (loader, FALSE);
+ gdk_pixbuf_loader_write (loader,
+ thumb->image_data,
+ thumb->image_data_len,
+ NULL);
+ gdk_pixbuf_loader_close (loader, NULL);
+ gdk_pixbuf_loader_set_size (loader,
+ writer->img_info->width,
+ writer->img_info->height);
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ g_object_ref (pixbuf);
+ g_object_unref (loader);
+
+ g_free (thumb->image_data);
+ thumb->image_data = NULL;
+ thumb->image_data_len = 0;
+ }
+
+ if (pixbuf == NULL)
+ {
return FALSE;
}
@@ -234,6 +258,9 @@ ithumb_writer_write_thumbnail (iThumbWriter *writer,
"height", &height,
NULL);
+ filename = thumb->filename;
+ thumb->filename = NULL;
+
/* FIXME: under certain conditions (probably related to
* writer->offset getting too big), this should be :F%04u_2.ithmb
* and so on
@@ -291,10 +318,14 @@ ithumb_writer_write_thumbnail (iThumbWriter *writer,
}
g_free (pixels);
writer->cur_offset += thumb->size;
- g_hash_table_insert (writer->cache, filename, thumb);
- /* !! filename is g_free()d when destroying the hash table. Do not
- do it here */
+ if (filename)
+ {
+ g_hash_table_insert (writer->cache, filename, thumb);
+
+ /* !! filename is g_free()d when destroying the hash table. Do not
+ do it here */
+ }
return TRUE;
}