#include "data/file-handle-def.h"
#include "libpspp/cast.h"
-#ifdef HAVE_CAIRO
#include "output/cairo-chart.h"
-#endif
-#include "output/chart-item.h"
-#include "output/group-item.h"
-#include "output/page-eject-item.h"
-#include "output/page-setup-item.h"
-#include "output/table-item.h"
-#include "output/text-item.h"
+#include "output/output-item.h"
#include "output/spv/spv-writer.h"
#include "gl/xalloc.h"
static struct output_driver *
spv_create (struct file_handle *fh, enum settings_output_devices device_type,
- struct string_map *o UNUSED)
+ struct string_map *o UNUSED)
{
struct output_driver *d;
- struct spv_driver *spv;
-
- spv = xzalloc (sizeof *spv);
+ struct spv_driver *spv = XZALLOC (struct spv_driver);
d = &spv->driver;
spv->handle = fh;
output_driver_init (&spv->driver, &spv_driver_class, fh_get_file_name (fh),
return d;
- error:
+error:
output_driver_destroy (d);
return NULL;
}
static void
spv_submit (struct output_driver *driver,
- const struct output_item *output_item)
+ const struct output_item *output_item)
{
struct spv_driver *spv = spv_driver_cast (driver);
- if (is_group_open_item (output_item))
- spv_writer_open_heading (spv->writer,
- to_group_open_item (output_item)->command_name,
- to_group_open_item (output_item)->command_name);
- else if (is_group_close_item (output_item))
- spv_writer_close_heading (spv->writer);
- else if (is_table_item (output_item))
- {
- const struct table_item *table_item = to_table_item (output_item);
- if (table_item->pt)
- spv_writer_put_table (spv->writer, table_item->pt);
- }
-#ifdef HAVE_CAIRO
- else if (is_chart_item (output_item))
- {
- cairo_surface_t *surface = xr_draw_image_chart (
- to_chart_item (output_item),
- &(struct cell_color) CELL_COLOR_BLACK,
- &(struct cell_color) CELL_COLOR_WHITE);
- if (cairo_surface_status (surface) == CAIRO_STATUS_SUCCESS)
- spv_writer_put_image (spv->writer, surface);
- cairo_surface_destroy (surface);
- }
-#endif
- else if (is_text_item (output_item))
- {
- char *command_id = output_get_command_name ();
- spv_writer_put_text (spv->writer, to_text_item (output_item),
- command_id);
- free (command_id);
- }
- else if (is_page_eject_item (output_item))
- spv_writer_eject_page (spv->writer);
- else if (is_page_setup_item (output_item))
- spv_writer_set_page_setup (spv->writer,
- to_page_setup_item (output_item)->page_setup);
+ spv_writer_write (spv->writer, output_item);
+}
+
+static void
+spv_setup (struct output_driver *driver,
+ const struct page_setup *ps)
+{
+ struct spv_driver *spv = spv_driver_cast (driver);
+
+ spv_writer_set_page_setup (spv->writer, ps);
}
struct output_driver_factory spv_driver_factory =
static const struct output_driver_class spv_driver_class =
{
- "spv",
- spv_destroy,
- spv_submit,
- NULL,
+ .name = "spv",
+ .destroy = spv_destroy,
+ .submit = spv_submit,
+ .setup = spv_setup,
+ .handles_show = true,
+ .handles_groups = true,
};