The width of the title was not being taken into account in calculating the
size of a table_item in the code path used by the GUI, so titles wider
than their tables were truncated at the width of the table. This commit
fixes the problem.
static struct render_page *
xr_render_table_item (struct xr_driver *xr, const struct table_item *item,
static struct render_page *
xr_render_table_item (struct xr_driver *xr, const struct table_item *item,
+ int *caption_widthp, int *caption_heightp)
{
const char *caption = table_item_get_caption (item);
if (caption != NULL)
{
/* XXX doesn't do well with very large captions */
{
const char *caption = table_item_get_caption (item);
if (caption != NULL)
{
/* XXX doesn't do well with very large captions */
+ int min_width, max_width;
xr_init_caption_cell (caption, &cell);
xr_init_caption_cell (caption, &cell);
- *caption_heightp = xr_measure_cell_height (xr, &cell, xr->width);
+
+ xr_measure_cell_width (xr, &cell, &min_width, &max_width);
+ *caption_widthp = MIN (max_width, xr->width);
+ *caption_heightp = xr_measure_cell_height (xr, &cell, *caption_widthp);
}
else
*caption_heightp = 0;
}
else
*caption_heightp = 0;
-xr_draw_title (struct xr_driver *xr, const char *title, int title_height)
+xr_draw_title (struct xr_driver *xr, const char *title,
+ int title_width, int title_height)
{
struct table_cell cell;
int bb[TABLE_N_AXES][2];
xr_init_caption_cell (title, &cell);
bb[H][0] = 0;
{
struct table_cell cell;
int bb[TABLE_N_AXES][2];
xr_init_caption_cell (title, &cell);
bb[H][0] = 0;
+ bb[H][1] = title_width;
bb[V][0] = 0;
bb[V][1] = title_height;
xr_draw_cell (xr, &cell, bb, bb);
bb[V][0] = 0;
bb[V][1] = title_height;
xr_draw_cell (xr, &cell, bb, bb);
/* Table items. */
struct render_page *page;
struct xr_driver *xr;
/* Table items. */
struct render_page *page;
struct xr_driver *xr;
r->xr = xr;
xr_set_cairo (xr, cr);
r->page = xr_render_table_item (xr, to_table_item (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);
}
else if (is_chart_item (item))
{
}
else if (is_chart_item (item))
{
{
if (is_table_item (r->item))
{
{
if (is_table_item (r->item))
{
- *w = render_page_get_size (r->page, H) / 1024;
+ int w0 = render_page_get_size (r->page, H);
+ int w1 = r->title_width;
+ *w = MAX (w0, w1) / 1024;
*h = (render_page_get_size (r->page, V) + r->title_height) / 1024;
}
else
*h = (render_page_get_size (r->page, V) + r->title_height) / 1024;
}
else
{
xr->y = 0;
xr_draw_title (xr, table_item_get_caption (to_table_item (r->item)),
{
xr->y = 0;
xr_draw_title (xr, table_item_get_caption (to_table_item (r->item)),
+ r->title_width, r->title_height);
}
xr->y = r->title_height;
}
xr->y = r->title_height;
{
if (xr->cairo)
xr_draw_title (xr, table_item_get_caption (ts->table_item),
{
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;
xr->y += ts->caption_height;
ts->caption_height = 0;
{
struct xr_table_state *ts;
struct render_page *page;
{
struct xr_table_state *ts;
struct render_page *page;
ts = xmalloc (sizeof *ts);
ts->fsm.render = xr_table_render;
ts = xmalloc (sizeof *ts);
ts->fsm.render = xr_table_render;
if (xr->y > 0)
xr->y += xr->char_height;
if (xr->y > 0)
xr->y += xr->char_height;
- page = xr_render_table_item (xr, table_item, &ts->caption_height);
+ page = 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);
xr->params->size[V] = xr->length - ts->caption_height;
render_break_init (&ts->x_break, page, H);