[solang] Use ThumbbufMaker in Thumbnail::generate_using_gdkpixbuf



commit 4d19464f8d73ef4d40cf47100ddbe77587cfe3c4
Author: Debarshi Ray <rishi gnu org>
Date:   Sun Dec 6 04:21:10 2009 +0200

    Use ThumbbufMaker in Thumbnail::generate_using_gdkpixbuf
    
    The ThumbbufMaker can now optionally rotate the GdkPixbuf using
    gdk_pixbuf_apply_embedded_orientation, and if the thumbnail is absent
    from the disk it creates a Gdk::Pixbuf from the photo's disk file.
    
    The Thumbnail::generate methods now accept a PhotoPtr instead of a
    Photo.

 src/attribute/thumbnail.cpp       |   52 ++++++++++++-------------------------
 src/attribute/thumbnail.h         |   11 ++++---
 src/common/thumbbuf-maker.cpp     |   26 +++++++++++++++++-
 src/common/thumbbuf-maker.h       |    4 ++-
 src/renderer/browser-renderer.cpp |    3 +-
 src/renderer/editor-renderer.cpp  |    4 +-
 src/storage/directory-storage.cpp |    2 +-
 7 files changed, 56 insertions(+), 46 deletions(-)
---
diff --git a/src/attribute/thumbnail.cpp b/src/attribute/thumbnail.cpp
index e0f5023..223690f 100644
--- a/src/attribute/thumbnail.cpp
+++ b/src/attribute/thumbnail.cpp
@@ -29,6 +29,7 @@
 #include "content-type-repo.h"
 #include "database.h"
 #include "photo.h"
+#include "thumbbuf-maker.h"
 #include "thumbnail.h"
 
 namespace Solang
@@ -93,7 +94,7 @@ Thumbnail::set_resolution(const Resolution & resolution)
 void
 Thumbnail::generate(const Resolution & new_resolution,
                     const DatabasePtr & db,
-                    const Photo &photo) throw(Error)
+                    const PhotoPtr & photo) throw(Error)
 {
     if( new_resolution == get_resolution() 
             || new_resolution < get_resolution() )
@@ -102,21 +103,21 @@ Thumbnail::generate(const Resolution & new_resolution,
     }
 
     //We assume the photo has physical path
-    if( photo.get_disk_file_path().empty() )
+    if (photo->get_disk_file_path().empty())
     {
         //TBD::Error
     }
 
     // We resize the thumbnail only.
     // Makes it faster.
-    generate_using_gdkpixbuf(get_path(), new_resolution );
+    generate_using_gdkpixbuf(photo, new_resolution);
 
     return;
         
 }
 
 void
-Thumbnail::generate( const Photo &photo )throw(Error)
+Thumbnail::generate(const PhotoPtr & photo) throw(Error)
 {
     try
     {
@@ -128,18 +129,17 @@ Thumbnail::generate( const Photo &photo )throw(Error)
         throw;
     }
 
-    generate_using_gdkpixbuf( photo.get_disk_file_path(), 
-                            Resolution(128, 128) );    
+    generate_using_gdkpixbuf(photo, Resolution(256, 256));
 
     return;
 }
 
 void
 Thumbnail::generate(Exiv2::ExifData & exifData,
-                        const Photo &photo) throw(Error)
+                    const PhotoPtr & photo) throw(Error)
 {
     // We assume the photo has physical path.
-    if (photo.get_disk_file_path().empty())
+    if (photo->get_disk_file_path().empty())
     {
         //TBD::Error
         return;
@@ -161,7 +161,7 @@ Thumbnail::generate(Exiv2::ExifData & exifData,
     }
 
     if (!ContentTypeRepo::instance()->is_gdk_supported(
-                                          photo.get_content_type())
+                                          photo->get_content_type())
         && !exifData.empty() )
     {
         // Extract from exif if present.
@@ -208,11 +208,10 @@ Thumbnail::generate(Exiv2::ExifData & exifData,
 
     if (false == thumbnail_generated
         && ContentTypeRepo::instance()->is_gdk_supported(
-                                            photo.get_content_type()))
+                                            photo->get_content_type()))
     {
         set_path( get_path() + ".jpg" );
-        generate_using_gdkpixbuf(photo.get_disk_file_path(),
-                                   Resolution(256, 256));
+        generate_using_gdkpixbuf(photo, Resolution(256, 256));
     }    
  
     return;
@@ -249,31 +248,14 @@ Thumbnail::make_thumb_path() throw(Error)
 }
 
 void
-Thumbnail::generate_using_gdkpixbuf(const Glib::ustring & path,
-                                      const Resolution & new_size_hint)
+Thumbnail::generate_using_gdkpixbuf(const PhotoPtr & photo,
+                                    const Resolution & new_size_hint)
 {
-    PixbufPtr thumbnail;
-    try
-    {
-        thumbnail = Gdk::Pixbuf::create_from_file(
-                                     path,
-                                     -1, //We keep aspect
-                                     new_size_hint.get_y(),
-                                     true);
-    }
-    catch (const Glib::FileError & e)
-    {
-        g_warning("%s", e.what().c_str());
-        return;
-    }
-    catch (const Gdk::PixbufError & e)
-    {
-        g_warning("%s", e.what().c_str());
-        return;
-    }
+    ThumbbufMaker thumbbuf_maker(new_size_hint.get_x(),
+                                 new_size_hint.get_y(),
+                                 true);
+    const PixbufPtr thumbnail = thumbbuf_maker(photo);
 
-    thumbnail = Glib::wrap(gdk_pixbuf_apply_embedded_orientation(
-                               thumbnail->gobj()), false);
     thumbnail->save( get_path(), "jpeg" );    
 
     set_resolution( Resolution( thumbnail->get_width(),
diff --git a/src/attribute/thumbnail.h b/src/attribute/thumbnail.h
index ad2c375..3b16177 100644
--- a/src/attribute/thumbnail.h
+++ b/src/attribute/thumbnail.h
@@ -139,14 +139,14 @@ class Thumbnail
         void
         generate(const Resolution & new_resolution,
                  const DatabasePtr & db,
-                 const Photo &photo) throw(Error);
+                 const PhotoPtr & photo) throw(Error);
 
         void
-        generate( const Photo &photo) throw(Error);
+        generate(const PhotoPtr & photo) throw(Error);
 
         void
         generate(Exiv2::ExifData & exifData,
-                 const Photo &photo) throw(Error);
+                 const PhotoPtr & photo) throw(Error);
 
         void
         insert(std::vector<Gnome::Gda::Value> &values);
@@ -162,8 +162,9 @@ class Thumbnail
         make_thumb_path() throw(Error);
 
         void
-        generate_using_gdkpixbuf(const Glib::ustring & path,
-                           const Resolution & new_resolution_hint);
+        generate_using_gdkpixbuf(
+            const PhotoPtr & photo,
+            const Resolution & new_resolution_hint);
 
         static const gint32 PHOTOID_COL;
         static const gint32 PATH_COL;
diff --git a/src/common/thumbbuf-maker.cpp b/src/common/thumbbuf-maker.cpp
index e6aa486..a7c0fd5 100644
--- a/src/common/thumbbuf-maker.cpp
+++ b/src/common/thumbbuf-maker.cpp
@@ -27,8 +27,10 @@
 namespace Solang
 {
 
-ThumbbufMaker::ThumbbufMaker(guint width, guint height) throw() :
+ThumbbufMaker::ThumbbufMaker(guint width, guint height, bool rotate)
+                             throw() :
     std::unary_function<const PhotoPtr &, PixbufPtr>(),
+    rotate_(rotate),
     width_(width),
     height_(height)
 {
@@ -36,6 +38,7 @@ ThumbbufMaker::ThumbbufMaker(guint width, guint height) throw() :
 
 ThumbbufMaker::ThumbbufMaker(const ThumbbufMaker & source) throw() :
     std::unary_function<const PhotoPtr &, PixbufPtr>(source),
+    rotate_(source.rotate_),
     width_(source.width_),
     height_(source.height_)
 {
@@ -52,6 +55,7 @@ ThumbbufMaker::operator=(const ThumbbufMaker & source) throw()
     {
         std::unary_function<const PhotoPtr &, PixbufPtr>
             ::operator=(source);
+        rotate_ = source.rotate_;
         width_ = source.width_;
         height_ = source.height_;
     }
@@ -75,6 +79,20 @@ ThumbbufMaker::operator()(const PhotoPtr & photo) throw()
         return PixbufPtr(0);
     }
 
+    if (false == Glib::file_test(path, Glib::FILE_TEST_EXISTS))
+    {
+        try
+        {
+            path = Glib::filename_from_utf8(
+                             photo->get_disk_file_path());
+        }
+        catch (const Glib::ConvertError & e)
+        {
+            g_warning("%s", e.what().c_str());
+            return PixbufPtr(0);
+        }
+    }
+
     PixbufPtr pixbuf;
     try
     {
@@ -91,6 +109,12 @@ ThumbbufMaker::operator()(const PhotoPtr & photo) throw()
         return PixbufPtr(0);
     }
 
+    if (true == rotate_)
+    {
+        pixbuf = Glib::wrap(gdk_pixbuf_apply_embedded_orientation(
+                                pixbuf->gobj()), false);
+    }
+
     const double height = static_cast<double>(pixbuf->get_height());
 
     if (height_ < height)
diff --git a/src/common/thumbbuf-maker.h b/src/common/thumbbuf-maker.h
index f0c87d6..ed454d8 100644
--- a/src/common/thumbbuf-maker.h
+++ b/src/common/thumbbuf-maker.h
@@ -33,7 +33,7 @@ class ThumbbufMaker :
     public std::unary_function<const PhotoPtr &, PixbufPtr>
 {
     public:
-        ThumbbufMaker(guint width, guint height) throw();
+        ThumbbufMaker(guint width, guint height, bool rotate) throw();
 
         ThumbbufMaker(const ThumbbufMaker & source) throw();
 
@@ -48,6 +48,8 @@ class ThumbbufMaker :
     protected:
 
     private:
+        bool rotate_;
+
         guint width_;
 
         guint height_;
diff --git a/src/renderer/browser-renderer.cpp b/src/renderer/browser-renderer.cpp
index 62e0091..e0048fb 100644
--- a/src/renderer/browser-renderer.cpp
+++ b/src/renderer/browser-renderer.cpp
@@ -459,7 +459,8 @@ BrowserRenderer::generate_thumbnails() throw()
         if (0 == photo->get_thumbnail_buffer() )
         {
             ThumbbufMaker thumbbuf_maker(thumbnail_width,
-                                         thumbnail_height);
+                                         thumbnail_height,
+                                         false);
 
             photo->set_thumbnail_buffer( thumbbuf_maker(photo) );
 
diff --git a/src/renderer/editor-renderer.cpp b/src/renderer/editor-renderer.cpp
index 47352c1..2ee5f66 100644
--- a/src/renderer/editor-renderer.cpp
+++ b/src/renderer/editor-renderer.cpp
@@ -853,7 +853,7 @@ EditorRenderer::renderSelectedPhotos(const EditablePhotoList & photos) throw()
     for( EditablePhotoList::const_iterator photo = photos.begin();
                     photo != photos.end(); photo ++ )
     {
-        ThumbbufMaker thumbbuf_maker( 48, 36 );
+        ThumbbufMaker thumbbuf_maker( 48, 36, false );
         Gtk::TreeModel::Row row = *(photosModel_->append());
         row[ columns_.buffer_ ] = scale_buffer((*photo)->get_photo()->get_thumbnail_buffer());
         row[ columns_.photo_ ] = (*photo);
@@ -917,7 +917,7 @@ EditorRenderer::refresh_image() throw()
 {
     Gtk::TreeModel::Row row = *currentItem_;
     EditablePhotoPtr photo = row[ columns_.photo_ ];
-    ThumbbufMaker thumbbuf_maker( 128, 96 );
+    ThumbbufMaker thumbbuf_maker( 128, 96, false );
     row[ columns_.buffer_ ] = scale_buffer( photo->get_photo()->get_thumbnail_buffer() );
 #if 0
     gtk_image_view_set_pixbuf(GTK_IMAGE_VIEW(imageView_),
diff --git a/src/storage/directory-storage.cpp b/src/storage/directory-storage.cpp
index ca45d67..aec43e9 100644
--- a/src/storage/directory-storage.cpp
+++ b/src/storage/directory-storage.cpp
@@ -229,7 +229,7 @@ void DirectoryStorage::save(const PhotoPtr &photo, bool move) throw(Error)
 
     Thumbnail thumb;
     thumb.set_path( tPath );
-    thumb.generate( exifData, *photo );
+    thumb.generate( exifData, photo );
 
     //tPath += exifData.thumbnailExtension();
     tPath += ".jpg";



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]