docs: public static void process_F32_sub(GrayF32 orig,
  									   GrayF32 derivX,
  									   GrayF32 derivY) {
  		final float[] data = orig.data;
  		final float[] imgX = derivX.data;
  		final float[] imgY = derivY.data;
  
  		final int width = orig.getWidth();
  		final int height = orig.getHeight() - 1;
  		final int strideSrc = orig.stride;
  
  		final int adjWidth = width - 2;
  
  		//CONCURRENT_BELOW BoofConcurrency.loopFor(1,height,y->{
  		for (int y = 1; y < height; y++) {
  			int index = orig.startIndex + strideSrc * y + 1;
  			int indexX = derivX.startIndex + derivX.stride * y + 1;
  			int indexY = derivY.startIndex + derivY.stride * y + 1;
  
  			int endX_alt = index + (width - adjWidth % 3) - 2;
  			int endX = endX_alt + adjWidth % 3;
  
  			float a11, a12, a13;
  			float a21, a22, a23;
  			float a31, a32, a33;
  
  
  			a11 = data[index - strideSrc - 1];
  			a12 = data[index - strideSrc];
  			a21 = data[index - 1];
  			a22 = data[index];
  			a31 = data[index + strideSrc - 1];
  			a32 = data[index + strideSrc];
  
  
  			for (; index < endX_alt;) {
  
  				a13 = data[index - strideSrc + 1];
  				a23 = data[index + 1];
  				a33 = data[index + strideSrc + 1];
  
  				float v = (a33 - a11) * 0.25F;
  				float w = (a31 - a13) * 0.25F;
  
  				imgY[indexY++] = (a32 - a12) * 0.5F + v + w;
  				imgX[indexX++] = (a23 - a21) * 0.5F + v - w;
  
  				index++;
  
  				a11 = data[index - strideSrc + 1];
  				a21 = data[index + 1];
  				a31 = data[index + strideSrc + 1];
  
  				v = (a31 - a12) * 0.25F;
  				w = (a32 - a11) * 0.25F;
  
  				imgY[indexY++] = (a33 - a13) * 0.5F + v + w;
  				imgX[indexX++] = (a21 - a22) * 0.5F + v - w;
  
  				index++;
  
  				a12 = data[index - strideSrc + 1];
  				a22 = data[index + 1];
  				a32 = data[index + strideSrc + 1];
  
  				v = (a32 - a13) * 0.25F;
  				w = (a33 - a12) * 0.25F;
  
  				imgY[indexY++] = (a31 - a11) * 0.5F + v + w;
  				imgX[indexX++] = (a22 - a23) * 0.5F + v - w;
  
  				index++;
  
  
  			}
  
  			// handle the remaining
  			for (; index < endX; index++) {
  				float v = (data[index + strideSrc + 1] - data[index - strideSrc - 1]) * 0.25F;
  				float w = (data[index + strideSrc - 1] - data[index - strideSrc + 1]) * 0.25F;
  
  				imgY[indexY++] = (data[index + strideSrc] - data[index - strideSrc]) * 0.5F + v + w;
  				imgX[indexX++] = (data[index + 1] - data[index - 1]) * 0.5F + v - w;
  			}
  		}
  		//CONCURRENT_ABOVE });
  	}