filter method

FilterResult? filter([
  1. CanvasElement? resultCanvas
])

Filters the image into resultCanvas.

Implementation

FilterResult? filter([CanvasElement? resultCanvas]) {
  // ignore: omit_local_variable_types
  Uint8ClampedList? inPixels = _getImagePixels();
  if (inPixels == null) return null;

  var srcWidth = _originalSpace.width;
  var srcHeight = _originalSpace.height;
  var srcWidth1 = srcWidth - 1;
  var srcHeight1 = srcHeight - 1;

  var outWidth = _transformedSpace.width;
  var outHeight = _transformedSpace.height;
  var outX = _transformedSpace.x;
  var outY = _transformedSpace.y;
  var outArea = outWidth * outHeight * 4;
  var outWidth4 = outWidth * 4;

  var out = Float32List(2);
  var outPixels = Uint8ClampedList(outArea);

  var pNW = Uint8ClampedList(4);

  for (var y = 0; y < outHeight; y++) {
    var outLineIdx = (outWidth * 4) * y;

    for (var xIdx = 0; xIdx < outWidth4; xIdx += 4) {
      var x = xIdx ~/ 4;

      _transformInverse(_originalSpace, outX + x, outY + y, out);

      var srcX = out[0].toInt();
      var srcY = out[1].toInt();

      if (srcX >= 0 && srcX < srcWidth1 && srcY >= 0 && srcY < srcHeight1) {
        var i = (srcWidth * 4) * srcY + (srcX * 4);

        _getPixelRGBA(inPixels, i, pNW);
      } else {
        _getPixel(inPixels, srcX, srcY, srcWidth, srcHeight, pNW);
      }

      var idx = outLineIdx + xIdx;

      outPixels[idx] = pNW[0];
      outPixels[idx + 1] = pNW[1];
      outPixels[idx + 2] = pNW[2];
      outPixels[idx + 3] = pNW[3];
    }
  }

  var canvasW = max(srcWidth, outWidth);
  var canvasH = max(srcHeight, outHeight);

  resultCanvas ??= CanvasElement(width: canvasW, height: canvasH);

  var context = resultCanvas.getContext('2d') as CanvasRenderingContext2D;

  var imgData = context.createImageData(outWidth, outHeight);
  imgData.data.setAll(0, outPixels);

  context.putImageData(imgData, 0, 0, 0, 0, outWidth, outHeight);

  var crop = _computeCrop();

  return FilterResult(image, resultCanvas, crop);
}