mirror of
https://github.com/netsurf-browser/netsurf
synced 2025-01-03 17:54:33 +03:00
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:
parent
f41d666fe1
commit
ee986e1d0a
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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,9 +53,10 @@ 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,
|
||||
@ -65,8 +65,7 @@ bool print_basic_run(struct content *content,
|
||||
{
|
||||
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,6 +81,7 @@ 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
|
||||
@ -111,6 +111,7 @@ 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
|
||||
@ -140,9 +141,11 @@ 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;
|
||||
}
|
||||
@ -150,6 +153,7 @@ bool print_draw_next_page(const struct printer *printer,
|
||||
/**
|
||||
* 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
|
||||
@ -180,12 +184,13 @@ struct content *print_init(struct content *content,
|
||||
box_duplicate_tree(content->data.html.layout,
|
||||
printed_content);
|
||||
|
||||
if (!printed_content->data.html.layout)
|
||||
if (!printed_content->data.html.layout) {
|
||||
talloc_free(printed_content);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
assert(settings->font_func != NULL);
|
||||
|
||||
if (settings->font_func == NULL)
|
||||
printed_content->data.html.font_func = &haru_nsfont;
|
||||
else
|
||||
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,19 +212,23 @@ 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));
|
||||
|
||||
/*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;
|
||||
@ -226,12 +236,12 @@ bool print_apply_settings(struct content *content,
|
||||
|
||||
/**
|
||||
* 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));
|
||||
|
||||
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:
|
||||
case PRINT_OPTIONS:
|
||||
settings = (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);
|
||||
/* Set font functions */
|
||||
settings->font_func = font_func;
|
||||
|
||||
settings->output = path;
|
||||
/* 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 */
|
||||
|
@ -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
|
||||
|
||||
|
@ -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,
|
||||
|
157
gtk/gtk_print.c
157
gtk/gtk_print.c
@ -25,47 +25,43 @@
|
||||
*/
|
||||
|
||||
#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,
|
||||
@ -88,7 +84,10 @@ static bool gtk_print_begin(struct print_settings* settings);
|
||||
static bool gtk_print_next_page(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 = {
|
||||
@ -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)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
LOG(("Plotting polygon."));
|
||||
unsigned int i;
|
||||
|
||||
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.
|
||||
*/
|
||||
* 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);
|
||||
@ -224,14 +227,12 @@ bool nsgtk_print_plot_clip(int clip_x0, int clip_y0,
|
||||
clip_x0,clip_y0,clip_x1,clip_y1));
|
||||
|
||||
/* Normalize cllipping area - to prevent overflows.
|
||||
See comment in pdf_plot_fill.
|
||||
*/
|
||||
* 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);
|
||||
@ -243,7 +244,6 @@ bool nsgtk_print_plot_clip(int clip_x0, int clip_y0,
|
||||
cliprect.height = clip_y1 - clip_y0;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -304,19 +303,18 @@ static bool nsgtk_print_plot_pixbuf(int x, int y, int width, int 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 {
|
||||
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 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 */
|
||||
|
@ -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. */
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user