X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcairo.c;h=3e8c256f8193f31e4ffc71b513c7e034b4b28556;hb=bf3af6fb69dc94a6b3010e11e5d359e9e4abd5ba;hp=e7fc7f931ecc2365e421abababad2361825dd249;hpb=93ec42221da8b677420bf11435e0d24d0503601b;p=pspp diff --git a/src/output/cairo.c b/src/output/cairo.c index e7fc7f931e..3e8c256f81 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -543,7 +543,7 @@ xr_init_caption_cell (const char *caption, struct table_cell *cell, cell->destructor = NULL; } -static struct render_page * +static struct render_pager * xr_render_table_item (struct xr_driver *xr, const struct table_item *item, int *caption_widthp, int *caption_heightp) { @@ -565,7 +565,7 @@ xr_render_table_item (struct xr_driver *xr, const struct table_item *item, else *caption_heightp = 0; - return render_page_create (xr->params, table_item_get_table (item)); + return render_pager_create (xr->params, item); } static void @@ -1044,10 +1044,9 @@ xr_layout_cell_subtable (struct xr_driver *xr, int bb[TABLE_N_AXES][2], int clip[TABLE_N_AXES][2], int *widthp, int *brk) { - const struct table *table = contents->table; int single_width, double_width; struct render_params params; - struct render_page *page; + struct render_pager *p; int r[TABLE_N_AXES][2]; int width, height; int i; @@ -1073,11 +1072,11 @@ xr_layout_cell_subtable (struct xr_driver *xr, } xr->nest++; - page = render_page_create (¶ms, table); - width = render_page_get_size (page, H); - height = render_page_get_size (page, V); + p = render_pager_create (¶ms, contents->table); + width = render_pager_get_size (p, H); + height = render_pager_get_size (p, V); if (bb[V][0] + height >= bb[V][1]) - *brk = bb[V][0] + render_page_get_best_breakpoint (page, bb[V][1] - bb[V][0]); + *brk = bb[V][0] + render_pager_get_best_breakpoint (p, bb[V][1] - bb[V][0]); /* r = intersect(bb, clip) - bb. */ for (i = 0; i < TABLE_N_AXES; i++) @@ -1099,13 +1098,13 @@ xr_layout_cell_subtable (struct xr_driver *xr, else if (alignment == TAB_CENTER) xr->x += (params.size[H] - width) / 2; xr->y += bb[V][0]; - render_page_draw_region (page, r[H][0], r[V][0], - r[H][1] - r[H][0], r[V][1] - r[V][0]); + render_pager_draw_region (p, r[H][0], r[V][0], + r[H][1] - r[H][0], r[V][1] - r[V][0]); xr->y -= bb[V][0]; xr->x = save_x; cairo_restore (xr->cairo); } - render_page_unref (page); + render_pager_destroy (p); xr->nest--; if (width > *widthp) @@ -1207,7 +1206,7 @@ struct xr_rendering struct output_item *item; /* Table items. */ - struct render_page *page; + struct render_pager *p; struct xr_driver *xr; int title_width; int title_height; @@ -1285,8 +1284,8 @@ xr_rendering_create (struct xr_driver *xr, const struct output_item *item, r->item = output_item_ref (item); r->xr = xr; xr_set_cairo (xr, cr); - r->page = xr_render_table_item (xr, to_table_item (item), - &r->title_width, &r->title_height); + r->p = xr_render_table_item (xr, to_table_item (item), + &r->title_width, &r->title_height); } else if (is_chart_item (item)) { @@ -1297,15 +1296,26 @@ xr_rendering_create (struct xr_driver *xr, const struct output_item *item, return r; } +void +xr_rendering_destroy (struct xr_rendering *r) +{ + if (r) + { + output_item_unref (r->item); + render_pager_destroy (r->p); + free (r); + } +} + void xr_rendering_measure (struct xr_rendering *r, int *w, int *h) { if (is_table_item (r->item)) { - int w0 = render_page_get_size (r->page, H); + int w0 = render_pager_get_size (r->p, H); int w1 = r->title_width; *w = MAX (w0, w1) / XR_POINT; - *h = (render_page_get_size (r->page, V) + r->title_height) / XR_POINT; + *h = (render_pager_get_size (r->p, V) + r->title_height) / XR_POINT; } else { @@ -1337,9 +1347,9 @@ xr_rendering_draw (struct xr_rendering *r, cairo_t *cr, } xr->y = r->title_height; - render_page_draw_region (r->page, - x * XR_POINT, (y * XR_POINT) - r->title_height, - w * XR_POINT, h * XR_POINT); + render_pager_draw_region (r->p, + x * XR_POINT, (y * XR_POINT) - r->title_height, + w * XR_POINT, h * XR_POINT); } else xr_draw_chart (to_chart_item (r->item), cr, @@ -1425,8 +1435,7 @@ struct xr_table_state { struct xr_render_fsm fsm; struct table_item *table_item; - struct render_break x_break; - struct render_break y_break; + struct render_pager *p; int caption_height; }; @@ -1435,46 +1444,32 @@ xr_table_render (struct xr_render_fsm *fsm, struct xr_driver *xr) { struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm); - for (;;) + while (render_pager_has_next (ts->p)) { - struct render_page *y_slice; - int space; + int caption_height = ts->caption_height; + int used; - while (!render_break_has_next (&ts->y_break)) - { - struct render_page *x_slice; - - render_break_destroy (&ts->y_break); - if (!render_break_has_next (&ts->x_break)) - return false; - - x_slice = render_break_next (&ts->x_break, xr->width); - render_break_init (&ts->y_break, x_slice, V); - } - - space = xr->length - xr->y; - if (render_break_next_size (&ts->y_break) > space) + xr->y += caption_height; + used = render_pager_draw_next (ts->p, xr->length - xr->y); + xr->y -= caption_height; + if (!used) { assert (xr->y > 0); return true; } - - y_slice = render_break_next (&ts->y_break, space); - if (ts->caption_height) + else { - if (xr->cairo) - xr_draw_title (xr, table_item_get_caption (ts->table_item), - xr->width, ts->caption_height); - - xr->y += ts->caption_height; - ts->caption_height = 0; + if (ts->caption_height) + { + if (xr->cairo) + xr_draw_title (xr, table_item_get_caption (ts->table_item), + xr->width, ts->caption_height); + ts->caption_height = 0; + } + xr->y += caption_height + used; } - - if (xr->cairo) - render_page_draw (y_slice); - xr->y += render_page_get_size (y_slice, V); - render_page_unref (y_slice); } + return false; } static void @@ -1483,8 +1478,7 @@ xr_table_destroy (struct xr_render_fsm *fsm) struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm); table_item_unref (ts->table_item); - render_break_destroy (&ts->x_break); - render_break_destroy (&ts->y_break); + render_pager_destroy (ts->p); free (ts); } @@ -1492,7 +1486,6 @@ static struct xr_render_fsm * xr_render_table (struct xr_driver *xr, const struct table_item *table_item) { struct xr_table_state *ts; - struct render_page *page; int caption_width; ts = xmalloc (sizeof *ts); @@ -1503,13 +1496,10 @@ xr_render_table (struct xr_driver *xr, const struct table_item *table_item) if (xr->y > 0) xr->y += xr->char_height; - page = xr_render_table_item (xr, table_item, - &caption_width, &ts->caption_height); + ts->p = xr_render_table_item (xr, table_item, + &caption_width, &ts->caption_height); xr->params->size[V] = xr->length - ts->caption_height; - render_break_init (&ts->x_break, page, H); - render_break_init_empty (&ts->y_break); - return &ts->fsm; }