From ce86289eed0651c846a609743d77e26cacbcfde6 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 13 Sep 2011 16:02:42 -0700 Subject: Add the capability to print a dive profile Ok, this is the ugliest f*&$ing printout I have ever seen in my life, but think of it as a "the concept of printing works" commit, and you'll be able to hold your lunch down and not gouge out your eyeballs with a spoon. Maybe. I'm just doing the cairo display as-is for the printout, which is a seriously bad idea. I need to not try to do colors etc, and instead of having white lines on a black background I just need to make thelines be black on white paper. But that would involve actually changing the current "plot()" routine, which is against the point of the exercise right now. This really is just a demonstration of how to add printing capabilities. Signed-off-by: Linus Torvalds --- print.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 print.c (limited to 'print.c') diff --git a/print.c b/print.c new file mode 100644 index 000000000..c2114d56c --- /dev/null +++ b/print.c @@ -0,0 +1,59 @@ +#include + +#include "dive.h" +#include "display.h" + +static void draw_page(GtkPrintOperation *operation, + GtkPrintContext *context, + gint page_nr, + gpointer user_data) +{ + cairo_t *cr; + PangoLayout *layout; + double w, h; + struct graphics_context gc = { 0 }; + + cr = gtk_print_context_get_cairo_context(context); + gc.cr = cr; + + layout=gtk_print_context_create_pango_layout(context); + + w = gtk_print_context_get_width(context); + h = gtk_print_context_get_height(context); + + /* Do the profile on the top third of the page.. */ + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_rectangle(cr, 0, 0, w, h/3); + cairo_fill(cr); + plot(&gc, w, h/3, current_dive); + + pango_cairo_show_layout(cr,layout); + g_object_unref(layout); +} + +static void begin_print(GtkPrintOperation *operation, gpointer user_data) +{ +} + +static GtkPrintSettings *settings = NULL; + +void do_print(void) +{ + GtkPrintOperation *print; + GtkPrintOperationResult res; + + print = gtk_print_operation_new(); + if (settings != NULL) + gtk_print_operation_set_print_settings(print, settings); + gtk_print_operation_set_n_pages(print, 1); + g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), NULL); + g_signal_connect(print, "draw_page", G_CALLBACK(draw_page), NULL); + res = gtk_print_operation_run(print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + GTK_WINDOW(main_window), NULL); + if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { + if (settings != NULL) + g_object_unref(settings); + settings = g_object_ref(gtk_print_operation_get_print_settings(print)); + } + g_object_unref(print); +} -- cgit v1.2.3-70-g09d2