namespace ScreenConnect; public class GrayscaleScreenDecoder : SimpleScreenDecoder { public GrayscaleScreenDecoder(IMultiCallCoder coder) : base(4, 0, coder) { } protected unsafe override void Process(byte* data, int width, int height, int stride, byte* workingBuffer, int rowLength, bool hasPadding) { int num = 0; while (num < height) { ReadRowData(workingBuffer, rowLength, num == height - 1); byte* ptr = workingBuffer; int* ptr2 = (int*)data; for (int i = 0; i < width; i++) { byte b = 0; b = ((i % 2 != 0) ? ((byte)(*(ptr++) & 0xF)) : ((byte)(*ptr >> 4))); *(ptr2++) = -16777216 | b | (b << 4) | (b << 8) | (b << 12) | (b << 16) | (b << 20); } num++; data += stride; } } }