gdouble height,
GIOChannel *cache_io)
{
- cairo_surface_t *surface;
+ cairo_surface_t *surface;
ppd_file_t *ppd_file = NULL;
ppd_attr_t *ppd_attr = NULL;
ppd_attr_t *ppd_attr_res = NULL;
ppd_attr_t *ppd_attr_screen_freq = NULL;
ppd_attr_t *ppd_attr_res_screen_freq = NULL;
gchar *res_string = NULL;
- int level = 2;
-
- /* TODO: check if it is a ps or pdf printer */
-
- surface = cairo_ps_surface_create_for_stream (_cairo_write_to_cups, cache_io, width, height);
+ gint level = 2;
+
+ if (gtk_printer_accepts_pdf (printer))
+ surface = cairo_pdf_surface_create_for_stream (_cairo_write_to_cups, cache_io, width, height);
+ else
+ surface = cairo_ps_surface_create_for_stream (_cairo_write_to_cups, cache_io, width, height);
ppd_file = gtk_printer_cups_get_ppd (GTK_PRINTER_CUPS (printer));
}
}
- res_string = g_strdup_printf ("%ddpi",
+ res_string = g_strdup_printf ("%ddpi",
gtk_print_settings_get_resolution (settings));
ppd_attr_res_screen_freq = ppdFindAttr (ppd_file, "ResScreenFreq", res_string);
g_free (res_string);
if (ppd_attr_res_screen_freq == NULL)
{
- res_string = g_strdup_printf ("%dx%ddpi",
+ res_string = g_strdup_printf ("%dx%ddpi",
gtk_print_settings_get_resolution_x (settings),
gtk_print_settings_get_resolution_y (settings));
ppd_attr_res_screen_freq = ppdFindAttr (ppd_file, "ResScreenFreq", res_string);
gtk_print_settings_set_printer_lpi (settings, atof (ppd_attr_screen_freq->value));
}
- if (level == 2)
- cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2);
+ if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_PS)
+ {
+ if (level == 2)
+ cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2);
- if (level == 3)
- cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_3);
+ if (level == 3)
+ cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_3);
+ }
cairo_surface_set_fallback_resolution (surface,
2.0 * gtk_print_settings_get_printer_lpi (settings),
GtkCupsResult *result,
GetPPDData *data)
{
- ipp_t *response;
GtkPrinter *printer;
GDK_THREADS_ENTER ();
goto done;
}
- response = gtk_cups_result_get_response (result);
-
/* let ppdOpenFd take over the ownership of the open file */
g_io_channel_seek_position (data->ppd_io, 0, G_SEEK_SET, NULL);
data->printer->ppd_file = ppdOpenFd (dup (g_io_channel_unix_get_fd (data->ppd_io)));
gtk_printer_option_set (option, cups_value);
else
{
- int res = gtk_print_settings_get_resolution (settings);
- int res_x = gtk_print_settings_get_resolution_x (settings);
- int res_y = gtk_print_settings_get_resolution_y (settings);
+ if (gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION, -1) != -1 ||
+ gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_X, -1) != -1 ||
+ gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_Y, -1) != -1 ||
+ option->value == NULL || option->value[0] == '\0')
+ {
+ int res = gtk_print_settings_get_resolution (settings);
+ int res_x = gtk_print_settings_get_resolution_x (settings);
+ int res_y = gtk_print_settings_get_resolution_y (settings);
- if (res_x != res_y)
- {
- value = g_strdup_printf ("%dx%ddpi", res_x, res_y);
- gtk_printer_option_set (option, value);
- g_free (value);
+ if (res_x != res_y)
+ {
+ value = g_strdup_printf ("%dx%ddpi", res_x, res_y);
+ gtk_printer_option_set (option, value);
+ g_free (value);
+ }
+ else if (res != 0)
+ {
+ value = g_strdup_printf ("%ddpi", res);
+ gtk_printer_option_set (option, value);
+ g_free (value);
+ }
}
- else if (res != 0)
- {
- value = g_strdup_printf ("%ddpi", res);
- gtk_printer_option_set (option, value);
- g_free (value);
- }
- }
+ }
}
else if (strcmp (option->name, "gtk-paper-type") == 0)
map_settings_to_option (option, media_type_map, G_N_ELEMENTS (media_type_map),