namespace ScreenConnect; public abstract class SimpleScreenEncoder : SimpleScreenCodec { private ISingleCallCoder singleCallCoder; private IMultiCallCoder multiCallCoder; protected SimpleScreenEncoder(int bitsPerPixel, int rowPadding, ICoder coder) : base(bitsPerPixel, rowPadding) { singleCallCoder = coder as ISingleCallCoder; multiCallCoder = coder as IMultiCallCoder; } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { singleCallCoder.DisposeQuietly(); multiCallCoder.DisposeQuietly(); } } protected unsafe override void Process(byte* data, int width, int height, int stride) { int rowLength = GetRowLength(width); bool hasPadding = base.RowPadding != 0; if (singleCallCoder != null) { int num = height * rowLength; fixed (byte* workingBuffer = GetWorkingBuffer(num)) { byte* ptr = workingBuffer; int num2 = 0; while (num2 < height) { ProcessRow((int*)data, ptr, width, hasPadding); num2++; data += stride; ptr += rowLength; } WriteThroughCoder(singleCallCoder, workingBuffer, num, null, null); } } else { fixed (byte* workingBuffer2 = GetWorkingBuffer(rowLength)) { int num3 = 0; while (num3 < height) { ProcessRow((int*)data, workingBuffer2, width, hasPadding); WriteThroughCoder(multiCallCoder, workingBuffer2, rowLength, num3 == height - 1); num3++; data += stride; } } } Flush(); } protected unsafe abstract void ProcessRow(int* srcCursor, byte* dstCursor, int width, bool hasPadding); }