fix handling of svg opacity, which should be applied to fill/stroke opacity at render time - closes #1744

This commit is contained in:
Dane Springmeyer 2013-03-11 14:56:00 -07:00
parent 3b834b4e6f
commit 29ce3b1c75
4 changed files with 11 additions and 8 deletions

View file

@ -264,6 +264,7 @@ public:
{ {
cur_attr().fill_opacity = op; cur_attr().fill_opacity = op;
} }
void stroke_opacity(double op) void stroke_opacity(double op)
{ {
cur_attr().stroke_opacity = op; cur_attr().stroke_opacity = op;
@ -271,8 +272,7 @@ public:
void opacity(double op) void opacity(double op)
{ {
cur_attr().stroke_opacity = op; cur_attr().opacity = op;
cur_attr().fill_opacity = op;
} }
void line_join(agg::line_join_e join) void line_join(agg::line_join_e join)

View file

@ -38,6 +38,7 @@ namespace svg {
struct path_attributes struct path_attributes
{ {
unsigned index; unsigned index;
double opacity;
agg::rgba8 fill_color; agg::rgba8 fill_color;
double fill_opacity; double fill_opacity;
agg::rgba8 stroke_color; agg::rgba8 stroke_color;
@ -58,6 +59,7 @@ struct path_attributes
// Empty constructor // Empty constructor
path_attributes() : path_attributes() :
index(0), index(0),
opacity(1.0),
fill_color(agg::rgba(0,0,0)), fill_color(agg::rgba(0,0,0)),
fill_opacity(1.0), fill_opacity(1.0),
stroke_color(agg::rgba(0,0,0)), stroke_color(agg::rgba(0,0,0)),
@ -80,6 +82,7 @@ struct path_attributes
// Copy constructor // Copy constructor
path_attributes(const path_attributes& attr) path_attributes(const path_attributes& attr)
: index(attr.index), : index(attr.index),
opacity(attr.opacity),
fill_color(attr.fill_color), fill_color(attr.fill_color),
fill_opacity(attr.fill_opacity), fill_opacity(attr.fill_opacity),
stroke_color(attr.stroke_color), stroke_color(attr.stroke_color),
@ -101,6 +104,7 @@ struct path_attributes
// Copy constructor with new index value // Copy constructor with new index value
path_attributes(path_attributes const& attr, unsigned idx) path_attributes(path_attributes const& attr, unsigned idx)
: index(idx), : index(idx),
opacity(attr.opacity),
fill_color(attr.fill_color), fill_color(attr.fill_color),
fill_opacity(attr.fill_opacity), fill_opacity(attr.fill_opacity),
stroke_color(attr.stroke_color), stroke_color(attr.stroke_color),

View file

@ -290,13 +290,13 @@ public:
if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT) if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT)
{ {
render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.fill_opacity * opacity, symbol_bbox, path_bbox); render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.fill_opacity * attr.opacity * opacity, symbol_bbox, path_bbox);
} }
else else
{ {
ras.filling_rule(attr.even_odd_flag ? fill_even_odd : fill_non_zero); ras.filling_rule(attr.even_odd_flag ? fill_even_odd : fill_non_zero);
color = attr.fill_color; color = attr.fill_color;
color.opacity(color.opacity() * attr.fill_opacity * opacity); color.opacity(color.opacity() * attr.fill_opacity * attr.opacity * opacity);
ScanlineRenderer ren_s(ren); ScanlineRenderer ren_s(ren);
color.premultiply(); color.premultiply();
ren_s.color(color); ren_s.color(color);
@ -326,13 +326,13 @@ public:
if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT) if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT)
{ {
render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.stroke_opacity * opacity, symbol_bbox, path_bbox); render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.stroke_opacity * attr.opacity * opacity, symbol_bbox, path_bbox);
} }
else else
{ {
ras.filling_rule(fill_non_zero); ras.filling_rule(fill_non_zero);
color = attr.stroke_color; color = attr.stroke_color;
color.opacity(color.opacity() * attr.stroke_opacity * opacity); color.opacity(color.opacity() * attr.stroke_opacity * attr.opacity * opacity);
ScanlineRenderer ren_s(ren); ScanlineRenderer ren_s(ren);
color.premultiply(); color.premultiply();
ren_s.color(color); ren_s.color(color);

View file

@ -411,8 +411,7 @@ void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value )
else if(xmlStrEqual(name, BAD_CAST "opacity")) else if(xmlStrEqual(name, BAD_CAST "opacity"))
{ {
double opacity = parse_double((const char*)value); double opacity = parse_double((const char*)value);
path_.stroke_opacity(opacity); path_.opacity(opacity);
path_.fill_opacity(opacity);
} }
else if (xmlStrEqual(name, BAD_CAST "visibility")) else if (xmlStrEqual(name, BAD_CAST "visibility"))
{ {