X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcairo.h;h=fd9c7b920472429412880303a32b0de9afc7005d;hb=530906aaa19f6c209ca008c8187f7f750a0b1283;hp=c4f8a81380171e228820dd178db0a993f525357d;hpb=cb72db62c20ecab427229110820c5b053d0663c4;p=pspp-builds.git diff --git a/src/output/cairo.h b/src/output/cairo.h index c4f8a813..fd9c7b92 100644 --- a/src/output/cairo.h +++ b/src/output/cairo.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,8 +17,74 @@ #ifndef OUTPUT_CAIRO_H #define OUTPUT_CAIRO_H 1 +#include + +#ifdef HAVE_CAIRO + #include -struct outp_driver *xr_create_driver (cairo_t *); +struct chart_item; +struct output_item; +struct string_map; + +/* Creating and destroying Cairo output drivers. */ +struct xr_driver *xr_driver_create (cairo_t *, struct string_map *options); +void xr_driver_destroy (struct xr_driver *); + +/* Functions for rendering a single output item to a Cairo context. + Output items are never broken across multiple pages. + Used by PSPPIRE to render in the GUI. */ +struct xr_rendering *xr_rendering_create (struct xr_driver *, + const struct output_item *, + cairo_t *); +void xr_rendering_measure (struct xr_rendering *, int *w, int *h); +void xr_rendering_draw (struct xr_rendering *, cairo_t *, + int x, int y, int w, int h); + +/* Functions for rendering a series of output items to a series of Cairo + contexts, with pagination, possibly including headers. + + The intended usage pattern is this: + + * Create an xr_driver with xr_driver_create(). The cairo_t passed in must + accurately reflect the properties of the output (e.g. for the purpose of + page size and font selection) but need not be used for rendering. + + * Call xr_driver_next_page() to set up the first real output page's + cairo_t. (You can skip this step if the cairo_t passed to + xr_driver_create() can be used.) + + * Then, for each output_item: + + - Pass the output item to xr_driver_output_item(). As much output as + fits will be rendered on the current page. + + - Then, as long as xr_driver_need_new_page() returns true, obtain a new + page for rendering and pass it to xr_driver_next_page(). As much + output as fits on the new page will be rendered on it. + + * When you're done, destroy the output driver with xr_driver_destroy(). + + These functions may also be used for counting pages without actually + rendering output. Follow the same steps, except pass NULL as the cairo_t to + xr_driver_next_page(). (But xr_driver_create() still needs a valid cairo_t + for page setup.) + + (If the cairo_t that you pass to xr_driver_create() won't remain valid, be + sure to clear it out one way or another before calling xr_driver_destroy(), + so that xr_driver_destroy() won't destroy it itself.) +*/ +void xr_driver_next_page (struct xr_driver *, cairo_t *); +void xr_driver_output_item (struct xr_driver *, const struct output_item *); +bool xr_driver_need_new_page (const struct xr_driver *); +bool xr_driver_is_page_blank (const struct xr_driver *); + +/* Render charts with Cairo. */ +void xr_draw_chart (const struct chart_item *, cairo_t *, + double x, double y, double width, double height); +char *xr_draw_png_chart (const struct chart_item *, + const char *file_name_template, int number); + +#endif /* HAVE_CAIRO */ #endif /* output/cairo.h */