LINUX.ORG.RU

[gtk+] печать


0

0

Доброго времени суток. Есть С/gtk+ приложение, в нем есть список изображений, обычный GList, хранящий пути к этим файлам. Вопрос в следующем, как это все отправить на печать, и возможно ли это средствами gtk+? Вообщем куда копать?

Спасибо


См. исходники EoG.

iZEN ★★★★★ ()

вот тебе готовый callback для сигнала draw-page из GtkPrintOperation

/* draw page for printing */
static void
draw_page (GtkPrintOperation * oper,
           GtkPrintContext * context,
           gint nr, gpointer d)
{
  cairo_t *cr;

  cr = gtk_print_context_get_cairo_context (context);

  if (data.image != NULL)
    {
      guchar *p, *np;
      long i;
      int iw, ih, rs;
      gdouble pw, ph;
      GdkPixbuf *pixbuf;
      cairo_surface_t *s;
      gdouble factor;

      /* scale image to page size */
      pw = gtk_page_setup_get_paper_width (data.page, GTK_UNIT_POINTS)
        - gtk_page_setup_get_left_margin (data.page, GTK_UNIT_POINTS)
        - gtk_page_setup_get_right_margin (data.page, GTK_UNIT_POINTS);
      ph = gtk_page_setup_get_paper_height (data.page, GTK_UNIT_POINTS)
        - gtk_page_setup_get_top_margin (data.page, GTK_UNIT_POINTS)
        - gtk_page_setup_get_bottom_margin (data.page, GTK_UNIT_POINTS);

      iw = gdk_pixbuf_get_width (data.image);
      ih = gdk_pixbuf_get_height (data.image);

      factor = MIN (pw / iw, ph / ih);
      factor = (factor > 1.0) ? 1.0 : factor;


      pixbuf = gdk_pixbuf_scale_simple (data.image,
                                        iw * factor, ih * factor,
                                        GDK_INTERP_HYPER);

      /* draw page (get this code from gthumb) */
      p = gdk_pixbuf_get_pixels (pixbuf);
      iw = gdk_pixbuf_get_width (pixbuf);
      ih = gdk_pixbuf_get_height (pixbuf);
      rs = gdk_pixbuf_get_rowstride (pixbuf);

      /* make buffer 32-bit deep */
      np = g_malloc (iw * ih * 4);
      for (i = 0; i < ih; i++)
        {
          guchar *kk, *kp;
          int j = 0;

          kk = p + rs * i;
          kp = np + iw * 4 * i;
          for (j = 0; j < iw; j++)
            {
              *((unsigned int *) kp) = kk[2] + (kk[1] << 8) + (kk[0] << 16);
              kk += 3;
              kp += 4;
            }
        }

      s = cairo_image_surface_create_for_data (np, CAIRO_FORMAT_RGB24,
                                               iw, ih, iw * 4);
      cairo_set_source_surface (cr, s, 0, 0);
      cairo_paint (cr);
      cairo_surface_destroy (s);
      g_object_unref (pixbuf);
      g_free (np);
    }
}

у меня data.image - GdkPixbuf поле глобальной структуры, но правильнее, наверное, передавать картинку через user_data

ananas ★★★★★ ()
Ответ на: комментарий от ananas

Как распечатать одно изображение разобрался, а если у меня их целый список? Как его передать на печать?

shk ()
Ответ на: комментарий от shk

Все разобрался. Всем большое спасибо за помощь

shk ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.