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
This commit is contained in:
John Mark Bell 2009-02-17 16:37:51 +00:00
parent f41d666fe1
commit ee986e1d0a
9 changed files with 207 additions and 207 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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 */

View File

@ -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

View File

@ -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,

View File

@ -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 "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(&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 */

View File

@ -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. */

View File

@ -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) {

View File

@ -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;
}