From ee986e1d0acfc586a81aa593c72f9278077f3299 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Tue, 17 Feb 2009 16:37:51 +0000 Subject: Divorce PDF export and printing. At some point, the RISC OS printing code should be ported to the core page-based output engine. svn path=/trunk/netsurf/; revision=6544 --- desktop/print.c | 134 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 68 insertions(+), 66 deletions(-) (limited to 'desktop/print.c') diff --git a/desktop/print.c b/desktop/print.c index 433a0bd89..1fdd5170d 100644 --- a/desktop/print.c +++ b/desktop/print.c @@ -21,24 +21,23 @@ */ #include "utils/config.h" -#ifdef WITH_PDF_EXPORT +#include #include +#include "content/content.h" #include "desktop/options.h" #include "desktop/print.h" #include "desktop/printer.h" -#include "desktop/save_pdf/font_haru.h" - -#include "content/content.h" - -#include "gtk/options.h" - +#include "render/loosen.h" +#include "render/box.h" #include "utils/log.h" #include "utils/talloc.h" -#include "render/loosen.h" -#include "render/box.h" +/* Default print settings */ +#define DEFAULT_PAGE_WIDTH 595 +#define DEFAULT_PAGE_HEIGHT 840 +#define DEFAULT_COPIES 1 static struct content *print_init(struct content *, struct print_settings *); static bool print_apply_settings(struct content *, struct print_settings *); @@ -54,20 +53,20 @@ int html_redraw_printing_top_cropped = 0; /** * This function calls print setup, prints page after page until the whole * content is printed calls cleaning up afterwise. + * * \param content The content to be printed * \param printer The printer interface for the printer to be used - * \param settings The settings for printing to use or NULL for DEFAULT + * \param settings The settings for printing to use * \return true if successful, false otherwise -*/ + */ bool print_basic_run(struct content *content, const struct printer *printer, struct print_settings *settings) { bool ret = true; - - if (settings == NULL) - settings = print_make_settings(DEFAULT, NULL); + assert(content != NULL && printer != NULL && settings != NULL); + if (!print_set_up(content, printer, settings, NULL)) ret = false; @@ -82,12 +81,13 @@ bool print_basic_run(struct content *content, /** * This function prepares the content to be printed. The current browser content * is duplicated and resized, printer initialization is called. + * * \param content The content to be printed * \param printer The printer interface for the printer to be used * \param settings The settings for printing to use * \param height updated to the height of the printed content * \return true if successful, false otherwise -*/ + */ bool print_set_up(struct content *content, const struct printer *printer, struct print_settings *settings, double *height) @@ -111,12 +111,13 @@ bool print_set_up(struct content *content, /** * This function draws one page, beginning with the height offset of done_height + * * \param printer The printer interface for the printer to be used * \param settings The settings for printing to use * \return true if successful, false otherwise */ bool print_draw_next_page(const struct printer *printer, - struct print_settings *settings) + struct print_settings *settings) { int clip_x1, clip_y1; @@ -130,7 +131,7 @@ bool print_draw_next_page(const struct printer *printer, html_redraw_printing_border = clip_y1; printer->print_next_page(); - if( !content_redraw(printed_content, + if (!content_redraw(printed_content, 0, -done_height, 0,0, @@ -140,16 +141,19 @@ bool print_draw_next_page(const struct printer *printer, clip_y1, settings->scale, 0xffffff)) return false; + done_height += page_content_height - (html_redraw_printing_top_cropped != INT_MAX ? - clip_y1 - html_redraw_printing_top_cropped : 0) / settings->scale; - + clip_y1 - html_redraw_printing_top_cropped : 0) / + settings->scale; + return true; } /** * The content passed to the function is duplicated with its boxes, font * measuring functions are being set. + * * \param content The content to be printed * \param settings The settings for printing to use * \return true if successful, false otherwise @@ -160,7 +164,7 @@ struct content *print_init(struct content *content, struct content* printed_content; struct content_user *user_sentinel; - content_add_user(content, NULL, (intptr_t)print_init, 0); + content_add_user(content, NULL, (intptr_t) print_init, 0); printed_content = talloc_memdup(content, content, sizeof *content); @@ -178,15 +182,16 @@ struct content *print_init(struct content *content, printed_content->data.html.layout = box_duplicate_tree(content->data.html.layout, - printed_content); + printed_content); - if (!printed_content->data.html.layout) + if (!printed_content->data.html.layout) { + talloc_free(printed_content); return NULL; + } - if (settings->font_func == NULL) - printed_content->data.html.font_func = &haru_nsfont; - else - printed_content->data.html.font_func = settings->font_func; + assert(settings->font_func != NULL); + + printed_content->data.html.font_func = settings->font_func; return printed_content; } @@ -194,6 +199,7 @@ struct content *print_init(struct content *content, /** * The content is resized to fit page width. In case it is to wide, it is * loosened. + * * \param content The content to be printed * \param settings The settings for printing to use * \return true if successful, false otherwise @@ -206,32 +212,36 @@ bool print_apply_settings(struct content *content, /*Apply settings - adjust page size etc*/ - page_content_width = (settings->page_width - settings->margins[MARGINLEFT] - + page_content_width = (settings->page_width - + settings->margins[MARGINLEFT] - settings->margins[MARGINRIGHT]) / settings->scale; - page_content_height = (settings->page_height - settings->margins[MARGINTOP] - + page_content_height = (settings->page_height - + settings->margins[MARGINTOP] - settings->margins[MARGINBOTTOM]) / settings->scale; content_reformat(content, page_content_width, 0); + LOG(("New layout applied.New height = %d ; New width = %d ", - content->height, content->width)); + content->height, content->width)); /*check if loosening is necessary and requested*/ if (option_enable_loosening && content->width > page_content_width) - return loosen_document_layout(content, content->data.html.layout, + return loosen_document_layout(content, + content->data.html.layout, page_content_width, page_content_height); - - return true; + + return true; } /** * Memory allocated during printing is being freed here. + * * \param content The original content * \param printer The printer interface for the printer to be used * \return true if successful, false otherwise */ -bool print_cleanup(struct content *content, - const struct printer *printer, +bool print_cleanup(struct content *content, const struct printer *printer, struct print_settings *settings) { printer->print_end(); @@ -239,7 +249,8 @@ bool print_cleanup(struct content *content, html_redraw_printing = false; if (printed_content) { - content_remove_user(printed_content, NULL, (intptr_t)print_init, 0); + content_remove_user(printed_content, NULL, + (intptr_t) print_init, 0); talloc_free(printed_content); } @@ -253,29 +264,25 @@ bool print_cleanup(struct content *content, /** * Generates one of the predefined print settings sets. + * * \param configuration the requested configuration * \param filename the filename or NULL + * \param font handling functions * \return print_settings in case if successful, NULL if unknown configuration \ * or lack of memory. */ struct print_settings *print_make_settings(print_configuration configuration, - const char *filename) + const char *filename, const struct font_functions *font_func) { struct print_settings *settings; - char *path; struct css_length length; - path = malloc(PATH_MAX * sizeof(char)); - if (path == NULL) - return NULL; - length.unit = CSS_UNIT_MM; switch (configuration){ - case DEFAULT: + case PRINT_DEFAULT: settings = (struct print_settings*) - malloc(sizeof(struct print_settings) ); - + malloc(sizeof(struct print_settings)); if (settings == NULL) return NULL; @@ -293,15 +300,11 @@ struct print_settings *print_make_settings(print_configuration configuration, settings->margins[MARGINTOP] = css_len2px(&length, 0); length.value = DEFAULT_MARGIN_BOTTOM_MM; settings->margins[MARGINBOTTOM] = css_len2px(&length, 0); - - settings->font_func = &haru_nsfont; - break; - /*use settings from the Export options tab*/ - case OPTIONS: + /* use settings from the Export options tab */ + case PRINT_OPTIONS: settings = (struct print_settings*) - malloc(sizeof(struct print_settings) ); - + malloc(sizeof(struct print_settings)); if (settings == NULL) return NULL; @@ -319,25 +322,24 @@ struct print_settings *print_make_settings(print_configuration configuration, settings->margins[MARGINTOP] = css_len2px(&length, 0); length.value = option_margin_bottom; settings->margins[MARGINBOTTOM] = css_len2px(&length, 0); - - settings->font_func = &haru_nsfont; - break; default: return NULL; } - - /*if no filename is specified use one without an extension*/ - if (filename == NULL) { - /*TODO: the "/" is not platform independent*/ - strcpy(path, "/out"); - } - else - strcpy(path, filename); - - settings->output = path; - + + /* Set font functions */ + settings->font_func = font_func; + + /* Output filename, or NULL if printing */ + if (filename != NULL) { + settings->output = strdup(filename); + if (settings->output == NULL) { + free(settings); + return NULL; + } + } else + settings->output = NULL; + return settings; } -#endif /* WITH_PDF_EXPORT */ -- cgit v1.2.3