Re: Float values in rgb() colour values

Thanks Chris

Ah yes.  Thanks for finding my error.  I forgot that there was a definition
of percentage in the CSS spec.  I was getting distracted by the explicit
definition in the SVG spec.

Paul




On 27 January 2014 19:59, Chris Lilley <chris@w3.org> wrote:

> Hello Paul,
>
> Monday, January 27, 2014, 6:03:16 AM, you wrote:
>
> > So it turns out that Adobe InDesign - before SVG export was removed
> > post-CS3 - generated files with rgb() component values that are
> > floats rather than integers.  I discovered this after a user of my
> > rendering library reported a rendering "bug".
> >
>
> > After experimenting, I see that all three of Chrome, FF and IE
> > allow float values in percentage components,
>
> Yes. As per the CSS spec.
>
> >  but not normal components.
>
> Again, yes.
>
> > In the following test file, the first rect is displayed, but not the
> second.
>
>
> > <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> > <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
> >    width="100%" height="100%"
> >    viewBox="0 0 200 200">
>
> >
> >   <!-- Test float values in rgb() colour declarations.
> >        The Adobe InDesign SVG export filter (present in CS3 and earlier)
> generated
> >        these erroneous type of values. -->
> >   <rect x="50" y="50" width="50" height="80" fill="rgb(100.5%,-4%,
> 33.3%)" />
> >   <rect x="100" y="50" width="50" height="80" fill="rgb(255, 0, 85.3)" />
> >
> >   <text x="100" y="160" text-anchor="middle" font-size="8">Accept
> > bad Adobe InDesign colour declarations</text>
> >   </svg>
>
>
> > How did it come about that the browsers all support floats in
> > percentages?
>
> Because they all follow the relevant specifications.
>
>   "SVG supports all of the syntax alternatives for <color> defined in
>   CSS2 syntax and basic data types ([CSS2], section 4.3.6), with the
>   exception that SVG allows an expanded list of recognized color
>   keywords names."
>   www.w3.org/TR/SVG11/types.html#DataTypeColor
>
>   "The format of an RGB value in the functional notation is 'rgb('
>   followed by a comma-separated list of three numerical values (either
>   three integer values or three percentage values) followed by ')'.
>   The integer value 255 corresponds to 100%, and to F or FF in the
>   hexadecimal notation: rgb(255,255,255) = rgb(100%,100%,100%) = #FFF.
>   Whitespace characters are allowed around the numerical values. "
>   http://www.w3.org/TR/2008/REC-CSS2-20080411/syndata.html#color-units
>
>  "4.3.3 Percentages
>
>   The format of a percentage value (denoted by <percentage> in this
>   specification) is an optional sign character ('+' or '-', with '+'
>   being the default) immediately followed by a <number> immediately
>   followed by '%'."
>
> http://www.w3.org/TR/2008/REC-CSS2-20080411/syndata.html#percentage-units
>
>     "<number> (real number value): The specification of real number
>   values is different for property values than for XML attribute
>   values.
>
>     CSS2 [CSS2] states that a property value which is a <number> is
>     specified in decimal notation (i.e., a <decimal-number>), which
>     consists of either an <integer>, or an optional sign character
>     followed by zero or more digits followed by a dot (.) followed by
>     one or more digits. Thus, for conformance with CSS2, any property
>     in SVG which accepts <number> values is specified in decimal
>     notation only."
>    http://www.w3.org/TR/2003/REC-SVG11-20030114/types.html
>
>   "Some value types may have integer values (denoted by <integer>) or
>   real number values (denoted by <number>). Real numbers and integers
>   are specified in decimal notation only. An <integer> consists of one
>   or more digits "0" to "9". A <number> can either be an <integer>, or
>   it can be zero or more digits followed by a dot (.) followed by one
>   or more digits. Both integers and real numbers may be preceded by a
>   "-" or "+" to indicate the sign."
>   http://www.w3.org/TR/2008/REC-CSS2-20080411/syndata.html#q13
>
> >  All versions of the spec, including SVG2, specify that
> > they should be integers.  Is it just a case of choosing to be
> > permissive?  If so, why do non-percent components not get the same
> treatment?
>
> Huh, that looks like an error that crept in during SVG 1.1 second
> edition. The first edition just referred to CSS (which has always
> allowed floats in percentages); the second edition similarly refers to
> CSS2 and also adds a grammar which, as you point out, is a subset of
> the allowed syntax because it uses <integer> instead of <number>:
>
> color    ::= "#" hexdigit hexdigit hexdigit (hexdigit hexdigit hexdigit)?
>              | "rgb(" wsp* integer comma integer comma integer wsp* ")"
>              | "rgb(" wsp* integer "%" comma integer "%" comma integer "%"
> wsp* ")"
>              | color-keyword
> hexdigit ::= [0-9A-Fa-f]
> comma    ::= wsp* "," wsp*
>
> SVG2 repeats this error
>
>   "color  ::=
>   "#" hexdigit hexdigit hexdigit (hexdigit hexdigit hexdigit)?
>   | ~"rgb(" wsp* integer comma integer comma integer wsp* ")"
>   | ~"rgb(" wsp* integer "%" comma integer "%" comma integer "%" wsp* ")"
>   | ~"hsl(" wsp* integer comma integer comma integer wsp* ")"
>   | ~"hsla(" wsp* integer comma integer comma integer comma integer wsp*
> ")"
>   | color-keyword
>   http://www.w3.org/TR/SVG2/color.html#color
>
>
> I will record that as an erratum for SVG 1.1 second edition, and
> ensure it gets fixed in SVG2.
>
> Thanks for your careful review, Paul
>
>
>
>
>
>
> --
> Best regards,
>  Chris                            mailto:chris@w3.org
>
>

Received on Monday, 27 January 2014 08:33:43 UTC