|
|
//
// Order Encoder
//
#ifndef _H_OE
#define _H_OE
//
// Required headers
//
#include <oa.h>
#include <shm.h>
#include <fh.h>
//
// 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
|