X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcairo-fsm.c;h=16cf47dec43883b711da0d14cf4fd371f7a1e22a;hb=e91782a2d25dec932c93b7a57bd03d836614ba43;hp=ec7e7278809b43bcf9b009f234e8b3264e1d1118;hpb=e6b6e7d67f173867d731ebca6b8fbad5a2f82560;p=pspp diff --git a/src/output/cairo-fsm.c b/src/output/cairo-fsm.c index ec7e727880..16cf47dec4 100644 --- a/src/output/cairo-fsm.c +++ b/src/output/cairo-fsm.c @@ -105,7 +105,6 @@ xr_fsm_style_equals (const struct xr_fsm_style *a, || a->min_break[H] != b->min_break[H] || a->min_break[V] != b->min_break[V] || a->use_system_colors != b->use_system_colors - || a->transparent != b->transparent || a->font_resolution != b->font_resolution) return false; @@ -186,8 +185,6 @@ xr_draw_line (struct xr_fsm *xr, int x0, int y0, int x1, int y1, int style, const struct cell_color *color) { cairo_new_path (xr->cairo); - if (!xr->style->use_system_colors) - xr_set_source_rgba (xr->cairo, color); cairo_set_line_width ( xr->cairo, xr_to_pt (style == RENDER_LINE_THICK ? XR_LINE_WIDTH * 2 @@ -195,7 +192,14 @@ xr_draw_line (struct xr_fsm *xr, int x0, int y0, int x1, int y1, int style, : XR_LINE_WIDTH)); cairo_move_to (xr->cairo, xr_to_pt (x0), xr_to_pt (y0)); cairo_line_to (xr->cairo, xr_to_pt (x1), xr_to_pt (y1)); + + if (!xr->style->use_system_colors) + xr_set_source_rgba (xr->cairo, color); + if (style == RENDER_LINE_DASHED) + cairo_set_dash (xr->cairo, (double[]) { 2 }, 1, 0); cairo_stroke (xr->cairo); + if (style == RENDER_LINE_DASHED) + cairo_set_dash (xr->cairo, NULL, 0, 0); } static void UNUSED @@ -451,7 +455,8 @@ xrr_draw_cell (void *xr_, const struct table_cell *cell, int color_idx, struct xr_fsm *xr = xr_; int w, h, brk; - if (!xr->style->transparent) + const struct cell_color *bg = &cell->style->font_style.bg[color_idx]; + if ((bg->r != 255 || bg->g != 255 || bg->b != 255) && bg->alpha) { cairo_save (xr->cairo); int bg_clip[TABLE_N_AXES][2]; @@ -466,7 +471,7 @@ xrr_draw_cell (void *xr_, const struct table_cell *cell, int color_idx, bg_clip[axis][1] += spill[axis][1]; } xr_clip (xr, bg_clip); - xr_set_source_rgba (xr->cairo, &cell->style->font_style.bg[color_idx]); + xr_set_source_rgba (xr->cairo, bg); fill_rectangle (xr, bb[H][0] - spill[H][0], bb[V][0] - spill[V][0], @@ -514,6 +519,13 @@ xrr_adjust_break (void *xr_, const struct table_cell *cell, xr_layout_cell (xr, cell, bb, clip, &w, &h, &brk); return brk; } + +static void +xrr_scale (void *xr_, double scale) +{ + struct xr_fsm *xr = xr_; + cairo_scale (xr->cairo, scale, scale); +} static void xr_clip (struct xr_fsm *xr, int clip[TABLE_N_AXES][2]) @@ -810,6 +822,9 @@ xr_layout_cell_text (struct xr_fsm *xr, const struct table_cell *cell, bb[X][1] == INT_MAX ? -1 : xr_to_pango (bb[X][1] - bb[X][0])); pango_layout_set_wrap (layout, PANGO_WRAP_WORD); + int size[TABLE_N_AXES]; + pango_layout_get_size (layout, &size[H], &size[V]); + if (clip[H][0] != clip[H][1]) { cairo_save (xr->cairo); @@ -817,8 +832,10 @@ xr_layout_cell_text (struct xr_fsm *xr, const struct table_cell *cell, xr_clip (xr, clip); if (options & TAB_ROTATE) { + int extra = bb[H][1] - bb[H][0] - size[V]; + int halign_offset = extra > 0 ? extra / 2 : 0; cairo_translate (xr->cairo, - xr_to_pt (bb[H][0]), + xr_to_pt (bb[H][0] + halign_offset), xr_to_pt (bb[V][1])); cairo_rotate (xr->cairo, -M_PI_2); } @@ -857,8 +874,6 @@ xr_layout_cell_text (struct xr_fsm *xr, const struct table_cell *cell, cairo_restore (xr->cairo); } - int size[TABLE_N_AXES]; - pango_layout_get_size (layout, &size[H], &size[V]); int w = pango_to_xr (size[X]); int h = pango_to_xr (size[Y]); if (w > *widthp) @@ -942,106 +957,6 @@ xr_layout_cell (struct xr_fsm *xr, const struct table_cell *cell, *brk = bb[V][0]; *height = xr_layout_cell_text (xr, cell, bb, clip, width, brk); } - -#if 0 -static bool -xr_table_render (struct xr_render_fsm *fsm, struct xr_fsm *xr) -{ - struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm); - - while (render_pager_has_next (ts->p)) - { - int used; - - used = render_pager_draw_next (ts->p, xr->length); - if (!used) - { - assert (xr->y > 0); - return true; - } - else - xr->y += used; - } - return false; -} - -static void -xr_table_destroy (struct xr_render_fsm *fsm) -{ - struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm); - - render_pager_destroy (ts->p); - free (ts); -} - -static struct xr_render_fsm * -xr_render_table (struct xr_fsm *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; - - 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; -} - -static bool -xr_eject_render (struct xr_render_fsm *fsm UNUSED, struct xr_fsm *xr) -{ - return xr->y > 0; -} - -static void -xr_eject_destroy (struct xr_render_fsm *fsm UNUSED) -{ - /* Nothing to do. */ -} - -static struct xr_render_fsm * -xr_render_eject (void) -{ - static struct xr_render_fsm eject_renderer = - { - xr_eject_render, - xr_eject_destroy - }; - - return &eject_renderer; -} - -#define CHART_WIDTH 500 -#define CHART_HEIGHT 375 - -static struct xr_render_fsm * -xr_render_text (struct xr_fsm *xr, const struct text_item *text_item) -{ - enum text_item_type type = text_item_get_type (text_item); - - switch (type) - { - case TEXT_ITEM_PAGE_TITLE: - break; - - case TEXT_ITEM_EJECT_PAGE: - if (xr->y > 0) - return xr_render_eject (); - break; - - default: - return xr_render_table ( - xr, text_item_to_table_item (text_item_ref (text_item))); - } - - return NULL; -} -#endif #define CHART_WIDTH 500 #define CHART_HEIGHT 375 @@ -1095,6 +1010,7 @@ xr_fsm_create (const struct output_item *item_, .adjust_break = xrr_adjust_break, .draw_line = xrr_draw_line, .draw_cell = xrr_draw_cell, + .scale = xrr_scale, }; enum { LW = XR_LINE_WIDTH, LS = XR_LINE_SPACE };