public boolean read(String fileName)
	{
                InputStream is = null;
                try {is = new FileInputStream(fileName);}
                catch (IOException e) {IJ.write("" + e); return false;}
		int width = (int) readfloat(is);
		int height = (int) readfloat(is);
		// allocate the arrays.
		v = new VolumeFloat(2, width, height); /* flowx, flowy */
		int size = getWidth()* getHeight();
		full = new boolean[height][width];
		int endwidth = (int) readfloat(is);
		int endheight = (int) readfloat(is);
		int startwidth = (int) readfloat(is);
		int startheight = (int) readfloat(is);
		for (int y = 0; y < v.getHeight(); y++)
		{
			  if (y >= startheight && y < endheight)
			  {
					byte[] buffer = new byte[getWidth()*4*2];
					try {is.read(buffer, 0, buffer.length); }
					catch (IOException e) {IJ.write("" + e); return false;}
					int tmpx = 0; int tmpy = 0;
					for (int x = startwidth; x < endwidth; x++)
                                        {
                                                tmpx = (int)(((buffer[x*4*2+0]&0xff)<<24) | ((buffer[x*4*2+1]&0xff)<<16)
                                                  | ((buffer[x*4*2+2]&0xff)<<8) | (buffer[x*4*2+3]&0xff));
                                                tmpy = (int)(((buffer[x*4*2+4+0]&0xff)<<24) | ((buffer[x*4*2+4+1]&0xff)<<16)
                                                  | ((buffer[x*4*2+4+2]&0xff)<<8) | (buffer[x*4*2+4+3]&0xff));
                                                if ((Float.intBitsToFloat(tmpx) == 100) && (Float.intBitsToFloat(tmpy) == 100))
                                                        set(x, y, 0, 0, false);
                                                else
                                                        set(x, y, Float.intBitsToFloat(tmpx), Float.intBitsToFloat(tmpy), true);
					}
			  }
			  IJ.showStatus("Reading... "+(100*(y*getHeight()))/size+"%");
		}
		try {is.close(); }
		catch (IOException e) {IJ.write("" + e); return false;}
		return true;
	}