windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/as/h/oe2.h
2020-09-26 16:20:57 +08:00

294 lines
10 KiB
C

//
// Order Encoder 2nd Level
//
#ifndef _H_OE2
#define _H_OE2
//
//
// TYPEDEFS
//
//
//
// The party order data structure contains all the data that is used by
// either the 2nd level encoder or decoder to store info on a party.
//
// The encoder contains just 1 instance of this structure, for the local
// party.
//
// The decoder contains 1 instance of the structure per remote party.
//
typedef struct _PARTYORDERDATA
{
STRUCTURE_STAMP
//
// A copy of the last order of each type.
// These are stored as byte array because we dont have a structure
// defined that has the header and the particular order defined.
//
BYTE LastDstblt[sizeof(COM_ORDER_HEADER)+sizeof(DSTBLT_ORDER)];
BYTE LastPatblt[sizeof(COM_ORDER_HEADER)+sizeof(PATBLT_ORDER)];
BYTE LastScrblt[sizeof(COM_ORDER_HEADER)+sizeof(SCRBLT_ORDER)];
BYTE LastMemblt[sizeof(COM_ORDER_HEADER)+sizeof(MEMBLT_ORDER)];
BYTE LastMem3blt[sizeof(COM_ORDER_HEADER)+sizeof(MEM3BLT_ORDER)];
BYTE LastRectangle[sizeof(COM_ORDER_HEADER)+sizeof(RECTANGLE_ORDER)];
BYTE LastLineTo[sizeof(COM_ORDER_HEADER)+sizeof(LINETO_ORDER)];
BYTE LastTextOut[sizeof(COM_ORDER_HEADER)+sizeof(TEXTOUT_ORDER)];
BYTE LastExtTextOut[sizeof(COM_ORDER_HEADER)+sizeof(EXTTEXTOUT_ORDER)];
BYTE LastOpaqueRect[sizeof(COM_ORDER_HEADER)+sizeof(OPAQUERECT_ORDER)];
BYTE LastSaveBitmap[sizeof(COM_ORDER_HEADER)+sizeof(SAVEBITMAP_ORDER)];
BYTE LastDeskScroll[sizeof(COM_ORDER_HEADER)+sizeof(DESKSCROLL_ORDER)];
BYTE LastMembltR2[sizeof(COM_ORDER_HEADER)+sizeof(MEMBLT_R2_ORDER)];
BYTE LastMem3bltR2[sizeof(COM_ORDER_HEADER)+sizeof(MEM3BLT_R2_ORDER)];
BYTE LastPolygon[sizeof(COM_ORDER_HEADER)+sizeof(POLYGON_ORDER)];
BYTE LastPie[sizeof(COM_ORDER_HEADER)+sizeof(PIE_ORDER)];
BYTE LastEllipse[sizeof(COM_ORDER_HEADER)+sizeof(ELLIPSE_ORDER)];
BYTE LastArc[sizeof(COM_ORDER_HEADER)+sizeof(ARC_ORDER)];
BYTE LastChord[sizeof(COM_ORDER_HEADER)+sizeof(CHORD_ORDER)];
BYTE LastPolyBezier[sizeof(COM_ORDER_HEADER)+sizeof(POLYBEZIER_ORDER)];
BYTE LastRoundRect[sizeof(COM_ORDER_HEADER)+sizeof(ROUNDRECT_ORDER)];
//
// The type and a pointer to the last order
//
BYTE LastOrderType;
LPCOM_ORDER pLastOrder;
//
// Details of the last font that was used
//
HFONT LastHFONT;
UINT LastCodePage;
UINT LastFontWidth;
UINT LastFontHeight;
UINT LastFontWeight;
UINT LastFontFlags;
UINT LastFontFaceLen;
char LastFaceName[FH_FACESIZE];
//
// The last bounds that were used.
//
TSHR_RECT16 LastBounds;
//
// Font metrics, currently unused by the encoder.
//
TEXTMETRIC LastFontMetrics;
//
// An array of pointers to the last orders of each type.
//
void * LastOrder[OE2_NUM_TYPES];
}
PARTYORDERDATA, * PPARTYORDERDATA, * * PPPARTYORDERDATA;
//
// This structure contains information for a single field in an ORDER
// structure
//
// FieldPos - The byte offset into the order structure to the
// start of the field.
//
// FieldUnencodedLen - The length in bytes of the unencoded field.
//
// FieldEncodedLen - The length in bytes of the encoded field. This
// should always be <= to FieldUnencodedLen.
//
// FieldSigned - Does this field contain a signed or unsigned value?
//
// FieldType - A description of the type of the field - this
// is used to determine how to encode / decode the
// field.
//
//
typedef struct tagOE2ETFIELD
{
UINT FieldPos;
UINT FieldUnencodedLen;
UINT FieldEncodedLen;
BOOL FieldSigned;
UINT FieldType;
}OE2ETFIELD;
typedef OE2ETFIELD const FAR * POE2ETFIELD;
//
// Array of pointers to the entries in the encoding table
//
typedef POE2ETFIELD OE2ETTYPE[OE2_NUM_TYPES];
//
// This structure contains information allowing an ORDER structure to be
// encoded or decoded into a DCEO2ORDER structure.
// The order table comprises
//
// - an array of POE2ETFIELD pointers, indexed by the encoded type
// index:
//
// typedef OE2ETTYPE POE2ETFIELD[OE2_NUM_TYPES]
//
// - one array of OE2ETFIELD structures for each of the 7 order
// types (each order type has a different number of fields).
// Note that there may not be more than 24 entries for a single
// ORDER type. The entries for an order type are terminated
// by an entry with the FieldPos field set to 0. The first
// FieldPos is non-zero since it is the offset to the second
// field of the order (type is ignored).
//
// pFields - an array of POE2ETFIELD pointers, indexed by the encoded
// type index. This is used to identify the entry in this
// table for an ORDER type.
//
// NumFields - an array of bytes containing the number of fields in each
// order structure for each order.
//
// DstBltFields - array of OE2ETFIELD structures (one for each field)
// for the DSTBLT_ORDER
//
// PatBltFields - array of OE2ETFIELD structures (one for each field)
// for the PATBLT_ORDER
//
// ScrBltFields - array of OE2ETFIELD structures (one for each field)
// for the SCRBLT_ORDER
//
// MemBltFields - array of OE2ETFIELD structures (one for each field)
// for the MEMBLT_ORDER
//
// Mem3BltFields - array of OE2ETFIELD structures (one for each field)
// for the MEM3BLT_ORDER
//
// TextOutFields - array of OE2ETFIELD structures (one for each field)
// for the TEXTOUT_ORDER
//
// ExtTextOutFields - array of OE2ETFIELD structures (one for each field)
// for the EXTTEXTOUT_ORDER
//
// RectangleFields - array of OE2ETFIELD structures (one for each field)
// for the RECTANGLE_ORDER
//
// LineToFields - array of OE2ETFIELD structures (one for each field)
// for the LINETO_ORDER
//
// OpaqueRectFields - array of OE2ETFIELD structures (one for each field)
// for the OPQAUERECT_ORDER
//
// SaveBitmapFields - array of OE2ETFIELD structures (one for each field)
// for the SAVEBITMAP_ORDER
//
// DeskScrollFields - array of OE2ETFIELD structures (one for each field)
// for the DESKSCROLL_ORDER
// etc.
//
//
typedef struct tagOE2ETTABLE
{
POE2ETFIELD pFields [OE2_NUM_TYPES];
BYTE NumFields [OE2_NUM_TYPES];
OE2ETFIELD DstBltFields [OE2_NUM_DSTBLT_FIELDS];
OE2ETFIELD PatBltFields [OE2_NUM_PATBLT_FIELDS];
OE2ETFIELD ScrBltFields [OE2_NUM_SCRBLT_FIELDS];
OE2ETFIELD MemBltFields [OE2_NUM_MEMBLT_FIELDS];
OE2ETFIELD Mem3BltFields [OE2_NUM_MEM3BLT_FIELDS];
OE2ETFIELD TextOutFields [OE2_NUM_TEXTOUT_FIELDS];
OE2ETFIELD ExtTextOutFields [OE2_NUM_EXTTEXTOUT_FIELDS];
OE2ETFIELD RectangleFields [OE2_NUM_RECTANGLE_FIELDS];
OE2ETFIELD LineToFields [OE2_NUM_LINETO_FIELDS];
OE2ETFIELD OpaqueRectFields [OE2_NUM_OPAQUERECT_FIELDS];
OE2ETFIELD SaveBitmapFields [OE2_NUM_SAVEBITMAP_FIELDS];
OE2ETFIELD DeskScrollFields [OE2_NUM_DESKSCROLL_FIELDS];
OE2ETFIELD MemBltR2Fields [OE2_NUM_MEMBLT_R2_FIELDS];
OE2ETFIELD Mem3BltR2Fields [OE2_NUM_MEM3BLT_R2_FIELDS];
OE2ETFIELD PolygonFields [OE2_NUM_POLYGON_FIELDS];
OE2ETFIELD PieFields [OE2_NUM_PIE_FIELDS];
OE2ETFIELD EllipseFields [OE2_NUM_ELLIPSE_FIELDS];
OE2ETFIELD ArcFields [OE2_NUM_ARC_FIELDS];
OE2ETFIELD ChordFields [OE2_NUM_CHORD_FIELDS];
OE2ETFIELD PolyBezierFields [OE2_NUM_POLYBEZIER_FIELDS];
OE2ETFIELD RoundRectFields [OE2_NUM_ROUNDRECT_FIELDS];
} OE2ETTABLE;
//
//
// MACROS
//
//
//
// #define used to check that there is enough room left in the buffer
// for the encoded data which is about to be copied in.
//
#define ENOUGH_BUFFER(bend, start, datalen) \
( ((LPBYTE)(start)+(datalen)) <= (bend) )
//
// FUNCTION: OE2GetOrderType
//
// DESCRIPTION:
//
// This function converts the two byte flag used in an ORDER to record the
// type of order into an internal single byte value
//
// PARAMETERS:
//
// pOrder - A pointer to the order
//
// RETURNS:
//
// The type of the order (internal single byte value - see above)
//
//
BYTE OE2GetOrderType(LPCOM_ORDER pOrder);
BOOL OE2CanUseDeltaCoords(void * pNewCoords,
void * pOldCoords,
UINT fieldLength,
BOOL signedValue,
UINT numElements);
void OE2CopyToDeltaCoords(LPTSHR_INT8* ppDestination,
void * pNewCoords,
void * pOldCoords,
UINT fieldLength,
BOOL signedValue,
UINT numElements);
//
// FUNCTION: OE2EncodeField
//
// DESCRIPTION:
//
// Convert a field which is an array of 1 or more elements, from its
// encoded form to its decoded form.
//
// PARAMETERS:
//
// pSrc - Array of source values.
// ppDest - Array of destination values.
// srcFieldLength - The size of each of the elements in the source array.
// destFieldLength - The size of each of the elements in the destination
// array.
// signedValue - Is the element a signed value ?
// numElements - The number of elements in the arrays.
//
// RETURNS:
//
// None.
//
//
void OE2EncodeField(void * pSrc,
PBYTE* ppDest,
UINT srcFieldLength,
UINT destFieldLength,
BOOL signedValue,
UINT numElements);
#endif // _H_OE2