W3C home > Mailing lists > Public > www-svg@w3.org > February 2001

Calculation of feComposite "arithmetic"

From: Jim Mork <jmork@jasc.com>
Date: Wed, 28 Feb 2001 15:42:37 -0600
Message-ID: <E580CB8FBC72D211A94A00A0C9B57292024A458B@EXCHANGE_SERVER>
To: "'www-svg@w3.org'" <www-svg@w3.org>


I am having difficulty in determining the correct formula for the
"arithmetic" operator with the feComposite filter primitive.   

According to the spec 15.12:

"...a component-wise arithmetic operation (with the result clamped between
[0..1]) can be applied..."

An example SVG file is included at the end of this message.  Using the SVG
filter primitives, I use feComposite "arithmetic" to add red square with 50%
opacity (result "I1") to a green square with 50% opacity (result "I2").  The
result of this operation ("I3") is blended on top of a black square using
the feComposite "over" operation.   (The red and green outputs are generated
using the feColorMatrix operation.)

If straight addition of the RGBA channels were applied, the result would be
yellow with 100% opacity: 
	[1.0  0.0  0.0  0.5] + [0.0  1.0  0.0  0.5] = [1.0  1.0  0.0  1.0]

The color of the final result (over black rectangle) would then be the same:
	[1.0  1.0  0.0  1.0]

If the operation were applied to premultiplied RGBA channels, the result
would be:
	[0.5  0.0  0.0  0.5] + [0.0  0.5  0.0  0.5] = [0.5  0.5  0.0  1.0]

In this case, the color of the final result would also be the same:
	[0.5  0.5  0.0  1.0]

The color of the final result I'm getting from the the Adobe SVG Viewer is:
	[~0.73  ~0.73  0  1.0] 

In terms of 0-255 RBG values the result is RGB(187, 187, 0).

My guess is that Adobe is calculating the alpha value resulting from
"arithmetic" as follows:

	A1 + A2 - A1*A2

In the specific case presented above with red 50% and green 50%:

	0.5 + 0.5 - 0.5*0.5 = 0.75

When [1.0  1.0  0.0  0.75] is blended over [0.0  0.0  0.0  1.0] the result
is [0.75  0.75  0.0  1.0] and that's in line with Adobe's results.

But from the information provided in the spec, I can't determine exactly how
feComposite "arithmetic" should be calculated.

Any enlightenment on this subject will be greatly appreciated.

Thanks in advance,

James Mork
Principle Software Engineer
Jasc Software Inc.

---snip---
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN"
	"http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd">
<svg width="100" height="100">
	<filter id="TestFilter" filterUnits="objectBoundingBox" x="0%"
y="0%"
		width="100%" height="100%">
		<feColorMatrix in="SourceGraphic" result="I1" type="matrix"
			values="0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5"/>
		<feColorMatrix in="SourceGraphic" result="I2" type="matrix"
			values="0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0.5"/>
		<feComposite operator="arithmetic" in="I1" in2="I2"
result="I3" k2="1" k3="1"/>
		<feComposite operator="over" in="I3" in2="SourceGraphic"/>
	</filter>
	<rect x="0" y="0" width="100" height="100" rx="0" ry="0"
style="stroke-miterlimit:4;stroke-linejoin:miter;stroke-width:1;stroke-opaci
ty:1;stroke:none;
	
fill-opacity:1;fill:rgb(0,0,0);opacity:1;filter:url(#TestFilter)"/>
</svg>
---snip---
Received on Wednesday, 28 February 2001 16:46:37 GMT

This archive was generated by hypermail 2.3.1 : Friday, 8 March 2013 15:54:20 GMT