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, [EMAIL PROTECTED] wrote:

Hi Randy,

[EMAIL PROTECTED] 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 [EMAIL PROTECTED] received on 04/19/2007 07:31 AM

04/19/2007 07:31 AM


[EMAIL PROTECTED]

Please respond to [email protected]
Sent by [EMAIL PROTECTED]

        To:        [email protected]
        cc:        [email protected]
        Subject:        Re: JSVGCanvas.setRenderingTransform()



Hi Randy,

[EMAIL PROTECTED] 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- [EMAIL PROTECTED] For additional commands, e-mail: batik-users- [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: batik-users- [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to