diff --git a/amiga/save_pdf.c b/amiga/save_pdf.c index 36b090549..f446da1e4 100644 --- a/amiga/save_pdf.c +++ b/amiga/save_pdf.c @@ -27,6 +27,7 @@ #include #include "content/content.h" #include "desktop/print.h" +#include "desktop/save_pdf/font_haru.h" #include "desktop/save_pdf/pdf_plotters.h" #include "amiga/save_pdf.h" #include "utils/log.h" @@ -43,12 +44,13 @@ bool save_as_pdf(struct content *c, const char *path) { struct print_settings *psettings; - psettings = print_make_settings(DEFAULT, path); + psettings = print_make_settings(PRINT_DEFAULT, path, &haru_nsfont); if (psettings == NULL) return false; if (!print_basic_run(c, &pdf_printer, psettings)) return false; + return true; } diff --git a/desktop/options.h b/desktop/options.h index 85ba13b7b..cf26728f0 100644 --- a/desktop/options.h +++ b/desktop/options.h @@ -94,14 +94,11 @@ extern bool option_remove_backgrounds; extern bool option_enable_loosening; extern bool option_enable_PDF_compression; extern bool option_enable_PDF_password; -#define DEFAULT_PAGE_WIDTH 595 -#define DEFAULT_PAGE_HEIGHT 840 #define DEFAULT_MARGIN_TOP_MM 10 #define DEFAULT_MARGIN_BOTTOM_MM 10 #define DEFAULT_MARGIN_LEFT_MM 10 #define DEFAULT_MARGIN_RIGHT_MM 10 #define DEFAULT_EXPORT_SCALE 0.7 -#define DEFAULT_COPIES 1 /* Fetcher configuration. */ extern int option_max_fetchers; 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 */ diff --git a/desktop/print.h b/desktop/print.h index 98f382eca..bc07e377e 100644 --- a/desktop/print.h +++ b/desktop/print.h @@ -40,7 +40,7 @@ struct printer; enum { MARGINLEFT = 0, MARGINRIGHT = 1, MARGINTOP = 2, MARGINBOTTOM = 3}; /** Predefined printing configuration names*/ -typedef enum {DEFAULT, OPTIONS} print_configuration; +typedef enum { PRINT_DEFAULT, PRINT_OPTIONS } print_configuration; /** Settings for a print - filled in by print_make_settings or * 'manually' by the caller @@ -62,19 +62,19 @@ struct print_settings{ }; -bool print_basic_run(struct content *, const struct printer *, struct print_settings *); -bool print_set_up(struct content *content, - const struct printer *printer, struct print_settings *settings, - double *height); +bool print_basic_run(struct content *, const struct printer *, + struct print_settings *); +bool print_set_up(struct content *content, const struct printer *printer, + struct print_settings *settings, double *height); bool print_draw_next_page(const struct printer *printer, struct print_settings *settings); bool print_cleanup(struct content *, const struct printer *, struct print_settings *settings); struct print_settings *print_make_settings(print_configuration configuration, - const char *url); + const char *url, const struct font_functions *font_func); -/*is the content currently redrawn fo printing?*/ +/*is the content currently redrawn for printing?*/ extern bool html_redraw_printing; /*if something is partially under this Y coordinate it won't be drawn...*/ extern int html_redraw_printing_border; @@ -82,3 +82,4 @@ extern int html_redraw_printing_border; extern int html_redraw_printing_top_cropped; #endif + diff --git a/desktop/save_pdf/pdf_plotters.c b/desktop/save_pdf/pdf_plotters.c index b30545b60..c538efa72 100644 --- a/desktop/save_pdf/pdf_plotters.c +++ b/desktop/save_pdf/pdf_plotters.c @@ -24,6 +24,7 @@ #include "utils/config.h" #ifdef WITH_PDF_EXPORT +#include #include #include #include "hpdf.h" @@ -735,6 +736,8 @@ void pdf_end(void) } #endif + assert(settings->output != NULL); + /*Encryption on*/ if (option_enable_PDF_password) PDF_Password(&owner_pass, &user_pass, diff --git a/gtk/gtk_print.c b/gtk/gtk_print.c index 0ce951f56..d74e4250d 100644 --- a/gtk/gtk_print.c +++ b/gtk/gtk_print.c @@ -25,56 +25,52 @@ */ #include "utils/config.h" -#ifdef WITH_PDF_EXPORT #include #include #include #include -#include "desktop/plotters.h" -#include "gtk/font_pango.h" -#include "gtk/gtk_scaffolding.h" -#include "render/font.h" -#include "utils/log.h" -#include "desktop/options.h" -#include "gtk/options.h" -#include "gtk/gtk_bitmap.h" +#include "content/content.h" +#include "desktop/options.h" +#include "desktop/plotters.h" #include "desktop/print.h" #include "desktop/printer.h" -#include "content/content.h" -#include "gtk_print.h" +#include "gtk/font_pango.h" +#include "gtk/gtk_bitmap.h" +#include "gtk/gtk_print.h" +#include "gtk/gtk_scaffolding.h" +#include "gtk/options.h" +#include "render/font.h" +#include "utils/log.h" #include "utils/utils.h" -cairo_t *gtk_print_current_cr; -static struct print_settings* settings; -struct content *content_to_print; - static bool nsgtk_print_plot_clg(colour c); static bool nsgtk_print_plot_rectangle(int x0, int y0, int width, int height, int line_width, colour c, bool dotted, bool dashed); static bool nsgtk_print_plot_line(int x0, int y0, int x1, int y1, int width, colour c, bool dotted, bool dashed); static bool nsgtk_print_plot_polygon(const int *p, unsigned int n, colour fill); -static bool nsgtk_print_plot_path(const float *p, unsigned int n, colour fill, float width, - colour c, const float transform[6]); +static bool nsgtk_print_plot_path(const float *p, unsigned int n, colour fill, + float width, colour c, const float transform[6]); static bool nsgtk_print_plot_fill(int x0, int y0, int x1, int y1, colour c); static bool nsgtk_print_plot_clip(int clip_x0, int clip_y0, int clip_x1, int clip_y1); static bool nsgtk_print_plot_text(int x, int y, const struct css_style *style, const char *text, size_t length, colour bg, colour c); -static bool nsgtk_print_plot_disc(int x, int y, int radius, colour c, bool filled); -static bool nsgtk_print_plot_arc(int x, int y, int radius, int angle1, int angle2, - colour c); +static bool nsgtk_print_plot_disc(int x, int y, int radius, colour c, + bool filled); +static bool nsgtk_print_plot_arc(int x, int y, int radius, int angle1, + int angle2, colour c); static bool nsgtk_print_plot_bitmap(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, struct content *content); static bool nsgtk_print_plot_bitmap_tile(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, bool repeat_x, bool repeat_y, struct content *content); -static void nsgtk_print_set_solid(void); /**< Set for drawing solid lines */ -static void nsgtk_print_set_dotted(void); /**< Set for drawing dotted lines */ -static void nsgtk_print_set_dashed(void); /**< Set for drawing dashed lines */ +static void nsgtk_print_set_solid(void); /**< Set for drawing solid lines */ +static void nsgtk_print_set_dotted(void); /**< Set for drawing dotted lines */ +static void nsgtk_print_set_dashed(void); /**< Set for drawing dashed lines */ static void nsgtk_print_set_colour(colour c); @@ -86,9 +82,12 @@ static bool gtk_print_font_paint(const struct css_style *style, static bool gtk_print_begin(struct print_settings* settings); static bool gtk_print_next_page(void); -static void gtk_print_end(void); - +static void gtk_print_end(void); +/* Globals */ +cairo_t *gtk_print_current_cr; +static struct print_settings* settings; +struct content *content_to_print; static GdkRectangle cliprect; static const struct plotter_table nsgtk_print_plotters = { @@ -110,7 +109,7 @@ static const struct plotter_table nsgtk_print_plotters = { false }; -static const struct printer gtk_printer= { +static const struct printer gtk_printer = { &nsgtk_print_plotters, gtk_print_begin, gtk_print_next_page, @@ -126,7 +125,9 @@ bool nsgtk_print_plot_rectangle(int x0, int y0, int width, int height, int line_width, colour c, bool dotted, bool dashed) { LOG(("Plotting rectangle. width: %i ; height: %i", width, height)); + nsgtk_print_set_colour(c); + if (dotted) nsgtk_print_set_dotted(); else if (dashed) @@ -134,7 +135,6 @@ bool nsgtk_print_plot_rectangle(int x0, int y0, int width, int height, else nsgtk_print_set_solid(); - if (line_width == 0) line_width = 1; @@ -150,6 +150,7 @@ bool nsgtk_print_plot_line(int x0, int y0, int x1, int y1, int width, colour c, bool dotted, bool dashed) { nsgtk_print_set_colour(c); + if (dotted) nsgtk_print_set_dotted(); else if (dashed) @@ -157,7 +158,6 @@ bool nsgtk_print_plot_line(int x0, int y0, int x1, int y1, int width, else nsgtk_print_set_solid(); - if (width == 0) width = 1; @@ -172,21 +172,23 @@ bool nsgtk_print_plot_line(int x0, int y0, int x1, int y1, int width, bool nsgtk_print_plot_polygon(const int *p, unsigned int n, colour fill) { - - LOG(("Plotting polygon.")); unsigned int i; + LOG(("Plotting polygon.")); + nsgtk_print_set_colour(fill); nsgtk_print_set_solid(); - cairo_set_line_width(gtk_print_current_cr, 0); cairo_move_to(gtk_print_current_cr, p[0], p[1]); + LOG(("Starting line at: %i\t%i",p[0],p[1])); + for (i = 1; i != n; i++) { cairo_line_to(gtk_print_current_cr, p[i * 2], p[i * 2 + 1]); LOG(("Drawing line to: %i\t%i",p[i * 2], p[i * 2 + 1])); } + cairo_fill(gtk_print_current_cr); cairo_stroke(gtk_print_current_cr); @@ -196,13 +198,14 @@ bool nsgtk_print_plot_polygon(const int *p, unsigned int n, colour fill) bool nsgtk_print_plot_fill(int x0, int y0, int x1, int y1, colour c) { - LOG(("Plotting fill. x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i", x0,y0,x1,y1)); + LOG(("Plotting fill. x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i", + x0,y0,x1,y1)); + nsgtk_print_set_colour(c); nsgtk_print_set_solid(); - /*Normalize boundaries of the area - to prevent overflows. - See comment in pdf_plot_fill. - */ + /* Normalize boundaries of the area - to prevent overflows. + * See comment in pdf_plot_fill. */ x0 = min(max(x0, 0), settings->page_width); y0 = min(max(y0, 0), settings->page_height); x1 = min(max(x1, 0), settings->page_width); @@ -223,15 +226,13 @@ bool nsgtk_print_plot_clip(int clip_x0, int clip_y0, LOG(("Clipping. x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i", clip_x0,clip_y0,clip_x1,clip_y1)); - /*Normalize cllipping area - to prevent overflows. - See comment in pdf_plot_fill. - */ + /* Normalize cllipping area - to prevent overflows. + * See comment in pdf_plot_fill. */ clip_x0 = min(max(clip_x0, 0), settings->page_width); clip_y0 = min(max(clip_y0, 0), settings->page_height); clip_x1 = min(max(clip_x1, 0), settings->page_width); clip_y1 = min(max(clip_y1, 0), settings->page_height); - cairo_reset_clip(gtk_print_current_cr); cairo_rectangle(gtk_print_current_cr, clip_x0, clip_y0, clip_x1 - clip_x0, clip_y1 - clip_y0); @@ -242,8 +243,7 @@ bool nsgtk_print_plot_clip(int clip_x0, int clip_y0, cliprect.width = clip_x1 - clip_x0; cliprect.height = clip_y1 - clip_y0; - return true; - + return true; } @@ -271,11 +271,11 @@ bool nsgtk_print_plot_disc(int x, int y, int radius, colour c, bool filled) cairo_stroke(gtk_print_current_cr); - return true; } -bool nsgtk_print_plot_arc(int x, int y, int radius, int angle1, int angle2, colour c) +bool nsgtk_print_plot_arc(int x, int y, int radius, int angle1, int angle2, + colour c) { nsgtk_print_set_colour(c); nsgtk_print_set_solid(); @@ -286,7 +286,6 @@ bool nsgtk_print_plot_arc(int x, int y, int radius, int angle1, int angle2, colo (angle2 + 90) * (M_PI / 180)); cairo_stroke(gtk_print_current_cr); - return true; } @@ -301,22 +300,21 @@ static bool nsgtk_print_plot_pixbuf(int x, int y, int width, int height, return true; if (gdk_pixbuf_get_width(pixbuf) == width && - gdk_pixbuf_get_height(pixbuf) == height) { + gdk_pixbuf_get_height(pixbuf) == height) { gdk_cairo_set_source_pixbuf(gtk_print_current_cr, pixbuf, x, y); cairo_paint(gtk_print_current_cr); - - } else { + } else { GdkPixbuf *scaled; scaled = gdk_pixbuf_scale_simple(pixbuf, width, height, - /* plotting for the printer doesn't have to be fast - * so we can use always the interp_style - * that gives better quality + /* plotting for the printer doesn't have + * to be fast so we can use always the + * interp_style that gives better quality */ - GDK_INTERP_BILINEAR - ); + GDK_INTERP_BILINEAR); if (!scaled) return false; + gdk_cairo_set_source_pixbuf(gtk_print_current_cr, scaled, x, y); cairo_paint(gtk_print_current_cr); @@ -330,6 +328,7 @@ bool nsgtk_print_plot_bitmap(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, struct content *content) { GdkPixbuf *pixbuf = gtk_bitmap_get_primary(bitmap); + return nsgtk_print_plot_pixbuf(x, y, width, height, pixbuf, bg); } @@ -343,7 +342,8 @@ bool nsgtk_print_plot_bitmap_tile(int x, int y, int width, int height, if (!(repeat_x || repeat_y)) { /* Not repeating at all, so just pass it on */ - return nsgtk_print_plot_bitmap(x,y,width,height,bitmap,bg,content); + return nsgtk_print_plot_bitmap(x, y, width, height, + bitmap, bg, content); } if (repeat_x && !repeat_y) @@ -356,42 +356,47 @@ bool nsgtk_print_plot_bitmap_tile(int x, int y, int width, int height, assert(pretiled != NULL); primary = gtk_bitmap_get_primary(bitmap); + /* use the primary and pretiled widths to scale the w/h provided */ width *= gdk_pixbuf_get_width(pretiled); width /= gdk_pixbuf_get_width(primary); height *= gdk_pixbuf_get_height(pretiled); height /= gdk_pixbuf_get_height(primary); - if (y > cliprect.y) - doneheight = (cliprect.y - height) + ((y - cliprect.y) % height); - else + if (y > cliprect.y) { + doneheight = (cliprect.y - height) + + ((y - cliprect.y) % height); + } else doneheight = y; while (doneheight < (cliprect.y + cliprect.height)) { - if (x > cliprect.x) - donewidth = (cliprect.x - width) + ((x - cliprect.x) % width); - else + if (x > cliprect.x) { + donewidth = (cliprect.x - width) + + ((x - cliprect.x) % width); + } else donewidth = x; + while (donewidth < (cliprect.x + cliprect.width)) { nsgtk_print_plot_pixbuf(donewidth, doneheight, width, height, pretiled, bg); donewidth += width; if (!repeat_x) break; } + doneheight += height; + if (!repeat_y) break; } return true; } -bool nsgtk_print_plot_path(const float *p, unsigned int n, colour fill, float width, - colour c, const float transform[6]) +bool nsgtk_print_plot_path(const float *p, unsigned int n, colour fill, + float width, colour c, const float transform[6]) { /* Only the internal SVG renderer uses this plot call currently, - * and the GTK version uses librsvg. Thus, we ignore this complexity, - * and just return true obliviously. - */ + * and the GTK version uses librsvg. Thus, we ignore this complexity, + * and just return true obliviously. */ return true; } @@ -410,33 +415,27 @@ void nsgtk_print_set_colour(colour c) colour.blue = b | (b << 8); colour.pixel = (r << 16) | (g << 8) | b; - gdk_color_alloc(gdk_colormap_get_system(), - &colour); + gdk_color_alloc(gdk_colormap_get_system(), &colour); cairo_set_source_rgba(gtk_print_current_cr, r / 255.0, g / 255.0, b / 255.0, 1.0); - } - -void nsgtk_print_set_solid() +void nsgtk_print_set_solid(void) { - double dashes = 0; cairo_set_dash(gtk_print_current_cr, &dashes, 0, 0); - } -void nsgtk_print_set_dotted() +void nsgtk_print_set_dotted(void) { double cdashes = 1; cairo_set_dash(gtk_print_current_cr, &cdashes, 1, 0); - } -void nsgtk_print_set_dashed() +void nsgtk_print_set_dashed(void) { double cdashes = 3; @@ -456,13 +455,14 @@ bool gtk_print_font_paint(const struct css_style *style, return true; desc = nsfont_style_to_description(style); - size = (gint)((double)pango_font_description_get_size(desc) * settings->scale); + size = (gint) ((double) pango_font_description_get_size(desc) * + settings->scale); + if (pango_font_description_get_size_is_absolute(desc)) pango_font_description_set_absolute_size(desc, size); else pango_font_description_set_size(desc, size); - layout = pango_cairo_create_layout(gtk_print_current_cr); pango_layout_set_font_description(layout, desc); @@ -474,35 +474,33 @@ bool gtk_print_font_paint(const struct css_style *style, nsgtk_print_set_colour(c); pango_cairo_show_layout_line(gtk_print_current_cr, line); - g_object_unref(layout); pango_font_description_free(desc); return true; } - - static bool gtk_print_begin(struct print_settings* settings) { return true; } -static bool gtk_print_next_page() +static bool gtk_print_next_page(void) { return true; } -static void gtk_print_end() +static void gtk_print_end(void) { } -/** Handle the begin_print signal from the GtkPrintOperation +/** + * Handle the begin_print signal from the GtkPrintOperation + * * \param operation the operation which emited the signal * \param context the print context used to set up the pages * \param user_data nothing in here */ void gtk_print_signal_begin_print (GtkPrintOperation *operation, - GtkPrintContext *context, - gpointer user_data) + GtkPrintContext *context, gpointer user_data) { int page_number; double height_on_page, height_to_print; @@ -532,34 +530,33 @@ void gtk_print_signal_begin_print (GtkPrintOperation *operation, height_to_print *= settings->scale; page_number = height_to_print / height_on_page; + if (height_to_print - page_number * height_on_page > 0) page_number += 1; gtk_print_operation_set_n_pages(operation, page_number); } -/** Handle the draw_page signal from the GtkPrintOperation. +/** + * Handle the draw_page signal from the GtkPrintOperation. * This function changes only the cairo context to print on. */ void gtk_print_signal_draw_page(GtkPrintOperation *operation, - GtkPrintContext *context, - gint page_nr, - gpointer user_data) + GtkPrintContext *context, gint page_nr, gpointer user_data) { LOG(("Draw Page")); gtk_print_current_cr = gtk_print_context_get_cairo_context(context); print_draw_next_page(>k_printer, settings); } -/** Handle the end_print signal from the GtkPrintOperation. +/** + * Handle the end_print signal from the GtkPrintOperation. * This functions calls only the print_cleanup function from the print interface */ void gtk_print_signal_end_print(GtkPrintOperation *operation, - GtkPrintContext *context, - gpointer user_data) + GtkPrintContext *context, gpointer user_data) { LOG(("End print")); print_cleanup(content_to_print, >k_printer, user_data); } -#endif /* WITH_PDF_EXPORT */ diff --git a/gtk/gtk_scaffolding.c b/gtk/gtk_scaffolding.c index 8a8c5e3aa..2e8264916 100644 --- a/gtk/gtk_scaffolding.c +++ b/gtk/gtk_scaffolding.c @@ -29,23 +29,29 @@ #include "desktop/history_core.h" #include "desktop/gui.h" #include "desktop/netsurf.h" -#include "desktop/plotters.h" -#include "desktop/selection.h" #include "desktop/options.h" +#include "desktop/plotters.h" +#include "desktop/print.h" +#ifdef WITH_PDF_EXPORT +#include "desktop/save_pdf/font_haru.h" +#include "desktop/save_pdf/pdf_plotters.h" +#endif +#include "desktop/selection.h" #include "desktop/textinput.h" -#include "gtk/gtk_gui.h" -#include "gtk/gtk_plotters.h" -#include "gtk/gtk_scaffolding.h" +#include "gtk/gtk_completion.h" #include "gtk/dialogs/gtk_options.h" #include "gtk/dialogs/gtk_about.h" -#include "gtk/gtk_completion.h" -#include "gtk/gtk_throbber.h" -#include "gtk/gtk_history.h" -#include "gtk/gtk_window.h" -#include "gtk/gtk_schedule.h" #include "gtk/gtk_download.h" -#include "gtk/options.h" +#include "gtk/gtk_gui.h" +#include "gtk/gtk_history.h" +#include "gtk/gtk_plotters.h" +#include "gtk/gtk_print.h" +#include "gtk/gtk_scaffolding.h" +#include "gtk/gtk_schedule.h" #include "gtk/gtk_tabs.h" +#include "gtk/gtk_throbber.h" +#include "gtk/gtk_window.h" +#include "gtk/options.h" #include "render/box.h" #include "render/font.h" #include "render/form.h" @@ -54,12 +60,6 @@ #include "utils/utils.h" #include "utils/url.h" -#include "desktop/print.h" -#include "desktop/save_pdf/pdf_plotters.h" -#ifdef WITH_PDF_EXPORT -#include "gtk/gtk_print.h" -#include "desktop/save_pdf/font_haru.h" -#endif #undef NDEBUG #include "utils/log.h" @@ -168,8 +168,8 @@ MENUPROTO(open_location); MENUPROTO(open_file); #ifdef WITH_PDF_EXPORT MENUPROTO(export_pdf); -MENUPROTO(print); #endif +MENUPROTO(print); MENUPROTO(close_window); MENUPROTO(quit); @@ -225,8 +225,8 @@ static struct menu_events menu_events[] = { MENUEVENT(open_file), #ifdef WITH_PDF_EXPORT MENUEVENT(export_pdf), - MENUEVENT(print), #endif + MENUEVENT(print), MENUEVENT(close_window), MENUEVENT(quit), @@ -555,7 +555,6 @@ MENUHANDLER(open_file) } #ifdef WITH_PDF_EXPORT - MENUHANDLER(export_pdf) { GtkWidget *save_dialog; @@ -586,7 +585,6 @@ MENUHANDLER(export_pdf) strncat(dirname, "/", PATH_MAX - strlen(dirname)); dirname[PATH_MAX - 1] = '\0'; - settings = print_make_settings(OPTIONS, NULL); /*this way the scale used by PDF functions is synchronized with that used by the all-purpose print interface*/ haru_nsfont_set_scale((float)option_export_scale / 100); @@ -604,9 +602,19 @@ MENUHANDLER(export_pdf) filename); if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) { - settings->output = gtk_file_chooser_get_filename( + gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(save_dialog)); + settings = print_make_settings(PRINT_OPTIONS, + (const char *) filename, &haru_nsfont); + g_free(filename); + + if (settings == NULL) { + warn_user(messages_get("NoMemory"), 0); + gtk_widget_destroy(save_dialog); + return TRUE; + } + /* This will clean up the print_settings object for us */ print_basic_run(bw->current_content, &pdf_printer, settings); } @@ -615,6 +623,7 @@ MENUHANDLER(export_pdf) return TRUE; } +#endif /* WITH_PDF_EXPORT */ MENUHANDLER(print) { @@ -654,7 +663,7 @@ MENUHANDLER(print) } gtk_print_operation_set_default_page_setup(print_op, page_setup); - settings = print_make_settings(DEFAULT, NULL); + settings = print_make_settings(PRINT_DEFAULT, NULL, &nsfont); g_signal_connect(print_op, "begin_print", G_CALLBACK(gtk_print_signal_begin_print), settings); @@ -685,8 +694,6 @@ MENUHANDLER(print) return TRUE; } -#endif /* WITH_PDF_EXPORT */ - MENUHANDLER(close_window) { struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g; @@ -1343,7 +1350,6 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel) /* disable PDF-requiring menu items */ #ifndef WITH_PDF_EXPORT gtk_widget_set_sensitive(GET_WIDGET("export_pdf"), FALSE); - gtk_widget_set_sensitive(GET_WIDGET("print"), FALSE); #endif /* finally, show the window. */ diff --git a/render/html_redraw.c b/render/html_redraw.c index afba91b8c..9cf0e58c3 100644 --- a/render/html_redraw.c +++ b/render/html_redraw.c @@ -180,10 +180,8 @@ bool html_redraw_box(struct box *box, int x_scrolled, y_scrolled; struct box *bg_box = NULL; -#ifdef WITH_PDF_EXPORT if (html_redraw_printing && box->printed) return true; -#endif /* avoid trivial FP maths */ if (scale == 1.0) { @@ -265,7 +263,6 @@ bool html_redraw_box(struct box *box, if (clip_y1 < y0 || y1 < clip_y0 || clip_x1 < x0 || x1 < clip_x0) return true; -#ifdef WITH_PDF_EXPORT /*if the rectangle is under the page bottom but it can fit in a page, don't print it now*/ if (html_redraw_printing) { @@ -283,7 +280,6 @@ bool html_redraw_box(struct box *box, } else box->printed = true;/*it won't be printed anymore*/ } -#endif /* if visibility is hidden render children only */ if (box->style && box->style->visibility == CSS_VISIBILITY_HIDDEN) { @@ -1437,11 +1433,8 @@ bool html_redraw_background(int x, int y, struct box *box, float scale, int width, height; struct box *parent; -#ifdef WITH_PDF_EXPORT if (html_redraw_printing && option_remove_backgrounds) return true; -#endif - plot_content = (background->background != NULL); @@ -1656,10 +1649,8 @@ bool html_redraw_inline_background(int x, int y, struct box *box, float scale, plot_content = (box->background != NULL); -#ifdef WITH_PDF_EXPORT if (html_redraw_printing && option_remove_backgrounds) return true; -#endif if (plot_content) { /* handle background-repeat */ @@ -1806,11 +1797,9 @@ bool html_redraw_text_decoration(struct box *box, unsigned int i; /* antialias colour for under/overline */ -#ifdef WITH_PDF_EXPORT if (html_redraw_printing) colour = box->style->color; else -#endif colour = html_redraw_aa(background_colour, box->style->color); if (box->type == BOX_INLINE) { diff --git a/riscos/save_pdf.c b/riscos/save_pdf.c index 456161692..4d553637b 100644 --- a/riscos/save_pdf.c +++ b/riscos/save_pdf.c @@ -27,6 +27,7 @@ #include "oslib/osfile.h" #include "content/content.h" #include "desktop/print.h" +#include "desktop/save_pdf/font_haru.h" #include "desktop/save_pdf/pdf_plotters.h" #include "riscos/save_pdf.h" #include "utils/log.h" @@ -43,13 +44,15 @@ bool save_as_pdf(struct content *c, const char *path) { struct print_settings *psettings; - psettings = print_make_settings(DEFAULT, path); + psettings = print_make_settings(PRINT_DEFAULT, path, &haru_nsfont); if (psettings == NULL) return false; if (!print_basic_run(c, &pdf_printer, psettings)) return false; + xosfile_set_type(path, 0xadf); + return true; }