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;
55 } bonobo_object_data_t;
62 bonobo_object_data_t *bonobo_object_data;
63 GtkWidget *drawing_area;
73 redraw_view (view_data_t *view_data, GdkRectangle *rect)
78 bonobo_object_data_t *bonobo_object_data = view_data->bonobo_object_data;
80 gtk_pixmap_get (view_data->pixmap, &pixmap, &dummy);
82 g_return_if_fail (pixmap != NULL);
85 * Do not draw outside the region that we know how to display
87 if (rect->x > view_data->w)
90 if (rect->y > view_data->h)
94 * Clip the draw region
96 if (rect->x + rect->width > view_data->w)
97 rect->width = view_data->w - rect->x;
99 if (rect->y + rect->height > view_data->h)
100 rect->height = view_data->h - rect->y;
103 * Draw the exposed region.
105 gdk_draw_pixmap (view_data->drawing_area->window,
106 view_data->drawing_area->style->white_gc,
115 configure_size (view_data_t *view_data, GdkRectangle *rect)
117 /* ArtPixBuf *pixbuf;
119 if (view_data->scaled)
120 pixbuf = view_data->scaled;
122 pixbuf = view_data->bonobo_object_data->image;
124 gtk_widget_set_usize (
125 view_data->drawing_area,
131 rect->width = pixbuf->width;
132 rect->height = pixbuf->height;*/
133 g_warning ("Ahhh run away... scaling !");
137 redraw_all (bonobo_object_data_t *bonobo_object_data)
141 for (l = bonobo_object_data->views; l; l = l->next){
143 view_data_t *view_data = (view_data_t *)l->data;
145 configure_size (view_data, &rect);
147 redraw_view (view_data, &rect);
152 save_image (GnomePersistStream *ps, GNOME_Stream stream, void *data)
154 g_warning ("Unimplemented");
159 * Loads a PDF from a GNOME_Stream
162 load_image_from_stream (GnomePersistStream *ps, GNOME_Stream stream, void *data)
164 bonobo_object_data_t *bonobo_object_data = (bonobo_object_data_t *)data;
165 CORBA_Environment ev;
167 GNOME_Stream_iobuf *buffer;
171 buffer = GNOME_Stream_iobuf__alloc ();
173 length = GNOME_Stream_length (stream, &ev);
174 GNOME_Stream_read (stream, length, &buffer, &ev);
176 name = tempnam (NULL, "xpdf-hack");
179 hack = fopen (name, "w+");
183 fwrite (buffer->_buffer, 1, buffer->_length, hack);
187 bonobo_object_data->pdf = new PDFDoc (new GString (name));
189 redraw_all (bonobo_object_data);
194 destroy_view (GnomeView *view, view_data_t *view_data)
196 view_data->bonobo_object_data->views = g_list_remove (view_data->bonobo_object_data->views, view_data);
197 gtk_object_unref (GTK_OBJECT (view_data->drawing_area));
203 drawing_area_exposed (GtkWidget *widget, GdkEventExpose *event, view_data_t *view_data)
205 /* if (!view_data->bonobo_object_data->image)
208 redraw_view (view_data, &event->area);
215 setup_pixmap (bonobo_object_data_t *doc, view_data_t *view, GdkWindow *window)
217 GdkGCValues gcValues;
219 PDFDoc *pdf = doc->pdf;
221 GdkPixmap *pixmap = NULL;
223 w = view->w = (int)((pdf->getPageWidth (view->page) * view->zoom) / 72.0);
224 h = view->h = (int)((pdf->getPageHeight (view->page) * view->zoom) / 72.0);
226 pixmap = gdk_pixmap_new (window, w, h, -1);
228 gdk_color_white (gtk_widget_get_default_colormap(), &view->paper);
229 view->out = new GOutputDev (pixmap, view->paper, window);
231 gdk_color_white (gtk_widget_get_default_colormap (), &gcValues.foreground);
232 gdk_color_black (gtk_widget_get_default_colormap (), &gcValues.background);
233 gcValues.line_width = 1;
234 gcValues.line_style = GDK_LINE_SOLID;
235 strokeGC = gdk_gc_new_with_values (
237 (enum GdkGCValuesMask)(GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE));
239 gdk_draw_rectangle (pixmap, strokeGC,
243 return GTK_PIXMAP (gtk_pixmap_new (pixmap, NULL));
247 view_factory (GnomeEmbeddable *bonobo_object,
248 const GNOME_ViewFrame view_frame,
252 bonobo_object_data_t *bonobo_object_data = (bonobo_object_data_t *)data;
253 view_data_t *view_data = g_new (view_data_t, 1);
255 view_data->scale = 1.0;
256 view_data->bonobo_object_data = bonobo_object_data;
257 view_data->drawing_area = gtk_drawing_area_new ();
259 view_data->zoom = 86.0;
261 GdkWindow *win = gtk_widget_get_parent_window (GTK_WIDGET (view_data->drawing_area));
262 view_data->pixmap = setup_pixmap (bonobo_object_data, view_data, win);
266 GTK_OBJECT (view_data->drawing_area),
268 GTK_SIGNAL_FUNC (drawing_area_exposed), view_data);
270 gtk_widget_show (view_data->drawing_area);
271 view = gnome_view_new (view_data->drawing_area);
274 GTK_OBJECT (view), "destroy",
275 GTK_SIGNAL_FUNC (destroy_view), view_data);
277 bonobo_object_data->views = g_list_prepend (bonobo_object_data->views,
284 bonobo_object_factory (GnomeEmbeddableFactory *This, void *data)
286 GnomeEmbeddable *bonobo_object;
287 GnomePersistStream *stream;
288 bonobo_object_data_t *bonobo_object_data = (bonobo_object_data_t *)data;
290 bonobo_object_data = g_new0 (bonobo_object_data_t, 1);
291 if (!bonobo_object_data)
295 * Creates the BonoboObject server
297 bonobo_object = gnome_embeddable_new (view_factory, bonobo_object_data);
298 if (bonobo_object == NULL){
299 g_free (bonobo_object_data);
303 /* Does the pdf init stuff */
304 initParams (xpdfConfigFile); /* Init font path */
305 bonobo_object_data->pdf = NULL;
308 * Interface GNOME::PersistStream
310 stream = gnome_persist_stream_new ("bonobo-object:image-x-pdf",
311 load_image_from_stream,
315 gtk_object_unref (GTK_OBJECT (bonobo_object));
316 g_free (bonobo_object_data);
320 bonobo_object_data->bonobo_object = bonobo_object;
323 * Bind the interfaces
325 gnome_object_add_interface (GNOME_OBJECT (bonobo_object),
326 GNOME_OBJECT (stream));
327 return (GnomeObject *) bonobo_object;
331 init_bonobo_image_x_png_factory (void)
333 GnomeEmbeddableFactory *factory;
335 factory = gnome_embeddable_factory_new (
336 "bonobo-object-factory:image-x-pdf",
337 bonobo_object_factory, NULL);
341 init_server_factory (int argc, char **argv)
343 gnome_CORBA_init_with_popt_table (
344 "bonobo-image-x-pdf", "1.0",
345 &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
347 if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
348 g_error (_("I could not initialize Bonobo"));
352 main (int argc, char *argv [])
354 CORBA_exception_init (&ev);
356 init_server_factory (argc, argv);
357 init_bonobo_image_x_png_factory ();
359 gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
360 gtk_widget_set_default_visual (gdk_rgb_get_visual ());
363 CORBA_exception_free (&ev);