public static void ComposePixels <TSrcPixel, TDstPixel>(SpanBitmap <TSrcPixel> src, SpanBitmap <TDstPixel> dst, TRANSFORM srcXform, bool useBilinear, float opacity) where TSrcPixel : unmanaged, Pixel.IConvertTo where TDstPixel : unmanaged, Pixel.IConvertTo { int opacityQ = (int)(opacity * 256); void _rowProcessorNearest(Span <TDstPixel> dst, SpanQuantized8Sampler <TSrcPixel, Pixel.BGRP32> src, _RowTransformIterator srcIterator) { Pixel.BGRP32 srcPixel = default; Pixel.BGRP32 composer = default; for (int i = 0; i < dst.Length; ++i) { srcIterator.MoveNext(out int sx, out int sy); src.GetSourcePixelOrDefault(sx, sy).CopyTo(ref srcPixel); if (srcPixel.A == 0) { continue; } ref var dstI = ref dst[i]; dstI.CopyTo(ref composer); composer.SetSourceOver(srcPixel, opacityQ); composer.CopyTo(ref dstI); } }
void _rowProcessorBilinear(Span <TDstPixel> dst, SpanQuantized8Sampler <TSrcPixel, Pixel.BGRP32> src, _RowTransformIterator srcIterator) { Pixel.BGRP32 srcPixel = default; Pixel.BGRP32 composer = default; for (int i = 0; i < dst.Length; ++i) { srcIterator.MoveNext(out int sx, out int sy, out int rx, out int ry); srcPixel = src.GetSampleOrDefault(sx, sy, rx, ry); if (srcPixel.A == 0) { continue; } ref var dstI = ref dst[i]; dstI.CopyTo(ref composer); composer.SetSourceOver(srcPixel, opacityQ); composer.CopyTo(ref dstI); }