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]

Reply via email to