Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

332 lines
8.6 KiB

/******************************Module*Header*******************************\
* Module Name: lfntobj.hxx
*
* The logical font user object and memory object.
*
* The logical font:
* ----------------
*
* o represents "wish list" of font attributes
*
* o a logical font may map to one or more realized fonts
*
* o multiple DCs may have the same logical font selected simultaneously
*
* o except for stock fonts, logical fonts are not shared between
* processes
*
* o concerned with creation, deletion, selection, and realization:
*
* o logical fonts are created by calling CreateFont or
* CreateFontIndirect at the API
*
* o logical fonts are selected into a DC by calling SelectObject at
* the API
*
* o logical fonts are deleted by calling DeleteObject at the API
*
* o logical fonts are lazily mapped/realized (realization postponed to
* the last possible moment)
*
* o text out time
*
* o querying the metrics of currently selected font
*
* o etc.
*
* o supports the following APIs:
*
* o CreateFont/CreateFontIndirect
*
* o DeleteObject
*
*
* Created: 25-Oct-1990 13:13:03
* Author: Gilman Wong [gilmanw]
*
* Copyright (c) 1990-1999 Microsoft Corporation
\**************************************************************************/
#ifndef _LFNTOBJ_
#define _LFNTOBJ_
#define TSIM_UNDERLINE1 0x00000020 // single underline
#define TSIM_UNDERLINE2 0x00000040 // double underline
#define TSIM_STRIKEOUT 0x00000080 // strike out
#ifndef GDIFLAGS_ONLY // used for gdikdx
struct MAPCACHE
{
HDEV hdev;
EFLOAT efM11;
EFLOAT efM12;
EFLOAT efM21;
EFLOAT efM22;
HPFEC hpfec;
ULONG iFont;
FLONG flSim;
POINTL ptlSim;
FLONG flAboutMatch;
ULONG iBitmapFormat; // pdc->dclevel->pSurface->so.iBitmapFormat
};
#endif // GDIFLAGS_ONLY used for gdikdx
#define MAXCACHEENTRIES 3
/**************************************************************************\
* LFONT flags.
*
* Allowed properties of a LFONT:
*
* Aliased -- an aliased LFONT is device specific. An aliased LFONT
* represents a SET OF LFONTs. The specfic member of the set
* represented in any given instance is dependent upon the
* the device (i.e., varies with DC).
*
* Stock -- a stock LFONT.
*
* Undeletable -- flag is set for non-stock fonts which are undeletable
* (like USERSRV cached fonts).
*
*
* Aliased Stock
* -----------------
* 0 0 user (app) defined LFONT
* 0 1 stock font
* 1 0 NOT ALLOWED
* 1 1 aliased stock font
*
\**************************************************************************/
#define LF_FLAG_ALIASED 0x00000001
#define LF_FLAG_STOCK 0x00000002
/*********************************Class************************************\
* class LFONT : public OBJECT
*
* Logical font object
*
* lft LFONT type. An enumerated type.
*
* fl LFONT flags.
*
* elfw The attributes of this logical font.
*
* cMapsInCache Number of entries in the font mapping cache.
*
* mapcache Cache of font mappings.
*
* History:
* 25-Oct-1990 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
#ifndef GDIFLAGS_ONLY // used for gdikdx
class LFONT : public OBJECT /* lfnt */
{
public:
// state
LFTYPE lft; // font type
FLONG fl; // flags
// Font mapping cache
INT cMapsInCache;
MAPCACHE mapcache[MAXCACHEENTRIES];
WCHAR wcCapFacename[LF_FACESIZE];
// data
ULONG cjElfw_; // size of ENUMLOGFONTEXDVW appended at the end
ENUMLOGFONTEXW elfw; // logical font attributes, really
};
typedef LFONT *PLFONT;
EFLOAT efCvtTenths(LONG l);
/**************************************************************************\
* Allowed Bit fields for flAboutMatch, returned by *
* LFONTOBJ::ppfeMapFont() *
\**************************************************************************/
#define MAPFONT_FOUND_NAME 0x00000001 // facename matched
#define MAPFONT_ALTFACE_USED 0x00000002 // alternate facename matched
/*********************************Class************************************\
* class LFONTOBJ
*
* User object for logical fonts.
*
* History:
* 25-Oct-1990 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
BOOL bDeleteFont(HLFONT,BOOL);
class PFE;
class LFONTOBJ /* lfo */
{
public:
PLFONT plfnt; // pointer to logical font object
public:
// Constructors -- lock LFONT object.
LFONTOBJ (HLFONT hlfnt, PDEVOBJ* ppdo = (PDEVOBJ *) NULL);
~LFONTOBJ ()
{
if (plfnt != NULL)
{
DEC_SHARE_REF_CNT_LAZY_DEL_LOGFONT(plfnt);
}
}
BOOL bValid () { return(plfnt != NULL); }
HLFONT hlfnt () { return((HLFONT) plfnt->hGet()); }
FLONG fl() { return(plfnt->fl); }
// hrfntRealizeFont -- return HRFONT that matches the LFONT.
PFE *ppfeMapFont(XDCOBJ& dco,
FLONG* pflSim,
POINTL *pptlSim,
FLONG *pflAboutMatch,
BOOL bIndexFont = FALSE
);
// plfw -- return pointer to LOGFONTW structure.
PLOGFONTW plfw()
{
return (&(plfnt->elfw.elfLogFont));
}
ENUMLOGFONTEXDVW * pelfw()
{
return ((ENUMLOGFONTEXDVW *)(&(plfnt->elfw)));
}
ULONG cjElfw() { return plfnt->cjElfw_; }
// gets the escapement in tenths of degrees and converts the
// to the corresponding EFLOAT that our efSine and efCosine routines
// understand
LONG lEscapement()
{
return (plfnt->elfw.elfLogFont.lfEscapement);
}
#ifdef FE_SB
ULONG ulOrientation()
{
return (plfnt->elfw.elfLogFont.lfOrientation);
}
LONG lWidth()
{
return (plfnt->elfw.elfLogFont.lfWidth);
}
LONG lHeight()
{
return (plfnt->elfw.elfLogFont.lfHeight);
}
LONG lWidth( LONG lWidth )
{
LONG lSave = plfnt->elfw.elfLogFont.lfWidth;
plfnt->elfw.elfLogFont.lfWidth = lWidth;
return( lSave );
}
LONG lHeight( LONG lHeight )
{
LONG lSave = plfnt->elfw.elfLogFont.lfHeight;
plfnt->elfw.elfLogFont.lfHeight = lHeight;
return( lSave );
}
ULONG ulOrientation( ULONG ulOrientation )
{
ULONG ulSave = plfnt->elfw.elfLogFont.lfOrientation;
plfnt->elfw.elfLogFont.lfOrientation = ulOrientation;
return( ulSave );
}
LONG lEscapement( LONG lEscapement )
{
LONG lSave = plfnt->elfw.elfLogFont.lfEscapement;
plfnt->elfw.elfLogFont.lfEscapement = lEscapement;
return( lSave );
}
FLONG flEudcFontItalicSimFlags( BOOL bNonSimItalic, BOOL bSimItalic )
{
FLONG fl = 0L;
if (!bNonSimItalic && /* font is already italicalized ? */
plfnt->elfw.elfLogFont.lfItalic && /* italized style is requested ? */
bSimItalic ) /* can do italic simulation ? */
{
fl |= FO_SIM_ITALIC;
}
return (fl);
}
FLONG flEudcFontBoldSimFlags( USHORT usNonSimWeight )
{
LONG lWish = plfnt->elfw.elfLogFont.lfWeight;
LONG lPen = (LONG)usNonSimWeight - (( lWish ) ? ( lWish ) : FW_NORMAL);
FLONG fl = 0L;
if( lPen < 0 )
{
fl |= FO_SIM_BOLD;
}
return (fl);
}
#endif
// flSimulationFlags -- returns the text simulation flags
FLONG flSimulationFlags()
{
FLONG fl = 0L;
if (plfnt->elfw.elfLogFont.lfUnderline)
fl |= TSIM_UNDERLINE1;
if (plfnt->elfw.elfLogFont.lfStrikeOut)
fl |= TSIM_STRIKEOUT;
return (fl);
}
#if DBG
// vDump -- debugging info.
VOID vDump (); // LFNTOBJ.CXX
#endif
};
typedef LFONTOBJ *PLFONTOBJ;
#endif // GDIFLAGS_ONLY used for gdikdx
#endif