+static void
+create_xr (struct psppire_output_view *view)
+{
+ const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (view->output));
+ struct text_item *text_item;
+ PangoFontDescription *font_desc;
+ struct xr_rendering *r;
+ char *font_name;
+ int font_width;
+ cairo_t *cr;
+ gchar *fgc;
+
+ cr = gdk_cairo_create (GTK_WIDGET (view->output)->window);
+
+ /* Set the widget's text color as the foreground color for the output driver */
+ fgc = gdk_color_to_string (&style->text[gtk_widget_get_state (GTK_WIDGET (view->output))]);
+
+ string_map_insert (&view->render_opts, "foreground-color", fgc);
+ g_free (fgc);
+
+ /* Use GTK+ default font as proportional font. */
+ font_name = pango_font_description_to_string (style->font_desc);
+ string_map_insert (&view->render_opts, "prop-font", font_name);
+ g_free (font_name);
+
+ /* Derived emphasized font from proportional font. */
+ font_desc = pango_font_description_copy (style->font_desc);
+ pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
+ font_name = pango_font_description_to_string (font_desc);
+ string_map_insert (&view->render_opts, "emph-font", font_name);
+ g_free (font_name);
+ pango_font_description_free (font_desc);
+
+ /* Pretend that the "page" has a reasonable width and a very big length,
+ so that most tables can be conveniently viewed on-screen with vertical
+ scrolling only. (The length should not be increased very much because
+ it is already close enough to INT_MAX when expressed as thousands of a
+ point.) */
+ string_map_insert_nocopy (&view->render_opts, xstrdup ("paper-size"),
+ xasprintf ("%dx1000000pt", view->render_width));
+ string_map_insert (&view->render_opts, "left-margin", "0");
+ string_map_insert (&view->render_opts, "right-margin", "0");
+ string_map_insert (&view->render_opts, "top-margin", "0");
+ string_map_insert (&view->render_opts, "bottom-margin", "0");
+
+ view->xr = xr_driver_create (cr, &view->render_opts);
+
+ text_item = text_item_create (TEXT_ITEM_PARAGRAPH, "X");
+ r = xr_rendering_create (view->xr, text_item_super (text_item), cr);
+ xr_rendering_measure (r, &font_width, &view->font_height);
+ /* xr_rendering_destroy (r); */
+ text_item_unref (text_item);
+
+ cairo_destroy (cr);
+}
+
+static void
+rerender (struct psppire_output_view *view)
+{
+ struct output_view_item *item;
+ cairo_t *cr;
+
+ if (!view->n_items)
+ return;
+
+ string_map_clear (&view->render_opts);
+ xr_driver_destroy (view->xr);
+ create_xr (view);
+
+ cr = gdk_cairo_create (GTK_WIDGET (view->output)->window);
+
+ view->y = 0;
+ view->max_width = 0;
+ for (item = view->items; item < &view->items[view->n_items]; item++)
+ {
+ struct xr_rendering *r;
+ int tw, th;
+
+ if (view->y > 0)
+ view->y += view->font_height / 2;
+
+ r = xr_rendering_create (view->xr, item->item, cr);
+ if (r == NULL)
+ {
+ g_warn_if_reached ();
+ continue;
+ }
+
+ xr_rendering_measure (r, &tw, &th);
+ g_object_set_data_full (G_OBJECT (item->drawing_area),
+ "rendering", r, free_rendering);
+ gtk_widget_set_size_request (item->drawing_area, tw, th);
+ gtk_layout_move (view->output, item->drawing_area, 0, view->y);
+
+ if (view->max_width < tw)
+ view->max_width = tw;
+ view->y += th;
+ }
+
+ gtk_layout_set_size (view->output, view->max_width, view->y);
+ cairo_destroy (cr);
+}
+