- From: Allen Razdow <arazdow@mathsoft.com>
- Date: Mon, 12 May 2003 09:05:32 -0400
- To: "'Fred P.'" <fprog26@hotmail.com>, www-svg@w3.org
- Cc: Kim.Marriott@infotech.monash.edu.au
Fred, We Fred, >Anybody else, would be enthusiast to have such functionality? We are anxious to see SVG be able to specify graphics adaptive to dimensions of text strings and substrings in particular, because these dimensions can't easily be known before render-time. Extensions to more general expression-based attributes makes sense so long as it doesn't add complexity beyond what text alone requires. -Allen -----Original Message----- From: Fred P. [mailto:fprog26@hotmail.com] Sent: Monday, May 12, 2003 3:13 AM To: www-svg@w3.org Cc: Kim.Marriott@infotech.monash.edu.au; arazdow@mathsoft.com Subject: RE: SVG 1.2 Working Draft: Comments on 3.2.7 Expression-based at tribute values I think the arguments of Professor Kim Marriott describes exactly what some of the things that we tried to achieve. Especially his formal PDF article on one-way constrained SVG. This is especially true for rendering UML diagrams using SVG, similar to Visio or Rational Rose, using an SVG web client. Let's take a simple case of springs: 0 1 2 3 (0,0) 012345678901234567890123456789012345 0+----------------------------------+ 1| z z | 2| (9,3) z (22,3) z | 3| +---+ +---+ | 4|zzzzzzzz| A |zzzzzzzz| B |zzzzzzzz| 5| +---+ +---+ | 6| z z | 7| z z | 8+----------------------------------+ (W,H) Spring conversion into one-way constraint functions can be derived with some low level logic: Notice that any thing calculation are integer based mostly using floor(x) A.x = (document.width - A.width - B.width) * 1/3 + 1 = (35 - 5 - 5) * 1/3 + 1 = (25 ) * 1/3 + 1 = 8.33 + 1 = 8 + 1 = 9 A.y = (document.height - A.height - B.height) * 1/2 + 1 = (8 - 3) / 2 + 1 = 5 /2 + 1 = 2.5 + 1 = 2 + 1 = 3 B.x = (document.width - A.width - B.width) * 2/3 + A.width + 1 = (35 - 5 - 5) * 2/3 + 5 + 1 = (25 ) * 2/3 + 5 + 1 = 16.67 + 6 = 16 + 6 = 22 B.y = (document.height - A.height - B.height) * 1/2 + 1 = (8 - 3) / 2 + 1 = 5 /2 + 1 = 2.5 + 1 = 2 + 1 = 3 <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE svg SYSTEM "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd" > <svg height="300" width="300" xmlns:xlink="http://www.w3.org/2000/xlink/namespace/" > <defs> <!-- Assuming you want 10px spacing between the box border and the text --> <constant id="offset" value="10px"/> </defs> <rect id="A" x="eval( (document.width - A.width - B.width ) * 1/3 + 1 );" y="eval( (document.height - A.height - B.height) * 1/2 + 1 );" width="eval( offset + textA.width + offset );" height="eval( offset + textA.height + offset );" style="fill:#00FFFF; stroke:#000000; stroke-width:1; shape-rendering: optimizeSpeed;" /> <rect id="B" x="eval( (document.width - A.width - B.width ) * 2/3 + A.width + 1 );" y="eval( (document.height - A.height - B.height) * 1/2 + 1 );" width="eval( offset + textB.width + offset );" height="eval( offset + textB.height + offset );" style="fill:#00FFFF; stroke:#000000; stroke-width:1; shape-rendering: optimizeSpeed;" /> <text id="textA" x="eval( A.x + offset );" y="eval( A.y + offset );" style="font:arial; font-size:8pt; text-rendering:optimizeSpeed;" >A</text> <text id="textB" x="eval( B.x + offset );" y="eval( B.y + offset );" style="font:arial; font-size:8pt; text-rendering:optimizeSpeed;" >B</text> </svg> Acyclic Dependancy: =================== A.width --> textA.width A.height --> textA.height B.width --> textB.width B.height --> textB.height textA.x --> A.x --> document.width | A.width | B.width --> textA.width | textB.width textA.y --> A.y --> document.height | A.height | B.height --> textA.height | textB.height textB.x --> B.x --> document.width | A.width | B.width --> textA.width | textB.width textB.y --> B.y --> document.height | A.height | B.height --> textA.height | textB.height As you can see, it's quite straight-forword to derive expression for GUI widget spring equations, at least for square box spacing approximation of complex shapes like a cloud or triangle and similar. For your <path/> example, I think something like this should make everyone happy: <path d="M {if {viewport.right-viewport.left > 10px} then {viewport.left+10px} else {0.5*viewport.right+0.5*viewport.left}}...."/> becomes: <path d="M eval( if ( viewport.right-viewport.left > 10px ) { return new Point( viewport.left+10px, 10px ); } else { return new Point( 0.5*viewport.right+0.5*viewport.left, 10px ); } ); l 1 0 l 0 1 l -1 0z"/> The following notation might be needed: <defs> <expression id='len' value='eval( viewport.width/2 + 10px );' /> </defs> <path d="M eval( if ( viewport.right-viewport.left > 10px ) { return new Point( viewport.left+10px, 10px ); } else { return new Point( 0.5*viewport.right+0.5*viewport.left, 10px ); } ); l eval( len ) 0 l 0 eval( len ) l eval( -1 * len ) 0z"/> Here we see clearly why eval( x ) is needed to not confound the l 'el' relative line command and the variable name len. or use { } as mentionned: <path d="M {eval( if ( viewport.right-viewport.left > 10px ) { return new Point( viewport.left+10px, 10px ); } else { return new Point( 0.5*viewport.right+0.5*viewport.left, 10px ); } ); } l 1 0 l 0 1 l -1 0z"/> The following might be needed: <defs> <expression id='len' value='eval( viewport.width/2 + 10px );' /> </defs> <path d="M {eval( if ( viewport.right-viewport.left > 10px ) { return new Point( viewport.left+10px, 10px ); } else { return new Point( 0.5*viewport.right+0.5*viewport.left, 10px ); } ); } l {eval( len )} 0 l 0 {eval( len )} l {eval( -1 * len )} 0z"/> or simply <path d="M {eval( if ( viewport.right-viewport.left > 10px ) { return new Point( viewport.left+10px, 10px ); } else { return new Point( 0.5*viewport.right+0.5*viewport.left, 10px ); } ); } l {len} 0 l 0 {len} l {-len} 0z"/> Anybody else, would be enthusiast to have such functionality? BTW, all those inlined calculation could be ECMAScript based and therefore hooked-up directly to existing embedded SVG ECMAscript engines, allowing for 'safe' recursive functions. Sincerely yours, Fred. _________________________________________________________________ Add photos to your messages with MSN 8. Get 2 months FREE*. http://join.msn.com/?page=features/featuredemail
Received on Monday, 12 May 2003 09:05:41 UTC