2 * image/x-pdf BonoboObject.
5 * Michael Meeks <michael@imaginator.com>
14 #define GString G_String
16 #include <libgnorba/gnorba.h>
17 #include <bonobo/gnome-bonobo.h>
22 #include "parseargs.h"
34 #include "GOutputDev.h"
35 #include "PSOutputDev.h"
36 #include "TextOutputDev.h"
41 GBool printCommands = gFalse;
50 GnomeEmbeddable *bonobo_object;
53 GNOME_Stream stream; /* To free it later */
56 } bonobo_object_data_t;
63 bonobo_object_data_t *bonobo_object_data;
64 GtkWidget *drawing_area;
74 redraw_view (view_data_t *view_data, GdkRectangle *rect)
77 bonobo_object_data_t *bonobo_object_data = view_data->bonobo_object_data;
79 g_return_if_fail (view_data->pixmap != NULL);
82 * Do not draw outside the region that we know how to display
84 if (rect->x > view_data->w)
87 if (rect->y > view_data->h)
91 * Clip the draw region
93 if (rect->x + rect->width > view_data->w)
94 rect->width = view_data->w - rect->x;
96 if (rect->y + rect->height > view_data->h)
97 rect->height = view_data->h - rect->y;
100 * Draw the exposed region.
102 gdk_draw_pixmap (view_data->drawing_area->window,
103 view_data->drawing_area->style->white_gc,
112 configure_size (view_data_t *view_data, GdkRectangle *rect)
114 /* ArtPixBuf *pixbuf;
116 if (view_data->scaled)
117 pixbuf = view_data->scaled;
119 pixbuf = view_data->bonobo_object_data->image;
121 gtk_widget_set_usize (
122 view_data->drawing_area,
128 rect->width = view_data->w;
129 rect->height = view_data->h;
133 redraw_all (bonobo_object_data_t *bonobo_object_data)
137 for (l = bonobo_object_data->views; l; l = l->next){
139 view_data_t *view_data = (view_data_t *)l->data;
141 configure_size (view_data, &rect);
143 redraw_view (view_data, &rect);
148 save_image (GnomePersistStream *ps, GNOME_Stream stream, void *data)
150 g_warning ("Unimplemented");
155 setup_size (bonobo_object_data_t *doc, view_data_t *view)
157 if (!doc || !view || !doc->pdf) {
162 view->w = (int)((doc->pdf->getPageWidth (view->page) * view->zoom) / 72.0);
163 view->h = (int)((doc->pdf->getPageHeight (view->page) * view->zoom) / 72.0);
167 * Loads a PDF from a GNOME_Stream
170 load_image_from_stream (GnomePersistStream *ps, GNOME_Stream stream, void *data)
172 bonobo_object_data_t *bonobo_object_data = (bonobo_object_data_t *)data;
174 GNOME_Stream_iobuf *buffer;
180 if (bonobo_object_data->pdf ||
181 bonobo_object_data->stream) {
182 g_warning ("Won't overwrite pre-existing stream: you wierdo");
186 /* We need this for later */
187 CORBA_Object_duplicate (stream, &ev);
188 g_return_val_if_fail (ev._major == CORBA_NO_EXCEPTION, 0);
190 /* buffer = GNOME_Stream_iobuf__alloc ();
191 length = GNOME_Stream_length (stream, &ev);
193 name = tempnam (NULL, "xpdf-hack");
196 hack = fopen (name, "wb+");
206 GNOME_Stream_read (stream, getlen, &buffer, &ev);
207 fwrite (buffer->_buffer, 1, buffer->_length, hack);
208 length -= buffer->_length;
213 CORBA_free (buffer);*/
215 printf ("Loading PDF from persiststream\n");
216 bonobo_object_data->stream = stream;
217 bonobo_object_data->pdf = new PDFDoc (stream, new GString ("Bonobo.pdf"));
218 printf ("Done load\n");
219 if (!(bonobo_object_data->pdf->isOk())) {
220 g_warning ("Duff pdf data\n");
221 delete bonobo_object_data->pdf;
222 bonobo_object_data->pdf = NULL;
224 if (!bonobo_object_data->pdf->getCatalog()) {
225 g_warning ("Duff pdf catalog\n");
226 delete bonobo_object_data->pdf;
227 bonobo_object_data->pdf = NULL;
230 redraw_all (bonobo_object_data);
236 destroy_view (GnomeView *view, view_data_t *view_data)
238 view_data->bonobo_object_data->views = g_list_remove (view_data->bonobo_object_data->views, view_data);
239 gtk_object_unref (GTK_OBJECT (view_data->drawing_area));
246 setup_pixmap (bonobo_object_data_t *doc, view_data_t *view, GdkWindow *window)
248 GdkGCValues gcValues;
252 GdkPixmap *pixmap = NULL;
254 g_return_val_if_fail (doc != NULL, NULL);
255 g_return_val_if_fail (view != NULL, NULL);
256 g_return_val_if_fail (doc->pdf != NULL, NULL);
260 setup_size (doc, view);
265 pixmap = gdk_pixmap_new (window, w, h, -1);
267 gdk_color_white (gtk_widget_get_default_colormap(), &view->paper);
268 view->out = new GOutputDev (pixmap, view->paper, window);
270 gdk_color_white (gtk_widget_get_default_colormap (), &gcValues.foreground);
271 gdk_color_black (gtk_widget_get_default_colormap (), &gcValues.background);
272 gcValues.line_width = 1;
273 gcValues.line_style = GDK_LINE_SOLID;
274 strokeGC = gdk_gc_new_with_values (
276 (enum GdkGCValuesMask)(GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE));
278 gdk_draw_rectangle (pixmap, strokeGC,
287 drawing_area_exposed (GtkWidget *widget, GdkEventExpose *event, view_data_t *view_data)
290 !view_data->bonobo_object_data->pdf)
293 /* Hoisted from view_factory: ugly */
294 if (!view_data->pixmap) {
295 GdkWindow *win = gtk_widget_get_parent_window (widget);
298 g_return_val_if_fail (win, TRUE);
300 view_data->pixmap = setup_pixmap (view_data->bonobo_object_data, view_data, win);
301 view_data->bonobo_object_data->pdf->displayPage(view_data->out, view_data->page, view_data->zoom, 0, gTrue);
303 configure_size (view_data, &tmp);
306 redraw_view (view_data, &event->area);
313 view_factory (GnomeEmbeddable *bonobo_object,
314 const GNOME_ViewFrame view_frame,
318 bonobo_object_data_t *bonobo_object_data = (bonobo_object_data_t *)data;
319 view_data_t *view_data = g_new (view_data_t, 1);
321 printf ("Created new bonobo object view %p\n", view_data);
323 view_data->scale = 1.0;
324 view_data->bonobo_object_data = bonobo_object_data;
325 view_data->drawing_area = gtk_drawing_area_new ();
326 view_data->pixmap = NULL;
327 view_data->out = NULL;
330 view_data->zoom = 24.0; /* 86.0; Must be small for demos :-) */
334 GTK_OBJECT (view_data->drawing_area),
336 GTK_SIGNAL_FUNC (drawing_area_exposed), view_data);
338 gtk_widget_show (view_data->drawing_area);
340 setup_size (bonobo_object_data, view_data);
342 view = gnome_view_new (view_data->drawing_area);
345 GTK_OBJECT (view), "destroy",
346 GTK_SIGNAL_FUNC (destroy_view), view_data);
348 bonobo_object_data->views = g_list_prepend (bonobo_object_data->views,
355 bonobo_object_factory (GnomeEmbeddableFactory *This, void *data)
357 GnomeEmbeddable *bonobo_object;
358 GnomePersistStream *stream;
359 bonobo_object_data_t *bonobo_object_data = (bonobo_object_data_t *)data;
361 bonobo_object_data = g_new0 (bonobo_object_data_t, 1);
362 if (!bonobo_object_data)
365 printf ("Created new bonobo object %p\n", bonobo_object_data);
367 * Creates the BonoboObject server
369 bonobo_object = gnome_embeddable_new (view_factory, bonobo_object_data);
370 if (bonobo_object == NULL){
371 g_free (bonobo_object_data);
375 bonobo_object_data->pdf = NULL;
378 * Interface GNOME::PersistStream
380 stream = gnome_persist_stream_new ("bonobo-object:image-x-pdf",
381 load_image_from_stream,
385 gtk_object_unref (GTK_OBJECT (bonobo_object));
386 g_free (bonobo_object_data);
390 bonobo_object_data->bonobo_object = bonobo_object;
393 * Bind the interfaces
395 gnome_object_add_interface (GNOME_OBJECT (bonobo_object),
396 GNOME_OBJECT (stream));
397 return (GnomeObject *) bonobo_object;
401 init_bonobo_image_x_png_factory (void)
403 GnomeEmbeddableFactory *factory;
405 factory = gnome_embeddable_factory_new (
406 "bonobo-object-factory:image-x-pdf",
407 bonobo_object_factory, NULL);
411 init_server_factory (int argc, char **argv)
413 gnome_CORBA_init_with_popt_table (
414 "bonobo-image-x-pdf", "1.0",
415 &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
417 if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
418 g_error (_("I could not initialize Bonobo"));
422 main (int argc, char *argv [])
424 CORBA_exception_init (&ev);
426 init_server_factory (argc, argv);
427 init_bonobo_image_x_png_factory ();
431 initParams (xpdfConfigFile); /* Init font path */
433 gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
434 gtk_widget_set_default_visual (gdk_rgb_get_visual ());
437 CORBA_exception_free (&ev);