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]