[Rawstudio-commit] r2218 - trunk/src

Anders Brander anders at brander.dk
Sun Feb 22 22:52:01 CET 2009


Author: abrander
Date: 2009-02-22 22:52:01 +0100 (Sun, 22 Feb 2009)
New Revision: 2218

Modified:
   trunk/src/rs-batch.c
   trunk/src/rs-batch.h
Log:
Ported batch-queue to RSOutput and RSFilter.

Modified: trunk/src/rs-batch.c
===================================================================
--- trunk/src/rs-batch.c	2009-02-22 21:50:09 UTC (rev 2217)
+++ trunk/src/rs-batch.c	2009-02-22 21:52:01 UTC (rev 2218)
@@ -149,7 +149,6 @@
 {
 	gchar *tmp;
 	RS_QUEUE *queue = g_new(RS_QUEUE, 1);
-	RS_FILETYPE *filetype;
 
 	queue->list = GTK_TREE_MODEL(gtk_list_store_new(5, G_TYPE_STRING,G_TYPE_STRING,
 									G_TYPE_INT,G_TYPE_STRING, GDK_TYPE_PIXBUF));
@@ -168,8 +167,6 @@
 		queue->filename = rs_conf_get_string(CONF_BATCH_FILENAME);
 	}
 
-	rs_conf_get_filetype(CONF_BATCH_FILETYPE, &filetype);
-	queue->filetype = filetype->filetype;
 	queue->size_lock = LOCK_SCALE;
 	queue->size = 100;
 	queue->size_window = NULL;
@@ -403,25 +400,13 @@
 	gchar *eta_text;
 	gint h = 0, m = 0, s = 0;
 	gint done = 0, left = 0;
+	RSFilter *finput = rs_filter_new("RSInputImage16", NULL);
+	RSFilter *fdemosaic = rs_filter_new("RSDemosaic", finput);
+	RSFilter *frotate = rs_filter_new("RSRotate", fdemosaic);
+	RSFilter *fcrop = rs_filter_new("RSCrop", frotate);
+	RSFilter *fresample= rs_filter_new("RSResample", fcrop);
+	RSFilter *fsharpen= rs_filter_new("RSSharpen", fresample);
 
-	/* Initialize dimensions */
-	switch (queue->size_lock)
-	{
-		case LOCK_SCALE:
-			scale = queue->scale/100.0;
-			break;
-		case LOCK_WIDTH:
-			width = queue->width;
-			break;
-		case LOCK_HEIGHT:
-			height = queue->height;
-			break;
-		case LOCK_BOUNDING_BOX:
-			width = queue->width;
-			height = queue->height;
-			break;
-	}
-
 	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 	gtk_window_set_transient_for(GTK_WINDOW(window), rawstudio_window);
 	gtk_window_set_title(GTK_WINDOW(window), _("Processing photos"));
@@ -488,58 +473,93 @@
 		g_free(basename);
 
 		photo = rs_photo_load_from_file(filename_in);
-		/* FIXME: Port all this to a RSFilter-chain */
-//		rs_image16_demosaic(photo->input, RS_DEMOSAIC_PPG);
 		if (photo)
 		{
+			gfloat actual_scale;
 			rs_metadata_load_from_file(photo->metadata, filename_in);
+			rs_cache_load(photo);
+
+			/* Build new filename */
 			filename = g_string_new(queue->directory);
 			g_string_append(filename, G_DIR_SEPARATOR_S);
 			g_string_append(filename, queue->filename);
 			g_string_append(filename, ".");
+			g_string_append(filename, rs_output_get_extension(queue->output));
+			parsed_filename = filename_parse(filename->str, filename_in, setting_id);
 
-			switch (queue->filetype)
-			{
-				case FILETYPE_JPEG:
-					g_string_append(filename, "jpg");
-					break;
-				case FILETYPE_PNG:
-					g_string_append(filename, "png");
-					break;
-				case FILETYPE_TIFF8:
-					g_string_append(filename, "tif");
-					break;
-				case FILETYPE_TIFF16:
-					g_string_append(filename, "tif");
-					break;
-			}
+			g_object_set(finput, "image", photo->input, NULL);
+			g_object_set(frotate, "angle", photo->angle, "orientation", photo->orientation, NULL);
+			g_object_set(fcrop, "rectangle", photo->crop, NULL);
 
-			rs_cache_load(photo);
+			width = rs_filter_get_width(fcrop);
+			height = rs_filter_get_height(fcrop);
+			rs_constrain_to_bounding_box(250, 250, &width, &height);
+			g_object_set(fresample, "width", width, "height", height, NULL);
 
-			parsed_filename = filename_parse(filename->str, filename_in, setting_id);
+			image = rs_filter_get_image(fresample);
 
-			image = rs_image16_transform(photo->input, NULL,
-				NULL, NULL, photo->crop, 200, 200, TRUE, -1.0,
-				photo->angle, photo->orientation, NULL);
-			if (pixbuf) g_object_unref(pixbuf);
+			/* Render preview image */
+			if (pixbuf)
+				g_object_unref(pixbuf);
 			pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, image->w, image->h);
 
-			/* Render preview image */
 			rs_color_transform_set_from_settings(rct, photo->settings[setting_id], MASK_ALL);
 			rs_color_transform_transform(rct, image->w, image->h, image->pixels,
 				image->rowstride, gdk_pixbuf_get_pixels(pixbuf),
 				gdk_pixbuf_get_rowstride(pixbuf));
 			gtk_image_set_from_pixbuf((GtkImage *) preview, pixbuf);
-			rs_image16_free(image);
+			g_object_unref(image);
 
+			/* Build text for small preview-window */
 			basename = g_path_get_basename(parsed_filename);
 			g_string_printf(status, _("Saving %s ..."), basename);
 			gtk_label_set_text(GTK_LABEL(label), status->str);
-			while (gtk_events_pending()) gtk_main_iteration();
+			while (gtk_events_pending())
+				gtk_main_iteration();
 			g_free(basename);
 
-			rs_photo_save(photo, parsed_filename, queue->filetype,
-				width, height, TRUE, scale, setting_id, queue->cms);
+			/* Calculate new size */
+			switch (queue->size_lock)
+			{
+				case LOCK_SCALE:
+					scale = queue->scale/100.0;
+					width = (gint) (((gdouble) rs_filter_get_width(fcrop)) * scale);
+					height = (gint) (((gdouble) rs_filter_get_height(fcrop)) * scale);
+					break;
+				case LOCK_WIDTH:
+					width = queue->width;
+					scale = ((gdouble) width) / rs_filter_get_width(fcrop);
+					height = (gint) (scale * ((gdouble) rs_filter_get_height(fcrop)));
+					break;
+				case LOCK_HEIGHT:
+					height = queue->height;
+					scale = ((gdouble) height) / rs_filter_get_height(fcrop);
+					width = (gint) (scale * ((gdouble) rs_filter_get_width(fcrop)));
+					break;
+				case LOCK_BOUNDING_BOX:
+					width = rs_filter_get_width(fcrop);
+					height = rs_filter_get_height(fcrop);
+					rs_constrain_to_bounding_box(queue->width, queue->height, &width, &height);
+					break;
+			}
+			actual_scale = ((gdouble) width / (gdouble) rs_filter_get_width(finput));
+			g_object_set(fresample, "width", width, "height", height, NULL);
+			g_object_set(fsharpen, "amount", actual_scale * photo->settings[setting_id]->sharpen, NULL);
+
+			/* Save the image */
+			image = rs_filter_get_image(fsharpen);
+			if (pixbuf)
+				g_object_unref(pixbuf);
+			pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, image->w, image->h);
+
+			rs_color_transform_set_from_settings(rct, photo->settings[setting_id], MASK_ALL);
+			rs_color_transform_transform(rct, image->w, image->h, image->pixels,
+				image->rowstride, gdk_pixbuf_get_pixels(pixbuf),
+				gdk_pixbuf_get_rowstride(pixbuf));
+			g_object_set(queue->output, "filename", parsed_filename, NULL);
+			rs_output_execute(queue->output, pixbuf);
+			g_object_unref(image);
+
 			g_free(parsed_filename);
 			g_string_free(filename, TRUE);
 			g_object_unref(photo);
@@ -559,6 +579,13 @@
 	gtk_widget_show_all(GTK_WIDGET(rawstudio_window));
 
 	batch_queue_update_sensivity(queue);
+
+	g_object_unref(finput);
+	g_object_unref(fdemosaic);
+	g_object_unref(frotate);
+	g_object_unref(fcrop);
+	g_object_unref(fresample);
+	g_object_unref(fsharpen);
 }
 
 static void
@@ -722,8 +749,11 @@
 filetype_changed(gpointer active, gpointer user_data)
 {
 	RS_QUEUE *queue = (RS_QUEUE *) user_data;
-	RS_FILETYPE *filetype = (RS_FILETYPE *) active;
-	queue->filetype = filetype->filetype;
+	GType filetype = GPOINTER_TO_INT(active);
+
+	if (queue->output)
+		g_object_unref(queue->output);
+	queue->output = rs_output_new(g_type_name(filetype));
 }
 
 static void
@@ -949,6 +979,16 @@
 	gui_confbox_set_callback(filetype_confbox, queue, filetype_changed);
 	gtk_box_pack_start (GTK_BOX (vbox), gui_confbox_get_widget(filetype_confbox), FALSE, TRUE, 0);
 
+	if (rs_conf_get_string(CONF_BATCH_FILETYPE))
+		queue->output = rs_output_new(rs_conf_get_string(CONF_BATCH_FILETYPE));
+
+	/* If we fail by now, something must be wrong with our value in conf */
+	if (!queue->output)
+	{
+		queue->output = rs_output_new("RSJpegfile");
+		rs_conf_set_string(CONF_BATCH_FILETYPE, "RSJpegfile");
+	}
+	
 	/* Export size */
 	hbox = gtk_hbox_new(FALSE, 1);
 	queue->size_label = gtk_label_new(NULL);

Modified: trunk/src/rs-batch.h
===================================================================
--- trunk/src/rs-batch.h	2009-02-22 21:50:09 UTC (rev 2217)
+++ trunk/src/rs-batch.h	2009-02-22 21:52:01 UTC (rev 2218)
@@ -34,7 +34,7 @@
 	GtkTreeView *view;
 	gchar *directory;
 	gchar *filename;
-	gint filetype;
+	RSOutput *output;
 	RS_QUEUE_SIZE_LOCK size_lock;
 	gdouble size;
 	void *cms;




More information about the Rawstudio-commit mailing list