summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--amiga/save_pdf.c4
-rw-r--r--desktop/options.h3
-rw-r--r--desktop/print.c134
-rw-r--r--desktop/print.h15
-rw-r--r--desktop/save_pdf/pdf_plotters.c3
-rw-r--r--gtk/gtk_print.c177
-rw-r--r--gtk/gtk_scaffolding.c52
-rw-r--r--render/html_redraw.c11
-rw-r--r--riscos/save_pdf.c5
9 files changed, 202 insertions, 202 deletions
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 <stdbool.h>
#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 <assert.h>
#include <string.h>
+#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 <assert.h>
#include <stdlib.h>
#include <string.h>
#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 <math.h>
#include <assert.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
+
+#include "content/content.h"
+#include "desktop/options.h"
#include "desktop/plotters.h"
+#include "desktop/print.h"
+#include "desktop/printer.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 "desktop/options.h"
-#include "gtk/options.h"
-#include "gtk/gtk_bitmap.h"
-
-#include "desktop/print.h"
-#include "desktop/printer.h"
-#include "content/content.h"
-#include "gtk_print.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(&gtk_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, &gtk_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/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/options.h"
#include "desktop/textinput.h"
+#include "gtk/gtk_completion.h"
+#include "gtk/dialogs/gtk_options.h"
+#include "gtk/dialogs/gtk_about.h"
+#include "gtk/gtk_download.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/dialogs/gtk_options.h"
-#include "gtk/dialogs/gtk_about.h"
-#include "gtk/gtk_completion.h"
+#include "gtk/gtk_schedule.h"
+#include "gtk/gtk_tabs.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_tabs.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;
}