LINUX.ORG.RU

[gtk+] Опять печать


0

0

Доброго времени суток. У меня опять небольшая проблема с печатью. Мне нужно, если изображение не помещается на A4 то его разрезать на несколько частей. Вот код:

static void draw_page (GtkPrintOperation * oper, GtkPrintContext * context, 
            			  gint nr, gpointer user_data)
{
   MainWin* mw = (MainWin*)user_data;
	
   GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file(image_list_get_current_file_path (mw->img_list),
												NULL);	
	
   GdkPixbuf* sub_pixbuf = NULL;
   cairo_t *cr = gtk_print_context_get_cairo_context (context);
	
   int i = 0;
   int j = 0;
   int n = 0;
	
   guint  width   = 0;
   guint  height  = 0;
   guint  width1  = 0;
   guint  height1 = 0; 
	
   guint  x = 210;
   guint  y = 297;

   width = gdk_pixbuf_get_width(pixbuf);
   height = gdk_pixbuf_get_height(pixbuf);
   width1 = gdk_pixbuf_get_width(pixbuf);
   height1 = gdk_pixbuf_get_height(pixbuf);	 
	
   if (width < 210 && height < 300)
   {
     gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
   }
   else
   {
	 int count = 0;
	   
     while (width >= 208)
     {
	   width -= 208;
       ++count;
     }
	   
	 for (i; i <= count; i++)
     {
		if (i == count)
		{
			sub_pixbuf = gdk_pixbuf_new_subpixbuf(pixbuf, j, 0,  width - 1 , 295);
		    list = g_list_prepend (list, sub_pixbuf); 
			break;
		}
		else
		{ 
		    sub_pixbuf = gdk_pixbuf_new_subpixbuf(pixbuf,j, 0,  208, 295);
	        list = g_list_prepend (list, sub_pixbuf); 
	        j += 208;
		}
		 
		 gdk_cairo_set_source_pixbuf(cr, g_list_nth_data(list,i), 0, 0);
	 }
   }
		
   cairo_paint (cr);  
   g_object_unref (pixbuf);   
}

Разрезать получилось. По ширине режется нормально. Но есть проблема. Допустим если изображение разрезано на 4 части, на печать отправляется только 1 либо какую укажешь в :

gdk_cairo_set_source_pixbuf(cr, g_list_nth_data(list,i), 0, 0);
После того как от изображения отрезается какая-то часть, эта часть сразу же сохраняется в GList.

Как сделать так что бы на печать отправлялись все части изображения а не 1?

Cпасибо.


нарезку и, соответственно, установку количества страниц надо делать в обработчике begin-print, а не draw-page

ananas ★★★★★
()

Перепиши на Qt, там проблем с печатью нет никаких!

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

Cейчас делаю так:

GList* list;

void begin_print (GtkPrintOperation * oper, GtkPrintContext * context, 
            			  gint nr, gpointer user_data)
{
   GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file("home/shk/photo.jpg", NULL);	
   
   list = g_list_prepend (list, pixbuf);
   gtk_print_operation_set_n_pages(oper,1);

   // Здесь нарезка изображения
   g_object_unref(pixbuf);
}

void draw_page (GtkPrintOperation * oper, GtkPrintContext * context, 
            			  gint nr, gpointer user_data)
{
  	cairo_t *cr = gtk_print_context_get_cairo_context (context);
        gdk_cairo_set_source_pixbuf(cr, (GdkPixbuf*)g_list_nth_data(list, 0), 0, 0);

	cairo_paint (cr);
}
void   print_pixbuf(GtkWidget* widget, MainWin* mw)
{	
    GtkPrintOperation *op;
    GtkPrintOperationResult res;
    
    op = gtk_print_operation_new ();
		
    gtk_print_operation_set_unit (op, GTK_UNIT_MM);
    g_signal_connect (op, "begin-print", G_CALLBACK (begin_print), mw);
	g_signal_connect (op, "draw-page", G_CALLBACK (draw_page), mw);
	
    res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, mw, NULL);
	
	g_object_unref (op);
}

Происходит сегфолт:

IA__gdk_cairo_set_source_pixbuf (cr=0x8333c00, pixbuf=0x0, pixbuf_x=0, 
    pixbuf_y=0) at gdkcairo.c:210
210	gdkcairo.c: No such file or directory.
	in gdkcairo.c

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

да, спасибо за ответ. Но все равно. Забил 3 pixbuf в лист. Установил 3 страницы.Теперь:

static void draw_page (GtkPrintOperation * oper, GtkPrintContext * context, 
            			  gint nr)
{
	cairo_t *cr = gtk_print_context_get_cairo_context (context);
	int i = 0;
	int l = g_list_length (list);
	
	for (i; i < l - 1; i++)
		gdk_cairo_set_source_pixbuf(cr, (GdkPixbuf*)g_list_nth_data(list,i), 0, 0);
	
	cairo_paint (cr);
}

Все равно выводится только одно изображение.

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

draw-page печатает только одно изображение. вместо for подсовывай в качестве индекса nr, т.е. номер страницы, которая в данный момент должна быть распечатана

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

cпасибо огромное, работает.

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