docs: @Override
  	public T subimage(int x0, int y0, int x1, int y1, T subimage) {
  		if (x0 < 0 || y0 < 0)
  			throw new IllegalArgumentException("x0 or y0 is less than zero");
  		if (x1 < x0 || y1 < y0)
  			throw new IllegalArgumentException("x1 or y1 is less than x0 or y0 respectively");
  		if (x1 > width || y1 > height)
  			throw new IllegalArgumentException("x1 or y1 is more than the width or height respectively");
  
  		if( subimage == null ) {
  			subimage = createNew(-1, -1);
  		}
  
  		subimage._setData(_getData());
  		subimage.stride = Math.max(width, stride);// ok why is this done?!?!  Shouldn't it always be stride?
  		subimage.width = x1 - x0;
  		subimage.height = y1 - y0;
  		subimage.startIndex = startIndex + y0 * stride + x0;
  		subimage.subImage = true;
  		subimage.imageType = imageType;
  
  		return subimage;
  	}