Add JPEG export support
This commit is contained in:
		| @@ -11,6 +11,8 @@ | ||||
| #include <math.h> | ||||
| #include <string.h> | ||||
| #include <librsvg/rsvg.h> | ||||
| #include <gdk-pixbuf/gdk-pixbuf.h> | ||||
| #include <glib/gi18n.h> | ||||
|  | ||||
| #include "config.h" | ||||
| #include "astrognome.h" | ||||
| @@ -1781,6 +1783,72 @@ ag_chart_export_svg_to_file(AgChart *chart, GFile *file, GError **err) | ||||
|         ); | ||||
| } | ||||
|  | ||||
| void | ||||
| ag_chart_export_jpg_to_file(AgChart *chart, GFile *file, GError **err) | ||||
| { | ||||
|     gchar      *svg, | ||||
|                *jpg; | ||||
|     gsize      svg_length, | ||||
|                jpg_length; | ||||
|     RsvgHandle *svg_handle; | ||||
|     GdkPixbuf  *pixbuf; | ||||
|  | ||||
|     if ((svg = ag_chart_create_svg(chart, &svg_length, TRUE, err)) == NULL) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if ((svg_handle = rsvg_handle_new_from_data( | ||||
|                  (const guint8 *)svg, | ||||
|                 svg_length, | ||||
|                 err | ||||
|             )) == NULL) { | ||||
|         g_free(svg); | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     g_free(svg); | ||||
|  | ||||
|     if ((pixbuf = rsvg_handle_get_pixbuf(svg_handle)) == NULL) { | ||||
|         g_set_error( | ||||
|                 err, | ||||
|                 AG_CHART_ERROR, AG_CHART_ERROR_RENDERING_ERROR, | ||||
|                 _("Unknown rendering error") | ||||
|             ); | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (!gdk_pixbuf_save_to_buffer( | ||||
|                 pixbuf, | ||||
|                 &jpg, | ||||
|                 &jpg_length, | ||||
|                 "jpeg", | ||||
|                 err, | ||||
|                 NULL | ||||
|             )) { | ||||
|         g_object_unref(pixbuf); | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     g_object_unref(pixbuf); | ||||
|  | ||||
|     g_file_replace_contents( | ||||
|             file, | ||||
|             (const gchar *)jpg, | ||||
|             jpg_length, | ||||
|             NULL, | ||||
|             FALSE, | ||||
|             G_FILE_CREATE_NONE, | ||||
|             NULL, | ||||
|             NULL, | ||||
|             err | ||||
|         ); | ||||
|  | ||||
|     g_free(jpg); | ||||
| } | ||||
|  | ||||
| void | ||||
| ag_chart_set_note(AgChart *chart, const gchar *note) | ||||
| { | ||||
|   | ||||
| @@ -17,6 +17,7 @@ typedef enum { | ||||
|     AG_CHART_ERROR_NOT_IMPLEMENTED, | ||||
|     AG_CHART_ERROR_INVALID_PLAC_FILE, | ||||
|     AG_CHART_ERROR_UNSUPPORTED_PLAC_FILE, | ||||
|     AG_CHART_ERROR_RENDERING_ERROR, | ||||
| } AgChartError; | ||||
|  | ||||
| #define AG_TYPE_CHART         (ag_chart_get_type()) | ||||
| @@ -69,6 +70,10 @@ void ag_chart_export_svg_to_file(AgChart *chart, | ||||
|                                  GFile   *file, | ||||
|                                  GError  **err); | ||||
|  | ||||
| void ag_chart_export_jpg_to_file(AgChart *chart, | ||||
|                                  GFile   *file, | ||||
|                                  GError  **err); | ||||
|  | ||||
| void ag_chart_set_name(AgChart     *chart, | ||||
|                        const gchar *name); | ||||
|  | ||||
|   | ||||
| @@ -859,6 +859,7 @@ ag_window_export_image(AgWindow *window, GError **err) | ||||
|                                      _("_Save"), GTK_RESPONSE_ACCEPT, | ||||
|                                      NULL); | ||||
|     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fs), filter_svg); | ||||
|     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fs), filter_jpg); | ||||
|     gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fs), filter_svg); | ||||
|     gtk_dialog_set_default_response(GTK_DIALOG(fs), GTK_RESPONSE_ACCEPT); | ||||
|     gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(fs), FALSE); | ||||
| @@ -887,6 +888,9 @@ ag_window_export_image(AgWindow *window, GError **err) | ||||
|             if (filter == filter_svg) { | ||||
|                 extension = ".svg"; | ||||
|                 save_func = &ag_chart_export_svg_to_file; | ||||
|             } else if (filter == filter_jpg) { | ||||
|                 extension = ".jpg"; | ||||
|                 save_func = &ag_chart_export_jpg_to_file; | ||||
|             } else { | ||||
|                 g_warning("Unknown file type"); | ||||
|                 gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fs), filter_svg); | ||||
|   | ||||
| @@ -25,6 +25,7 @@ GtkFileFilter *filter_all   = NULL; | ||||
| GtkFileFilter *filter_chart = NULL; | ||||
| GtkFileFilter *filter_hor   = NULL; | ||||
| GtkFileFilter *filter_svg   = NULL; | ||||
| GtkFileFilter *filter_jpg   = NULL; | ||||
| GtkTreeModel  *country_list = NULL; | ||||
| GtkTreeModel  *city_list    = NULL; | ||||
| GHashTable    *xinclude_positions; | ||||
| @@ -90,6 +91,13 @@ init_filters(void) | ||||
|     gtk_file_filter_set_name(filter_svg, _("SVG image")); | ||||
|     gtk_file_filter_add_pattern(filter_svg, "*.svg"); | ||||
|     g_object_ref_sink(filter_svg); | ||||
|  | ||||
|     filter_jpg = gtk_file_filter_new(); | ||||
|     gtk_file_filter_set_name(filter_jpg, _("JPEG image")); | ||||
|     gtk_file_filter_add_pattern(filter_jpg, "*.jpg"); | ||||
|     gtk_file_filter_add_pattern(filter_jpg, "*.jpe"); | ||||
|     gtk_file_filter_add_pattern(filter_jpg, "*.jpeg"); | ||||
|     g_object_ref_sink(filter_jpg); | ||||
| } | ||||
|  | ||||
| static int | ||||
|   | ||||
| @@ -14,6 +14,7 @@ extern GtkFileFilter    *filter_all; | ||||
| extern GtkFileFilter    *filter_chart; | ||||
| extern GtkFileFilter    *filter_hor; | ||||
| extern GtkFileFilter    *filter_svg; | ||||
| extern GtkFileFilter    *filter_jpg; | ||||
| extern GtkTreeModel     *country_list; | ||||
| extern GtkTreeModel     *city_list; | ||||
| extern const GswePlanet used_planets[]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user