|
|
/******************************Module*Header*******************************\
* Module Name: textobj.hxx * * * * Supporting routines for text output, mostly computation of text * * positioning and text extent. * * * * Created: 16-Jan-1991 13:44:27 * * Author: Bodin Dresevic [BodinD] * * * * Copyright (c) 1992-1999 Microsoft Corporation * \**************************************************************************/
/*********************************Class************************************\
* class ESTROBJ; * * * * The global aspects of the text positioning and text size computation. * * * * Public Interface: * * * * History: * * Fri 13-Mar-1992 02:10:27 -by- Charles Whitmer [chuckwh] * * Simplified all the work and put it into the vInit call. Deleted lots of * * methods. * * * * 21-Jan-1991 -by- Bodin Dresevic [BodinD] * * Wrote it. * \**************************************************************************/
// The flTO flags. Leave room for the TSIM flags.
#define TO_MEM_ALLOCATED 0x0001L //Memory was allocated.
#define TO_ALL_PTRS_VALID 0x0002L //All pointers to cache locked.
#define TO_VALID 0x0004L //ESTROBJ constructor succeeded.
#define TO_ESC_NOT_ORIENT 0x0008L //Escapement not equal to orientation.
#define TO_PWSZ_ALLOCATED 0x0010L //pwszOrg needs to be released
#define TO_HIGHRESTEXT 0x0100L //Printer driver wants 28.4 text coords.
#define TO_BITMAPS 0x0200L //pgdf contains GLYPHBITS pointer
#ifdef FE_SB
#define TO_PARTITION_INIT 0x0400L //The partitioning info has been initialized.
#define TO_ALLOC_FACENAME 0x0800L //FaceName glyphs array was allocated.
#define TO_SYS_PARTITION 0x1000L //System glyphs partition initialized
#endif
#define POINTS_PER_INCH 72
#define DEFAULT_SCALABLE_FONT_HEIGHT_IN_POINTS 24
#ifndef GDIFLAGS_ONLY // used for gdikdx
class ESTROBJ : public _STROBJ // so
{ public:
// The following five fields are inherited from the STROBJ.
// ULONG cGlyphs; // Number of glyphs.
// FLONG flAccel; // Accelerator flags exposed to the driver.
// ULONG ulCharInc; // Non-zero if constant character increment.
// RECTL rclBkGround; // Background rect of the string.
// GLYPHPOS *pgp; // Accelerator if all GLYPHPOS's are valid.
// PWSTR pwszOrg; // pointer to original unicode string.
ULONG cgposCopied; // For enumeration.
ULONG cgposPositionsEnumerated; // only used for enumerating positions in linked strings
RFONTOBJ *prfo; // Remember our RFONTOBJ.
FLONG flTO; // flags
EGLYPHPOS *pgpos; // Pointer to the GLYPHPOS structures.
POINTFIX ptfxRef; // Reference point.
POINTFIX ptfxUpdate; // CP advancement for the string.
POINTFIX ptfxEscapement; // The total escapement vector.
RECTFX rcfx; // The TextBox, projected onto the base and ascent.
FIX fxExtent; // The Windows compatible text extent.
FIX xExtra; // computed in H3, G2,3 cases
FIX xBreakExtra; // computed in H3, G2,3 cases
DWORD dwCodePage; // accelerator for ps driver
ULONG cExtraRects; // Rectangles for underline
RECTL arclExtra[3]; // and strikeout.
#ifdef FE_SB
RECTL rclBkGroundSave; // used to save a copy of BkGroundRect
WCHAR *pwcPartition; // For partitioning
LONG *plPartition; // Points to partitioning information
LONG *plNext; // Next glyph in font
GLYPHPOS *pgpNext; // For enumeration
LONG lCurrentFont; // For enumeration
POINTL ptlBaseLineAdjust; // Used to adjust SysEUDC baseline
ULONG cTTSysGlyphs; // Number of TT system font glyphs in a string
ULONG cSysGlyphs; // Number of system eudc glyphs in a string.
ULONG cDefGlyphs; // Number of default eudc glyphs in a string.
ULONG cNumFaceNameLinks; // Number of linked face name eudc in a string .
ULONG *pacFaceNameGlyphs; // Pointer to array of number of face name glyphs.
ULONG acFaceNameGlyphs[QUICK_FACE_NAME_LINKS]; // Number of face name glyphs
// in a string.
#endif
public:
VOID vInit // TEXTOBJ.CXX
( PWSZ pwsz, LONG cwc, XDCOBJ& dco, RFONTOBJ& rfo, EXFORMOBJ& xo, LONG *pdx, BOOL bPdy, LONG lEsc, LONG lExtra, LONG lBreakExtra, LONG cBreak, FIX xRef, FIX yRef, FLONG flControl, LONG *pdxOut, PVOID pvBuffer, DWORD dwCodePage );
VOID vInitSimple // TEXTOBJ.CXX
( PWSZ pwsz, LONG cwc, XDCOBJ& dco, RFONTOBJ& rfo, LONG xRef, LONG yRef, PVOID pvBuffer );
ESTROBJ() {flTO = 0;}
// constructor -- initialize the object on the frame
ESTROBJ ( PWSZ pwsz, LONG cwc, XDCOBJ& dco, RFONTOBJ& rfo, EXFORMOBJ& xo, LONG *pdx, BOOL bPdy, LONG lEsc, LONG lExtra, LONG lBExtra, LONG cBreak, FIX x, FIX y, FLONG fl, LONG *pdxOut ) { vInit(pwsz, cwc, dco, rfo,xo,pdx,bPdy,lEsc,lExtra,lBExtra,cBreak,x,y,fl,pdxOut,NULL,0); }
// destructor -- Frees the memory pointed to by pgpos.
~ESTROBJ() { #ifdef FE_SB
if (flTO & (TO_MEM_ALLOCATED|TO_ALLOC_FACENAME)) { if (flTO & TO_MEM_ALLOCATED) FREEALLOCTEMPBUFFER((PVOID) pgpos); if (flTO & TO_ALLOC_FACENAME) VFREEMEM((PVOID) pacFaceNameGlyphs); } #else
if (flTO & TO_MEM_ALLOCATED) { //
// NOTE:
// Use this macro because allocation of the ESTROBJ goes through
// The fast allocator.
//
FREEALLOCTEMPBUFFER((PVOID) pgpos); } #endif
}
// bValid -- Checks if memory allocation in the constructor has failed.
BOOL bValid() {return(flTO & TO_VALID);}
// bOpaqueArea -- Computes the area that would need opaquing behind the text.
// Returns TRUE if the result is complex.
BOOL bOpaqueArea(POINTFIX *pptfx,RECTL *prcl);
// prclExtraRects -- Returns the rectangles that simulate underlines.
RECTL *prclExtraRects() { return((cExtraRects == 0) ? NULL : arclExtra); }
// bTextExtent -- Transform the TextBox extents back to logical coordinates.
#ifdef FE_SB
BOOL bTextExtent(RFONTOBJ& rfo,LONG lEsc,PSIZE pSize); #else
BOOL bTextExtent(PSIZE pSize); #endif
// ptfxAdvance -- Returns the amount that the current position should be offset.
POINTFIX& ptfxAdvance() {return(ptfxUpdate);}
// bTextToPath -- Draws the string into the given path.
BOOL bTextToPath( EPATHOBJ& po, XDCOBJ& dco, BOOL bNeedUnflattend = FALSE); BOOL bLinkedTextToPath( EPATHOBJ& po, XDCOBJ& dco, BOOL bNeedUnflattend = FALSE); BOOL bTextToPathWorkhorse( EPATHOBJ& po, BOOL bNeedUnflattend = FALSE);
// bExtraRectsToPath -- Draws underlines and strikeouts into a path.
BOOL bExtraRectsToPath(EPATHOBJ& po, BOOL bNeedUnflattend = FALSE);
VOID vEnumStart() { cgposCopied = 0; cgposPositionsEnumerated = 0; }
// vCharPos -- Special case character positioning routines.
VOID vCharPos_H1 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG *pdx, EFLOAT efScale );
VOID ESTROBJ::vCharPos_H2 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef #ifdef FE_SB
,EFLOAT efScale #endif
);
VOID vCharPos_H3 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG lExtra, LONG lBreakExtra, LONG cBreak, EFLOAT efScale #ifdef FE_SB
,PBOOL pAccel = NULL #endif
);
VOID ESTROBJ::vCharPos_H4 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG *pdxdy, EFLOAT efXScale, EFLOAT efYScale );
VOID vCharPos_G1 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG *pdx, LONG *pdxOut );
VOID vCharPos_G2 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG lExtra, LONG lBreakExtra, LONG cBreak, LONG *pdxOut );
VOID vCharPos_G3 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG lExtra, LONG lBreakExtra, LONG cBreak, LONG *pdx, LONG *pdxOut );
VOID vCharPos_G4 ( XDCOBJ& dco, RFONTOBJ& rfo, FIX xRef, FIX yRef, LONG *pdxdy );
VOID vEudcOpaqueArea(POINTFIX *pptfx, BOOL bComplexBackGround);
PGLYPHPOS pgpGet() {return(pgpos); } ULONG cGlyphsGet() {return(cGlyphs); } PWSZ pwszGet() {return(pwszOrg); }
#ifdef FE_SB
// methods for EUDC functionality
VOID vFontSet( LONG _lCurrentFont ) { lCurrentFont = _lCurrentFont; cgposCopied = 0;}
FLONG flAccelGet() { return( flAccel ); } VOID flAccelSet( FLONG _flAccel ) { flAccel = _flAccel ;}
VOID vClearCharInc() { ulCharInc = 0; }
VOID pgpSet( GLYPHPOS *_pgp ) { pgp = _pgp; } VOID prfntSet( PRFONTOBJ _prfnt ) { prfo = _prfnt; } VOID pwszSet( PWSZ _pwszOrg ) { pwszOrg = _pwszOrg; }
BOOL bLinkedGlyphs() { return((flTO & (TO_SYS_PARTITION|TO_PARTITION_INIT )) ? TRUE : FALSE); }
VOID cGlyphsSet( LONG _cGlyphs ) { cGlyphs = _cGlyphs; } ULONG cFaceNameGlyphsGet( ULONG ul ) { return( pacFaceNameGlyphs ? pacFaceNameGlyphs[ul] : 0); } VOID vFaceNameInc( ULONG ul ) { (pacFaceNameGlyphs[ul]) += 1; } ULONG cTTSysGlyphsGet() { return( cTTSysGlyphs ); } ULONG cSysGlyphsGet() { return( cSysGlyphs ); } VOID vSysGlyphsInc() { cSysGlyphs += 1; } VOID vTTSysGlyphsInc() { cTTSysGlyphs += 1; } ULONG cDefGlyphsGet() { return( cDefGlyphs ); } VOID vDefGlyphsInc() { cDefGlyphs += 1; }
VOID vInflateTextRect(ERECTL _rclInflate) { (ERECTL)rclBkGround += _rclInflate; } VOID ptlBaseLineAdjustSet( POINTL& _ptlBaseLineAdjust );
BOOL bPartitionInit() { return(flTO & TO_PARTITION_INIT ); } BOOL bSystemPartitionInit(){ return(flTO & TO_SYS_PARTITION);} BOOL bPartitionInit(COUNT c, UINT uiNumLinks, BOOL bEUDCInit); LONG *plPartitionGet() { return( plPartition ); } WCHAR *pwcPartitionGet() { return( pwcPartition ); }
VOID vSaveBkGroundRect() {rclBkGroundSave = rclBkGround;} VOID vRestoreBkGroundRect() {rclBkGround = rclBkGroundSave;}
#endif
#if DBG
void vCorrectBackGround(); void vCorrectBackGroundError( GLYPHPOS *pgp ); #endif
};
BOOL GreExtTextOutWLocked( XDCOBJ &dco, int x, int y, UINT flOpts, LPRECT prcl, LPWSTR pwsz, int cwc, LPINT pdx, ULONG ulBkMode, PVOID pvBuffer, DWORD dwCodePage );
BOOL ExtTextOutRect( XDCOBJ &dcoDst, LPRECT prcl );
BOOL GreBatchTextOut( XDCOBJ &dcoDst, PBATCHTEXTOUT pbText, ULONG cjBatchLength ); #endif // GDIFLAGS_ONLY used for gdikdx
|