The TS_FP_COLORPOINTERATTRIBUTE structure is the fast-path variant of the TS_COLORPOINTERATTRIBUTE structure.
file:///C:/ts_dev/TestSuites/MS-RDPBCGR/TestSuite/Src/TD/latest_XMLS_16may/RDPBCGR/ _rfc_ms-rdpbcgr2_1_8_1_2_1_7.xml
Inheritance: TS_FP_UPDATE
        public static TS_FP_COLORPOINTERATTRIBUTE CreateFPColorPointerAttribute(ushort cacheIndex, ushort hotSpotX, ushort hotSpotY, ushort width, ushort height,
            byte[] xorMaskData = null, byte[] andMaskData = null)
        {
            TS_FP_COLORPOINTERATTRIBUTE fpColorPtr = new TS_FP_COLORPOINTERATTRIBUTE();

            fpColorPtr.updateHeader = (byte)(((int)updateCode_Values.FASTPATH_UPDATETYPE_COLOR & 0x0f)
                | (((int)fragmentation_Value.FASTPATH_FRAGMENT_SINGLE) << 4)
                | ((int)compressedType_Values.None << 6));

            fpColorPtr.colorPointerUpdateData.cacheIndex = cacheIndex;
            fpColorPtr.colorPointerUpdateData.hotSpot.xPos = hotSpotX;
            fpColorPtr.colorPointerUpdateData.hotSpot.yPos = hotSpotY;
            fpColorPtr.colorPointerUpdateData.width = width;
            fpColorPtr.colorPointerUpdateData.height = height;

            if (xorMaskData != null)
            {
                fpColorPtr.colorPointerUpdateData.lengthXorMask = (ushort)xorMaskData.Length;
                fpColorPtr.colorPointerUpdateData.xorMaskData = xorMaskData;
            }
            else
            {
                fpColorPtr.colorPointerUpdateData.lengthXorMask = (ushort)((width * 3 + 1) / 2 * 2 * height);
                fpColorPtr.colorPointerUpdateData.xorMaskData = new byte[fpColorPtr.colorPointerUpdateData.lengthXorMask];
                for (int i = 0; i < fpColorPtr.colorPointerUpdateData.lengthXorMask; i++)
                    fpColorPtr.colorPointerUpdateData.xorMaskData[i] = 0xff;
            }

            if (andMaskData != null)
            {
                fpColorPtr.colorPointerUpdateData.lengthAndMask = (ushort)andMaskData.Length;
                fpColorPtr.colorPointerUpdateData.andMaskData = andMaskData;
            }
            else
            {
                fpColorPtr.colorPointerUpdateData.lengthAndMask = (ushort)(((width + 7) / 8 + 1) / 2 * 2 * height);
                fpColorPtr.colorPointerUpdateData.andMaskData = new byte[fpColorPtr.colorPointerUpdateData.lengthAndMask];
                for (int i = 0; i < fpColorPtr.colorPointerUpdateData.lengthAndMask; i++)
                    fpColorPtr.colorPointerUpdateData.andMaskData[i] = 0xff;
            }

            fpColorPtr.colorPointerUpdateData.pad = 0;
            fpColorPtr.size = (ushort)(15 + fpColorPtr.colorPointerUpdateData.lengthXorMask + fpColorPtr.colorPointerUpdateData.lengthAndMask);

            return fpColorPtr;
        }
        /// <summary>
        /// Parse TS_FP_COLORPOINTERATTRIBUTE
        /// </summary>
        /// <param name="updateHeader">update header</param>
        /// <param name="compressionFlags">compression flags</param>
        /// <param name="size">update data size(before decompression)</param>
        /// <param name="updateData">update data(decompressed)</param>
        /// <returns>TS_FP_COLORPOINTERATTRIBUTE</returns>
        private TS_FP_COLORPOINTERATTRIBUTE ParseTsFpColorPointerAttribute(
            byte updateHeader,
            compressedType_Values compressionFlags,
            UInt16 size,
            byte[] updateData)
        {
            TS_FP_COLORPOINTERATTRIBUTE attribute = new TS_FP_COLORPOINTERATTRIBUTE();

            // TS_FP_COLORPOINTERATTRIBUTE: updateHeader
            attribute.updateHeader = updateHeader;

            // TS_FP_COLORPOINTERATTRIBUTE: compressionFlags
            attribute.compressionFlags = compressionFlags;

            // TS_FP_COLORPOINTERATTRIBUTE: size
            attribute.size = size;

            // TS_FP_COLORPOINTERATTRIBUTE: colorPointerUpdateData
            int index = 0;
            attribute.colorPointerUpdateData = ParseTsColorPointerAttribute(updateData, ref index);

            // Check if data length exceeded expectation
            VerifyDataLength(updateData.Length, index, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED);
            return attribute;
        }
Exemplo n.º 3
0
        private byte[] EncodeColorPtr(TS_FP_COLORPOINTERATTRIBUTE ptrData)
        {
            List<byte> totalBuffer = new List<byte>();
            List<byte> buffer = new List<byte>();

            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.cacheIndex);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.hotSpot.xPos);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.hotSpot.yPos);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.width);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.height);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.lengthAndMask);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.lengthXorMask);
            if (ptrData.colorPointerUpdateData.andMaskData != null)
            {
                RdpbcgrEncoder.EncodeBytes(buffer, ptrData.colorPointerUpdateData.andMaskData);
            }
            if (ptrData.colorPointerUpdateData.xorMaskData != null)
            {
                RdpbcgrEncoder.EncodeBytes(buffer, ptrData.colorPointerUpdateData.xorMaskData);
            }
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.colorPointerUpdateData.pad);

            if (ptrData.compressionFlags != compressedType_Values.None)
            {
                RdpbcgrEncoder.EncodeBytes(
                    totalBuffer, serverSessionContext.Compress(ptrData.compressionFlags, buffer.ToArray()));
            }
            else
            {
                RdpbcgrEncoder.EncodeBytes(totalBuffer, buffer.ToArray());
            }
            return totalBuffer.ToArray();
        }
        public static TS_FP_COLORPOINTERATTRIBUTE CreateFPColorPointerAttribute(int width, int height)
        {
            TS_FP_COLORPOINTERATTRIBUTE fpColorPtr = new TS_FP_COLORPOINTERATTRIBUTE();

            fpColorPtr.updateHeader = (byte)(((int)updateCode_Values.FASTPATH_UPDATETYPE_COLOR & 0x0f)
                | (((int)fragmentation_Value.FASTPATH_FRAGMENT_SINGLE) << 4)
                | ((int)compressedType_Values.None << 6));
            fpColorPtr.size = 0;
            fpColorPtr.colorPointerUpdateData.cacheIndex = 0;
            fpColorPtr.colorPointerUpdateData.hotSpot.xPos = 5;
            fpColorPtr.colorPointerUpdateData.hotSpot.yPos = 5;
            fpColorPtr.colorPointerUpdateData.width = (ushort)width;
            fpColorPtr.colorPointerUpdateData.height = (ushort)height;
            fpColorPtr.colorPointerUpdateData.lengthAndMask = (ushort)(((width + 7) / 8 + 1) / 2 * 2 * height);
            fpColorPtr.colorPointerUpdateData.lengthXorMask = (ushort)((width * 3 + 1) / 2 * 2 * height);
            fpColorPtr.colorPointerUpdateData.xorMaskData = new byte[fpColorPtr.colorPointerUpdateData.lengthXorMask];
            for (int i = 0; i < fpColorPtr.colorPointerUpdateData.lengthXorMask; i++)
                fpColorPtr.colorPointerUpdateData.xorMaskData[i] = 0xf1;
            fpColorPtr.colorPointerUpdateData.andMaskData = new byte[fpColorPtr.colorPointerUpdateData.lengthAndMask];
            for (int i = 0; i < fpColorPtr.colorPointerUpdateData.lengthAndMask; i++)
                fpColorPtr.colorPointerUpdateData.andMaskData[i] = 0x1f;
            fpColorPtr.colorPointerUpdateData.pad = 0;
            fpColorPtr.size = (ushort)(15 + fpColorPtr.colorPointerUpdateData.lengthXorMask + fpColorPtr.colorPointerUpdateData.lengthAndMask);

            return fpColorPtr;
        }