/* * @(#)/ZSliceVolumeFilter.java 1.3 96/03/30 by Andrew Barclay abb@nuccard.eushc.org * * Copyright (c) 1995 Andrew B. Barclay All Rights Reserved. */ import java.awt.image.ColorModel ; import java.awt.Point ; import java.awt.Rectangle ; import SliceVolumeFilter ; /** * An ImageFilter class for sliceing volume images. * This class extends the basic ImageFilter Class to extract a given * slice of an existing Volume and provide a source for a * new image containing just the extracted slice. It is meant to * be used in conjunction with a FilteredImageSource object to produce * sliced versions of existing volumes. * * This one's easy. * * @see CropImageFilter * @see FilteredImageSource * @see ImageFilter * @see SliceVolumeFilter * * @version 1.1 95/12/06 * @author Andrew Barclay */ public class ZSliceVolumeFilter extends SliceVolumeFilter { boolean debug = false ; /** * Construct a SliceVolumeFilter that extracts a slice of the source * Volume specified by the ul, ll and ur parameters. * @param srcSlices[] the array of x,y positions of the source image slices * @param volWidth the width of the source volume * @param volHeight the height of the source volume * @param slice the slice number to be extracted * @param width the width of the slice to be extracted * @param height the height of the slice to be extracted */ public ZSliceVolumeFilter( Point srcSlices[], int volWidth, int volHeight, double slice, int width, int height ) { super( srcSlices, volWidth, volHeight, slice, width, height ) ; type = 'Z' ; } /** * Determine if the delivered pixels intersect the slice to * be extracted and pass through only that subset of pixels that * appear in the output slice. */ public void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int off, int scansize) { long ct = System.currentTimeMillis() ; Rectangle sr = new Rectangle( x, y, w, h ) ; int sz1 = firstZSlice( sr ) ; int sz2 = lastZSlice( sr ) ; /* dbg( "sr="+sr+" sz1="+sz1+" sz2="+sz2 ) ; dbg( "off="+off+" scansize="+scansize+" type="+type+" slice="+slice ) ; */ // implement this properly later -- for now, just take orthogonal // slices. int islice = (int)( 0.5 + slice ) ; if( islice >= sz1 && islice < sz2 ) { int x1 = srcSlices[islice].x ; int y1 = srcSlices[islice].y ; int dx = (x1>x) ? x1-x : 0 ; int dy = (y1>y) ? y1-y : 0 ; Rectangle ir = sr.intersection( new Rectangle( x1, y1, width, height ) ) ; dbg( "zslice="+islice+" ir="+ir ) ; dbg( "sr="+sr+" sz1="+sz1+" sz2="+sz2 ) ; if( ir.width > 0 && ir.height > 0 ) { consumer.setPixels( ir.x-x1, ir.y-y1, ir.width, ir.height, model, pixels, off + dx + dy*scansize, scansize ) ; dbg( "byte time= "+(System.currentTimeMillis()-ct)+" ms.\n" ) ; } else { Rectangle dr = new Rectangle( x1, y1, voldims[0], voldims[1] ) ; dbg( "Error: h<0, dr="+dr ) ; } } } public void setPixels(int x, int y, int w, int h, ColorModel model, int pixels[], int off, int scansize) { long ct = System.currentTimeMillis() ; Rectangle sr = new Rectangle( x, y, w, h ) ; int sz1 = firstZSlice( sr ) ; int sz2 = lastZSlice( sr ) ; /* dbg( "sr="+sr+" sz1="+sz1+" sz2="+sz2 ) ; dbg( "off="+off+" scansize="+scansize+" type="+type+" slice="+slice ) ; */ // implement this properly later -- for now, just take orthogonal // slices. int islice = (int)( 0.5 + slice ) ; if( islice >= sz1 && islice < sz2 ) { int x1 = srcSlices[islice].x ; int y1 = srcSlices[islice].y ; int dx = (x1>x) ? x1-x : 0 ; int dy = (y1>y) ? y1-y : 0 ; Rectangle ir = sr.intersection( new Rectangle( x1, y1, width, height ) ) ; dbg( "zslice="+islice+" ir="+ir ) ; dbg( "sr="+sr+" sz1="+sz1+" sz2="+sz2 ) ; if( ir.width > 0 && ir.height > 0 ) { consumer.setPixels( ir.x-x1, ir.y-y1, ir.width, ir.height, model, pixels, off + dx + dy*scansize, scansize ) ; dbg( "int time= "+(System.currentTimeMillis()-ct)+" ms.\n" ) ; } else { Rectangle dr = new Rectangle( x1, y1, voldims[0], voldims[1] ) ; dbg( "Error: h<0, dr="+dr ) ; } } } }