[goffice] Fixed EPS images storing.
- From: Jean BrÃfort <jbrefort src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] Fixed EPS images storing.
- Date: Sat, 31 Mar 2012 08:07:18 +0000 (UTC)
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]