static void preview_got_page_size (GtkPrintOperationPreview *preview, GtkPrintContext *context, GtkPageSetup *page_setup, gpointer data) { PreviewOp *pop = data; GtkPaperSize *paper_size; double w, h; cairo_t *cr; gdouble dpi_x, dpi_y; paper_size = gtk_page_setup_get_paper_size (page_setup); w = gtk_paper_size_get_width (paper_size, GTK_UNIT_INCH); h = gtk_paper_size_get_height (paper_size, GTK_UNIT_INCH); cr = gdk_cairo_create (pop->area->window); dpi_x = pop->area->allocation.width/w; dpi_y = pop->area->allocation.height/h; if (fabs (dpi_x - pop->dpi_x) > 0.001 || fabs (dpi_y - pop->dpi_y) > 0.001) { gtk_print_context_set_cairo_context (context, cr, dpi_x, dpi_y); pop->dpi_x = dpi_x; pop->dpi_y = dpi_y; } pango_cairo_update_layout (cr, pop->data->layout); cairo_destroy (cr); }
static VALUE rg_set_cairo_context(VALUE self, VALUE cr, VALUE dpi_x, VALUE dpi_y) { gtk_print_context_set_cairo_context(_SELF(self), RVAL2CRCONTEXT(cr), NUM2DBL(dpi_x), NUM2DBL(dpi_y)); return self; }
static gboolean preview_draw (GtkWidget *widget, cairo_t *cr, gpointer data) { PreviewOp *pop = data; cairo_t *prev_cr; double dpi_x, dpi_y; prev_cr = gtk_print_context_get_cairo_context (pop->context); cairo_reference (prev_cr); dpi_x = gtk_print_context_get_dpi_x (pop->context); dpi_y = gtk_print_context_get_dpi_y (pop->context); gtk_print_context_set_cairo_context (pop->context, cr, dpi_x, dpi_y); gtk_print_operation_preview_render_page (pop->preview, pop->page - 1); gtk_print_context_set_cairo_context (pop->context, prev_cr, dpi_x, dpi_y); cairo_destroy (prev_cr); return TRUE; }
static void draw_page_content (cairo_t *cr, gint page_number, SoliPrintPreview *preview) { gdouble dpi; /* scale to the desired size */ cairo_scale (cr, preview->scale, preview->scale); dpi = get_screen_dpi (preview); gtk_print_context_set_cairo_context (preview->context, cr, dpi, dpi); gtk_print_operation_preview_render_page (preview->gtk_preview, page_number); }
GtkWidget * soli_print_preview_new (GtkPrintOperation *operation, GtkPrintOperationPreview *gtk_preview, GtkPrintContext *context) { SoliPrintPreview *preview; cairo_surface_t *surface; cairo_t *cr; gdouble dpi_x, dpi_y; g_return_val_if_fail (GTK_IS_PRINT_OPERATION (operation), NULL); g_return_val_if_fail (GTK_IS_PRINT_OPERATION_PREVIEW (gtk_preview), NULL); preview = g_object_new (SOLI_TYPE_PRINT_PREVIEW, NULL); preview->operation = g_object_ref (operation); preview->gtk_preview = g_object_ref (gtk_preview); preview->context = g_object_ref (context); /* FIXME: is this legal?? */ gtk_print_operation_set_unit (operation, GTK_UNIT_POINTS); g_signal_connect_object (gtk_preview, "ready", G_CALLBACK (preview_ready), preview, 0); /* FIXME: we need a cr to paginate... but we can't get the drawing * area surface because it's not there yet... for now I create * a dummy pdf surface. * gtk_print_context_set_cairo_context() should be called in the * got-page-size handler. */ surface = create_preview_surface (preview, &dpi_x, &dpi_y); cr = cairo_create (surface); gtk_print_context_set_cairo_context (context, cr, dpi_x, dpi_y); cairo_destroy (cr); cairo_surface_destroy (surface); return GTK_WIDGET (preview); }
JNIEXPORT void JNICALL Java_org_gnome_gtk_GtkPrintContext_gtk_1print_1context_1set_1cairo_1context ( JNIEnv* env, jclass cls, jlong _self, jlong _cr, jdouble _dpiX, jdouble _dpiY ) { GtkPrintContext* self; cairo_t* cr; double dpiX; double dpiY; // convert parameter self self = (GtkPrintContext*) _self; // convert parameter cr cr = (cairo_t*) _cr; // convert parameter dpiX dpiX = (double) _dpiX; // convert parameter dpiY dpiY = (double) _dpiY; // call function gtk_print_context_set_cairo_context(self, cr, dpiX, dpiY); // cleanup parameter self // cleanup parameter cr // cleanup parameter dpiX // cleanup parameter dpiY }
static void finish_print (PortalData *portal, GtkPrinter *printer, GtkPageSetup *page_setup, GtkPrintSettings *settings) { GtkPrintOperation *op = portal->op; GtkPrintOperationPrivate *priv = op->priv; GtkPrintJob *job; GtkPrintOperationPortal *op_portal; cairo_t *cr; if (portal->do_print) { gtk_print_operation_set_print_settings (op, settings); priv->print_context = _gtk_print_context_new (op); _gtk_print_context_set_hard_margins (priv->print_context, 0, 0, 0, 0); gtk_print_operation_set_default_page_setup (op, page_setup); _gtk_print_context_set_page_setup (priv->print_context, page_setup); op_portal = g_new0 (GtkPrintOperationPortal, 1); priv->platform_data = op_portal; priv->free_platform_data = (GDestroyNotify) op_portal_free; priv->start_page = portal_start_page; priv->end_page = portal_end_page; priv->end_run = portal_end_run; job = gtk_print_job_new (priv->job_name, printer, settings, page_setup); op_portal->job = job; op_portal->proxy = g_object_ref (portal->proxy); op_portal->token = portal->token; op_portal->surface = gtk_print_job_get_surface (job, &priv->error); if (op_portal->surface == NULL) { portal->result = GTK_PRINT_OPERATION_RESULT_ERROR; portal->do_print = FALSE; goto out; } cr = cairo_create (op_portal->surface); gtk_print_context_set_cairo_context (priv->print_context, cr, 72, 72); cairo_destroy (cr); priv->print_pages = gtk_print_job_get_pages (job); priv->page_ranges = gtk_print_job_get_page_ranges (job, &priv->num_page_ranges); priv->manual_num_copies = gtk_print_job_get_num_copies (job); priv->manual_collation = gtk_print_job_get_collate (job); priv->manual_reverse = gtk_print_job_get_reverse (job); priv->manual_page_set = gtk_print_job_get_page_set (job); priv->manual_scale = gtk_print_job_get_scale (job); priv->manual_orientation = gtk_print_job_get_rotate (job); priv->manual_number_up = gtk_print_job_get_n_up (job); priv->manual_number_up_layout = gtk_print_job_get_n_up_layout (job); } out: if (portal->print_cb) portal->print_cb (op, portal->parent, portal->do_print, portal->result); if (portal->destroy) portal->destroy (portal); }
static gboolean preview_cb (GtkPrintOperation *op, GtkPrintOperationPreview *preview, GtkPrintContext *context, GtkWindow *parent, gpointer data) { GtkWidget *window, *close, *page, *hbox, *vbox, *da; gdouble width, height; cairo_t *cr; PreviewOp *pop; PrintData *print_data = data; pop = g_new0 (PreviewOp, 1); pop->data = print_data; width = 200; height = 300; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (main_window)); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), vbox); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); page = gtk_spin_button_new_with_range (1, 100, 1); gtk_box_pack_start (GTK_BOX (hbox), page, FALSE, FALSE, 0); close = gtk_button_new_with_label ("Close"); gtk_box_pack_start (GTK_BOX (hbox), close, FALSE, FALSE, 0); da = gtk_drawing_area_new (); gtk_widget_set_size_request (GTK_WIDGET (da), width, height); gtk_box_pack_start (GTK_BOX (vbox), da, TRUE, TRUE, 0); gtk_widget_realize (da); G_GNUC_BEGIN_IGNORE_DEPRECATIONS cr = gdk_cairo_create (gtk_widget_get_window (da)); G_GNUC_END_IGNORE_DEPRECATIONS /* TODO: What dpi to use here? This will be used for pagination.. */ gtk_print_context_set_cairo_context (context, cr, 72, 72); cairo_destroy (cr); pop->op = g_object_ref (op); pop->preview = preview; pop->context = context; pop->spin = page; pop->area = da; pop->page = 1; g_signal_connect (page, "value-changed", G_CALLBACK (update_page), pop); g_signal_connect_swapped (close, "clicked", G_CALLBACK (gtk_widget_destroy), window); g_signal_connect (preview, "ready", G_CALLBACK (preview_ready), pop); g_signal_connect (preview, "got-page-size", G_CALLBACK (preview_got_page_size), pop); g_signal_connect (window, "destroy", G_CALLBACK (preview_destroy), pop); gtk_widget_show_all (window); return TRUE; }