windows-nt/Source/XPSP1/NT/enduser/netmeeting/as/h/oe.h
2020-09-26 16:20:57 +08:00

648 lines
21 KiB
C

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