Merge branch 'iss-5072' into 'main'

gtk/print/gtkprintoperation{,-unix,-portal}.c: add CAIRO_HAS checks

Closes #5072

See merge request GNOME/gtk!7717
This commit is contained in:
Matthias Clasen 2024-09-17 10:05:18 +00:00
commit a50df37d52
5 changed files with 92 additions and 1 deletions

View File

@ -4862,7 +4862,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS
if (surface != NULL)
{
array = g_byte_array_new ();
#if CAIRO_HAS_PNG_FUNCTIONS
cairo_surface_write_to_png_stream (surface, cairo_write_array, array);
#endif
_indent (p);
g_string_append (p->str, "pixels: url(\"data:image/png;base64,\\\n");

View File

@ -24,8 +24,13 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <cairo.h>
#ifdef CAIRO_HAS_PDF_SURFACE
#include <cairo-pdf.h>
#endif
#ifdef CAIRO_HAS_PS_SURFACE
#include <cairo-ps.h>
#endif
#include <gio/gunixfdlist.h>
@ -147,6 +152,7 @@ portal_start_page (GtkPrintOperation *op,
{
if (type == CAIRO_SURFACE_TYPE_PS)
{
#ifdef CAIRO_HAS_PS_SURFACE
cairo_ps_surface_set_size (op_portal->surface, w, h);
cairo_ps_surface_dsc_begin_page_setup (op_portal->surface);
switch (gtk_page_setup_get_orientation (page_setup))
@ -164,15 +170,18 @@ portal_start_page (GtkPrintOperation *op,
default:
break;
}
#endif
}
else if (type == CAIRO_SURFACE_TYPE_PDF)
{
#ifdef CAIRO_HAS_PDF_SURFACE
if (!op->priv->manual_orientation)
{
w = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS);
h = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS);
}
cairo_pdf_surface_set_size (op_portal->surface, w, h);
#endif
}
}
}

View File

@ -36,8 +36,13 @@
#include "gtkprintoperation-private.h"
#include "gtkprintoperation-portal.h"
#include <cairo.h>
#ifdef CAIRO_HAS_PDF_SURFACE
#include <cairo-pdf.h>
#endif
#ifdef CAIRO_HAS_PS_SURFACE
#include <cairo-ps.h>
#endif
#include "gtkprintunixdialog.h"
#include "gtkpagesetupunixdialog.h"
#include "gtkprintbackendprivate.h"
@ -90,6 +95,7 @@ unix_start_page (GtkPrintOperation *op,
{
if (type == CAIRO_SURFACE_TYPE_PS)
{
#ifdef CAIRO_HAS_PS_SURFACE
cairo_ps_surface_set_size (op_unix->surface, w, h);
cairo_ps_surface_dsc_begin_page_setup (op_unix->surface);
switch (gtk_page_setup_get_orientation (page_setup))
@ -106,15 +112,18 @@ unix_start_page (GtkPrintOperation *op,
default:
break;
}
#endif
}
else if (type == CAIRO_SURFACE_TYPE_PDF)
{
#ifdef CAIRO_HAS_PDF_SURFACE
if (!op->priv->manual_orientation)
{
w = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS);
h = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS);
}
cairo_pdf_surface_set_size (op_unix->surface, w, h);
#endif
}
}
}
@ -746,6 +755,7 @@ gtk_print_operation_unix_run_dialog_async (GtkPrintOperation *op,
}
}
#ifdef CAIRO_HAS_PDF_SURFACE
static cairo_status_t
write_preview (void *closure,
const unsigned char *data,
@ -817,6 +827,7 @@ gtk_print_operation_unix_create_preview_surface (GtkPrintOperation *op,
return surface;
}
#endif
static void
gtk_print_operation_unix_preview_start_page (GtkPrintOperation *op,
@ -838,11 +849,13 @@ gtk_print_operation_unix_resize_preview_surface (GtkPrintOperation *op,
GtkPageSetup *page_setup,
cairo_surface_t *surface)
{
#ifdef CAIRO_HAS_PDF_SURFACE
double w, h;
w = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS);
h = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS);
cairo_pdf_surface_set_size (surface, w, h);
#endif
}
static GtkPrintOperationResult
@ -1292,7 +1305,11 @@ _gtk_print_operation_platform_backend_create_preview_surface (GtkPrintOperation
double *dpi_y,
char **target)
{
#ifdef CAIRO_HAS_PDF_SURFACE
return gtk_print_operation_unix_create_preview_surface (op, page_setup, dpi_x, dpi_y, target);
#else
return NULL;
#endif
}
void

View File

@ -23,7 +23,10 @@
#include <math.h>
#include <string.h>
#include <cairo.h>
#ifdef CAIRO_HAS_PDF_SURFACE
#include <cairo-pdf.h>
#endif
#include <glib/gi18n-lib.h>
#include "gtkmarshalers.h"
@ -1953,6 +1956,7 @@ create_page_setup (GtkPrintOperation *op)
return page_setup;
}
#ifdef CAIRO_HAS_PDF_SURFACE
static void
pdf_start_page (GtkPrintOperation *op,
GtkPrintContext *print_context,
@ -2063,7 +2067,7 @@ run_pdf (GtkPrintOperation *op,
return GTK_PRINT_OPERATION_RESULT_APPLY;
}
#endif
static void
clamp_page_ranges (PrintPagesData *data)
@ -3096,7 +3100,11 @@ gtk_print_operation_run (GtkPrintOperation *op,
*/
priv->is_sync = TRUE;
g_return_val_if_fail (priv->export_filename != NULL, GTK_PRINT_OPERATION_RESULT_ERROR);
#ifdef CAIRO_HAS_PDF_SURFACE
result = run_pdf (op, parent, &do_print);
#else
result = GTK_PRINT_OPERATION_RESULT_ERROR;
#endif
}
else if (action == GTK_PRINT_OPERATION_ACTION_PREVIEW)
{

View File

@ -27,10 +27,17 @@
#include <string.h>
#include <errno.h>
#include <cairo.h>
#ifdef CAIRO_HAS_PDF_SURFACE
#include <cairo-pdf.h>
#endif
#ifdef CAIRO_HAS_PS_SURFACE
#include <cairo-ps.h>
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
#include <cairo-svg.h>
#endif
#include <glib/gi18n-lib.h>
@ -60,17 +67,29 @@ struct _GtkPrintBackendFile
typedef enum
{
#ifdef CAIRO_HAS_PDF_SURFACE
FORMAT_PDF,
#endif
#ifdef CAIRO_HAS_PS_SURFACE
FORMAT_PS,
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
FORMAT_SVG,
#endif
N_FORMATS
} OutputFormat;
static const char * formats[N_FORMATS] =
{
#ifdef CAIRO_HAS_PDF_SURFACE
"pdf",
#endif
#ifdef CAIRO_HAS_PS_SURFACE
"ps",
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
"svg"
#endif
};
static GObjectClass *backend_parent_class;
@ -220,15 +239,21 @@ output_file_from_settings (GtkPrintSettings *settings,
{
default:
case N_FORMATS:
#ifdef CAIRO_HAS_PDF_SURFACE
case FORMAT_PDF:
extension = "pdf";
break;
#endif
#ifdef CAIRO_HAS_PS_SURFACE
case FORMAT_PS:
extension = "ps";
break;
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
case FORMAT_SVG:
extension = "svg";
break;
#endif
}
}
@ -325,8 +350,10 @@ file_printer_create_cairo_surface (GtkPrinter *printer,
{
cairo_surface_t *surface;
OutputFormat format;
#ifdef CAIRO_HAS_SVG_SURFACE
const cairo_svg_version_t *versions;
int num_versions = 0;
#endif
format = format_from_settings (settings);
@ -334,18 +361,24 @@ file_printer_create_cairo_surface (GtkPrinter *printer,
{
default:
case N_FORMATS:
#ifdef CAIRO_HAS_PDF_SURFACE
case FORMAT_PDF:
surface = cairo_pdf_surface_create_for_stream (_cairo_write, cache_io, width, height);
break;
#endif
#ifdef CAIRO_HAS_PS_SURFACE
case FORMAT_PS:
surface = cairo_ps_surface_create_for_stream (_cairo_write, cache_io, width, height);
break;
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
case FORMAT_SVG:
surface = cairo_svg_surface_create_for_stream (_cairo_write, cache_io, width, height);
cairo_svg_get_versions (&versions, &num_versions);
if (num_versions > 0)
cairo_svg_surface_restrict_to_version (surface, versions[num_versions - 1]);
break;
#endif
}
cairo_surface_set_fallback_resolution (surface,
@ -550,15 +583,21 @@ set_printer_format_from_option_set (GtkPrinter *printer,
switch (i)
{
#ifdef CAIRO_HAS_PDF_SURFACE
case FORMAT_PDF:
gtk_printer_set_accepts_pdf (printer, TRUE);
gtk_printer_set_accepts_ps (printer, FALSE);
break;
#endif
#ifdef CAIRO_HAS_PS_SURFACE
case FORMAT_PS:
gtk_printer_set_accepts_pdf (printer, FALSE);
gtk_printer_set_accepts_ps (printer, TRUE);
break;
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
case FORMAT_SVG:
#endif
default:
gtk_printer_set_accepts_pdf (printer, FALSE);
gtk_printer_set_accepts_ps (printer, FALSE);
@ -660,6 +699,7 @@ file_printer_get_options (GtkPrinter *printer,
if (capabilities & (GTK_PRINT_CAPABILITY_GENERATE_PDF | GTK_PRINT_CAPABILITY_GENERATE_PS))
{
#ifdef CAIRO_HAS_PDF_SURFACE
if (capabilities & GTK_PRINT_CAPABILITY_GENERATE_PDF)
{
if (format == FORMAT_PDF || format == N_FORMATS)
@ -671,6 +711,8 @@ file_printer_get_options (GtkPrinter *printer,
display_format_names[n_formats] = _(format_names[FORMAT_PDF]);
n_formats++;
}
#endif
#ifdef CAIRO_HAS_PS_SURFACE
if (capabilities & GTK_PRINT_CAPABILITY_GENERATE_PS)
{
if (format == FORMAT_PS || format == N_FORMATS)
@ -679,6 +721,7 @@ file_printer_get_options (GtkPrinter *printer,
display_format_names[n_formats] = _(format_names[FORMAT_PS]);
n_formats++;
}
#endif
}
else
{
@ -686,15 +729,21 @@ file_printer_get_options (GtkPrinter *printer,
{
default:
case N_FORMATS:
#ifdef CAIRO_HAS_PDF_SURFACE
case FORMAT_PDF:
current_format = FORMAT_PDF;
break;
#endif
#ifdef CAIRO_HAS_PS_SURFACE
case FORMAT_PS:
current_format = FORMAT_PS;
break;
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
case FORMAT_SVG:
current_format = FORMAT_SVG;
break;
#endif
}
for (n_formats = 0; n_formats < N_FORMATS; ++n_formats)
@ -802,13 +851,19 @@ file_printer_prepare_for_print (GtkPrinter *printer,
format = format_from_settings (settings);
switch (format)
{
#ifdef CAIRO_HAS_PDF_SURFACE
case FORMAT_PDF:
#endif
case N_FORMATS:
gtk_print_job_set_rotate (print_job, FALSE);
break;
default:
#ifdef CAIRO_HAS_PS_SURFACE
case FORMAT_PS:
#endif
#ifdef CAIRO_HAS_SVG_SURFACE
case FORMAT_SVG:
#endif
gtk_print_job_set_rotate (print_job, TRUE);
break;
}