You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-users@xmlgraphics.apache.org by Randy Kunkee <ra...@randallkunkee.com> on 2007/05/13 22:37:56 UTC

Re: JSVGCanvas.setRenderingTransform()

Hi Thomas,

It's been a while, but I wanted to get back to you and let you know  
that this did the trick.  This prompted me to look further at the  
Batik code and all the different versions of  
getPreserveAspectRatioTransform(). Here's what I ended up with:

     void  initPictureSize(Document doc, String viewbox)
     {
         Element svgelm = doc.getDocumentElement();
         if (svgelm.getAttributeNS(null, "viewBox").equals(viewbox))
             return;
         float w = Float.parseFloat(svgelm.getAttributeNS(null,  
"width"));
         float h = Float.parseFloat(svgelm.getAttributeNS(null,  
"height"));
         float[] vb = ViewBox.parseViewBoxAttribute((Element) 
(elements.item(0)), viewbox);
         AffineTransform at = ViewBox.getPreserveAspectRatioTransform 
(svgelm, vb, w, h);
         canvas_.setRenderingTransform(at);
     }

This assumes that the SVG document has width and height attributes in  
the outer <svg> element. Not sure what I'd do otherwise (or if the  
values were expressed as percentages), but mine are all integers. The  
variable canvas_ is the JSVGCanvas.

I used the particular version of  
ViewBox.getPreserveAspectRatioTransform() above because it did not  
require a BridgeContext. It would have been possible to drill in and  
get the BridgeContext, but this seemed an easier way to go, even  
though I had to parse the viewBox myself.

I later noticed that Batik-1.7 does not have this particular form of  
getPreserveAspectRatio(), so I'll have to do something a little  
different whenever I get around to that. Any reason in particular  
this was removed?

Thanks again,
Randy

On Apr 27, 2007, at 8:20 PM, thomas.deweese@kodak.com wrote:

> Hi Randy,
>
> randy.kunkee@us.abb.com wrote on 04/24/2007 03:48:37 PM:
>
>> Since the batik.bridge.ViewBox doesn't take an x and y argument,
>> only width and height, I'm not sure how to use this.
>
>     public static
>         AffineTransform getPreserveAspectRatioTransform(Element e,
>                                                         float[] vb,
>                                                         float w,
>                                                         float h,
>                                                          
> BridgeContext ctx)
> {
>
>    The 'vb' is an array of 4 floats: x, y, w, h.
>
>> Would I do this
>> through a separate URL? Could it start with '#', e.g.
>> '#svgView(viewBox(...))'?
>
>    You could do this...
>
>> There is something else that does almost exactly what I need. It is
>> the viewBox element in the outer <svg:svg> element. If I put my
>> viewBox parameters in there, it presents the view exactly the way I
>> want it.
>
>    The code that handles that is the ViewBox.
>
>> Except that I can't zoom out - the picture is clipped by
>> the outer viewBox. If I could only zoom out and pan. Is there a way
>> to stop this clipping?
>
>    You can set overflow="visible" on the root SVG element.
>
>> Perhaps another approach would be to use the
>> viewBox in the <svg:svg> and then make some calls to enable  
>> panning out?
>
>
>    You can do this, but setting the viewBox can be expensive.
>
>> Message from thomas.deweese@kodak.com received on 04/19/2007 07:31 AM
>>
>> 04/19/2007 07:31 AM
>
>>
>> thomas.deweese@kodak.com
>>
>> Please respond to batik-users@xmlgraphics.apache.org
>> Sent by thomas.deweese@kodak.com
>>
>>         To:        batik-users@xmlgraphics.apache.org
>>         cc:        batik-users@xmlgraphics.apache.org
>>         Subject:        Re: JSVGCanvas.setRenderingTransform()
>>
>>
>>
>> Hi Randy,
>>
>> randy.kunkee@us.abb.com wrote on 04/17/2007 04:10:19 PM:
>>
>>>
>>> I hope somebody can shed some light on this.
>>>
>>> Basically, I want to do in software what could be done with a
>>> control-drag-mousebutton1. Seems like there could be a simple
>>> interface to call to do this, but I haven't found it yet.
>>
>> See batik.bridge.ViewBox
>>
>>    /**
>>     * Parses the specified reference (from a URI) and returns the
>> appropriate
>>     * transform.
>>     *
>>     * @param ref the reference of the URI that may specify additional
>> attribute
>>     *            values such as the viewBox, preserveAspectRatio or a
>> transform
>>     * @param e the element interested in its view transform
>>     * @param w the width of the effective viewport
>>     * @param h The height of the effective viewport
>>     * @param ctx The BridgeContext to use for error information
>>     * @exception BridgeException if an error occured while  
>> computing the
>>     *            preserveAspectRatio transform
>>     */
>>    public static AffineTransform getViewTransform(String ref,
>>                                                   Element e,
>>                                                   float w,
>>                                                   float h,
>>                                                   BridgeContext  
>> ctx) {
>>
>>
>>> I'm trying to implement what I call a "pre-zoomed" SVG file. In my
>>> SVG file, I have added an element <x:defaultpicturesize  
>>> viewBox="x y w
>
>> h"/>.
>>
>>   You probably want to look at:
>>   http://www.w3.org/TR/SVG11/linking.html#SVGFragmentIdentifiers
>>
>>   As this is more or less already built into Batik.
>>
>>> Since I haven't found a call to "zoom it to this box", I tried using
>>> setRenderingTransform(). After loading the SVG file (and after
>>> gvtRenderingCompleted() is called), I look for this element.  If I
>>> find one, I create an AffineTransform and call  
>>> setRenderingTransform()
>
>>>
>>> The problem is that this thing does not do what I expect it to.
>>
>>   Affine transforms rarely do what you expect them to do unless
>> you have been working with them for quite a while.  My guess is that
>> you aren't considering the viewBox transform which it sounds like may
>> be introducing a small scale and or translate.
>>
>>> It is easy enough to center up the picture (if that's all I wanted
>>> to do). I simply calculate the difference between the center of the
>>> <svg:svg viewbox="..."> and the center of my desired viewbox. This
>>> is straightforward and produces a view that looks close to centered
>>> (but clearly is not exactly centered)
>>>
>>> When I apply a scaling transformation things go very off. First of
>>> all, scaling appears to happen based on the upper left-hand corner
>>> of the picture. For example, if I only scale (say 2x) what
>>> previously was in the upper left-hand corner now fills the entire
>> display.
>>>
>>> So I think, translate the upper left-hand corner of the desired
>>> viewbox to the x and y of the <svg:svg> viewbox and then scale.
>>> Still not right. Then I think, okay, it's scaling first so my
>>> translation values actually need to be multiplied by the scale
>>> factor - better but still not right.
>>>
>>> What am I missing here? Seems like this should be an easy thing  
>>> to do.
>
>>>
>>> Regards,
>>> Randy
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: batik-users- 
>> unsubscribe@xmlgraphics.apache.org
>> For additional commands, e-mail: batik-users- 
>> help@xmlgraphics.apache.org
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> For additional commands, e-mail: batik-users- 
> help@xmlgraphics.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org


Re: JSVGCanvas.setRenderingTransform()

Posted by th...@kodak.com.
Hi Randy,
    See answers below..

Randy Kunkee <ra...@randallkunkee.com> wrote on 05/13/2007 04:37:56 PM:

> Here's what I ended up with:
>      void  initPictureSize(Document doc, String viewbox)
>      {
>          Element svgelm = doc.getDocumentElement();
>          if (svgelm.getAttributeNS(null, "viewBox").equals(viewbox))
>              return;
>          float w = Float.parseFloat(svgelm.getAttributeNS(null, 
> "width"));
>          float h = Float.parseFloat(svgelm.getAttributeNS(null, 
> "height"));
>          float[] vb = ViewBox.parseViewBoxAttribute((Element) 
> (elements.item(0)), viewbox);
>          AffineTransform at = ViewBox.getPreserveAspectRatioTransform 
> (svgelm, vb, w, h);
>          canvas_.setRenderingTransform(at);
>      }

> I used the particular version of 
> ViewBox.getPreserveAspectRatioTransform() above because it did not 
> require a BridgeContext. [...]
> 
> I later noticed that Batik-1.7 does not have this particular form of 
> getPreserveAspectRatio(), so I'll have to do something a little 
> different whenever I get around to that. Any reason in particular 
> this was removed?

    This form required parsing the preserveAspectRatio attribute and
we needed the BridgeContext in order to generate a usable Error message
(file and line number).  There is still the real underlying call:

    public static
    AffineTransform getPreserveAspectRatioTransform(float [] vb,
                                                        short align,
                                                        boolean meet,
                                                        float w,
                                                        float h);

   Good luck.

> 
> On Apr 27, 2007, at 8:20 PM, thomas.deweese@kodak.com wrote:
> 
> > Hi Randy,
> >
> > randy.kunkee@us.abb.com wrote on 04/24/2007 03:48:37 PM:
> >
> >> Since the batik.bridge.ViewBox doesn't take an x and y argument,
> >> only width and height, I'm not sure how to use this.
> >
> >     public static
> >         AffineTransform getPreserveAspectRatioTransform(Element e,
> >                                                         float[] vb,
> >                                                         float w,
> >                                                         float h,
> > 
> > BridgeContext ctx)
> > {
> >
> >    The 'vb' is an array of 4 floats: x, y, w, h.
> >
> >> Would I do this
> >> through a separate URL? Could it start with '#', e.g.
> >> '#svgView(viewBox(...))'?
> >
> >    You could do this...
> >
> >> There is something else that does almost exactly what I need. It is
> >> the viewBox element in the outer <svg:svg> element. If I put my
> >> viewBox parameters in there, it presents the view exactly the way I
> >> want it.
> >
> >    The code that handles that is the ViewBox.
> >
> >> Except that I can't zoom out - the picture is clipped by
> >> the outer viewBox. If I could only zoom out and pan. Is there a way
> >> to stop this clipping?
> >
> >    You can set overflow="visible" on the root SVG element.
> >
> >> Perhaps another approach would be to use the
> >> viewBox in the <svg:svg> and then make some calls to enable 
> >> panning out?
> >
> >
> >    You can do this, but setting the viewBox can be expensive.
> >
> >> Message from thomas.deweese@kodak.com received on 04/19/2007 07:31 AM
> >>
> >> 04/19/2007 07:31 AM
> >
> >>
> >> thomas.deweese@kodak.com
> >>
> >> Please respond to batik-users@xmlgraphics.apache.org
> >> Sent by thomas.deweese@kodak.com
> >>
> >>         To:        batik-users@xmlgraphics.apache.org
> >>         cc:        batik-users@xmlgraphics.apache.org
> >>         Subject:        Re: JSVGCanvas.setRenderingTransform()
> >>
> >>
> >>
> >> Hi Randy,
> >>
> >> randy.kunkee@us.abb.com wrote on 04/17/2007 04:10:19 PM:
> >>
> >>>
> >>> I hope somebody can shed some light on this.
> >>>
> >>> Basically, I want to do in software what could be done with a
> >>> control-drag-mousebutton1. Seems like there could be a simple
> >>> interface to call to do this, but I haven't found it yet.
> >>
> >> See batik.bridge.ViewBox
> >>
> >>    /**
> >>     * Parses the specified reference (from a URI) and returns the
> >> appropriate
> >>     * transform.
> >>     *
> >>     * @param ref the reference of the URI that may specify additional
> >> attribute
> >>     *            values such as the viewBox, preserveAspectRatio or a
> >> transform
> >>     * @param e the element interested in its view transform
> >>     * @param w the width of the effective viewport
> >>     * @param h The height of the effective viewport
> >>     * @param ctx The BridgeContext to use for error information
> >>     * @exception BridgeException if an error occured while 
> >> computing the
> >>     *            preserveAspectRatio transform
> >>     */
> >>    public static AffineTransform getViewTransform(String ref,
> >>                                                   Element e,
> >>                                                   float w,
> >>                                                   float h,
> >>                                                   BridgeContext 
> >> ctx) {
> >>
> >>
> >>> I'm trying to implement what I call a "pre-zoomed" SVG file. In my
> >>> SVG file, I have added an element <x:defaultpicturesize 
> >>> viewBox="x y w
> >
> >> h"/>.
> >>
> >>   You probably want to look at:
> >>   http://www.w3.org/TR/SVG11/linking.html#SVGFragmentIdentifiers
> >>
> >>   As this is more or less already built into Batik.
> >>
> >>> Since I haven't found a call to "zoom it to this box", I tried using
> >>> setRenderingTransform(). After loading the SVG file (and after
> >>> gvtRenderingCompleted() is called), I look for this element.  If I
> >>> find one, I create an AffineTransform and call 
> >>> setRenderingTransform()
> >
> >>>
> >>> The problem is that this thing does not do what I expect it to.
> >>
> >>   Affine transforms rarely do what you expect them to do unless
> >> you have been working with them for quite a while.  My guess is that
> >> you aren't considering the viewBox transform which it sounds like may
> >> be introducing a small scale and or translate.
> >>
> >>> It is easy enough to center up the picture (if that's all I wanted
> >>> to do). I simply calculate the difference between the center of the
> >>> <svg:svg viewbox="..."> and the center of my desired viewbox. This
> >>> is straightforward and produces a view that looks close to centered
> >>> (but clearly is not exactly centered)
> >>>
> >>> When I apply a scaling transformation things go very off. First of
> >>> all, scaling appears to happen based on the upper left-hand corner
> >>> of the picture. For example, if I only scale (say 2x) what
> >>> previously was in the upper left-hand corner now fills the entire
> >> display.
> >>>
> >>> So I think, translate the upper left-hand corner of the desired
> >>> viewbox to the x and y of the <svg:svg> viewbox and then scale.
> >>> Still not right. Then I think, okay, it's scaling first so my
> >>> translation values actually need to be multiplied by the scale
> >>> factor - better but still not right.
> >>>
> >>> What am I missing here? Seems like this should be an easy thing 
> >>> to do.
> >
> >>>
> >>> Regards,
> >>> Randy
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: batik-users- 
> >> unsubscribe@xmlgraphics.apache.org
> >> For additional commands, e-mail: batik-users- 
> >> help@xmlgraphics.apache.org
> >>
> >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> > For additional commands, e-mail: batik-users- 
> > help@xmlgraphics.apache.org
> >
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org