[maemo-commits] [maemo-commits] r16691 - in projects/haf/trunk/hildon-thumbnail: . daemon daemon/plugins

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon Nov 17 12:16:17 EET 2008
Author: pvanhoof
Date: 2008-11-17 12:16:16 +0200 (Mon, 17 Nov 2008)
New Revision: 16691

Modified:
   projects/haf/trunk/hildon-thumbnail/ChangeLog
   projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.c
   projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.h
   projects/haf/trunk/hildon-thumbnail/daemon/plugins/epeg-plugin.c
   projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-jpeg-out-plugin.c
   projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-plugin.c
   projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-png-out-plugin.c
   projects/haf/trunk/hildon-thumbnail/daemon/plugins/gstreamer-video-plugin.c
Log:
2008-11-17  Philip Van Hoof  <philip at codeminded.be>

	* daemon/hildon-thumbnail-plugin.h
	* daemon/plugins/gdkpixbuf-plugin.c
	* daemon/plugins/gdkpixbuf-png-out-plugin.c
	* daemon/plugins/gdkpixbuf-jpeg-out-plugin.c
	* daemon/plugins/gstreamer-video-plugin.c
	* daemon/plugins/epeg-plugin.c
	* daemon/hildon-thumbnail-plugin.c: Don't recreate based on modified time



Modified: projects/haf/trunk/hildon-thumbnail/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-thumbnail/ChangeLog	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/ChangeLog	2008-11-17 10:16:16 UTC (rev 16691)
@@ -1,5 +1,15 @@
 2008-11-17  Philip Van Hoof  <philip at codeminded.be>
 
+	* daemon/hildon-thumbnail-plugin.h
+	* daemon/plugins/gdkpixbuf-plugin.c
+	* daemon/plugins/gdkpixbuf-png-out-plugin.c
+	* daemon/plugins/gdkpixbuf-jpeg-out-plugin.c
+	* daemon/plugins/gstreamer-video-plugin.c
+	* daemon/plugins/epeg-plugin.c
+	* daemon/hildon-thumbnail-plugin.c: Don't recreate based on modified time
+
+2008-11-17  Philip Van Hoof  <philip at codeminded.be>
+
 	* daemon/plugins/gstreamer-video-plugin.c: Fixed a criticial warning
 	in the video thumbnailer plugin
 

Modified: projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.c	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.c	2008-11-17 10:16:16 UTC (rev 16691)
@@ -77,6 +77,55 @@
 	return module;
 }
 
+
+
+typedef gboolean (*NeedsOutFunc) (const guchar *rgb8_pixmap, 
+			 guint width, guint height,
+			 guint rowstride, guint bits_per_sample,
+			 OutType type,
+			 guint64 mtime, 
+			 const gchar *uri);
+
+
+gboolean
+hildon_thumbnail_outplugins_needs_out (const guchar *rgb8_pixmap, 
+						   guint width, guint height,
+						   guint rowstride, guint bits_per_sample,
+						   OutType type,
+						   guint64 mtime, 
+						   const gchar *uri)
+{
+	GList *copy = g_list_copy (outplugs);
+	GQuark domain;
+	gboolean retval = FALSE;
+
+	g_static_rec_mutex_lock (&mutex);
+	copy = g_list_copy (outplugs);
+
+	while (copy && !retval) {
+		GModule *module = copy->data;
+		NeedsOutFunc needs_out_func;
+
+		if (g_module_symbol (module, "hildon_thumbnail_outplugin_needs_out", (gpointer *) &needs_out_func)) {
+			IsActiveFunc isac_func;
+			if (g_module_symbol (module, "hildon_thumbnail_outplugin_is_active", (gpointer *) &isac_func)) {
+				if (isac_func ()) {
+					retval = needs_out_func (rgb8_pixmap, width, height, rowstride, bits_per_sample, type, mtime, uri);
+				} 
+			} 
+		}
+
+		copy = g_list_next (copy);
+	}
+
+	g_static_rec_mutex_unlock (&mutex);
+
+	g_list_free (copy);
+
+	return retval;
+}
+
+
 typedef void (*OutFunc) (const guchar *rgb8_pixmap, 
 			 guint width, guint height,
 			 guint rowstride, guint bits_per_sample,
@@ -97,7 +146,6 @@
 	GList *copy = g_list_copy (outplugs);
 	GString *errors = NULL;
 	GQuark domain;
-	gboolean dounl = TRUE;
 
 	g_static_rec_mutex_lock (&mutex);
 	copy = g_list_copy (outplugs);

Modified: projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.h
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.h	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/hildon-thumbnail-plugin.h	2008-11-17 10:16:16 UTC (rev 16691)
@@ -65,6 +65,12 @@
 						   guint64 mtime, 
 						   const gchar *uri, 
 						   GError **error);
+gboolean    hildon_thumbnail_outplugins_needs_out (const guchar *rgb8_pixmap, 
+						   guint width, guint height,
+						   guint rowstride, guint bits_per_sample,
+						   OutType type,
+						   guint64 mtime, 
+						   const gchar *uri);
 
 G_END_DECLS
 

Modified: projects/haf/trunk/hildon-thumbnail/daemon/plugins/epeg-plugin.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/plugins/epeg-plugin.c	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/plugins/epeg-plugin.c	2008-11-17 10:16:16 UTC (rev 16691)
@@ -160,6 +160,10 @@
 		GError *nerror = NULL;
 		guint ow, oh;
 
+		const guchar *rgb8_pixels;
+		guint width; guint height;
+		guint rowstride; 
+
 		file = g_file_new_for_uri (uri);
 		path = g_file_get_path (file);
 
@@ -216,31 +220,61 @@
 									  destroy_pixbuf, im);
 		}
 
-		hildon_thumbnail_outplugins_do_out (gdk_pixbuf_get_pixels    (pixbuf_large), 
-						    gdk_pixbuf_get_width     (pixbuf_large),
-						    gdk_pixbuf_get_height    (pixbuf_large),
-						    gdk_pixbuf_get_rowstride (pixbuf_large),
-						    8,
-						    OUTTYPE_LARGE,
-						    mtime, 
-						    uri, 
-						    &nerror);
+		rgb8_pixels = gdk_pixbuf_get_pixels (pixbuf_large);
+		width = gdk_pixbuf_get_width (pixbuf_large);
+		height = gdk_pixbuf_get_height (pixbuf_large);
+		rowstride = gdk_pixbuf_get_rowstride (pixbuf_large);
 
+		if (hildon_thumbnail_outplugins_needs_out (rgb8_pixels, 
+							   width,
+							   height,
+							   rowstride,
+							   8,
+							   OUTTYPE_LARGE,
+							   mtime, 
+							   uri)) {
+
+			hildon_thumbnail_outplugins_do_out (rgb8_pixels, 
+							    width,
+							    height,
+							    rowstride,
+							    8,
+							    OUTTYPE_LARGE,
+							    mtime, 
+							    uri, 
+							    &nerror);
+		}
+
 		if (nerror)
 			goto nerror_handler;
 
 		pixbuf_cropped = crop_resize (pixbuf_large, 124, 124);
 
-		hildon_thumbnail_outplugins_do_out (gdk_pixbuf_get_pixels    (pixbuf_cropped), 
-						    gdk_pixbuf_get_width     (pixbuf_cropped),
-						    gdk_pixbuf_get_height    (pixbuf_cropped),
-						    gdk_pixbuf_get_rowstride (pixbuf_cropped),
-						    8,
-						    OUTTYPE_CROPPED,
-						    mtime, 
-						    uri, 
-						    &nerror);
+		rgb8_pixels = gdk_pixbuf_get_pixels (pixbuf_cropped);
+		width = gdk_pixbuf_get_width (pixbuf_cropped);
+		height = gdk_pixbuf_get_height (pixbuf_cropped);
+		rowstride = gdk_pixbuf_get_rowstride (pixbuf_cropped);
 
+		if (hildon_thumbnail_outplugins_needs_out (rgb8_pixels, 
+							   width,
+							   height,
+							   rowstride,
+							   8,
+							   OUTTYPE_CROPPED,
+							   mtime, 
+							   uri)) {
+
+			hildon_thumbnail_outplugins_do_out (rgb8_pixels, 
+							    width,
+							    height,
+							    rowstride,
+							    8,
+							    OUTTYPE_CROPPED,
+							    mtime, 
+							    uri, 
+							    &nerror);
+		}
+
 		g_object_unref (pixbuf_cropped);
 
 		if (nerror)
@@ -250,15 +284,30 @@
 							 128, 128,
 							 GDK_INTERP_HYPER);
 
-		hildon_thumbnail_outplugins_do_out (gdk_pixbuf_get_pixels    (pixbuf_normal), 
-						    gdk_pixbuf_get_width     (pixbuf_normal),
-						    gdk_pixbuf_get_height    (pixbuf_normal),
-						    gdk_pixbuf_get_rowstride (pixbuf_normal),
+		rgb8_pixels = gdk_pixbuf_get_pixels (pixbuf_normal);
+		width = gdk_pixbuf_get_width (pixbuf_normal);
+		height = gdk_pixbuf_get_height (pixbuf_normal);
+		rowstride = gdk_pixbuf_get_rowstride (pixbuf_normal);
+
+		if (hildon_thumbnail_outplugins_needs_out (rgb8_pixels, 
+							   width,
+							   height,
+							   rowstride,
+							   8,
+							   OUTTYPE_NORMAL,
+							   mtime, 
+							   uri)) {
+
+		    hildon_thumbnail_outplugins_do_out (rgb8_pixels, 
+						    width,
+						    height,
+						    rowstride,
 						    8,
 						    OUTTYPE_NORMAL,
 						    mtime, 
 						    uri, 
 						    &nerror);
+		}
 
 		g_object_unref (pixbuf_normal);
 

Modified: projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-jpeg-out-plugin.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-jpeg-out-plugin.c	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-jpeg-out-plugin.c	2008-11-17 10:16:16 UTC (rev 16691)
@@ -29,6 +29,9 @@
 #include "config.h"
 #endif
 
+#include <sys/types.h>
+#include <utime.h>
+
 #include <string.h>
 #include <glib.h>
 #include <gio/gio.h>
@@ -43,6 +46,50 @@
 static gboolean is_active = TRUE;
 static GFileMonitor *monitor = NULL;
 
+
+gboolean
+hildon_thumbnail_outplugin_needs_out (const guchar *rgb8_pixmap, 
+				guint width, guint height,
+				guint rowstride, guint bits_per_sample,
+				OutType type,
+				guint64 mtime, 
+				const gchar *uri)
+{
+	gboolean retval;
+	gchar *large, *normal, *cropped, *filen;
+
+	hildon_thumbnail_util_get_thumb_paths (uri, &large, &normal, &cropped,
+					       NULL, NULL, NULL, FALSE);
+
+	switch (type) {
+		case OUTTYPE_LARGE:
+			filen = large;
+		break;
+		case OUTTYPE_NORMAL:
+			filen = normal;
+		break;
+		case OUTTYPE_CROPPED:
+			filen = cropped;
+		break;
+	}
+
+	retval = FALSE;
+
+	if (g_file_test (filen, G_FILE_TEST_EXISTS)) {
+		struct stat st;
+		g_stat (filen, &st);
+		if (st.st_mtime != mtime)
+			retval = TRUE;
+	} else
+		retval = TRUE;
+
+	g_free (normal);
+	g_free (large);
+	g_free (cropped);
+
+	return retval;
+}
+
 void
 hildon_thumbnail_outplugin_out (const guchar *rgb8_pixmap, 
 				guint width, guint height,
@@ -54,6 +101,7 @@
 {
 	GdkPixbuf *pixbuf;
 	gchar *large, *normal, *cropped, *filen;
+	struct utimbuf buf;
 
 	hildon_thumbnail_util_get_thumb_paths (uri, &large, &normal, &cropped,
 					       NULL, NULL, NULL, FALSE);
@@ -80,6 +128,10 @@
 
 	g_object_unref (pixbuf);
 
+	buf.actime = buf.modtime = mtime;
+
+	utime (filen, &buf);
+
 	g_free (normal);
 	g_free (large);
 	g_free (cropped);

Modified: projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-plugin.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-plugin.c	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-plugin.c	2008-11-17 10:16:16 UTC (rev 16691)
@@ -176,7 +176,11 @@
 		GdkPixbuf *pixbuf, *pixbuf_cropped;
 		guint64 mtime;
 
+		const guchar *rgb8_pixels;
+		guint width; guint height;
+		guint rowstride; 
 
+
 		file = g_file_new_for_uri (uri);
 
 		info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED,
@@ -202,16 +206,31 @@
 		if (nerror)
 			goto nerror_handler;
 
-		hildon_thumbnail_outplugins_do_out (gdk_pixbuf_get_pixels    (pixbuf_large), 
-						    gdk_pixbuf_get_width     (pixbuf_large),
-						    gdk_pixbuf_get_height    (pixbuf_large),
-						    gdk_pixbuf_get_rowstride (pixbuf_large),
-						    8,
-						    OUTTYPE_LARGE,
-						    mtime, 
-						    uri, 
-						    &nerror);
+		rgb8_pixels = gdk_pixbuf_get_pixels (pixbuf_large);
+		width = gdk_pixbuf_get_width (pixbuf_large);
+		height = gdk_pixbuf_get_height (pixbuf_large);
+		rowstride = gdk_pixbuf_get_rowstride (pixbuf_large);
 
+		if (hildon_thumbnail_outplugins_needs_out (rgb8_pixels, 
+							   width,
+							   height,
+							   rowstride,
+							   8,
+							   OUTTYPE_LARGE,
+							   mtime, 
+							   uri)) {
+
+			hildon_thumbnail_outplugins_do_out (rgb8_pixels, 
+							    width,
+							    height,
+							    rowstride,
+							    8,
+							    OUTTYPE_LARGE,
+							    mtime, 
+							    uri, 
+							    &nerror);
+		}
+
 		g_object_unref (pixbuf_large);
 
 		if (nerror)
@@ -231,15 +250,30 @@
 		if (nerror)
 			goto nerror_handler;
 
-		hildon_thumbnail_outplugins_do_out (gdk_pixbuf_get_pixels    (pixbuf_normal), 
-						    gdk_pixbuf_get_width     (pixbuf_normal),
-						    gdk_pixbuf_get_height    (pixbuf_normal),
-						    gdk_pixbuf_get_rowstride (pixbuf_normal),
+		rgb8_pixels = gdk_pixbuf_get_pixels (pixbuf_normal);
+		width = gdk_pixbuf_get_width (pixbuf_normal);
+		height = gdk_pixbuf_get_height (pixbuf_normal);
+		rowstride = gdk_pixbuf_get_rowstride (pixbuf_normal);
+
+		if (hildon_thumbnail_outplugins_needs_out (rgb8_pixels, 
+							   width,
+							   height,
+							   rowstride,
+							   8,
+							   OUTTYPE_NORMAL,
+							   mtime, 
+							   uri)) {
+
+		    hildon_thumbnail_outplugins_do_out (rgb8_pixels, 
+						    width,
+						    height,
+						    rowstride,
 						    8,
 						    OUTTYPE_NORMAL,
 						    mtime, 
 						    uri, 
 						    &nerror);
+		}
 
 		g_object_unref (pixbuf_normal);
 
@@ -262,16 +296,32 @@
 
 		g_object_unref (pixbuf);
 
-		hildon_thumbnail_outplugins_do_out (gdk_pixbuf_get_pixels    (pixbuf_cropped), 
-						    gdk_pixbuf_get_width     (pixbuf_cropped),
-						    gdk_pixbuf_get_height    (pixbuf_cropped),
-						    gdk_pixbuf_get_rowstride (pixbuf_cropped),
-						    8,
-						    OUTTYPE_CROPPED,
-						    mtime, 
-						    uri, 
-						    &nerror);
+		rgb8_pixels = gdk_pixbuf_get_pixels (pixbuf_cropped);
+		width = gdk_pixbuf_get_width (pixbuf_cropped);
+		height = gdk_pixbuf_get_height (pixbuf_cropped);
+		rowstride = gdk_pixbuf_get_rowstride (pixbuf_cropped);
 
+		if (hildon_thumbnail_outplugins_needs_out (rgb8_pixels, 
+							   width,
+							   height,
+							   rowstride,
+							   8,
+							   OUTTYPE_CROPPED,
+							   mtime, 
+							   uri)) {
+
+			hildon_thumbnail_outplugins_do_out (rgb8_pixels, 
+							    width,
+							    height,
+							    rowstride,
+							    8,
+							    OUTTYPE_CROPPED,
+							    mtime, 
+							    uri, 
+							    &nerror);
+		}
+
+
 		g_object_unref (pixbuf_cropped);
 
 		nerror_handler:

Modified: projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-png-out-plugin.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-png-out-plugin.c	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/plugins/gdkpixbuf-png-out-plugin.c	2008-11-17 10:16:16 UTC (rev 16691)
@@ -29,6 +29,9 @@
 #include "config.h"
 #endif
 
+#include <sys/types.h>
+#include <utime.h>
+
 #include <string.h>
 #include <glib.h>
 #include <gio/gio.h>
@@ -49,6 +52,50 @@
 #define MTIME_OPTION HILDON_THUMBNAIL_OPTION_PREFIX "MTime"
 #define SOFTWARE_OPTION "tEXt::Software"
 
+
+gboolean
+hildon_thumbnail_outplugin_needs_out (const guchar *rgb8_pixmap, 
+				guint width, guint height,
+				guint rowstride, guint bits_per_sample,
+				OutType type,
+				guint64 mtime, 
+				const gchar *uri)
+{
+	gboolean retval;
+	gchar *large, *normal, *cropped, *filen;
+
+	hildon_thumbnail_util_get_thumb_paths (uri, &large, &normal, &cropped,
+					       NULL, NULL, NULL, TRUE);
+
+	switch (type) {
+		case OUTTYPE_LARGE:
+			filen = large;
+		break;
+		case OUTTYPE_NORMAL:
+			filen = normal;
+		break;
+		case OUTTYPE_CROPPED:
+			filen = cropped;
+		break;
+	}
+
+	retval = FALSE;
+
+	if (g_file_test (filen, G_FILE_TEST_EXISTS)) {
+		struct stat st;
+		g_stat (filen, &st);
+		if (st.st_mtime != mtime)
+			retval = TRUE;
+	} else
+		retval = TRUE;
+
+	g_free (normal);
+	g_free (large);
+	g_free (cropped);
+
+	return retval;
+}
+
 void
 hildon_thumbnail_outplugin_out (const guchar *rgb8_pixmap, 
 				guint width, guint height,
@@ -61,6 +108,7 @@
 	GdkPixbuf *pixbuf;
 	gchar *large, *normal, *cropped, *filen;
 	char mtime_str[64];
+	struct utimbuf buf;
 
 	const char *default_keys[] = {
 		URI_OPTION,
@@ -99,13 +147,17 @@
 
 	g_sprintf (mtime_str, "%lu", mtime);
 
-	 gdk_pixbuf_savev (pixbuf, filen, "png", 
+	gdk_pixbuf_savev (pixbuf, filen, "png", 
 			  (char **) default_keys, 
 			  (char **) default_values, 
 			  error);
 
 	g_object_unref (pixbuf);
 
+	buf.actime = buf.modtime = mtime;
+
+	utime (filen, &buf);
+
 	g_free (normal);
 	g_free (large);
 	g_free (cropped);

Modified: projects/haf/trunk/hildon-thumbnail/daemon/plugins/gstreamer-video-plugin.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/daemon/plugins/gstreamer-video-plugin.c	2008-11-17 09:42:04 UTC (rev 16690)
+++ projects/haf/trunk/hildon-thumbnail/daemon/plugins/gstreamer-video-plugin.c	2008-11-17 10:16:16 UTC (rev 16691)
@@ -92,20 +92,30 @@
 {
 	GError *error = NULL;
 
-	hildon_thumbnail_outplugins_do_out (data, 
-					    width,
-					    height,
-					    width*3,
-					    bpp/3,
-					    target,
-					    mtime, 
-					    uri, 
-					    &error);
+	if (hildon_thumbnail_outplugins_needs_out (data, 
+						   width,
+						   height,
+						   width*3,
+						   bpp/3,
+						   target,
+						   mtime, 
+						   uri)) {
 
-	if (error) {
-		g_warning("%s\n", error->message);
-		g_error_free(error);
-		return FALSE;
+		hildon_thumbnail_outplugins_do_out (data, 
+						    width,
+						    height,
+						    width*3,
+						    bpp/3,
+						    target,
+						    mtime, 
+						    uri, 
+						    &error);
+
+		if (error) {
+			g_warning("%s\n", error->message);
+			g_error_free(error);
+			return FALSE;
+		}
 	}
 
 	return TRUE;


More information about the maemo-commits mailing list