Comments on SVG 1.2 WD-6

Hi all,

    Attached is a detailed set of comments on WD-6 of SVG 1.2.
It may make things easier if people respond to individual sections
rather than the whole thing at once.  If so changing the subject
might help.

---

FlowText Suggestion -

   Can you add a 'getAsTspan()' method to the FlowRoot element?  This
would return a text element with tspan's that would render identically
to the current display (ideally it would even use things like
text-length on the individual spans).  This is important to avoid
'rewraps' when moving between a client environments.

   One issue this would require adding the ability to include SVG
graphics in the standard 'text' element.  Which only makes sense given
the support in FlowText.

---

    If you are going to have flowImage (which I'm not really sure you
should) then you should really have a grid element for doing 'table
like' layout.  Once the UA needs to support dynamic layout of SVG
content it might as well support grid layout.  This is also really
important for GUI type stuff.

    Suggestion:

    <grid x/y/w/h>
      <gridCell colSpan width/height>
        <gridText>
          <flowDiv> (could have gridDiv - but doesn't really seem needed).
        </gridText>
      </gridCell>
    </grid>

    <gridRef xlink:href="">
       Like 'flowRef' allows references to gridCell's 'out of line'
    so z-order can be easily manipulated.


    Along with this I would add minWidth/minHeight maxWidth/maxHeight
to SVG locatable.  This would allow the layout to be easily specified.
For most SVG graphics min/max W/H would == W/H.  For gridText it would
be the max word length, and total line length in progression direction
with lineHeight/lineHeight*maxNumLines(?)  in non-progression
direction (this might need a little tweaking, I'm not 100% sure what
makes sense in the non-progression direction).

   This really should be trivial to implement given flowText as once
the table alg is applied (which is fairly simple given the methods
above - which more or less fall out of text wrapping) it should be
simple to transcode the grids to flowRoot/flowRegion equivalents.

---

2) Printing

   The text seems a little contradictory in places:

      "No SVG content is allowed between the pageSet and the root svg
       element."

   (I think this is an error) then later:

   <svg ...>
    <defs><!-- definitions here are always available --></defs>
    <g>   <!-- graphics here are always visible --></g>
    <pageSet>
   </svg>

---

10.3 Constrained Transformations

    The value of 'target' can either be a local id URI
    reference or the special keyword 'host'.

    Does this mean: "ref(url(#myId))" or "ref(#myId)" or "ref(myId)".

    What happens if 'myId' is "not displayed" (in defs, ancestor has
    display="none", etc), Error?  no transform?

   It says:
      if the tree is referenced by an element from the SVG language,
      then the search continues from the referencing element

   I assume that this means that for 'use' references the search
jumps to the use element?  Gahh!

   I really wish the WG would bite the bullet and say that 'use' is
really just a shadow tree.  This might break the small amount of
existing code that relies on modification of the referenced element
updating all instances, but it would avoid introducing another whole
system of dependency tracking...

   It would also allow for things like getTransformToElement to
be useful.

---

11.4 Inheritance into the shadow tree

      The User Agent default stylesheet for SVG 1.2 user agents, to
      give SVG 1.0/1.1 compatible styling, includes the following
      rules:

   symbol { shadowInherit: onUse; }
   image, feImage { shadowInherit: none; }

    This example looks really odd to me: first feImage can behave
like use or image depending on what it is referencing - so there is
really no way to mimic this behavior here.  Second you swap where you
define shadowInherit from the referenced element (symbol) the the
referencing element (image).  I think 'symbol' should be 'use' - since
symbol doesn't establish the show tree the 'use' element does.

---

11.6 Controlling the rendering color space

      The SVG Working Group are considering removing this new feature
      from SVG 1.2 due to lack of interest.

    Please don't.  There is a working implementation available for
Batik, and this feature is really critical for some high quality/
high performance work flows.

    The current specification requires user agents to repeatedly change
the color space each time color spaces other than sRGB are used.  This
causes harm to the image data, in that colors can "walk" and precision
is lost, etc.

    Additionally the current support for just linear and gamma
corrected sRGB is quite limiting.  There are a number of new color
spaces coming into use that are designed for image quality rather than
matching existing phosphor colors.  The use of these color spaces is
likely to expand over time and in general it only makes sense to
composite an image in these optimized color spaces rather than
converting everything directly into sRGB.

    Given that user agents must already support ICC profiling of image
data expanding this functionality to arbitrary 3 band color spaces
makes a lot of sense.

---

11.12 Overlaying graphics

    Any comment on how this plays with background image?  How about
the extended composite rules?  Basically are these overlays
considered to have no background image, the background image at the
point they exist in the document, or at the point they are rendered?

    Do they appear in other siblings that request background image?
Other overlays?

---

11.15 More rendering hints

    It is unclear to me what the intended difference between 'cache'
    and 'static' is.  Can you provide an example where a UA would act
    differently between 'cache: true' and 'static: true'?

    Is the intent that offscreen images only be created for
    "cache:true; static:true"?

---

12.2 The min-unit-scale and max-unit-scale attributes

    I still think these are better done with a custom element that can
    make intelligent decisions about what branch should be displayed,
    and provides a much clearer semantic relationship between the
    various branches.  However, at the very least the following text
    should be tightened:

        "If the scale factor from the current user coordinate system to
        the viewport coordinate system is greater than min-unit-scale,
        then the test evaluates to true. If the scale factor from the
        current user coordinate system to the viewport coordinate
        system is smaller than max-unit-scale, then the test evaluates
        to true. Otherwise, the tests evaluate to false."

    This means both will evaluate to false when the scale factor equals
    min/max-unit-scale - this means that most of your example content
    will fail:

      <switch>
           <g id="veryDetailed" min-unit-scale="10"/>
           <g id="somewhatDetailed"
              min-unit-scale="1" max-unit-scale="10"/>
           <g id="roughlyDetailed" max-unit-scale="1"/>
      </switch>

     Nothing will show for unit-scale = 1 & 10.  One of the above
checks and only one should be changed to include "or equal to" (don't
change both otherwise people who don't use 'switch', which is likely
to be _lots_ of people will get two branches rendered at 1 & 10).

     I still think you should stick with the version of this feature
that actually has a working implementation, rather than wasting time
redesigning it.

---

13 Vector Effects

    So I must admit to being a bit nervous about the inclusion of
very complex actions like 'union' and 'intersection'.  In my
experience even the best libraries for these actions have at times
"screwed up" (in this list I include Illustrator, Java, several
3D programs) - in fact I've never known a library that didn't have
instabilities in these operations (doesn't mean it doesn't exist
I just haven't encountered it).

    Also I will point out it is not always clear what the correct
    answer is for these, imagine two rectangles that share an edge:

     <rect x="0"   y="0" width="100" height="100"/>
     <rect x="100" y="0" width="100" height="100"/>

    What is the result of 'union'?

     <path d="M 0,0 h 200       v 100 h-200       v-100z"/>

     <path d="M 0,0 h 100 h 100 v 100 h-100 h-100 v-100z"/>

     <path d="M  0,0 h 100 v 100 h-100 v-100 z
              M100,0 h 100 v 100 h-100 v-100 z"/>

    All three enclose the union of the area of the two shapes, thus
meeting some criteria for "an outline of the union of two shapes".
Many people would argue against #3 because it has an edge that passes
it's self going both ways, but what if the 'source' geometry contains
such edges - should they be cleaned?  If so the union of an object
with it's self may not be it's self (generally not the mathmatically
desirable result).

    Also while #1 and #2 would stroke identically if you apply markers
the result would be different.  I've never seen a Union engine that
would generate #1 - even though that is probably what "people" would
want :)

    Are any of the above acceptable?  If so authors need to be warned.
I personally feel that these methods may make more sense in script
than declairative.

---

13.3 The veStrokePath element

    What is the expected output of this?  Are poly lines OK?  In
    general none of the SVG geometry can be stroked and "stay the same"
    so an outset/inset cubic bezier is no longer a cubic bezier.  So
    some level of approximation _must_ take place.  Is it up to
    implementations how this feature is implemented?  Once again
    differences here may not have large visible differences when
    filled/stroked but if markers are used these differences will be
    very visible.

    The specification needs to be clear about this so authors know what
    to expect.

---

13.17 The vector-effect property

   The specification of 'non-scaling-stroke' is:

       <vectorEffect>
         <veFill/>
         <veStrokePath in="SourcePath"/>
         <veFill transform="ref(host)" fill="StrokePaint"/>
         <veMarker/>
       </vectorEffect>

   Shouldn't the 'transform' be on the veStrokePath?  Also doesn't
the veMarker need to have in="sourcePath" otherwise it will
marker the outline of the stroke not the path as it is supposed to.

    "Should markers scale in this case?"

   If one had to be picked(and I think one does) the obvious answer is
no.  Admittedly in some cases the markers will then start
"overlapping" each other but the alternative is that markers slowly
sink into a sea of stroke - which is almost certainly not the intent
(they might want to turn off markers at a certain point).

   The reality is that this case would be unusual but when used I think
the constant size markers are significantly more likely to be

---

14 Progressive Rendering

    "A user agent implementing progressive rendering must render the
     current document tree with the following rules:

     * The user agent updates the rendering following each startElement
       and/or endElement SAX event."

   First off which is it 'and' or 'or'? :)

   Second off isn't O(N^2) behavior supposed to be bad? :)

   I think we want to give UA's some room here to be "smart". A
   renderer should not be be required to rerender a document that
   contains a background rect with a filter effect comprised of 50
   filter primitives that takes 30sec to render per square inch for the
   10,000 simple elements that follow.  It should have the option of
   balancing time spent rendering the document for progressive display
   with time spent reading the document - the end result will be a more
   pleasant experience for users.

   Also you went to such lengths to describe font's what about
   gradients (gradient-stop element children), filters, vector effects,
   patterns (this is a debatable), etc.

   I like the model proposed but the way it is currently specified a
   truely conforming implementation would be terrible to work with.

Received on Friday, 2 April 2004 16:16:59 UTC