[lasem] svg_view: fix gradient in case of simple fill or stroke with opacity < 1.0.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] svg_view: fix gradient in case of simple fill or stroke with opacity < 1.0.
- Date: Tue, 24 Aug 2010 08:31:28 +0000 (UTC)
commit adf8e833ce921b7c91aef55bf228d31704a725dd
Author: Emmanuel Pacaud <emmanuel gnome org>
Date: Tue Aug 24 10:30:02 2010 +0200
svg_view: fix gradient in case of simple fill or stroke with opacity < 1.0.
The image pattern case should be also fixed, using push_group.
It would be nicer if cairo has a cairo_set_source_with_alpha function.
src/lsmsvgview.c | 20 ++++++++++++++------
1 files changed, 14 insertions(+), 6 deletions(-)
---
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 61691dd..d8e43d3 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -65,6 +65,8 @@ struct _LsmSvgViewPatternData {
LsmSvgPatternUnits units;
LsmSvgPatternUnits content_units;
LsmSvgSpreadMethod spread_method;
+
+ double opacity;
};
double
@@ -85,7 +87,7 @@ lsm_svg_view_normalize_length (LsmSvgView *view, const LsmSvgLength *length, Lsm
}
static void
-_start_pattern (LsmSvgView *view, const LsmBox *extents)
+_start_pattern (LsmSvgView *view, const LsmBox *extents, double opacity)
{
lsm_debug ("render", "[LsmSvgView::start_pattern]");
@@ -98,6 +100,7 @@ _start_pattern (LsmSvgView *view, const LsmBox *extents)
view->pattern_data->units = LSM_SVG_PATTERN_UNITS_USER_SPACE_ON_USE;
view->pattern_data->spread_method = LSM_SVG_SPREAD_METHOD_REPEAT;
view->pattern_data->extents = *extents;
+ view->pattern_data->opacity = opacity;
view->dom_view.cairo = NULL;
@@ -185,11 +188,16 @@ lsm_svg_view_add_gradient_color_stop (LsmSvgView *view, double offset)
if (color->red < 0.0 || color->blue < 0.0 || color->green < 0.0)
color = &style->color->value;
+ lsm_debug ("render", "[LsmSvgView::add_gradient_color_stop] color = %2x%2x%2x",
+ (int) (255.0 * color->red),
+ (int) (255.0 * color->green),
+ (int) (255.0 * color->blue));
+
cairo_pattern_add_color_stop_rgba (view->pattern_data->pattern, offset,
color->red,
color->green,
color->blue,
- style->stop_opacity->value);
+ style->stop_opacity->value * view->pattern_data->opacity);
}
void
@@ -736,7 +744,7 @@ static void
_paint_url (LsmSvgView *view,
LsmSvgViewPathInfos *path_infos,
LsmSvgViewPaintOperation operation,
- const char *url)
+ const char *url, double opacity)
{
cairo_t *cairo;
LsmSvgElement *element;
@@ -767,7 +775,7 @@ _paint_url (LsmSvgView *view,
lsm_debug ("render", "[LsmSvgView::_paint_url] Pattern extents x = %g, y = %g, w = %g, h = %g",
extents.x, extents.y, extents.width, extents.height);
- _start_pattern (view, &extents);
+ _start_pattern (view, &extents, opacity);
lsm_svg_element_force_render (LSM_SVG_ELEMENT (element), view);
@@ -854,7 +862,7 @@ _set_color (LsmSvgView *view,
case LSM_SVG_PAINT_TYPE_URI_RGB_COLOR:
case LSM_SVG_PAINT_TYPE_URI_CURRENT_COLOR:
case LSM_SVG_PAINT_TYPE_URI_NONE:
- _paint_url (view, path_infos, operation, paint->url);
+ _paint_url (view, path_infos, operation, paint->url, opacity);
break;
default:
return FALSE;
@@ -1801,7 +1809,7 @@ lsm_svg_view_pop_mask (LsmSvgView *view)
cairo = view->dom_view.cairo;
- _start_pattern (view, &mask_extents);
+ _start_pattern (view, &mask_extents, 1.0);
lsm_svg_element_force_render (LSM_SVG_ELEMENT (mask_element), view);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]