Humm... Now we found another issue. When we scroll quickly, it doesn't paint everything. We tried it on the sample (batikBatik.svg) and got the same results. We zoomed in quite a bit so we had a lot of room to scroll and then scrolled around. It is pretty sporatic...it just seems to randomly not paint certain sections. Is this a known behaviour? Is there something we can do about it?
Mark > -----Original Message----- > From: Mark Claassen [mailto:[EMAIL PROTECTED] > Sent: Tuesday, August 12, 2003 11:38 AM > To: 'Batik Users' > Subject: RE: Lazy rendering and zoom > > > We found the scrollable class you were referring to and it > seems to be exactly what we needed! > > > > -----Original Message----- > > From: Thomas DeWeese [mailto:[EMAIL PROTECTED] > > Sent: Tuesday, August 12, 2003 10:14 AM > > To: Batik Users > > Subject: Re: Lazy rendering and zoom > > > > > > Mark Claassen wrote: > > > Thanks for all your help. I believe, though, that I > didn't explain > > > our main reason for messing with this. > > > > > > We were hoping to create a Component so that all the > > panning could be > > > done via the scroll bars, and not the arrow keys. The > > default zooming > > > behaviour just renders a piece of the image inside a Component. > > > Depending on how this is used, you might be able to see the whole > > > section, or have scroll bars which can be used to see the > > section. We > > > were wanting to have the scroll bars always set up so that > > the whole > > > document, regardless of zoom, could be navigated to with > the scroll > > > bars. > > > > > > The first way that came to mind was just to make the > canvas bigger, > > > and render the whole image. This, however, took too much memory. > > > > Ok, I see the problem now. We were using getSize() when we > > should generally use getVisibleRect() to get the area we are > > actually going to display (and hence the size of the offscreen > > buffers we should create). I'm in the processes of fixing this. > > > > > The next way I thought we could do this would be to make > > the canvas as > > > big as we need for the whole image, but just paint the > > portion of the > > > canvas that is currently being viewed in the scroll pane. > > > > > > Is there a way in Batik that I can accomplish this through > > the API you > > > mentioned? > > > > You may also want to subclass JSVGCanvas and implement the > > scrollable interface. Jan Lolling has posted code to do this > > several times. As long as you do the scrolling by adjusting the > > rendering transform the tile caching will kick in. > > > > > > > > > > >>-----Original Message----- > > >>From: Thomas DeWeese [mailto:[EMAIL PROTECTED] > > >>Sent: Tuesday, August 12, 2003 4:46 AM > > >>To: Batik Users > > >>Subject: Re: Lazy rendering and zoom > > >> > > >> > > >>Hi Mark, > > >> > > >>Mark Claassen wrote: > > >> > > >>>Thanks for the reply. > > >>> > > >>>Ok, so here is our theory: > > >>>1) Using the SVG view box and the scale factor, figure how > > >> > > >>many tiles > > >> > > >>>(at say 100 X 100) will fit into the image. > > >>>2) Create a JSVGComponent (workingComp) and set the > > >> > > >>preferred size to > > >> > > >>>be the size of our tiles (100 X 100) > > >>>3) Set the rendering transform of workingComp to have the > > >> > > >>scale factor > > >> > > >>>we want > > >> > > >> The point of my message was that if you zoom the > canvas with a > > >>static document it will automatically tile the image for you. Try > > >>it, bring up an image with a really complex background (try > > >>samples/batikBatik.svg) Zoom in a bunch Pan right notice it > > >>takes a second or two to update, Pan back left notice it > > >>repaints immediately. > > >> > > >> The biggest problem with the current scheme is that the tile > > >>cache is extrememly limited in size it keeps ~50 128x128 tiles in > > >>memory (around 4MB - which is like one screenful of data these > > >>days). This can be adjusted by making calls to: > > >> > > >>org.apache.batik.ext.awt.image.rendered.TileCache.setSize(in sz); > > >> > > >> The cache actually does use SoftReferences to try > and reclaim > > >>tiles that age out of the cache but these are generally pretty > > >>quickly reclaimed. The number you provide is the number > of tiles it > > >>will hold hard references to. > > >> > > >> > > >>>--- > > >>>In our paint method for our JComponent (myComp), we will > paint the > > >>>tiles that are visible in our scrollpane. > > >>> > > >>>For each visible tile > > >>> 4) translate the rendering transform so that the part > > >> > > >>of the tile we > > >> > > >>>want is on the workingComp > > >>> 5) Draw this to a buffered image and keep it. > > >>> 6) repaint this tile on myComp > > >>> > > >>> > > >>>Does this sound OK? Are there any obvious pitfalls or > performance > > >>>issues that might make this not a practical solution? > > >> > > >> The current system goes to great lengths to rendering large > > >>'patches' of the image at once and then split the data out into > > >>tiles after the fact, this is significantly more efficent then > > >>rendering each individual tile. > > >> > > >> > > >>>>-----Original Message----- > > >>>>From: Thomas DeWeese [mailto:[EMAIL PROTECTED] > > >>>>Sent: Friday, August 08, 2003 6:29 PM > > >>>>To: Batik Users > > >>>>Subject: Re: Lazy rendering and zoom > > >>>> > > >>>> > > >>>>Mark Claassen wrote: > > >>>> > > >>>> > > >>>>>Thanks for the reply. > > >>>>> > > >>>>>As it turns out, we are using a static document > already. We went > > >>>>>ahead and actually set the state to be static, but we > > >> > > >>still get the > > >> > > >>>>>memory problem if we zoom enough. (It seems that we are > > >>>> > > >>>>now able to > > >>>> > > >>>> > > >>>>>zoom a bit more, although this may just be a coincidence.) > > >>>> > > >>>>From your > > >>> > > >>>>>description, we thought it was futile to override the > > >>>>>createImageRenderer method as this point. > > >>>>> > > >>>>>It seems to me that if the tiles are rendered lazily, we > > >> > > >>could zoom > > >> > > >>>>>indefinitely and use a relatively constant amount of > > >>>> > > >>>>memory. Also, we > > >>>> > > >>>> > > >>>>>have never noticed the document being painted as we > > >> > > >>scroll. If the > > >> > > >>>>>tiles truley were rendered lazily, I would except to see this. > > >>>>> > > >>>>>Maybe we are just doing something wrong. We weren't quite > > >>>> > > >>>>sure how to > > >>>> > > >>>> > > >>>>>get the zoom we wanted using the API directly, so we resize > > >>>> > > >>>>the canvas > > >>>> > > >>>> > > >>>>>to zoom. To zoom 2X, we: > > >>>>> > > >>>>>Dimension d = canvas.getSize(); > > >>>>>d.width = d.width * 2; > > >>>>>d.height = d. height * 2; > > >>>>>canvas.setPreferredSize(d) > > >>>>>canvas.revalidate(); > > >>>>> > > >>>>>Is there a better way? > > >>>> > > >>>> Yes change the rendering transform, take a look at > > >>>>Zoom(In|Out)?Action in JSVGCanvas.java you are actually > > >> > > >>doubling the > > >> > > >>>>size of the 'visible' canvas so it creates an offscreen > that size. > > >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > >>>>>>-----Original Message----- > > >>>>>>From: Thomas DeWeese [mailto:[EMAIL PROTECTED] > > >>>>>>Sent: Friday, August 08, 2003 12:10 PM > > >>>>>>To: Batik Users > > >>>>>>Subject: Re: Lazy rendering and zoom > > >>>>>> > > >>>>>> > > >>>>>>Mark Claassen wrote: > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>I noticed there is a setProgressivePaint(boolean) method in > > >>>>>>>JGVTComponent. This seems to display items on the canvas > > >>>>>> > > >>>>>>as they are > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>rendered, and not just display the whole document at once. > > >>>>>>> > > >>>>>>>What I was wondering was if there is an option that > > goes a step > > >>>>>>>further, and would restrict rendering to just viewable > > >>>>>> > > >>>>>>area. This is > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>a common thing in Swing, where, for instance, the rows of a > > >>>>>> > > >>>>>>table that > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>are not currently visible in a JScrollPane are never > rendered. > > >>>>>>> > > >>>>>>>The default zooming behaviour in Batik seems to render a > > >> > > >>portion of > > >> > > >>> > > >>>>>>>the document while not changing the canvas size. We > > >> > > >>would like to > > >> > > >>>>>>>change the canvas size, so that the we can pan to see any > > >>>>>> > > >>>>>>part of the > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>document we need simply by moving the scrollbars. > > >>>>>> > > >>>>>>Unfortunately, this > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>causes OutOfMemory errors when the zoom factor gets large. > > >>>>>>> > > >>>>>>>I know we can increase the JVM heap size, but this can only > > >>>>>> > > >>>>>>go so far. > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>What I was hoping for was something in the JSVGCanvas that > > >>>>>> > > >>>>>>would draw > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>just a portion of the document on the canvas, and then when > > >>>>>> > > >>>>>>a scroll > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>occurred, it would noticed that this area had not been > > >> > > >>rendered and > > >> > > >>> > > >>>>>>>draw that. One could even go so far as to anticipate the > > >>>>>> > > >>>>>>loading of > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>>sections and use SortReferences to hold now longer visible > > >>>> > > >>>>sections. > > >>>> > > >>>> > > >>>>>>>Is there anything like this, or any plans to include > > >> > > >>something like > > >> > > >>> > > >>>>>>>this? > > >>>>>> > > >>>>>>Hi Mark, > > >>>>>> > > >>>>>> This is already done for Static Documents. The > > >> > > >>Static Renderer > > >> > > >>> > > >>>>>>keeps a tiled view of the image and when translates > > >> > > >>happen it tries > > >> > > >>>>>>to populate the new view from the stored tiles. This is > > >> > > >>generally > > >> > > >>>>>>not done for dynamic documents as maintaining the > tile store is > > >>>>>>expensive for many small changes (the system would widens > > >> > > >>rendering > > >> > > >>>>>>requests to tile > > >>>>>>boundries) also there were a few bugs in what I will call odd > > >>>>>>cases (the size/location of the root SVG changing). However > > >>>>>>depending on your context this still might be a win for > > your case. > > >>>>>>It is pretty easy to change this by overiding the > > following method > > >>>>>>in batik.swing.svg.JSVGComponent: > > >>>>>> > > >>>>>> protected ImageRenderer createImageRenderer() { > > >>>>>> if (isDynamicDocument) { > > >>>>>> return > rendererFactory.createDynamicImageRenderer(); > > >>>>>> } else { > > >>>>>> return rendererFactory.createStaticImageRenderer(); > > >>>>>> } > > >>>>>> } > > >>>>>> > > >>>>>> So it always returns a static ImageRenderer. > > >> > > >> > > >> > > >> > > >>------------------------------------------------------------ > > --------- > > >>To unsubscribe, e-mail: [EMAIL PROTECTED] > > >>For additional commands, e-mail: [EMAIL PROTECTED] > > >> > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]