/****************************************************************************/ // od.h // // Order Decoder Class. // // Copyright (c) 1997-1999 Microsoft Corp. // Portions copyright (c) 1992-1997 Microsoft, PictureTel /****************************************************************************/ #ifndef _H_OD #define _H_OD extern "C" { #include } #include "or.h" #include "uh.h" #include "cc.h" #include "objs.h" /****************************************************************************/ /* ODORDERFIELDINFO "type" flags. */ /****************************************************************************/ #define OD_OFI_TYPE_FIXED 0x01 #define OD_OFI_TYPE_VARIABLE 0x02 #define OD_OFI_TYPE_COORDINATES 0x04 #define OD_OFI_TYPE_DATA 0x08 #define OD_OFI_TYPE_SIGNED 0x10 #define OD_OFI_TYPE_LONG_VARIABLE 0x20 /****************************************************************************/ /* Define the maximum sizes of fields within encoded orders. */ /****************************************************************************/ #define OD_CONTROL_FLAGS_FIELD_SIZE 1 #define OD_TYPE_FIELD_SIZE 1 #define OD_MAX_FIELD_FLAG_BYTES 3 #define OD_MAX_ADDITIONAL_BOUNDS_BYTES 1 /****************************************************************************/ /* Structure: OD_ORDER_FIELD_INFO */ /* */ /* 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 decode the */ /* field. */ /****************************************************************************/ typedef struct tagOD_ORDER_FIELD_INFO { UINT16 fieldPos; BYTE fieldUnencodedLen; BYTE fieldEncodedLen; BYTE fieldType; } OD_ORDER_FIELD_INFO, FAR *POD_ORDER_FIELD_INFO; class COD; // Fast-path decoding function pointer type. typedef HRESULT (DCINTERNAL FAR COD::*POD_ORDER_HANDLER_FUNC)( PUH_ORDER pOrder, UINT16 uiVarDataLen, BOOL bBoundsSet); typedef HRESULT (DCINTERNAL FAR COD::*POD_FAST_ORDER_DECODE_FUNC)( BYTE ControlFlags, BYTE FAR * FAR *ppFieldDecode, DCUINT dataLen, UINT32 FieldFlags); /* typedef void (DCINTERNAL FAR *POD_FAST_ORDER_DECODE_FUNC)( BYTE ControlFlags, BYTE FAR * FAR *ppFieldDecode, UINT32 FieldFlags); typedef void (DCINTERNAL FAR *POD_ORDER_HANDLER_FUNC)( PUH_ORDER pOrder, BOOL bBoundsSet); */ #define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember)) // Order attribute data, one per order type to store decoding tables and info. typedef struct tagOD_ORDER_TABLE { const OD_ORDER_FIELD_INFO FAR *pOrderTable; unsigned NumFields; PUH_ORDER LastOrder; DCUINT cbMaxOrderLen; UINT16 cbVariableDataLen; POD_FAST_ORDER_DECODE_FUNC pFastDecode; POD_ORDER_HANDLER_FUNC pHandler; } OD_ORDER_TABLE; /****************************************************************************/ /* Structure: OD_GLOBAL_DATA */ /* */ /* Description: */ /****************************************************************************/ typedef struct tagOD_GLOBAL_DATA { /************************************************************************/ /* 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[UH_ORDER_HEADER_SIZE + sizeof(DSTBLT_ORDER)]; BYTE lastPatblt[UH_ORDER_HEADER_SIZE + sizeof(PATBLT_ORDER)]; BYTE lastScrblt[UH_ORDER_HEADER_SIZE + sizeof(SCRBLT_ORDER)]; BYTE lastLineTo[UH_ORDER_HEADER_SIZE + sizeof(LINETO_ORDER)]; BYTE lastOpaqueRect[UH_ORDER_HEADER_SIZE + sizeof(OPAQUERECT_ORDER)]; BYTE lastSaveBitmap[UH_ORDER_HEADER_SIZE + sizeof(SAVEBITMAP_ORDER)]; BYTE lastMembltR2[UH_ORDER_HEADER_SIZE + sizeof(MEMBLT_R2_ORDER)]; BYTE lastMem3bltR2[UH_ORDER_HEADER_SIZE + sizeof(MEM3BLT_R2_ORDER)]; BYTE lastMultiDstBlt[UH_ORDER_HEADER_SIZE + sizeof(MULTI_DSTBLT_ORDER)]; BYTE lastMultiPatBlt[UH_ORDER_HEADER_SIZE + sizeof(MULTI_PATBLT_ORDER)]; BYTE lastMultiScrBlt[UH_ORDER_HEADER_SIZE + sizeof(MULTI_SCRBLT_ORDER)]; BYTE lastMultiOpaqueRect[UH_ORDER_HEADER_SIZE + sizeof(MULTI_OPAQUERECT_ORDER)]; BYTE lastFastIndex[UH_ORDER_HEADER_SIZE + sizeof(FAST_INDEX_ORDER)]; BYTE lastPolygonSC[UH_ORDER_HEADER_SIZE + sizeof(POLYGON_SC_ORDER)]; BYTE lastPolygonCB[UH_ORDER_HEADER_SIZE + sizeof(POLYGON_CB_ORDER)]; BYTE lastPolyLine[UH_ORDER_HEADER_SIZE + sizeof(POLYLINE_ORDER)]; BYTE lastFastGlyph[UH_ORDER_HEADER_SIZE + sizeof(FAST_GLYPH_ORDER)]; BYTE lastEllipseSC[UH_ORDER_HEADER_SIZE + sizeof(ELLIPSE_SC_ORDER)]; BYTE lastEllipseCB[UH_ORDER_HEADER_SIZE + sizeof(ELLIPSE_CB_ORDER)]; BYTE lastIndex[UH_ORDER_HEADER_SIZE + sizeof(INDEX_ORDER)]; #ifdef DRAW_NINEGRID BYTE lastDrawNineGrid[UH_ORDER_HEADER_SIZE + sizeof(DRAWNINEGRID_ORDER)]; BYTE lastMultiDrawNineGrid[UH_ORDER_HEADER_SIZE + sizeof(MULTI_DRAWNINEGRID_ORDER)]; #endif /************************************************************************/ /* The type of order, and a pointer to the last order */ /************************************************************************/ BYTE lastOrderType; PUH_ORDER pLastOrder; /************************************************************************/ /* The last bounds that were used. */ /************************************************************************/ RECT lastBounds; #ifdef DC_HICOLOR //#ifdef DC_DEBUG /************************************************************************/ /* Used for testing to confirm that we've received each of the order */ /* types */ /************************************************************************/ #define TS_FIRST_SECONDARY_ORDER TS_MAX_ORDERS UINT32 orderHit[TS_MAX_ORDERS + TS_NUM_SECONDARY_ORDERS]; //#endif #endif } OD_GLOBAL_DATA; class COD { public: COD(CObjs* objs); ~COD(); public: // // API // void DCAPI OD_Init(void); void DCAPI OD_Term(void); void DCAPI OD_Enable(void); void DCAPI OD_Disable(void); HRESULT DCAPI OD_DecodeOrder(PPDCVOID, DCUINT, PUH_ORDER *); public: // // Public data members // OD_GLOBAL_DATA _OD; // Order attributes used for decoding, organized to optimize cache line // usage. The fourth and fifth fields of each row are the fast-path decode // and order handler functions, respectively. If a fast-path decode function // is used, neither a decoding table nor a handler function is needed, // since fast-path decode functions also perform the handling. OD_ORDER_TABLE odOrderTable[TS_MAX_ORDERS]; private: // // Internal functions // /****************************************************************************/ /* FUNCTION PROTOTYPES */ /****************************************************************************/ HRESULT DCINTERNAL ODDecodeFieldSingle(PPDCUINT8, PDCVOID, unsigned, unsigned, BOOL); HRESULT ODDecodeMultipleRects(RECT *, UINT32, CLIP_RECT_VARIABLE_CODEDDELTALIST FAR *, UINT16 uiVarDataLen); HRESULT DCINTERNAL ODDecodePathPoints(POINT *, RECT *, BYTE FAR *pData, unsigned NumDeltaEntries, unsigned MaxNumDeltaEntries, unsigned dataLen, unsigned MaxDataLen, UINT16 uiVarDataLen, BOOL); HRESULT DCINTERNAL ODDecodeOpaqueRect(BYTE, BYTE FAR * FAR *, DCUINT, UINT32); HRESULT DCINTERNAL ODDecodeMemBlt(BYTE, BYTE FAR * FAR *, DCUINT, UINT32); HRESULT DCINTERNAL ODDecodeLineTo(BYTE, BYTE FAR * FAR *, DCUINT, UINT32); HRESULT DCINTERNAL ODDecodePatBlt(BYTE, BYTE FAR * FAR *, DCUINT, UINT32); HRESULT DCINTERNAL ODDecodeFastIndex(BYTE, BYTE FAR * FAR *, DCUINT, UINT32); HRESULT DCINTERNAL ODHandleMultiPatBlt(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleDstBlts(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleScrBlts(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleMultiOpaqueRect(PUH_ORDER, UINT16, BOOL); #ifdef DRAW_NINEGRID HRESULT DCINTERNAL ODHandleDrawNineGrid(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleMultiDrawNineGrid(PUH_ORDER, UINT16, BOOL); #endif HRESULT DCINTERNAL ODHandleMem3Blt(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleSaveBitmap(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandlePolyLine(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandlePolygonSC(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandlePolygonCB(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleEllipseSC(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleEllipseCB(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleFastGlyph(PUH_ORDER, UINT16, BOOL); HRESULT DCINTERNAL ODHandleGlyphIndex(PUH_ORDER, UINT16, BOOL); #ifdef OS_WINCE BOOL DCINTERNAL ODHandleAlwaysOnTopRects(LPMULTI_SCRBLT_ORDER pSB); #endif private: COP* _pOp; CUH* _pUh; CCC* _pCc; CUI* _pUi; CCD* _pCd; private: CObjs* _pClientObjects; }; #endif // _H_OD