scope grabbableGrayPixels.

import java.awt.image.DataBufferByte;

static Bool #succeeded;
static Throwable #error;
sbool #enable = true;

static GrabbableGrayPixels grabbableGrayPixels(BufferedImage img) {
  if (img == null || !enable) null;
  try {
    var result = grabbableGrayPixels_impl(img);
    succeeded = result != null;
    ret result;
  } on fail e {
    error = e;
    succeeded = false;
  }
}

static GrabbableGrayPixels grabbableGrayPixels_impl(BufferedImage img) {
  Raster raster = img.getRaster();
  SampleModel sampleModel = raster.getSampleModel();
  if (!sampleModel instanceof PixelInterleavedSampleModel) null;
  cast sampleModel to PixelInterleavedSampleModel;
  
  DataBufferByte dataBuffer = cast raster.getDataBuffer();
  assertEquals(1, dataBuffer.getNumBanks());
  assertEquals(DataBuffer.TYPE_BYTE, dataBuffer.getDataType());

  // Let's at this point assume the raster data is gray and not a palette
  
  int w = img.getWidth(), h = img.getHeight();
  int scanlineStride = sampleModel.getScanlineStride();
  byte[] pixels = dataBuffer.getData();
  int offset = dataBuffer.getOffset();
  int translateX = raster.getSampleModelTranslateX();
  int translateY = raster.getSampleModelTranslateY();
  offset += -translateX-translateY*scanlineStride;
  ret GrabbableGrayPixels(pixels, w, h, offset, scanlineStride);
}