Finally getting back to testing this and posting the results.

Thanks, Michael, for your reply.

Yes, I want to zoom in with a given center point. However the solution offered below doesn't work. Or perhaps it's not universal enough. Or I'm doing something wrong. Here's what I have:

The outer svg element is:
<svg height="647px" width="1024px" viewBox="-334 -78 649 410" etc (xml namespace stuff) >

As I stated before, I have another element (in a different namespace, let's call it x):

<x:defpicturesize viewBox="32 -63 269 169"> (call these the desired values). To help me know if I'm doing the right thing, I also have a <rect x="32" y="-63" width="269" height="169" stroke="#00ff00"/>. If my zoom is correct, then I just just see the edges of this rectangle. Alas, the formula below is pretty far off.

This gives sx=2.4126394, and sy=2.4260354. I have tested these zoom values and know them to be accurate. I can manually scroll until the desired viewBox just fits my window. Zoom is easy to calculate, i.e. width of svg / width of desired viewBox, and likewise with the svg height and the desired height.

I calculate the center of the box I want to zoom to as (desired_x + desired_width/2, desired_y / desired_height/2), i.e. these are my center points you describe below as x and y. Applying the formulas below, I get (for tx, ty) = ( -235.20445, -30.659761).

Sadly, on the actual display the view is far to the left of where it should be. Through trial and error, I have found that the actual X translation to center on the zoomed in viewBox is tx = -1124.7725 and ty is about -146. Of course, these numbers only work for the default window size of my application. If I start with a larger window, the x translation is no longer correct.

Any more ideas about this?

Another question: when I call getRenderingTransform(), shouldn't I get something other than the identify transformation? It's always the identity transformation before I start. I create my transformation by creating the translation matrix and then concatenating the scaling matrix. Shouldn't the renderingTransform not be [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]?

Thanks,
Randy



On Apr 17, 2007, at 4:06 PM, Bishop, Michael W. CONTR J9C880 wrote:

It sounds like you're trying to scale around a certain center point:

Given a center point (x,y) and scale values sx, sy, you derive translate values tx and ty:

tx = -x * (sx - 1.0);
ty = -y * (sy - 1.0);

translate(tx, ty);
scale(sx, sy);

Michael Bishop

________________________________

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Sent: Tue 4/17/2007 4:10 PM
To: [email protected]
Subject: JSVGCanvas.setRenderingTransform()



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.

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"/>.

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.

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
<winmail.dat>
---------------------------------------------------------------------
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