private byte[] EncodeBitmap(TS_FP_UPDATE_BITMAP bitmapData)
{
List<byte> totalBuffer = new List<byte>();
List<byte> buffer = new List<byte>();
RdpbcgrEncoder.EncodeStructure(buffer, (ushort)bitmapData.bitmapUpdateData.updateType);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.numberRectangles);
if (bitmapData.bitmapUpdateData.rectangles != null)
{
for (int i = 0; i < bitmapData.bitmapUpdateData.rectangles.Length; ++i)
{
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].destLeft);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].destTop);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].destRight);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].destBottom);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].width);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].height);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].bitsPerPixel);
RdpbcgrEncoder.EncodeStructure(buffer, (ushort)bitmapData.bitmapUpdateData.rectangles[i].Flags);
RdpbcgrEncoder.EncodeStructure(buffer, bitmapData.bitmapUpdateData.rectangles[i].bitmapLength);
if ((bitmapData.bitmapUpdateData.rectangles[i].Flags & TS_BITMAP_DATA_Flags_Values.NO_BITMAP_COMPRESSION_HDR)
== TS_BITMAP_DATA_Flags_Values.None)
{
RdpbcgrEncoder.EncodeStructure(
buffer, (ushort)bitmapData.bitmapUpdateData.rectangles[i].bitmapComprHdr.cbCompFirstRowSize);
RdpbcgrEncoder.EncodeStructure(
buffer, bitmapData.bitmapUpdateData.rectangles[i].bitmapComprHdr.cbCompMainBodySize);
RdpbcgrEncoder.EncodeStructure(
buffer, bitmapData.bitmapUpdateData.rectangles[i].bitmapComprHdr.cbScanWidth);
RdpbcgrEncoder.EncodeStructure(
buffer, bitmapData.bitmapUpdateData.rectangles[i].bitmapComprHdr.cbUncompressedSize);
}
if (bitmapData.bitmapUpdateData.rectangles[i].bitmapDataStream != null)
{
if ((bitmapData.bitmapUpdateData.rectangles[i].Flags & TS_BITMAP_DATA_Flags_Values.BITMAP_COMPRESSION)
== TS_BITMAP_DATA_Flags_Values.BITMAP_COMPRESSION)
{
byte[] temp = serverSessionContext.Compress(bitmapData.compressionFlags, bitmapData.bitmapUpdateData.rectangles[i].bitmapDataStream);
bitmapData.bitmapUpdateData.rectangles[i].bitmapDataStream = temp;
RdpbcgrEncoder.EncodeBytes(buffer, bitmapData.bitmapUpdateData.rectangles[i].bitmapDataStream);
}
else
{
RdpbcgrEncoder.EncodeBytes(buffer, bitmapData.bitmapUpdateData.rectangles[i].bitmapDataStream);
}
}
}
}
if (bitmapData.compressionFlags != compressedType_Values.None)
{
RdpbcgrEncoder.EncodeBytes(
totalBuffer, serverSessionContext.Compress(bitmapData.compressionFlags, buffer.ToArray()));
}
else
{
RdpbcgrEncoder.EncodeBytes(totalBuffer, buffer.ToArray());
}
return totalBuffer.ToArray();
}