+void
+xr_fsm_draw_all (struct xr_fsm *fsm, cairo_t *cr)
+{
+ assert (!fsm->print);
+ xr_fsm_draw_region (fsm, cr, 0, 0, INT_MAX, INT_MAX);
+}
+
+static int
+mul_XR_POINT (int x)
+{
+ return (x >= INT_MAX / XR_POINT ? INT_MAX
+ : x <= INT_MIN / XR_POINT ? INT_MIN
+ : x * XR_POINT);
+}
+
+static void
+draw_image (cairo_surface_t *image, cairo_t *cr)
+{
+ cairo_save (cr);
+ cairo_set_source_surface (cr, image, 0, 0);
+ cairo_rectangle (cr, 0, 0, cairo_image_surface_get_width (image),
+ cairo_image_surface_get_height (image));
+ cairo_clip (cr);
+ cairo_paint (cr);
+ cairo_restore (cr);
+}
+
+void
+xr_fsm_draw_region (struct xr_fsm *fsm, cairo_t *cr,
+ int x, int y, int w, int h)
+{
+ assert (!fsm->print);
+ switch (fsm->item->type)
+ {
+ case OUTPUT_ITEM_CHART:
+ xr_draw_chart (fsm->item->chart, cr, CHART_WIDTH, CHART_HEIGHT);
+ break;
+
+ case OUTPUT_ITEM_IMAGE:
+ draw_image (fsm->item->image, cr);
+ break;
+
+ case OUTPUT_ITEM_TABLE:
+ fsm->cairo = cr;
+ render_pager_draw_region (fsm->p, mul_XR_POINT (x), mul_XR_POINT (y),
+ mul_XR_POINT (w), mul_XR_POINT (h));
+ fsm->cairo = NULL;
+ break;
+
+ case OUTPUT_ITEM_GROUP_OPEN:
+ case OUTPUT_ITEM_GROUP_CLOSE:
+ case OUTPUT_ITEM_MESSAGE:
+ case OUTPUT_ITEM_PAGE_BREAK:
+ case OUTPUT_ITEM_PAGE_SETUP:
+ case OUTPUT_ITEM_TEXT:
+ NOT_REACHED ();
+ }
+}
+\f
+/* Printing API. */
+