On 5/4/07, Philip Taylor <[EMAIL PROTECTED]> wrote:
For radial gradients, I've been looking into what happens when the two
circles that define the gradient are not fully overlapping (i.e. not
one entirely inside the other) - this appears to not be implemented or
specified accurately.

No kidding. Wow.


Negative radius values don't sound very useful or sensible to me, and
they're not implemented in a useful or compatible way, so I think they
ought to be handled as either:
* Always take the absolute value of r0 and r1.
or
* Throw INDEX_SIZE_ERR when passed a negative r0 or r1 (for similarity
with arc).
I don't know which would be better. I'll guess the first for now,
since it matches Firefox.

Fixed.


So, I would suggest defining something like:

<<<<
Once a gradient has been created (see below), stops must be placed
along it to define how the colors are distributed along the gradient.
Between each such stop, the colors and the alpha component must be
linearly interpolated over the RGBA space to find the color to use at
that offset. Before the lowest stop, the color of the lowest stop must
be used. After the highest stop, the color of the highest stop must be
used.

[Clarified to "linearly interpolated". Changed what happens outside
the range of the stops - since this text is shared with linear
gradients, I'm assuming they are both changed to be the same.]

Done.


Radial gradients must be rendered as follows:

* If one of the start circle and end circle is enclosed within the
other circle, and their circumferences touch in at least one point,
then the gradient must be rendered as the color at offset 0.

* Otherwise, a cone or cylinder must be created from the circles, such
that at the circumference of the starting circle the color at offset 0
is used, that at the circumference of the ending circle the color at
offset 1 is used, that the circumference of a circle drawn a certain
fraction of the way along the line between the two origins with a
radius the same fraction of the way between the two radii has the
color at that offset (interpolation happening as described above) for
all offsets such that the radius of the circle at that offset is
positive; that the end circle appear to be above the start circle, and
that any points not described by the gradient are a transparent black.

I did basically what you described as your second bulletpoint.

The only case this doesn't cover is the x0,y0,r0=x1,y1,r1 case, but
that doesn't really make any sense to me from a radial gradient point
of view. I've made it paint nothing. It could raise an exception, I
guess. Or paint a circle of the second colour against a background of
the first colour.

--
Ian Hickson

Reply via email to