filter method
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);
}