From f0d2e71ef9de7c23e12956fae070c49891769e0a Mon Sep 17 00:00:00 2001 From: Moritz Lipp Date: Mon, 2 May 2011 18:49:54 +0200 Subject: [PATCH] Allow async printing and calculate scale level --- print.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/print.c b/print.c index 3545997..74a0da4 100644 --- a/print.c +++ b/print.c @@ -18,7 +18,7 @@ print(zathura_t* zathura) gtk_print_operation_set_default_page_setup(print_operation, zathura->print.page_setup); } - gtk_print_operation_set_show_progress(print_operation, TRUE); + gtk_print_operation_set_allow_async(print_operation, TRUE); gtk_print_operation_set_n_pages(print_operation, zathura->document->number_of_pages); gtk_print_operation_set_current_page(print_operation, zathura->document->current_page_number); @@ -40,22 +40,41 @@ print(zathura_t* zathura) g_object_unref(print_operation); } +void +cb_print_begin(GtkPrintOperation* print_operation, GtkPrintContext* context, zathura_t* zathura) +{ + +} + void cb_print_draw_page(GtkPrintOperation* print_operation, GtkPrintContext* context, gint page_number, zathura_t* zathura) { - /*cairo_t* cairo = gtk_print_context_get_cairo_context(context);*/ + cairo_t* cairo = gtk_print_context_get_cairo_context(context); - /*zathura_page_t* page = zathura->document->pages[page_number];*/ - /*g_static_mutex_lock(&(page->lock));*/ - /*zathura_image_buffer_t* image_buffer = zathura_page_render(page);*/ - /*g_static_mutex_unlock(&(page->lock));*/ + girara_info("Printing page %d", page_number); - /*for (unsigned int y = 0; y < image_buffer->height; y++) {*/ - /*unsigned char* src = image_buffer->data + y * image_buffer->rowstride;*/ - /*for (unsigned int x = 0; x < image_buffer->width; x++) {*/ - /*cairo_set_source_rgb(cairo, src[0], src[1], src[2]);*/ - /*cairo_rectangle(cairo, x, y, 1, 1);*/ - /*cairo_fill(cairo);*/ - /*}*/ - /*}*/ + zathura_page_t* page = zathura->document->pages[page_number]; + + double requested_with = gtk_print_context_get_width(context); + double tmp_scale = zathura->document->scale; + zathura->document->scale = requested_with / page->width; + + g_static_mutex_lock(&(page->lock)); + zathura_image_buffer_t* image_buffer = zathura_page_render(page); + g_static_mutex_unlock(&(page->lock)); + + for (unsigned int y = 0; y < image_buffer->height; y++) { + unsigned char* src = image_buffer->data + y * image_buffer->rowstride; + for (unsigned int x = 0; x < image_buffer->width; x++) { + if (src[0] != 255 && src[1] != 255 && src[2] != 255) { + cairo_set_source_rgb(cairo, src[0], src[1], src[2]); + cairo_rectangle(cairo, x, y, 1, 1); + cairo_fill(cairo); + } + + src += 3; + } + } + + zathura->document->scale = tmp_scale; }