]> www.fi.muni.cz Git - evince.git/blob - pdf/xpdf/test-gdk-output-dev.cc
Import of xpdf code from gpdf.
[evince.git] / pdf / xpdf / test-gdk-output-dev.cc
1 /**
2  * render a PDF to GDKSplashOutputDev
3  *
4  * Copyright 2004 Red Hat, Inc.
5  */
6
7 #include <config.h>
8
9 #include <aconf.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12
13 #include "gpdf-g-switch.h"
14 #include <gtk/gtk.h>
15 #include "gpdf-g-switch.h"
16
17 #include "GlobalParams.h"
18 #include "GDKSplashOutputDev.h"
19 #include "PDFDoc.h"
20 #include "ErrorCodes.h"
21
22 typedef struct
23 {
24   GtkWidget *window;
25   GtkWidget *sw;
26   GtkWidget *drawing_area;
27   GDKSplashOutputDev *out;
28   PDFDoc *doc;
29 } View;
30
31 static void
32 drawing_area_expose (GtkWidget      *drawing_area,
33                      GdkEventExpose *event,
34                      void           *data)
35 {
36   View *v = (View*) data;
37   int x, y, w, h;
38   GdkRectangle document;
39   GdkRectangle draw;
40
41   gdk_window_clear (drawing_area->window);
42   
43   document.x = 0;
44   document.y = 0;
45   document.width = v->out->getBitmapWidth();
46   document.height = v->out->getBitmapHeight();
47
48   if (gdk_rectangle_intersect (&document, &event->area, &draw))
49     {
50       v->out->redraw (draw.x, draw.y,
51                       drawing_area->window,
52                       draw.x, draw.y,
53                       draw.width, draw.height);
54     }
55 }
56
57 static int
58 view_load (View       *v,
59            const char *filename)
60 {
61   PDFDoc *newDoc;
62   int err;
63   GString *filename_g;
64   GtkAdjustment *hadj;
65   GtkAdjustment *vadj;
66   int w, h;
67
68   filename_g = new GString (filename);
69
70   // open the PDF file
71   newDoc = new PDFDoc(filename_g, 0, 0);
72
73   delete filename_g;
74   
75   if (!newDoc->isOk())
76     {
77       err = newDoc->getErrorCode();
78       delete newDoc;
79       return err;
80     }
81
82   if (v->doc)
83     delete v->doc;
84   v->doc = newDoc;
85   
86   v->out->startDoc(v->doc->getXRef());
87
88   v->doc->displayPage (v->out, 1, 72, 72, 0, gTrue, gTrue);
89   
90   w = v->out->getBitmapWidth();
91   h = v->out->getBitmapHeight();
92   
93   gtk_widget_set_size_request (v->drawing_area, w, h);
94 }
95
96 static void
97 view_show (View *v)
98 {
99   gtk_widget_show (v->window);
100 }
101
102 static void
103 redraw_callback (void *data)
104 {
105   View *v = (View*) data;
106
107   gtk_widget_queue_draw (v->drawing_area);
108 }
109
110 static View*
111 view_new (void)
112 {
113   View *v;
114   GtkWidget *window;
115   GtkWidget *drawing_area;
116   GtkWidget *sw;
117
118   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
119
120   drawing_area = gtk_drawing_area_new ();
121
122   sw = gtk_scrolled_window_new (NULL, NULL);
123
124   gtk_container_add (GTK_CONTAINER (window), sw);
125   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), drawing_area);
126
127   gtk_widget_show_all (sw);
128
129   v = g_new0 (View, 1);
130
131   v->window = window;
132   v->drawing_area = drawing_area;
133   v->sw = sw;
134   v->out = new GDKSplashOutputDev (gtk_widget_get_screen (window),
135                                    redraw_callback, (void*) v);
136   v->doc = 0;
137
138   g_signal_connect (drawing_area,
139                     "expose_event",
140                     G_CALLBACK (drawing_area_expose),
141                     (void*) v);
142   
143   return v;
144 }
145
146 int
147 main (int argc, char *argv [])
148 {
149   View *v;
150   int i;
151   
152   gtk_init (&argc, &argv);
153   
154   globalParams = new GlobalParams("/etc/xpdfrc");
155   globalParams->setupBaseFonts(NULL);
156   
157   i = 1;
158   while (i < argc)
159     {
160       int err;
161       
162       v = view_new ();
163
164       err = view_load (v, argv[i]);
165
166       if (err != errNone)
167         g_printerr ("Error loading document!\n");
168       
169       view_show (v);
170
171       ++i;
172     }
173   
174   gtk_main ();
175   
176   delete globalParams;
177   
178   return 0;
179 }