function getShapeAt(x, y) {
  const color = this.getAbsolutePixelAt(x, y);
  if (color === null) return (null);
  const shape = this.getBinaryShape(x, y, color);
  if (shape === null) return (null);
  const batch = this.createDynamicBatch(x, y);
  const bounds = this.bounds;
  const bx = bounds.x;
  const by = bounds.y;
  const bw = bounds.w;
  const bh = bounds.h;
  // create buffer to draw a fake shape into
  const buffer = createCanvasBuffer(bw, bh);
  const rgba = bytesToRgba(SELECTION_COLOR);
  rgba[3] = 0.45;
  buffer.fillStyle = colorToRgbaString(rgba);
  for (let ii = 0; ii < shape.length; ++ii) {
    const xx = (ii % bw);
    const yy = (ii / bw) | 0;
    if (shape[yy * bw + xx] !== 2) continue;
    buffer.fillRect(
      xx, yy,
      1, 1
    );
  };
  batch.buffer = buffer;
  batch.data = new Uint8Array(buffer.getImageData(0, 0, bw, bh).data);
  batch.bounds.update(bx, by, bw, bh);
  batch.resizeByMatrixData();
  batch.refreshTexture(true);
  return (batch);
}
@param {Number} x
@param {Number} y
@return {Batch}