docs: public static void horizontal( GrayF32 src , GrayF32 dst ) {
  
  		if( src.width < dst.width )
  			throw new IllegalArgumentException("src width must be >= dst width");
  		if( src.height != dst.height )
  			throw new IllegalArgumentException("src height must equal dst height");
  
  		float scale = src.width/(float)dst.width;
  
  		//CONCURRENT_BELOW BoofConcurrency.loopFor(0, dst.height, y -> {
  		for (int y = 0; y < dst.height; y++) {
  			int indexDst = dst.startIndex + y*dst.stride;
  			for (int x = 0; x < dst.width-1; x++, indexDst++ ) {
  				float srcX0 = x*scale;
  				float srcX1 = (x+1)*scale;
  
  				int isrcX0 = (int)srcX0;
  				int isrcX1 = (int)srcX1;
  
  				int index = src.getIndex(isrcX0,y);
  
  				// compute value of overlapped region
  				float startWeight = (1.0f-(srcX0-isrcX0));
  				float start = src.data[index++];
  
  				float middle = 0;
  				for( int i = isrcX0+1; i < isrcX1; i++ ) {
  					middle += src.data[index++];
  				}
  
  				float endWeight = (srcX1%1);
  				float end = src.data[index];
  				dst.data[indexDst] = (start*startWeight + middle + end*endWeight)/scale;
  			}
  
  			// handle the last area as a special case
  			int x = dst.width-1;
  			float srcX0 = x*scale;
  
  			int isrcX0 = (int)srcX0;
  			int isrcX1 = src.width-1;
  
  			int index = src.getIndex(isrcX0,y);
  
  			// compute value of overlapped region
  			float startWeight = (1.0f-(srcX0-isrcX0));
  			float start = src.data[index++];
  
  			float middle = 0;
  			for( int i = isrcX0+1; i < isrcX1; i++ ) {
  				middle += src.data[index++];
  			}
  
  			float end = isrcX1 != isrcX0 ? src.data[index] : 0;
  			dst.data[indexDst] = (start*startWeight + middle + end)/scale;
  		}
  		//CONCURRENT_ABOVE });
  	}