#include "output/charts/scree.h"
#include "output/charts/scatterplot.h"
#include "output/driver-provider.h"
+#include "output/group-item.h"
#include "output/message-item.h"
#include "output/options.h"
#include "output/render.h"
#define H TABLE_HORZ
#define V TABLE_VERT
-/* The unit used for internal measurements is inch/(72 * XR_POINT). */
+/* The unit used for internal measurements is inch/(72 * XR_POINT).
+ (Thus, XR_POINT units represent one point.) */
#define XR_POINT PANGO_SCALE
/* Conversions to and from points. */
for (i = 0; i < TABLE_N_AXES; i++)
xr->params->min_break[i] = xr->min_break[i];
xr->params->supports_margins = true;
+ xr->params->rtl = render_direction_rtl ();
}
cairo_set_source_rgb (xr->cairo, xr->fg.red, xr->fg.green, xr->fg.blue);
pango_attr_list_insert (list, attr);
}
+static void
+markup_escape (const char *in, struct string *out)
+{
+ for (int c = *in++; c; c = *in++)
+ switch (c)
+ {
+ case '&':
+ ds_put_cstr (out, "&");
+ break;
+ case '<':
+ ds_put_cstr (out, "<");
+ break;
+ case '>':
+ ds_put_cstr (out, ">");
+ break;
+ default:
+ ds_put_byte (out, c);
+ break;
+ }
+}
+
static int
xr_layout_cell_text (struct xr_driver *xr,
const struct cell_contents *contents,
}
size_t initial_length = ds_length (&tmp);
- cell_contents_format_footnote_markers (contents, &tmp);
- pango_layout_set_text (font->layout, ds_cstr (&tmp), ds_length (&tmp));
+ for (size_t i = 0; i < contents->n_footnotes; i++)
+ {
+ if (i)
+ ds_put_byte (&tmp, ',');
+
+ const char *marker = contents->footnotes[i]->marker;
+ if (options & TAB_MARKUP)
+ markup_escape (marker, &tmp);
+ else
+ ds_put_cstr (&tmp, marker);
+ }
+
+ if (options & TAB_MARKUP)
+ pango_layout_set_markup (font->layout,
+ ds_cstr (&tmp), ds_length (&tmp));
+ else
+ pango_layout_set_text (font->layout, ds_cstr (&tmp), ds_length (&tmp));
PangoAttrList *attrs = pango_attr_list_new ();
if (style->underline)
else
{
const char *content = ds_is_empty (&tmp) ? text : ds_cstr (&tmp);
- pango_layout_set_text (font->layout, content, -1);
+ if (options & TAB_MARKUP)
+ pango_layout_set_markup (font->layout, content, -1);
+ else
+ pango_layout_set_text (font->layout, content, -1);
if (style->underline)
{
r = xzalloc (sizeof *r);
r->item = output_item_ref (item);
}
+ else if (is_group_open_item (item))
+ r = xr_rendering_create_text (xr, to_group_open_item (item)->command_name,
+ cr);
return r;
}
/* Draws onto CR */
void
-xr_rendering_draw_all (struct xr_rendering *r, cairo_t *cr)
+xr_rendering_draw (struct xr_rendering *r, cairo_t *cr,
+ int x0, int y0, int x1, int y1)
{
if (is_table_item (r->item))
{
xr_set_cairo (xr, cr);
- render_pager_draw (r->p);
-
+ render_pager_draw_region (r->p, x0 * XR_POINT, y0 * XR_POINT,
+ (x1 - x0) * XR_POINT, (y1 - y0) * XR_POINT);
}
else
xr_draw_chart (to_chart_item (r->item), cr,
struct xr_table_state
{
struct xr_render_fsm fsm;
- struct table_item *table_item;
struct render_pager *p;
};
{
struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm);
- table_item_unref (ts->table_item);
render_pager_destroy (ts->p);
free (ts);
}
static struct xr_render_fsm *
-xr_render_table (struct xr_driver *xr, const struct table_item *table_item)
+xr_render_table (struct xr_driver *xr, struct table_item *table_item)
{
struct xr_table_state *ts;
ts = xmalloc (sizeof *ts);
ts->fsm.render = xr_table_render;
ts->fsm.destroy = xr_table_destroy;
- ts->table_item = table_item_ref (table_item);
if (xr->y > 0)
xr->y += xr->char_height;
ts->p = render_pager_create (xr->params, table_item);
+ table_item_unref (table_item);
return &ts->fsm;
}
return &eject_renderer;
}
\f
-static struct xr_render_fsm *
-xr_create_text_renderer (struct xr_driver *xr, const struct text_item *item)
-{
- struct tab_table *tab = tab_create (1, 1);
-
- struct cell_style *style = pool_alloc (tab->container, sizeof *style);
- *style = (struct cell_style) CELL_STYLE_INITIALIZER;
- if (item->font)
- style->font = pool_strdup (tab->container, item->font);
- style->font_size = item->font_size;
- style->bold = item->bold;
- style->italic = item->italic;
- style->underline = item->underline;
- tab->styles[0] = style;
-
- tab_text (tab, 0, 0, TAB_LEFT, text_item_get_text (item));
- struct table_item *table_item = table_item_create (&tab->table, NULL, NULL);
- struct xr_render_fsm *fsm = xr_render_table (xr, table_item);
- table_item_unref (table_item);
-
- return fsm;
-}
-
static struct xr_render_fsm *
xr_render_text (struct xr_driver *xr, const struct text_item *text_item)
{
break;
default:
- return xr_create_text_renderer (xr, text_item);
+ return xr_render_table (
+ xr, text_item_to_table_item (text_item_ref (text_item)));
}
return NULL;
char *s = msg_to_string (message_item_get_msg (message_item));
struct text_item *item = text_item_create (TEXT_ITEM_PARAGRAPH, s);
free (s);
- struct xr_render_fsm *fsm = xr_create_text_renderer (xr, item);
- text_item_unref (item);
-
- return fsm;
+ return xr_render_table (xr, text_item_to_table_item (item));
}
static struct xr_render_fsm *
const struct output_item *output_item)
{
if (is_table_item (output_item))
- return xr_render_table (xr, to_table_item (output_item));
+ return xr_render_table (xr, table_item_ref (to_table_item (output_item)));
else if (is_chart_item (output_item))
return xr_render_chart (to_chart_item (output_item));
else if (is_text_item (output_item))