// // 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