[solang] Use ThumbbufMaker in Thumbnail::generate_using_gdkpixbuf
- From: Debarshi Ray <debarshir src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [solang] Use ThumbbufMaker in Thumbnail::generate_using_gdkpixbuf
- Date: Fri, 25 Dec 2009 10:36:21 +0000 (UTC)
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]