summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-02-17 16:37:51 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-02-17 16:37:51 +0000
commitee986e1d0acfc586a81aa593c72f9278077f3299 (patch)
tree9da1d53a770d8b828e73ab0db176fbff36b1dd06 /desktop
parentf41d666fe17ef2bf4a1a4161283049d2817a4087 (diff)
downloadnetsurf-ee986e1d0acfc586a81aa593c72f9278077f3299.tar.gz
netsurf-ee986e1d0acfc586a81aa593c72f9278077f3299.tar.bz2
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
Diffstat (limited to 'desktop')
-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
4 files changed, 79 insertions, 76 deletions
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,