home *** CD-ROM | disk | FTP | other *** search
/ The Net: Ultimate Internet Guide / WWLCD1.ISO / pc / java / unuam4cs / volume.java < prev    next >
Encoding:
Java Source  |  1996-08-14  |  5.9 KB  |  241 lines

  1. /*
  2.  * @(#)/Volume.java    1.7 96/03/31 by Andrew Barclay abb@nuccard.eushc.org
  3.  *
  4.  * Copyright (c) 1995 Andrew B. Barclay All Rights Reserved.
  5.  */
  6.  
  7. import java.applet.Applet ;
  8. import java.awt.Dimension ;
  9. import java.awt.Image ;
  10. import java.awt.Point ;
  11. import java.awt.image.FilteredImageSource ;
  12. import java.awt.image.ImageConsumer ;
  13. import java.awt.image.ImageObserver ;
  14. import java.awt.image.ImageProducer ;
  15. import java.util.Enumeration ;
  16. import java.util.Vector ;
  17.  
  18. import XSliceVolumeFilter ;
  19. import YSliceVolumeFilter ;
  20. import ZSliceVolumeFilter ;
  21.  
  22. /**
  23.  * A volume composed of 2D slices across the z-axis.
  24.  *
  25.  * @see SliceVolumeFilter
  26.  *
  27.  * @version    1.7 96/03/31
  28.  * @author     Andrew Barclay
  29.  */
  30.  
  31. public class Volume extends Object implements ImageObserver {
  32.     Image src ;
  33.     int srcwidth ;
  34.     int srcheight ;
  35.     int dimensions[] ;
  36.     double voxelsize[] ;
  37.     Point srcSlices[] ;
  38.     static char axissym[] = { 'x', 'y', 'z' } ;
  39.     Vector slicefilters = new Vector() ;
  40.  
  41.     boolean loaderror = false ;
  42.     boolean debug = false ;
  43.     
  44.     /**
  45.      * Construct a Volume
  46.      * @param src source image slices arranged in a 2D grid
  47.      * @param dimensions[] the dimensions of the volume
  48.      * @param voxelsize[] the voxel size (arbitrary units)
  49.      */
  50.     public Volume( Image src, int dimensions[], double voxelsize[] ) {
  51.     this.src = src ;
  52.     this.dimensions = dimensions ;
  53.     if( voxelsize == null ) {
  54.         this.voxelsize = new double[3] ;
  55.         this.voxelsize[0] = this.voxelsize[1] = this.voxelsize[2] = 1.0 ;
  56.     } else {
  57.         this.voxelsize = voxelsize ;
  58.     }
  59.     initialize() ;
  60.     }
  61.  
  62.     public Volume( Image src, int dimensions[] ) {
  63.     this( src, dimensions, null ) ;
  64.     }
  65.  
  66.     void initialize() {
  67.     dbg( "Volume: getting src width and height" ) ;
  68.     try {
  69.         Dimension dim = getImageDimensions( src ) ;
  70.         srcwidth = dim.width ;
  71.         srcheight = dim.height ;
  72.     } catch (Exception e) {
  73.         perror( "Volume.initialize: Image load error." ) ;
  74.     }
  75.     dbg( "width="+srcwidth+" height="+srcheight ) ;
  76.  
  77.     // Now we've got the info we need to make up the srcSlices[].
  78.     srcSlices = new Point[dimensions[2]] ;
  79.     int xstart = 0 ;
  80.     int rowstride = dimensions[1] ;
  81.     int colstride = dimensions[0] ;
  82.     int x = xstart ;
  83.     int y = 0 ;
  84.     for( int z = 0 ; z < dimensions[2] ; z++ ) {
  85.         srcSlices[z] = new Point( x, y ) ;
  86.         x += colstride ;
  87.         if( x >= srcwidth ) {
  88.         x = xstart ;
  89.         y += rowstride ;
  90.         }
  91.     }
  92.     dbg( "finished with Volume.initialize()" ) ;
  93.     }
  94.  
  95.     Image Slice( Applet comp, double pos, int axis ) {
  96.     switch( axis ) {
  97.         case 0:
  98.         return XSlice( comp, pos ) ;
  99.         case 1:
  100.         return YSlice( comp, pos ) ;
  101.         case 2:
  102.         return ZSlice( comp, pos ) ;
  103.     }
  104.     return null ;
  105.     }
  106.  
  107.     Image XSlice( Applet comp, double pos ) {
  108.     dbg( "Volume.XSlice( comp, double )" ) ;
  109.  
  110.     XSliceVolumeFilter svf = new XSliceVolumeFilter(
  111.         srcSlices, dimensions[0], dimensions[1], pos/voxelsize[0],
  112.         dimensions[2], dimensions[1]
  113.     ) ;
  114.     slicefilters.addElement( svf ) ;
  115.  
  116.     return comp.createImage(
  117.         new FilteredImageSource( src.getSource(), svf )
  118.     ) ;
  119.     }
  120.  
  121.     Image YSlice( Applet comp, double pos ) {
  122.     dbg( "Volume.YSlice( comp, double )" ) ;
  123.  
  124.     YSliceVolumeFilter svf = new YSliceVolumeFilter(
  125.         srcSlices, dimensions[0], dimensions[1], pos/voxelsize[1],
  126.         dimensions[0], dimensions[2]
  127.     ) ;
  128.     slicefilters.addElement( svf ) ;
  129.  
  130.     return comp.createImage(
  131.         new FilteredImageSource( src.getSource(), svf )
  132.     ) ;
  133.     }
  134.  
  135.     Image ZSlice( Applet comp, double pos ) {
  136.     dbg( "Volume.ZSlice( comp, double )" ) ;
  137.  
  138.     ZSliceVolumeFilter svf = new ZSliceVolumeFilter(
  139.         srcSlices, dimensions[0], dimensions[1], pos/voxelsize[2],
  140.         dimensions[0], dimensions[1]
  141.     ) ;
  142.     slicefilters.addElement( svf ) ;
  143.  
  144.     return comp.createImage(
  145.         new FilteredImageSource( src.getSource(), svf )
  146.     ) ;
  147.     }
  148.  
  149.     /*
  150.      * The lengths I go to in order to stop an image load...
  151.      * and it still doesn't work -- how do you find all the 
  152.      * consumers and stop the download?
  153.      */
  154.     public void StopConsuming() {
  155.     ImageProducer ip = src.getSource() ;
  156.     Enumeration en = slicefilters.elements() ;
  157.  
  158.     for( ; en.hasMoreElements() ; ) {
  159.         SliceVolumeFilter svf = (SliceVolumeFilter)en.nextElement() ;
  160.         if( ip.isConsumer( svf ) ) {
  161.         dbg( "Volume.StopConsuming(): removing consumer" ) ;
  162.         ip.removeConsumer( svf ) ;
  163.         }
  164.     }
  165.     }
  166.  
  167.     /**
  168.      * Lifted from Animator.java:
  169.      * Get the dimensions of an image.
  170.      * @return the image's dimensions.
  171.      */
  172.     synchronized Dimension getImageDimensions( Image img ) {
  173.     int width ;
  174.     int height ;
  175.  
  176.     dbg( "Volume.getImageDimensions() img="+img ) ;
  177.     // Get the width of the image.
  178.     while ((width = img.getWidth(this)) < 0) {
  179.         try {
  180.         dbg( "waiting on width..." ) ;
  181.         wait(100);
  182.         } catch (InterruptedException e) {
  183.         }
  184.         if (loaderror) {
  185.         perror( "Volume.getImageDimensions: got a load error 1" ) ;
  186.         }
  187.     }
  188.     
  189.     // Get the height of the image.
  190.     while ((height = img.getHeight(this)) < 0) {
  191.         try {
  192.         dbg( "waiting on height..." ) ;
  193.         wait(100);
  194.         } catch (InterruptedException e) {
  195.         }
  196.         if (loaderror) {
  197.         perror( "Volume.getImageDimensions: got a load error 2" ) ;
  198.         }
  199.     }
  200.  
  201.     return new Dimension( width, height ) ;
  202.     }
  203.  
  204.     public synchronized boolean imageUpdate( Image img, int infoflags,
  205.         int x, int y, int w, int h ) {
  206.     //dbg( "Volume.imageUpdate() infoflags="+infoflags ) ;
  207.  
  208.     if( img != src ) {
  209.         return false ;
  210.     }
  211.  
  212.     if ((infoflags & WIDTH) != 0) {
  213.         dbg( "Volume: Got src width = " + w ) ;
  214.     }
  215.     if ((infoflags & HEIGHT) != 0) {
  216.         dbg( "Volume: Got src height = " + h ) ;
  217.     }
  218.     if ((infoflags & (FRAMEBITS | ALLBITS)) != 0) {
  219.         dbg( "Volume: Finished loading volume." ) ;
  220.     } else if ((infoflags & SOMEBITS) != 0) {
  221.         dbg( "Volume: Got some bits, x=" + x + " y=" + y ) ;
  222.     }
  223.     if( (infoflags & ERROR) != 0 ) {
  224.         dbg( "Volume: Load error" ) ;
  225.         loaderror = true ;
  226.     } 
  227.  
  228.     return true ;
  229.     }
  230.  
  231.     void perror( String s ) {
  232.     System.err.println( s ) ;
  233.     }
  234.  
  235.     void dbg( String s ) {
  236.     if( debug ) {
  237.         System.out.println( s ) ;
  238.     }
  239.     }
  240. }
  241.