Re: Float values in rgb() colour values

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 06:59:52 UTC