2 * pattern.c : Support and specifications for patterns.
5 * Jody Goldberg <jody@gnome.org>
7 * (C) 1999-2003 Jody Goldberg
9 #include <gnumeric-config.h>
13 #include <style-color.h>
15 #include <goffice/utils/go-pattern.h>
17 static const GOPatternType patterns
[] = {
18 GO_PATTERN_SOLID
, /* dummy filler */
29 GO_PATTERN_DIAG_CROSS
,
30 GO_PATTERN_THICK_DIAG_CROSS
,
31 GO_PATTERN_THIN_HORIZ
,
33 GO_PATTERN_THIN_REV_DIAG
,
35 GO_PATTERN_THIN_HORIZ_CROSS
,
36 GO_PATTERN_THIN_DIAG_CROSS
,
37 GO_PATTERN_SMALL_CIRCLES
,
38 GO_PATTERN_SEMI_CIRCLES
,
40 GO_PATTERN_LARGE_CIRCLES
,
42 GO_PATTERN_FOREGROUND_SOLID
46 * gnm_pattern_background_set:
52 * Returns: %TRUE if there is a background to paint.
54 * Set up a cairo context to paint the background of a cell.
58 gnm_pattern_background_set (GnmStyle
const *mstyle
, cairo_t
*cr
,
59 gboolean
const is_selected
, GtkStyleContext
*ctxt
)
63 g_return_val_if_fail (!is_selected
|| ctxt
!= NULL
, FALSE
);
66 * Draw the background if the PATTERN is non 0
67 * Draw a stipple too if the pattern is > 1
69 pattern
= gnm_style_get_pattern (mstyle
);
70 if (pattern
> 0 && pattern
< GNM_PATTERNS_MAX
) {
72 cairo_pattern_t
*crpat
;
73 gopat
.pattern
= patterns
[pattern
];
74 gopat
.fore
= gnm_style_get_pattern_color (mstyle
)->go_color
;
75 gopat
.back
= gnm_style_get_back_color (mstyle
)->go_color
;
79 gtk_style_context_get_background_color
80 (ctxt
, GTK_STATE_FLAG_SELECTED
, &rgba
);
81 light
= GO_COLOR_FROM_GDK_RGBA (rgba
);
82 gopat
.fore
= GO_COLOR_INTERPOLATE (light
, gopat
.fore
, .5);
83 gopat
.back
= GO_COLOR_INTERPOLATE (light
, gopat
.back
, .5);
85 crpat
= go_pattern_create_cairo_pattern (&gopat
, cr
);
87 cairo_set_source (cr
, crpat
);
88 cairo_pattern_destroy (crpat
);
90 } else if (is_selected
) {
94 gtk_style_context_get_background_color (ctxt
, GTK_STATE_FLAG_SELECTED
, &rgba
);
95 color
= GO_COLOR_FROM_GDK_RGBA (rgba
);
96 /* Make a lighter version. */
97 color
= GO_COLOR_INTERPOLATE (GO_COLOR_WHITE
, color
, .5);
98 cairo_set_source_rgba (cr
, GO_COLOR_TO_CAIRO (color
));