// // Order Encoder // #ifndef _H_OE #define _H_OE // // Required headers // #include #include #include // // Specific values for OSI escape codes // #define OE_ESC(code) (OSI_OE_ESC_FIRST + code) #define OE_ESC_NEW_FONTS OE_ESC(0) #define OE_ESC_NEW_CAPABILITIES OE_ESC(1) // // Structure: OE_NEW_FONTS // // Description: // // Structure to pass new font data down to the display driver from the // Share Core. // // typedef struct tagOE_NEW_FONTS { OSI_ESCAPE_HEADER header; // Common header WORD fontCaps; // R11 font capabilities WORD countFonts; // Number of fonts in data block LPLOCALFONT fontData; // Local font table, containing // FH_MAX_FONTS entries LPWORD fontIndex; // Font table index, containing // FH_LOCAL_INDEX_SIZE entries } OE_NEW_FONTS; typedef OE_NEW_FONTS FAR * LPOE_NEW_FONTS; // // Structure: OE_NEW_CAPABILITIES // // Description: // // Structure to pass new capabilities down to the display driver from the // Share Core. // // typedef struct tagOE_NEW_CAPABILITIES { OSI_ESCAPE_HEADER header; // Common header DWORD sendOrders; // Are we allowed to send any // orders? DWORD textEnabled; // Are we allowed to send text // orders? DWORD baselineTextEnabled; // Flag to indicate if we should // encode text orders using // baseline alignment. LPBYTE orderSupported; // Array of BYTE-sized booleans } OE_NEW_CAPABILITIES; typedef OE_NEW_CAPABILITIES FAR * LPOE_NEW_CAPABILITIES; // // Flag to indicate support of second level order encoding. This is used // as a bitwise flag so that we can easily determine when parties have // mixed capabilities. Allowed values are: // // OE2_FLAG_UNKNOWN - OE2 supported has not been negotiated yet // OE2_FLAG_SUPPORTED - OE2 is supported by at least one person // OE2_FLAG_NOT_SUPPORTED - OE2 is not supported by at least one person // OE2_FLAG_MIXED - Oh no! This results when we have 2 (or more) // nodes that have differing OE2 support. In // this case we must disable OE2 encoding. // #define OE2_FLAG_UNKNOWN 0x00 #define OE2_FLAG_SUPPORTED 0x10 #define OE2_FLAG_NOT_SUPPORTED 0x01 #define OE2_FLAG_MIXED 0x11 // // // PROTOTYPES // // #ifdef DLL_DISP // // Name: OE_DDProcessRequest // // Purpose: Process an OE specific request from the Share Core // // Returns: TRUE if processed OK, FALSE otherwise // // Params: pso - SURFOBJ associated with ther request // cjIn - size of input buffer // pvIn - pointer to input buffer // cjOut - size of output buffer // pvOut - pointer to output buffer // #ifdef IS_16 BOOL OE_DDProcessRequest(UINT fnEscape, LPOSI_ESCAPE_HEADER pResult, DWORD cbResult); BOOL OE_DDInit(void); void OE_DDViewing(BOOL fStart); #else ULONG OE_DDProcessRequest(SURFOBJ* pso, UINT cjIn, void* pvIn, UINT cjOut, void* pvOut); #endif // IS_16 void OE_DDTerm(void); void OEDDSetNewFonts(LPOE_NEW_FONTS pDataIn); void OEDDSetNewCapabilities(LPOE_NEW_CAPABILITIES pCaps); BOOL OE_SendAsOrder(DWORD order); BOOL OE_RectIntersectsSDA(LPRECT lpRect); #endif // ifdef DLL_DISP // // Function prototypes. // // // OE_GetStringExtent(..) // // FUNCTION: // // Gets the extent (in logical coords) of the specified string. // The extent returned encloses all pels of the specified string. // // // PARAMETERS: // // hdc - DC handle // // pMetric - pointer to text metrics for the font for the string; if NULL, // use the global text metrics // // lpszString - pointer to null terminated string // // cbString - number of bytes in string // // lpDx - pointer to character increments. If NULL, use default character // increments // // pRect - pointer to rect where string extent is returned // // RETURNS: // // The amount of overhang included in the returned extent // // ------------------------------------.... // | ****: // | * : // | *** : // | * | : // | * | : // | **** | : // ------------------------------------.... // ^ // :-------- bounds are wider // ^ than text extent // | due to overhang // real text extent ends here // // int OE_GetStringExtent(HDC hdc, TEXTMETRIC* pMetric, LPSTR lpszString, UINT cbString, LPRECT pRect ); // // Macros to lock down the buffer that we want to use. // // NOTE: We do not have any OE specific shared memory, so we'll use the OA // shared data as a surrogate for the lock. Since the lock is counting, we // have no worries. // #define OE_SHM_START_WRITING OA_SHM_START_WRITING #define OE_SHM_STOP_WRITING OA_SHM_STOP_WRITING // // Number of rectangles that can make up a clip region before it is too // complicated to send as an order. // #define COMPLEX_CLIP_RECT_COUNT 4 // // Mask and valid values for TextOut flAccel flags // #define OE_BAD_TEXT_MASK ( SO_VERTICAL | SO_REVERSED | SO_GLYPHINDEX_TEXTOUT ) #ifdef DLL_DISP // // Structure to store brushes used as BLT patterns. // // style - Standard brush style (used in order to send brush type). // // BS_HATCHED // BS_PATTERN // BS_SOLID // BS_NULL // // hatch - Standard hatch definition. Can be one of the following. // // style = BS_HATCHED // // HS_HORIZONTAL // HS_VERTICAL // HS_FDIAGONAL // HS_BDIAGONAL // HS_CROSS // HS_DIAGCROSS // // style = BS_PATTERN // // This field contains the first byte of the brush definition // from the brush bitmap. // // brushData - bit data for the brush. // // fore - foreground color for the brush // // back - background color for the brush // // brushData - bit data for the brush (8x8x1bpp - 1 (see above) = 7 bytes) // // typedef struct tagOE_BRUSH_DATA { BYTE style; BYTE hatch; BYTE pad[2]; TSHR_COLOR fore; TSHR_COLOR back; BYTE brushData[7]; } OE_BRUSH_DATA, * POE_BRUSH_DATA; #ifndef IS_16 // // Structure allowing sufficient stack to be allocated for an ENUMRECTS // structure containing more than one (in fact COMPLEX_CLIP_RECT_COUNT) // rectangles. // This holds one RECTL more than we need to allow us to determine whether // there are too many rects for order encoding by making a single call to // CLIPOBJ_bEnumRects. // typedef struct tagOE_ENUMRECTS { ENUMRECTS rects; RECTL extraRects[COMPLEX_CLIP_RECT_COUNT]; } OE_ENUMRECTS; #endif // !IS_16 #endif // // Font Alias table structure. The font aliases convert non-existant fonts // to ones that Windows supports in its default installation. // // pszOriginalFontName - Name of the non-existant font to be aliased // // pszAliasFontName - Name of the font Windows uses instead of the non // existant font. // // charWidthAdjustment - Character adjustment to make a decent match. // typedef struct _FONT_ALIAS_TABLE { LPBYTE pszOriginalFontName; LPBYTE pszAliasFontName; TSHR_UINT16 charWidthAdjustment; } FONT_ALIAS_TABLE; // // ROP4 to ROP3 conversion macros. Note that we don't use the full Windows // 3-way ROP code - we are only interested in the index byte. // #define ROP3_HIGH_FROM_ROP4(rop) ((TSHR_INT8)((rop & 0xff00) >> 8)) #define ROP3_LOW_FROM_ROP4(rop) ((TSHR_INT8)((rop & 0x00ff))) // // OS specific RECTL to RECT conversion macro. Note that this macro // guarantees to return a well-ordered rectangle. // #define RECT_FROM_RECTL(dcr, rec) if (rec.right < rec.left) \ { \ dcr.left = rec.right; \ dcr.right = rec.left; \ } \ else \ { \ dcr.left = rec.left; \ dcr.right = rec.right; \ } \ if (rec.bottom < rec.top) \ { \ dcr.bottom = rec.top; \ dcr.top = rec.bottom; \ } \ else \ { \ dcr.top = rec.top; \ dcr.bottom = rec.bottom; \ } // // OS specific RECTFX to RECT conversion macro. Note that this macro // guarantees to return a well-ordered rectangle. // // A RECTFX uses fixed point (28.4 bit) numbers so we need to truncate the // fraction and move to the correct integer value, i.e. shift right 4 bits. // #define RECT_FROM_RECTFX(dcr, rec) \ if (rec.xRight < rec.xLeft) \ { \ dcr.left = FXTOLFLOOR(rec.xRight); \ dcr.right = FXTOLCEILING(rec.xLeft); \ } \ else \ { \ dcr.left = FXTOLFLOOR(rec.xLeft); \ dcr.right = FXTOLCEILING(rec.xRight); \ } \ if (rec.yBottom < rec.yTop) \ { \ dcr.bottom= FXTOLCEILING(rec.yTop); \ dcr.top = FXTOLFLOOR(rec.yBottom); \ } \ else \ { \ dcr.top = FXTOLFLOOR(rec.yTop); \ dcr.bottom= FXTOLCEILING(rec.yBottom); \ } #define POINT_FROM_POINTL(dcp, pnt) dcp.x = pnt.x; \ dcp.y = pnt.y #define POINT_FROM_POINTFIX(dcp, pnt) dcp.x = FXTOLROUND(pnt.x); \ dcp.y = FXTOLROUND(pnt.y) // // Macros to check for articular types of ROP code. // #define ROP3_NO_PATTERN(rop) ((rop & 0x0f) == (rop >> 4)) #define ROP3_NO_SOURCE(rop) ((rop & 0x33) == ((rop & 0xCC) >> 2)) #define ROP3_NO_TARGET(rop) ((rop & 0x55) == ((rop & 0xAA) >> 1)) // // Checking for SRCCOPY, PATCOPY, BLACKNESS, WHITENESS // #define ROP3_IS_OPAQUE(rop) ( ((rop) == 0xCC) || ((rop) == 0xF0) || \ ((rop) == 0x00) || ((rop) == 0xFF) ) // // 3-way rop equating to the COPYPEN mix. // #define OE_COPYPEN_ROP (BYTE)0xf0 #ifdef DLL_DISP void OEConvertMask(ULONG mask, LPUINT pBitDepth, LPUINT pShift); #ifdef IS_16 // // GDI never made defines for these, so we will. // #define PALETTEINDEX_FLAG 0x01000000L #define PALETTERGB_FLAG 0x02000000L #define COLOR_FLAGS 0x03000000L // // This is a GLOBAL to cut down on stack space, and is only valid during // the life of a DDI call that is not reentrant. // // When we calculate something, we set the bit saying we did. This speeds // up our code a lot from NM 2.0 which used to calculate the same things // over and over again. // #define OESTATE_SDA_DCB 0x0001 // Send as screen data, use DCBs #define OESTATE_SDA_SCREEN 0x0002 // Send as screen data, use screen rc #define OESTATE_SDA_MASK 0x0003 // Send rc as screen data #define OESTATE_SDA_FONTCOMPLEX 0x0004 // Send as screen data if font too complex #define OESTATE_OFFBYONEHACK 0x0010 // Add one pixel onto bottom after DDI #define OESTATE_CURPOS 0x0020 // Save curpos before DDI call #define OESTATE_DDISTUFF 0x003F #define OESTATE_COORDS 0x0100 #define OESTATE_PEN 0x0200 #define OESTATE_BRUSH 0x0400 #define OESTATE_REGION 0x0800 #define OESTATE_FONT 0x1000 #define OESTATE_GET_MASK 0x1F00 #define MIN_BRUSH_WIDTH 8 #define MAX_BRUSH_WIDTH 16 #define TRACKED_BRUSH_HEIGHT 8 #define TRACKED_BRUSH_SIZE 8 typedef struct tagOESTATE { UINT uFlags; HDC hdc; LPDC lpdc; RECT rc; // // These are used when calcing the bounds is too complicated, so we // let GDI do it for us, albeit slower. // UINT uGetDCB; UINT uSetDCB; RECT rcDCB; POINT ptCurPos; POINT ptDCOrg; POINT ptPolarity; LOGPEN logPen; LOGBRUSH logBrush; BYTE logBrushExtra[TRACKED_BRUSH_SIZE]; LOGFONT logFont; int tmAlign; TEXTMETRIC tmFont; REAL_RGNDATA rgnData; } OESTATE, FAR* LPOESTATE; void OEGetState(UINT uFlags); BOOL OEBeforeDDI(DDI_PATCH ddiType, HDC hdc, UINT flags); BOOL OEAfterDDI(DDI_PATCH ddiType, BOOL fWeCare, BOOL fOutputHappened); #define OECHECK_PEN 0x0001 #define OECHECK_BRUSH 0x0002 #define OECHECK_FONT 0x0004 #define OECHECK_CLIPPING 0x0010 BOOL OECheckOrder(DWORD order, UINT flags); LPDC OEValidateDC(HDC hdc, BOOL fSrc); void OEMaybeBitmapHasChanged(LPDC lpdc); void OEClipAndAddOrder(LPINT_ORDER pOrder, void FAR* lpExtraInfo); void OEClipAndAddScreenData(LPRECT pRect); void OELPtoVirtual(HDC hdc, LPPOINT aPts, UINT cPts); void OELRtoVirtual(HDC hdc, LPRECT aRcs, UINT cRcs); void OEGetPolarity(void); void OEPolarityAdjust(LPRECT pRects, UINT cRects); void OEPenWidthAdjust(LPRECT lprc, UINT divisor); BOOL OETwoWayRopToThree(int, LPDWORD); BOOL OEClippingIsSimple(void); BOOL OEClippingIsComplex(void); BOOL OECheckPenIsSimple(void); BOOL OECheckBrushIsSimple(void); void OEExpandColor(LPBYTE lpField, DWORD clrSrc, DWORD fieldMask); void OEConvertColor(DWORD rgb, LPTSHR_COLOR lptshrDst, BOOL fAllowDither); void OEGetBrushInfo(LPTSHR_COLOR pClrBack, LPTSHR_COLOR pClrFore, LPTSHR_UINT32 lpBrushStyle, LPTSHR_UINT32 lpBrushHatch, LPBYTE lpBrushExtra); void OEAddLine(POINT ptStart, POINT ptEnd); void OEAddBlt(DWORD rop); void OEAddOpaqueRect(LPRECT); void OEAddRgnPaint(HRGN hrgnnPaint, HBRUSH hbrPaint, UINT rop); void OEAddPolyline(POINT ptStart, LPPOINT apts, UINT cpts); void OEAddPolyBezier(POINT ptStart, LPPOINT apts, UINT cpts); // // Cached font width info // typedef struct tagFH_CACHE { UINT fontIndex; UINT fontWidth; UINT fontHeight; UINT fontWeight; UINT fontFlags; UINT charWidths[256]; } FH_CACHE, FAR* LPFH_CACHE; void OEAddText(POINT ptDst, UINT uOptions, LPRECT lprcClip, LPSTR lpszText, UINT cchText, LPINT lpdxCharSpacing); int OEGetStringExtent(LPSTR lpszText, UINT cchText, LPINT lpdxCharSpacing, LPRECT lprcExtent); BOOL OECheckFontIsSupported(LPSTR lpszText, UINT cchText, LPUINT pFontHeight, LPUINT pFontWidth, LPUINT pFontWeight, LPUINT pFontFlags, LPUINT pFontIndex, LPBOOL lpfSendDeltaX); BOOL OEAddDeltaX(LPEXTTEXTOUT_ORDER pExtTextOut, LPSTR lpszText, UINT cchText, LPINT lpdxCharSpacing, BOOL fSendDeltaX, POINT ptStart); #else void OELPtoVirtual(LPPOINT pPoints, UINT cPoints); void OELRtoVirtual(LPRECT pRects, UINT cRects); void OEClipAndAddOrder(LPINT_ORDER pOrder, void FAR * pExtraInfo, CLIPOBJ* pco); void OEClipAndAddScreenData(LPRECT pRect, CLIPOBJ* pco); BOOL OEClippingIsSimple(CLIPOBJ* pco); BOOL OEClippingIsComplex(CLIPOBJ* pco); BOOL OECheckBrushIsSimple(LPOSI_PDEV ppdev, BRUSHOBJ* pbo, POE_BRUSH_DATA * ppBrush); void OEExpandColor(LPBYTE lpField, ULONG clrSrc, ULONG mask); void OEConvertColor(LPOSI_PDEV ppdev, LPTSHR_COLOR pDCColor, ULONG osColor, XLATEOBJ* pxlo); BOOL OEAddLine(LPOSI_PDEV ppdev, LPPOINT startPoint, LPPOINT endPoint, LPRECT rectTrg, UINT rop2, UINT width, UINT color, CLIPOBJ* pco); BOOL OEAccumulateOutput(SURFOBJ* pso, CLIPOBJ *pco, LPRECT pRect); BOOL OEAccumulateOutputRect( SURFOBJ* pso, LPRECT pRect); BOOL OEStoreBrush(LPOSI_PDEV ppdev, BRUSHOBJ* pbo, BYTE style, LPBYTE pBits, XLATEOBJ* pxlo, BYTE hatch, UINT color1, UINT color2); BOOL OECheckFontIsSupported(FONTOBJ* pfo, LPSTR lpszText, UINT cchText, LPUINT fontHeight, LPUINT pFontAscent, LPUINT pFontWidth, LPUINT pFontWeight, LPUINT pFontFlags, LPUINT pFontIndex, LPBOOL pfSendDeltaX); void OETileBitBltOrder(LPINT_ORDER pOrder, LPMEMBLT_ORDER_EXTRA_INFO pExtraInfo, CLIPOBJ* pco); void OEAddTiledBitBltOrder(LPINT_ORDER pOrder, LPMEMBLT_ORDER_EXTRA_INFO pExtraInfo, CLIPOBJ* pco, int xTile, int yTile, UINT tileWidth, UINT tileHeight); BOOL OEEncodePatBlt(LPOSI_PDEV ppdev, BRUSHOBJ *pbo, POINTL *pptlBrush, BYTE rop3, LPRECT pBounds, LPINT_ORDER *ppOrder); #endif // !IS_16 #endif // DLL_DISP // // Structures and typedefs. // // // Remote font is the structure we store for each font received from a // remote party. It mirrors the NETWORKFONT structure, with the facename // replaced with an index value (used to map the remote font handle to the // correct local font handle). // typedef struct _OEREMOTEFONT { TSHR_UINT16 rfLocalHandle; TSHR_UINT16 rfFontFlags; TSHR_UINT16 rfAveWidth; TSHR_UINT16 rfAveHeight; // lonchanc: rfAspectX and rfAspectY are used in network packet header // for both R11 and R20. So, keep it around! TSHR_UINT16 rfAspectX; // New field for r1.1 TSHR_UINT16 rfAspectY; // New field for r1.1 TSHR_UINT8 rfSigFats; // New field for r2.0 TSHR_UINT8 rfSigThins; // New field for r2.0 TSHR_UINT16 rfSigSymbol; // New field for r2.0 TSHR_UINT16 rfCodePage; // New field for R2.0 TSHR_UINT16 rfMaxAscent; // New field for R2.0 } OEREMOTEFONT, * POEREMOTEFONT; void OEMaybeEnableText(void); BOOL OERectIntersectsSDA(LPRECT pRectVD); BOOL OESendRop3AsOrder(BYTE rop3); #endif // _H_OE