~ubuntu-branches/ubuntu/trusty/evince/trusty-proposed

« back to all changes in this revision

Viewing changes to shell/ev-jobs.c

Tags: upstream-0.7.0
ImportĀ upstreamĀ versionĀ 0.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
#include "ev-document-fonts.h"
8
8
#include "ev-selection.h"
9
9
#include "ev-async-renderer.h"
10
 
#include "ev-ps-exporter.h"
 
10
#include "ev-file-exporter.h"
11
11
#include "ev-window.h"
12
12
 
13
13
#include <glib/gstdio.h>
316
316
                g_signal_connect (EV_JOB (job)->document, "render_finished",
317
317
                                  G_CALLBACK (render_finished_cb), job);
318
318
        } else {
 
319
                ev_document_fc_mutex_lock ();
 
320
                
319
321
                job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document, job->rc);
320
322
                if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document))
321
323
                        job->link_mapping =
337
339
                                                                   job->rc,
338
340
                                                                   &(job->selection_points));
339
341
                }
340
 
 
 
342
                
 
343
                ev_document_fc_mutex_unlock ();
341
344
                EV_JOB (job)->finished = TRUE;
342
345
        }
343
346
 
406
409
        ev_document_doc_mutex_lock ();
407
410
        
408
411
        fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document);
 
412
        ev_document_fc_mutex_lock ();
409
413
        job->scan_completed = !ev_document_fonts_scan (fonts, 20);
 
414
        ev_document_fc_mutex_unlock ();
410
415
        
411
416
        EV_JOB (job)->finished = TRUE;
412
417
 
527
532
}
528
533
 
529
534
EvJob *
530
 
ev_job_print_new (EvDocument   *document,
531
 
                  EvPrintRange *ranges,
532
 
                  gint          n_ranges,
533
 
                  gdouble       width,
534
 
                  gdouble       height)
 
535
ev_job_print_new (EvDocument    *document,
 
536
                  const gchar   *format,
 
537
                  gdouble        width,
 
538
                  gdouble        height,
 
539
                  EvPrintRange  *ranges,
 
540
                  gint           n_ranges,
 
541
                  EvPrintPageSet page_set,
 
542
                  gint           copies,
 
543
                  gdouble        collate,
 
544
                  gdouble        reverse)
535
545
{
536
546
        EvJobPrint *job;
537
547
 
539
549
 
540
550
        EV_JOB (job)->document = g_object_ref (document);
541
551
 
 
552
        job->format = format;
 
553
        
542
554
        job->temp_file = NULL;
543
555
        job->error = NULL;
544
556
 
 
557
        job->width = width;
 
558
        job->height = height;
 
559
 
545
560
        job->ranges = ranges;
546
561
        job->n_ranges = n_ranges;
547
 
        
548
 
        job->width = width;
549
 
        job->height = height;
550
562
 
 
563
        job->page_set = page_set;
 
564
        
 
565
        job->copies = copies;
 
566
        job->collate = collate;
 
567
        job->reverse = reverse;
 
568
        
551
569
        return EV_JOB (job);
552
570
}
553
571
 
589
607
}
590
608
 
591
609
static gboolean
592
 
ev_print_job_print_page (EvJobPrint *job,
593
 
                         gint        page)
 
610
ev_print_job_print_page_in_range (EvJobPrint *job,
 
611
                                  gint        page)
594
612
{
595
613
        gint i;
596
614
 
603
621
        return FALSE;
604
622
}
605
623
 
 
624
static gboolean
 
625
ev_print_job_print_page_in_set (EvJobPrint *job,
 
626
                                gint        page)
 
627
{
 
628
        switch (job->page_set) {
 
629
                case EV_PRINT_PAGE_SET_EVEN:
 
630
                        return page % 2 == 0;
 
631
                case EV_PRINT_PAGE_SET_ODD:
 
632
                        return page % 2 != 0;
 
633
                case EV_PRINT_PAGE_SET_ALL:
 
634
                        return TRUE;
 
635
        }
 
636
 
 
637
        return FALSE;
 
638
}
 
639
 
 
640
static void
 
641
ev_job_print_do_page (EvJobPrint *job, gint page)
 
642
{
 
643
        EvDocument      *document = EV_JOB (job)->document;
 
644
        EvRenderContext *rc;
 
645
 
 
646
        rc = ev_render_context_new (0, page, 1.0);
 
647
        ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc);
 
648
        g_object_unref (rc);
 
649
}
 
650
 
606
651
void
607
652
ev_job_print_run (EvJobPrint *job)
608
653
{
611
656
        gint        last_page;
612
657
        gint        first_page;
613
658
        gint        i;
 
659
        gchar      *filename;
614
660
        
615
661
        g_return_if_fail (EV_IS_JOB_PRINT (job));
616
662
 
621
667
        if (job->error)
622
668
                g_error_free (job->error);
623
669
        job->error = NULL;
624
 
        
625
 
        fd = g_file_open_tmp ("evince_print.ps.XXXXXX", &job->temp_file, &job->error);
 
670
 
 
671
        filename = g_strdup_printf ("evince_print.%s.XXXXXX", job->format);
 
672
        fd = g_file_open_tmp (filename, &job->temp_file, &job->error);
 
673
        g_free (filename);
626
674
        if (fd <= -1) {
627
675
                EV_JOB (job)->finished = TRUE;
628
676
                return;
632
680
        last_page = ev_print_job_get_last_page (job);
633
681
 
634
682
        ev_document_doc_mutex_lock ();
635
 
        ev_ps_exporter_begin (EV_PS_EXPORTER (document),
636
 
                              job->temp_file,
637
 
                              MIN (first_page, last_page),
638
 
                              MAX (first_page, last_page),
639
 
                              job->width, job->height, FALSE);
 
683
        ev_file_exporter_begin (EV_FILE_EXPORTER (document),
 
684
                                g_ascii_strcasecmp (job->format, "pdf") == 0 ?
 
685
                                EV_FILE_FORMAT_PDF : EV_FILE_FORMAT_PS,
 
686
                                job->temp_file,
 
687
                                MIN (first_page, last_page),
 
688
                                MAX (first_page, last_page),
 
689
                                job->width, job->height, FALSE);
640
690
        ev_document_doc_mutex_unlock ();
641
691
 
642
 
        for (i = first_page; i <= last_page; i++) {
643
 
                EvRenderContext *rc;
644
 
 
645
 
                if (job->n_ranges > 0 &&
646
 
                    !ev_print_job_print_page (job, i))
647
 
                        continue;
648
 
                
649
 
                rc = ev_render_context_new (0, i, 1.0);
650
 
 
651
 
                ev_document_doc_mutex_lock ();
652
 
                ev_ps_exporter_do_page (EV_PS_EXPORTER (document), rc);
653
 
                ev_document_doc_mutex_unlock ();
654
 
 
655
 
                g_object_unref (rc);
 
692
        for (i = 0; i < job->copies; i++) {
 
693
                gint page, step;
 
694
                
 
695
                step = job->reverse ? -1 : 1;
 
696
                page = job->reverse ? last_page : first_page;
 
697
                
 
698
                while ((job->reverse && (page >= first_page)) ||
 
699
                       (!job->reverse && (page <= last_page))) {
 
700
                        gint n_pages = 1;
 
701
                        gint j;
 
702
 
 
703
                        if (job->n_ranges > 0 &&
 
704
                            !ev_print_job_print_page_in_range (job, page)) {
 
705
                                page += step;
 
706
                                continue;
 
707
                        }
 
708
 
 
709
                        if (!ev_print_job_print_page_in_set (job, page + 1)) {
 
710
                                page += step;
 
711
                                continue;
 
712
                        }
 
713
 
 
714
                        if (job->collate)
 
715
                                n_pages = job->copies;
 
716
 
 
717
                        for (j = 0; j < n_pages; j++) {
 
718
                                ev_document_doc_mutex_lock ();
 
719
                                ev_job_print_do_page (job, page);
 
720
                                ev_document_doc_mutex_unlock ();
 
721
                        }
 
722
 
 
723
                        page += step;
 
724
                }
 
725
 
 
726
                if (job->collate)
 
727
                        break;
656
728
        }
657
729
 
658
730
        ev_document_doc_mutex_lock ();
659
 
        ev_ps_exporter_end (EV_PS_EXPORTER (document));
 
731
        ev_file_exporter_end (EV_FILE_EXPORTER (document));
660
732
        ev_document_doc_mutex_unlock ();
661
733
 
662
734
        close (fd);