[goffice] Fixed EPS images storing.



commit d01302bdfbbe870841d0adad893113d77757219b
Author: Jean Brefort <jean brefort normalesup org>
Date:   Sat Mar 31 10:06:01 2012 +0200

    Fixed EPS images storing.

 ChangeLog                  |    8 ++++++++
 goffice/utils/go-image.c   |    4 ----
 goffice/utils/go-spectre.c |   43 +++++++++++++++++++++++++++++++------------
 3 files changed, 39 insertions(+), 16 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index c517b3b..d71d01b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-03-31  Jean Brefort  <jean brefort normalesup org>
+
+	* goffice/utils/go-image.c (go_image_new_from_file),
+	(go_image_new_from_data): correctly store EPS images even when not
+	supported.
+	* goffice/utils/go-spectre.c (go_spectre_new_from_file),
+	(go_spectre_new_from_data): ditto.
+
 2012-03-26  Jean Brefort  <jean brefort normalesup org>
 
 	* goffice/utils/go-emf.c (go_emf_load_data), (go_emf_get_pixbuf),
diff --git a/goffice/utils/go-image.c b/goffice/utils/go-image.c
index a71b284..6d4c563 100644
--- a/goffice/utils/go-image.c
+++ b/goffice/utils/go-image.c
@@ -512,9 +512,7 @@ go_image_new_from_file (char const *filename, GError **error)
 	case GO_IMAGE_FORMAT_WMF:
 		return go_emf_new_from_file (filename, error);
 	case GO_IMAGE_FORMAT_EPS:
-#ifdef GOFFICE_WITH_EPS
 		return go_spectre_new_from_file (filename, error);
-#endif
 	case GO_IMAGE_FORMAT_PS: /* we might support ps with libspectre */
 	case GO_IMAGE_FORMAT_PDF:
 	case GO_IMAGE_FORMAT_UNKNOWN:
@@ -550,10 +548,8 @@ go_image_new_from_data (char const *type, guint8 const *data, gsize length, char
 		image = go_svg_new_from_data (data, length, error);
 	} else if (!strcmp (type, "emf") || !strcmp (type, "wmf")) {
 		image = go_emf_new_from_data (data, length, error);
-#ifdef GOFFICE_WITH_EPS
 	} else if (!strcmp (type, "eps")) {
 		image = go_spectre_new_from_data (data, length, error);
-#endif
 	} else {
 		GdkPixbufLoader *loader = gdk_pixbuf_loader_new_with_type (type, error);
 		if (loader) {
diff --git a/goffice/utils/go-spectre.c b/goffice/utils/go-spectre.c
index f5feb57..93c180c 100644
--- a/goffice/utils/go-spectre.c
+++ b/goffice/utils/go-spectre.c
@@ -24,6 +24,9 @@
 #ifdef GOFFICE_WITH_EPS
 #       include <libspectre/spectre-document.h>
 #       include <libspectre/spectre-render-context.h>
+#else
+#		include <gsf/gsf-input-textline.h> 
+#		include <gsf/gsf-input-memory.h> 
 #endif
 #include <gsf/gsf-utils.h>
 #include <gsf/gsf-input-stdio.h>
@@ -115,7 +118,7 @@ go_spectre_build_surface (GOSpectre *spectre)
 				     data, (cairo_destroy_func_t) g_free);
 }
 
-Sstatic void
+static void
 go_spectre_draw (GOImage *image, cairo_t *cr)
 {
 	GOSpectre *spectre = GO_SPECTRE (image);
@@ -225,24 +228,26 @@ GSF_CLASS (GOSpectre, go_spectre,
 GOImage *
 go_spectre_new_from_file (char const *filename, GError **error)
 {
-#ifdef GOFFICE_WITH_EPS
 	GOSpectre *spectre = g_object_new (GO_TYPE_SPECTRE, NULL);
 	guint8 *data;
 	GsfInput *input = gsf_input_stdio_new (filename, error);
+#ifdef GOFFICE_WITH_EPS
 	int width, height;
+#endif
 	GOImage *image;
 
 	if (!input)
 		return NULL;
-	spectre->data_length = gsf_input_size (input);
-	data = g_malloc (spectre->data_length);
-	if (!data || !gsf_input_read (input, spectre->data_length, data)) {
+	image = GO_IMAGE (spectre);
+	image->data_length = gsf_input_size (input);
+	data = g_malloc (image->data_length);
+	if (!data || !gsf_input_read (input, image->data_length, data)) {
 		g_object_unref (spectre);
 		g_free (data);
 		return NULL;
 	}
-	image = GO_IMAGE (spectre);
 	image->data = data;
+#ifdef GOFFICE_WITH_EPS
 	spectre->doc = spectre_document_new ();
 	if (spectre->doc == NULL) {
 		g_object_unref (spectre);
@@ -256,16 +261,33 @@ go_spectre_new_from_file (char const *filename, GError **error)
 	spectre_document_get_page_size (spectre->doc, &width, &height);
 	image->width = width;
 	image->height = height;
-	return image;
 #else
-	return NULL;
+	{
+		GsfInput *input = gsf_input_memory_new (image->data, image->data_length, FALSE);
+		GsfInputTextline *text = GSF_INPUT_TEXTLINE (gsf_input_textline_new (input));
+		guint8 *line;
+		while ((line = gsf_input_textline_ascii_gets (text)))
+			if (!strncmp (line, "%%BoundingBox: ", 15)) {
+				unsigned x0, x1, y0, y1;
+				if (sscanf (line + 15, "%u %u %u %u", &x0, &y0, &x1, &y1) == 4) {
+					image->width = x1 - x0;
+					image->height = y1 - y0;
+				} else {
+					image->width = 100;
+					image->height = 100;
+				}
+				break;
+			}
+	       g_object_unref (text);
+	       g_object_unref (input);
+	}
 #endif
+	return image;
 }
 
 GOImage *
 go_spectre_new_from_data (char const *data, size_t length, GError **error)
 {
-#ifdef GOFFICE_WITH_EPS
 	GOImage *image;
 	char *tmpname;
 	int f;
@@ -281,7 +303,4 @@ go_spectre_new_from_data (char const *data, size_t length, GError **error)
 	image = go_spectre_new_from_file (tmpname, error);
 	g_free (tmpname);
 	return image;
-#else
-	return NULL;
-#endif
 }



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