The TS_FP_POINTERPOSATTRIBUTE structure is the fast-path variant of the TS_POINTERPOSATTRIBUTE structure (see section ).
file:///C:/ts_dev/TestSuites/MS-RDPBCGR/TestSuite/Src/TD/latest_XMLS_16may/RDPBCGR/ _rfc_ms-rdpbcgr2_1_8_1_2_1_4.xml
Inheritance: TS_FP_UPDATE
        private byte[] EncodePtrPos(TS_FP_POINTERPOSATTRIBUTE ptrData)
        {
            List<byte> totalBuffer = new List<byte>();
            List<byte> buffer = new List<byte>();

            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.pointerPositionUpdateData.position.xPos);
            RdpbcgrEncoder.EncodeStructure(buffer, ptrData.pointerPositionUpdateData.position.yPos);

            if (ptrData.compressionFlags != compressedType_Values.None)
            {
                RdpbcgrEncoder.EncodeBytes(
                    totalBuffer, serverSessionContext.Compress(ptrData.compressionFlags, buffer.ToArray()));
            }
            else
            {
                RdpbcgrEncoder.EncodeBytes(totalBuffer, buffer.ToArray());
            }
            return totalBuffer.ToArray();
        }
        /// <summary>
        /// Parse TS_FP_POINTERPOSATTRIBUTE
        /// </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_POINTERPOSATTRIBUTE</returns>
        private TS_FP_POINTERPOSATTRIBUTE ParseTsFpPointerPosAttribute(
            byte updateHeader,
            compressedType_Values compressionFlags,
            UInt16 size,
            byte[] updateData)
        {
            TS_FP_POINTERPOSATTRIBUTE positionAttribute = new TS_FP_POINTERPOSATTRIBUTE();

            // TS_FP_POINTERPOSATTRIBUTE: updateHeader
            positionAttribute.updateHeader = updateHeader;

            // TS_FP_POINTERPOSATTRIBUTE: compressionFlags
            positionAttribute.compressionFlags = compressionFlags;

            // TS_FP_POINTERPOSATTRIBUTE: size
            positionAttribute.size = size;

            // TS_FP_POINTERPOSATTRIBUTE: pointerPositionUpdateData
            int index = 0;
            positionAttribute.pointerPositionUpdateData = ParseTsPointerPosAttribute(updateData, ref index);

            // Check if data length exceeded expectation
            VerifyDataLength(updateData.Length, index, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED);
            return positionAttribute;
        }
        public static TS_FP_POINTERPOSATTRIBUTE CreateFPPointerPosAttribute(int x, int y)
        {
            TS_FP_POINTERPOSATTRIBUTE fpPos = new TS_FP_POINTERPOSATTRIBUTE();

            fpPos.updateHeader = (byte)(((int)updateCode_Values.FASTPATH_UPDATETYPE_PTR_POSITION & 0x0f)
                | (((int)fragmentation_Value.FASTPATH_FRAGMENT_SINGLE) << 4)
                | ((int)compressedType_Values.None << 6));
            fpPos.compressionFlags = compressedType_Values.None;
            fpPos.pointerPositionUpdateData.position.xPos = (ushort)x;
            fpPos.pointerPositionUpdateData.position.yPos = (ushort)y;
            fpPos.size = 4;

            return fpPos;
        }