]> www.fi.muni.cz Git - evince.git/blob - pdf/xpdf/gpdf.cc
7da47d58497c5b47c57b04fc6cea098dfc0844d7
[evince.git] / pdf / xpdf / gpdf.cc
1 //========================================================================
2 //
3 // gpdf.cc
4 //
5 // Copyright 1996 Derek B. Noonburg
6 // Copyright 1999 Michael Meeks.
7 // Copyright 1999 Miguel de Icaza
8 //
9 //========================================================================
10
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <stddef.h>
15 #include <string.h>
16 #define GString G_String
17 #include <gnome.h>
18 #include <glade/glade.h>
19 #undef  GString 
20 #include "gtypes.h"
21 #include "GString.h"
22 #include "parseargs.h"
23 #include "gfile.h"
24 #include "gmem.h"
25 #include "Object.h"
26 #include "Stream.h"
27 #include "Array.h"
28 #include "Dict.h"
29 #include "XRef.h"
30 #include "Catalog.h"
31 #include "Page.h"
32 #include "Link.h"
33 #include "PDFDoc.h"
34 #include "GOutputDev.h"
35 #include "PSOutputDev.h"
36 #include "TextOutputDev.h"
37 #include "Params.h"
38 #include "Error.h"
39 #include "config.h"
40
41 #define GPDF_GLADE_DIR "/opt/gnome/src/xpdf/xpdf"
42
43 GBool printCommands = gFalse;
44 gint  gpdf_debug=1;
45 poptContext ctx;
46
47 #define DEV_DEBUG 0
48
49 double zoom = 86.0;
50 gint page = 2;
51
52 #define DOC_KEY "xpdf_doc_key"
53 struct DOC_ROOT {
54   GString        *title;
55   PDFDoc         *pdf;
56   GtkDrawingArea *area;
57   GtkPixmap      *pixmap;
58   OutputDev      *out;
59   GdkColor        paper;
60   GtkScrolledWindow *scroll;
61   GtkWidget      *mainframe;
62   GladeXML       *gui;
63 };
64
65 const struct poptOption gpdf_popt_options [] = {
66   { "debug", '\0', POPT_ARG_INT, &gpdf_debug, 0,
67     N_("Enables some debugging functions"), N_("LEVEL") },
68   { NULL, '\0', 0, NULL, 0 }
69 };
70
71 //------------------------------------------------------------------------
72 // loadFile / displayPage
73 //------------------------------------------------------------------------
74
75 static void
76 get_page_geom (int *w, int *h, Page *p)
77 {
78   double pw = p->getWidth();
79   double ph = p->getHeight();
80
81   *w = 612;
82   *h = 792;
83
84   if (!p)
85     return;
86
87   *w = (int)((pw * zoom)/72.0 + 28.0);
88   *h = (int)((ph * zoom)/72.0 + 56.0);
89 }
90
91 static GdkPixmap *
92 setup_pixmap (DOC_ROOT *doc, GdkWindow *window)
93 {
94   GdkGCValues  gcValues;
95   GdkGC       *strokeGC;
96   PDFDoc      *pdf = doc->pdf;
97   int          w, h;
98   GdkPixmap   *pixmap = NULL;
99
100   if (pixmap)
101     gdk_pixmap_unref(pixmap);
102
103   Catalog *cat = pdf->getCatalog();
104   get_page_geom (&w, &h, cat->getPage (page));
105
106   pixmap = gdk_pixmap_new (window, w, h, -1);
107   gtk_widget_set_usize (GTK_WIDGET (doc->scroll), w, h);
108
109   printf ("Creating pixmap of size %d %d\n", w, h);
110   gdk_color_white (gtk_widget_get_default_colormap(), &doc->paper);
111   doc->out    = new GOutputDev (pixmap, doc->paper, window);
112
113   gdk_color_white (gtk_widget_get_default_colormap (), &gcValues.foreground);
114   gdk_color_black (gtk_widget_get_default_colormap (), &gcValues.background);
115   gcValues.line_width = 1;
116   gcValues.line_style = GDK_LINE_SOLID;
117   strokeGC = gdk_gc_new_with_values (
118     pixmap, &gcValues, 
119     (enum GdkGCValuesMask)(GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE));
120   
121   gdk_draw_rectangle (pixmap, strokeGC,
122                       TRUE, 0, 0,
123                       w, h);
124   return pixmap;
125 }
126
127 /*static gint
128 doc_config_event (GtkWidget *widget, void *ugly)
129 {
130   DOC_ROOT *doc;
131
132   doc = (DOC_ROOT *)gtk_object_get_data (GTK_OBJECT (widget), DOC_KEY);
133   
134   g_return_val_if_fail (doc, FALSE);
135
136   return TRUE;
137 }
138
139 static gint
140 doc_redraw_event (GtkWidget *widget, GdkEventExpose *event)
141 {
142   DOC_ROOT *doc;
143  
144   g_return_val_if_fail (widget != NULL, FALSE);
145
146   doc = (DOC_ROOT *)gtk_object_get_data (GTK_OBJECT (widget), DOC_KEY);
147
148   g_return_val_if_fail (doc != NULL, FALSE);
149
150   if (doc->out && doc->pdf) {
151 #if DEV_DEBUG > 0
152     printf ("There are %d pages\n", doc->pdf->getNumPages());
153 #endif
154
155     doc->pdf->displayPage(doc->out, 1, 86, 0, gTrue);
156     gdk_draw_pixmap(widget->window,
157                     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
158                     doc->pixmap,
159                     0, 0,
160                     event->area.x, event->area.y,
161                     event->area.width, event->area.height);
162   } else
163     printf ("Null pointer error %p %p\n", doc->out, doc->pdf);
164   
165   return FALSE;
166 }*/
167
168 static PDFDoc *
169 getPDF (GString *fname)
170 {
171   PDFDoc *pdf;
172   pdf = new PDFDoc(fname);
173   if (!pdf->isOk()) {
174     delete pdf;
175     return NULL;
176   }
177   g_return_val_if_fail (pdf->getCatalog(), NULL);
178   return pdf;
179 }
180
181
182 static GBool
183 loadPDF(GString *fileName)
184 {
185   DOC_ROOT *doc = new DOC_ROOT();
186   GtkVBox  *pane;
187   GtkAdjustment *hadj, *vadj;
188   GdkPixmap *pix;
189
190   // open PDF file
191   doc->pdf = getPDF (fileName);
192   if (!doc->pdf) {
193     delete doc;
194     return gFalse;
195   }
196
197   doc->gui = glade_xml_new (GPDF_GLADE_DIR "/gpdf.glade", NULL);
198   if (!doc->gui ||
199       !(doc->mainframe = glade_xml_get_widget (doc->gui, "gpdf")) ||
200       !(pane = GTK_VBOX (glade_xml_get_widget (doc->gui, "pane")))) {
201     printf ("Couldn't find " GPDF_GLADE_DIR "/gpdf.glade\n");
202     delete doc->pdf;
203     delete doc;
204     return gFalse;
205   }
206 /*  glade_xml_signal_autoconnect (doc->gui);*/
207     
208   pix = setup_pixmap (doc, gtk_widget_get_parent_window (GTK_WIDGET (pane)));
209   doc->pixmap = GTK_PIXMAP (gtk_pixmap_new (pix, NULL));
210   
211   doc->scroll = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
212   gtk_scrolled_window_set_policy (doc->scroll, GTK_POLICY_AUTOMATIC,
213                                   GTK_POLICY_AUTOMATIC);
214   doc->pdf->displayPage(doc->out, page, zoom, 0, gTrue);
215   gtk_scrolled_window_add_with_viewport (doc->scroll, GTK_WIDGET (doc->pixmap));
216   gtk_box_pack_start (GTK_BOX (pane), GTK_WIDGET (doc->scroll), TRUE, TRUE, 0);
217
218   gtk_widget_show_all (doc->mainframe);
219   return gTrue;
220 }
221
222 /*static void displayPage(int page1, int zoom1, int rotate1) {
223   char s[20];
224
225   // check for document
226   if (!doc)
227     return;
228
229   // busy cursor
230   if (win)
231     win->setBusyCursor(gTrue);
232
233   // new page/zoom/rotate values
234   page = page1;
235   zoom = zoom1;
236   rotate = rotate1;
237
238   // initialize mouse-related stuff
239   linkAction = NULL;
240   win->setDefaultCursor();
241   linkLabel->setText(NULL);
242   selectXMin = selectXMax = 0;
243   selectYMin = selectYMax = 0;
244   lastDragLeft = lastDragTop = gTrue;
245
246   // draw the page
247   doc->displayPage(out, page, zoomDPI[zoom - minZoom], rotate, gTrue);
248   layoutCbk(win);
249
250   // update page number display
251   sprintf(s, "%d", page);
252   pageNumText->setText(s);
253
254   // back to regular cursor
255   win->setBusyCursor(gFalse);
256   }*/
257
258 extern "C" {
259   void
260   on_close_activate (GtkWidget *window, void *data)
261   {
262     printf ("Bye...");
263     gtk_widget_destroy (window);
264   }
265 }
266
267 int
268 main (int argc, char *argv [])
269 {
270   char **view_files = NULL;
271   int    i;
272   
273   gnome_init_with_popt_table (
274     "gpdf", "0.1", argc, argv,
275     gpdf_popt_options, 0, &ctx);
276
277   errorInit();
278   
279   initParams (xpdfConfigFile); /* Init font path */
280
281   glade_gnome_init ();
282
283   view_files = poptGetArgs (ctx);
284   /* Load files */
285   if (view_files) {
286     for (i = 0; view_files[i]; i++) {
287       GString *name = new GString (view_files[i]);
288       if (!name || !loadPDF (name))
289         printf ("Error loading '%s'\n", view_files[i]);
290     }
291   } else {
292     printf ("Need filenames...\n");
293     exit (0);
294   }
295
296   poptFreeContext (ctx);
297
298   gtk_main ();
299
300   freeParams();
301
302   /* Destroy files */
303 }