diff options
| author | jcsjcs <jcsjcs@f01d2545-417e-4e96-918e-98f8d0dbbcb6> | 2006-09-17 17:14:21 +0000 |
|---|---|---|
| committer | jcsjcs <jcsjcs@f01d2545-417e-4e96-918e-98f8d0dbbcb6> | 2006-09-17 17:14:21 +0000 |
| commit | daed5361c83e5c47ff528ded11f99c08005a8152 (patch) | |
| tree | d4e5e8c4b49b8414cb14a31bce0a98e48fbb0ebe /src/ithumb-writer.c | |
| parent | 5800e1e016c544b49acfd3e7b6d890045efebd08 (diff) | |
| download | libgpod-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.c | 73 |
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; } |
