From: Ben Pfaff Date: Mon, 25 Jan 2021 05:09:08 +0000 (-0800) Subject: output: Replace OUTPUT_ITEM_PAGE_SETUP by a new driver function. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=672776c201a00e1a667d37a957e7d2211300d48a;p=pspp output: Replace OUTPUT_ITEM_PAGE_SETUP by a new driver function. OUTPUT_ITEM_PAGE_SETUP was a special case that only the Cairo and SPV drivers could implement, and it could only come first in the output stream anyway, so it didn't make much sense. This commit gets rid of it in favor of adding a new driver class function for setting the page setup. --- diff --git a/src/output/ascii.c b/src/output/ascii.c index cf649b0aec..ee87fa22e3 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -651,7 +651,6 @@ ascii_submit (struct output_driver *driver, const struct output_item *item) NOT_REACHED (); case OUTPUT_ITEM_PAGE_BREAK: - case OUTPUT_ITEM_PAGE_SETUP: break; } } diff --git a/src/output/cairo-fsm.c b/src/output/cairo-fsm.c index 5377c28b1c..d71f4d0b02 100644 --- a/src/output/cairo-fsm.c +++ b/src/output/cairo-fsm.c @@ -991,7 +991,6 @@ xr_fsm_create (const struct output_item *item_, break; case OUTPUT_ITEM_GROUP: - case OUTPUT_ITEM_PAGE_SETUP: return NULL; case OUTPUT_ITEM_MESSAGE: @@ -1150,7 +1149,6 @@ xr_fsm_measure (struct xr_fsm *fsm, cairo_t *cr, int *wp, int *hp) case OUTPUT_ITEM_GROUP: case OUTPUT_ITEM_MESSAGE: case OUTPUT_ITEM_PAGE_BREAK: - case OUTPUT_ITEM_PAGE_SETUP: case OUTPUT_ITEM_TEXT: default: NOT_REACHED (); @@ -1214,7 +1212,6 @@ xr_fsm_draw_region (struct xr_fsm *fsm, cairo_t *cr, case OUTPUT_ITEM_GROUP: case OUTPUT_ITEM_MESSAGE: case OUTPUT_ITEM_PAGE_BREAK: - case OUTPUT_ITEM_PAGE_SETUP: case OUTPUT_ITEM_TEXT: NOT_REACHED (); } @@ -1345,7 +1342,6 @@ xr_fsm_draw_slice (struct xr_fsm *fsm, cairo_t *cr, int space) case OUTPUT_ITEM_GROUP: case OUTPUT_ITEM_MESSAGE: - case OUTPUT_ITEM_PAGE_SETUP: case OUTPUT_ITEM_TEXT: default: NOT_REACHED (); diff --git a/src/output/cairo.c b/src/output/cairo.c index 81aeddc15f..dc5cf94ca3 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -607,13 +607,6 @@ xr_submit (struct output_driver *driver, const struct output_item *item) { struct xr_driver *xr = xr_driver_cast (driver); - if (item->type == OUTPUT_ITEM_PAGE_SETUP) - { - if (!xr->pager) - xr_update_page_setup (driver, item->page_setup); - return; - } - if (!xr->pager) { xr->pager = xr_pager_create (xr->page_style, xr->fsm_style); @@ -627,6 +620,15 @@ xr_submit (struct output_driver *driver, const struct output_item *item) xr_pager_add_page (xr->pager, cairo_create (xr->drawing_surface)); } } + +static void +xr_setup (struct output_driver *driver, const struct page_setup *ps) +{ + struct xr_driver *xr = xr_driver_cast (driver); + + if (!xr->pager) + xr_update_page_setup (driver, ps); +} struct output_driver_factory pdf_driver_factory = { "pdf", "pspp.pdf", xr_pdf_create }; @@ -642,5 +644,6 @@ static const struct output_driver_class cairo_driver_class = .name = "cairo", .destroy = xr_destroy, .submit = xr_submit, + .setup = xr_setup, .handles_groups = true, }; diff --git a/src/output/csv.c b/src/output/csv.c index 130fe69dfe..3b719fa506 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -264,9 +264,6 @@ csv_submit (struct output_driver *driver, csv_output_lines (csv, ""); break; - case OUTPUT_ITEM_PAGE_SETUP: - break; - case OUTPUT_ITEM_TABLE: { size_t *layer_indexes; diff --git a/src/output/driver-provider.h b/src/output/driver-provider.h index 3712663bc5..1f3f726949 100644 --- a/src/output/driver-provider.h +++ b/src/output/driver-provider.h @@ -27,6 +27,7 @@ struct output_item; struct output_iterator; struct string_map; struct file_handle; +struct page_setup; /* A configured output driver. */ struct output_driver @@ -66,6 +67,10 @@ struct output_driver_class void (*submit) (struct output_driver *driver, const struct output_item *item); + /* Changes DRIVER's output page setup to PS, if possible. This may be NUL + if the driver doesn't support page setup. */ + void (*setup) (struct output_driver *driver, const struct page_setup *ps); + /* Ensures that any output items passed to the 'submit' function for DRIVER have actually been displayed. diff --git a/src/output/driver.c b/src/output/driver.c index 61ce6f51aa..33473a0142 100644 --- a/src/output/driver.c +++ b/src/output/driver.c @@ -156,7 +156,6 @@ output_driver_should_show (const struct output_driver *d, case OUTPUT_ITEM_GROUP: case OUTPUT_ITEM_IMAGE: case OUTPUT_ITEM_PAGE_BREAK: - case OUTPUT_ITEM_PAGE_SETUP: case OUTPUT_ITEM_TABLE: break; } @@ -462,6 +461,20 @@ output_driver_is_registered (const struct output_driver *driver) { return output_driver_get_engine (driver) != NULL; } + +void +output_set_page_setup (const struct page_setup *ps) +{ + struct output_engine *e = engine_stack_top (); + + struct llx *llx; + llx_for_each (llx, &e->drivers) + { + struct output_driver *d = llx_data (llx); + if (d->class->setup) + d->class->setup (d, ps); + } +} extern const struct output_driver_factory csv_driver_factory; extern const struct output_driver_factory html_driver_factory; diff --git a/src/output/driver.h b/src/output/driver.h index b3e3a520b2..ab162a6268 100644 --- a/src/output/driver.h +++ b/src/output/driver.h @@ -22,6 +22,7 @@ #include "libpspp/compiler.h" struct output_item; +struct page_setup; struct string_set; struct string_map; @@ -53,4 +54,6 @@ bool output_driver_is_registered (const struct output_driver *); void output_driver_register (struct output_driver *); void output_driver_unregister (struct output_driver *); +void output_set_page_setup (const struct page_setup *); + #endif /* output/driver.h */ diff --git a/src/output/html.c b/src/output/html.c index e3483b4ebc..cbb8e90c6e 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -302,9 +302,6 @@ html_submit__ (struct output_driver *driver, const struct output_item *item, case OUTPUT_ITEM_PAGE_BREAK: break; - case OUTPUT_ITEM_PAGE_SETUP: - break; - case OUTPUT_ITEM_TABLE: html_output_table (html, item); break; diff --git a/src/output/journal.c b/src/output/journal.c index 4945db2ee9..a07fd4a094 100644 --- a/src/output/journal.c +++ b/src/output/journal.c @@ -123,7 +123,6 @@ journal_submit (struct output_driver *driver, const struct output_item *item) case OUTPUT_ITEM_CHART: case OUTPUT_ITEM_IMAGE: case OUTPUT_ITEM_PAGE_BREAK: - case OUTPUT_ITEM_PAGE_SETUP: case OUTPUT_ITEM_TABLE: break; } diff --git a/src/output/odt.c b/src/output/odt.c index a7eeaee9ef..ed70ecbb4c 100644 --- a/src/output/odt.c +++ b/src/output/odt.c @@ -614,9 +614,6 @@ odt_submit (struct output_driver *driver, const struct output_item *item) case OUTPUT_ITEM_PAGE_BREAK: break; - case OUTPUT_ITEM_PAGE_SETUP: - break; - case OUTPUT_ITEM_TABLE: write_table (odt, item->table); break; diff --git a/src/output/output-item.c b/src/output/output-item.c index 5bfd125413..a46fdf8020 100644 --- a/src/output/output-item.c +++ b/src/output/output-item.c @@ -28,7 +28,6 @@ #include "libpspp/zip-reader.h" #include "output/chart.h" #include "output/driver.h" -#include "output/page-setup.h" #include "output/pivot-table.h" #include "gl/xalloc.h" @@ -47,7 +46,6 @@ output_item_type_to_string (enum output_item_type type) case OUTPUT_ITEM_IMAGE: return "image"; case OUTPUT_ITEM_MESSAGE: return "message"; case OUTPUT_ITEM_PAGE_BREAK: return "page break"; - case OUTPUT_ITEM_PAGE_SETUP: return "page setup"; case OUTPUT_ITEM_TABLE: return "table"; case OUTPUT_ITEM_TEXT: return "text"; } @@ -101,10 +99,6 @@ output_item_unref (struct output_item *item) case OUTPUT_ITEM_PAGE_BREAK: break; - case OUTPUT_ITEM_PAGE_SETUP: - page_setup_destroy (item->page_setup); - break; - case OUTPUT_ITEM_TABLE: pivot_table_unref (item->table); break; @@ -184,10 +178,6 @@ output_item_unshare (struct output_item *old) case OUTPUT_ITEM_PAGE_BREAK: break; - case OUTPUT_ITEM_PAGE_SETUP: - new->page_setup = page_setup_clone (old->page_setup); - break; - case OUTPUT_ITEM_TABLE: new->table = pivot_table_ref (old->table); break; @@ -254,10 +244,6 @@ output_item_get_label (const struct output_item *item) case OUTPUT_ITEM_PAGE_BREAK: return _("Page Break"); - case OUTPUT_ITEM_PAGE_SETUP: - /* Not marked for translation: user should never see it. */ - return "Page Setup"; - case OUTPUT_ITEM_TABLE: if (!item->cached_label) { @@ -372,10 +358,6 @@ output_item_dump (const struct output_item *item, int indentation) printf ("page break\n"); break; - case OUTPUT_ITEM_PAGE_SETUP: - printf ("page setup\n"); - break; - case OUTPUT_ITEM_TABLE: pivot_table_dump (item->table, indentation + 1); break; @@ -556,17 +538,6 @@ page_break_item_create (void) return item; } -struct output_item * -page_setup_item_create (const struct page_setup *ps) -{ - struct output_item *item = xmalloc (sizeof *item); - *item = (struct output_item) { - OUTPUT_ITEM_INITIALIZER (OUTPUT_ITEM_PAGE_SETUP), - .page_setup = page_setup_clone (ps), - }; - return item; -} - /* Returns a new output_item for rendering TABLE. Takes ownership of TABLE. */ struct output_item * diff --git a/src/output/output-item.h b/src/output/output-item.h index 72d4661510..475504acb5 100644 --- a/src/output/output-item.h +++ b/src/output/output-item.h @@ -34,7 +34,6 @@ enum output_item_type OUTPUT_ITEM_IMAGE, OUTPUT_ITEM_MESSAGE, OUTPUT_ITEM_PAGE_BREAK, - OUTPUT_ITEM_PAGE_SETUP, OUTPUT_ITEM_TABLE, OUTPUT_ITEM_TEXT, }; @@ -90,8 +89,6 @@ struct output_item struct msg *message; - struct page_setup *page_setup; - struct pivot_table *table; struct @@ -194,10 +191,6 @@ struct output_item *message_item_to_text_item (struct output_item *); struct output_item *page_break_item_create (void); -/* OUTPUT_ITEM_PAGE_SETUP. */ - -struct output_item *page_setup_item_create (const struct page_setup *); - /* OUTPUT_ITEM_TABLE. */ struct output_item *table_item_create (struct pivot_table *); diff --git a/src/output/select.c b/src/output/select.c index 52ab7f29bd..7f76b73a85 100644 --- a/src/output/select.c +++ b/src/output/select.c @@ -76,9 +76,6 @@ output_item_classify (const struct output_item *item) case OUTPUT_ITEM_PAGE_BREAK: return OUTPUT_CLASS_OTHER; - case OUTPUT_ITEM_PAGE_SETUP: - return OUTPUT_CLASS_OTHER; - case OUTPUT_ITEM_TABLE: return (!strcmp (label, "Warnings") ? OUTPUT_CLASS_WARNINGS : !strcmp (label, "Notes") ? OUTPUT_CLASS_NOTES diff --git a/src/output/spv-driver.c b/src/output/spv-driver.c index 36db324ee7..1eb57f7f16 100644 --- a/src/output/spv-driver.c +++ b/src/output/spv-driver.c @@ -49,7 +49,7 @@ spv_driver_cast (struct output_driver *driver) 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; @@ -69,7 +69,7 @@ spv_create (struct file_handle *fh, enum settings_output_devices device_type, return d; - error: +error: output_driver_destroy (d); return NULL; } @@ -88,13 +88,22 @@ spv_destroy (struct output_driver *driver) 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); 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 = { "spv", "pspp.spv", spv_create }; @@ -103,6 +112,7 @@ static const struct output_driver_class spv_driver_class = .name = "spv", .destroy = spv_destroy, .submit = spv_submit, + .setup = spv_setup, .handles_show = true, .handles_groups = true, }; diff --git a/src/output/spv/spv-writer.c b/src/output/spv/spv-writer.c index 64bb365c61..f1f9b96956 100644 --- a/src/output/spv/spv-writer.c +++ b/src/output/spv/spv-writer.c @@ -1126,11 +1126,6 @@ spv_writer_write (struct spv_writer *w, const struct output_item *item) w->need_page_break = true; break; - case OUTPUT_ITEM_PAGE_SETUP: - page_setup_destroy (w->page_setup); - w->page_setup = page_setup_clone (item->page_setup); - break; - case OUTPUT_ITEM_TABLE: spv_writer_put_table (w, item); break; @@ -1140,3 +1135,11 @@ spv_writer_write (struct spv_writer *w, const struct output_item *item) break; } } + +void +spv_writer_set_page_setup (struct spv_writer *w, + const struct page_setup *ps) +{ + page_setup_destroy (w->page_setup); + w->page_setup = page_setup_clone (ps); +} diff --git a/src/output/spv/spv-writer.h b/src/output/spv/spv-writer.h index 7641f1c34c..4ff63acad3 100644 --- a/src/output/spv/spv-writer.h +++ b/src/output/spv/spv-writer.h @@ -18,6 +18,7 @@ #define OUTPUT_SPV_WRITER_H 1 struct output_item; +struct page_setup; struct spv_writer; #include "libpspp/compiler.h" @@ -27,5 +28,7 @@ char *spv_writer_open (const char *filename, struct spv_writer **) char *spv_writer_close (struct spv_writer *) WARN_UNUSED_RESULT; void spv_writer_write (struct spv_writer *, const struct output_item *); +void spv_writer_set_page_setup (struct spv_writer *, + const struct page_setup *); #endif /* output/spv/spv-writer.h */ diff --git a/src/output/tex.c b/src/output/tex.c index 254d6a6861..800aa726d9 100644 --- a/src/output/tex.c +++ b/src/output/tex.c @@ -356,9 +356,6 @@ tex_submit (struct output_driver *driver, const struct output_item *item) case OUTPUT_ITEM_PAGE_BREAK: break; - case OUTPUT_ITEM_PAGE_SETUP: - break; - case OUTPUT_ITEM_TABLE: tex_output_table (tex, item->table); break; diff --git a/utilities/pspp-output.c b/utilities/pspp-output.c index 3f1fcb81d4..3a695efa29 100644 --- a/utilities/pspp-output.c +++ b/utilities/pspp-output.c @@ -239,7 +239,7 @@ run_convert (int argc UNUSED, char **argv) if (ps) { - output_item_submit (page_setup_item_create (ps)); + output_set_page_setup (ps); page_setup_destroy (ps); } output_item_submit_children (root);